[BACK]Return to list.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / urogue

Annotation of early-roguelike/urogue/list.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:     list.c - Functions for dealing with linked lists of goodies
                      3:
                      4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
                      5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
                      6:     All rights reserved.
                      7:
                      8:     Based on "Advanced Rogue"
                      9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
                     10:     All rights reserved.
                     11:
                     12:     Based on "Rogue: Exploring the Dungeons of Doom"
                     13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     14:     All rights reserved.
                     15:
                     16:     See the file LICENSE.TXT for full copyright and licensing information.
                     17: */
                     18:
                     19: #include <stdlib.h>
                     20: #include <stdio.h>
                     21: #include <string.h>
                     22: #include "rogue.h"
                     23:
                     24: static char errbuf[2 * LINELEN];
                     25:
                     26: /*
                     27:     ur_alloc()
                     28:     ur_free()
                     29:
                     30:     These are just calls to the system alloc and free, and they also adjust
                     31:     the totals. The buffer is cleared out because idents need to be zero
                     32:     before going into the pack, or they will be used as indices!
                     33: */
                     34:
                     35: void *
                     36: ur_alloc(size_t size)
                     37: {
                     38:     char *buf_p;
                     39:
                     40:     total++;
                     41:
                     42:     buf_p = mem_malloc(size);
                     43:
                     44:     if (buf_p == NULL)
                     45:         return(NULL);
                     46:
                     47:     memset(buf_p,0,size);
                     48:
                     49:     return(buf_p);
                     50: }
                     51:
                     52: void
                     53: ur_free(void *buf_p)
                     54: {
                     55:     mem_free(buf_p);
                     56:     total--;
                     57: }
                     58:
                     59: /*
                     60:     detach()
                     61:         Takes an item out of whatever linked list it might be in
                     62:         .... function needs to be renamed....
                     63: */
                     64:
                     65: void
                     66: _detach(struct linked_list **list, struct linked_list *item)
                     67: {
                     68:     if (*list == item)
                     69:         *list = next(item);
                     70:
                     71:     if (prev(item) != NULL)
                     72:         item->l_prev->l_next = next(item);
                     73:
                     74:     if (next(item) != NULL)
                     75:         item->l_next->l_prev = prev(item);
                     76:
                     77:     item->l_next = NULL;
                     78:     item->l_prev = NULL;
                     79: }
                     80:
                     81: /*
                     82:     _attach()
                     83:         add an item to the head of a list
                     84:         ... this needs to be renamed as well ...
                     85: */
                     86:
                     87: void
                     88: _attach(struct linked_list  **list, struct linked_list  *item)
                     89: {
                     90:     if (*list != NULL)
                     91:     {
                     92:         item->l_next = *list;
                     93:         (*list)->l_prev = item;
                     94:         item->l_prev = NULL;
                     95:     }
                     96:     else
                     97:     {
                     98:         item->l_next = NULL;
                     99:         item->l_prev = NULL;
                    100:     }
                    101:
                    102:     *list = item;
                    103: }
                    104:
                    105: /*
                    106:     _attach_after()
                    107:
                    108:     Attaches the given item after the supplied one in the list. If the listed
                    109:     item is NULL, the new item is attached at the head of the list.
                    110: */
                    111:
                    112: void
                    113: _attach_after(linked_list **list_pp, linked_list *list_p, linked_list *new_p)
                    114: {
                    115:     if (list_p == NULL)
                    116:     {
                    117:         _attach(list_pp, new_p);    /* stuff it at the beginning */
                    118:         return;
                    119:     }
                    120:
                    121:     if (next(list_p) != NULL)  /* something after this one? */
                    122:     {
                    123:         new_p->l_next = next(list_p);
                    124:         list_p->l_next->l_prev = new_p;
                    125:     }
                    126:     else
                    127:         new_p->l_next = NULL;
                    128:
                    129:     list_p->l_next = new_p;
                    130:     new_p->l_prev = list_p;
                    131: }
                    132:
                    133: /*
                    134:     _free_list()
                    135:         Throw the whole blamed thing away
                    136: */
                    137:
                    138: void
                    139: _free_list(linked_list **ptr)
                    140: {
                    141:     linked_list *item;
                    142:
                    143:     while(*ptr != NULL)
                    144:     {
                    145:         item = *ptr;
                    146:         *ptr = next(item);
                    147:         discard(item);
                    148:     }
                    149: }
                    150:
                    151: /*
                    152:     discard()
                    153:         free up an item
                    154: */
                    155:
                    156: void
                    157: discard(struct linked_list *item)
                    158: {
                    159:     throw_away(item->data.obj);
                    160:     ur_free(item);
                    161: }
                    162:
                    163: /*
                    164:     throw_away()
                    165:         toss out something (like discard, but without the link_list)
                    166: */
                    167:
                    168: void
                    169: throw_away(struct object *ptr)
                    170: {
                    171:     free_ident(ptr);
                    172:     ur_free(ptr);
                    173: }
                    174:
                    175: /*
                    176:     new_item()
                    177:         get a new item with a specified size
                    178: */
                    179:
                    180: struct linked_list *
                    181: new_item(int size)
                    182: {
                    183:     struct linked_list  *item;
                    184:
                    185:     if ((item = new_list()) == NULL)
                    186:         msg("Ran out of memory for header after %d items.", total);
                    187:
                    188:     if ((item->data.l_data = new_alloc(size)) == NULL)
                    189:         msg("Ran out of memory for data after %d items.", total);
                    190:
                    191:     item->l_next = item->l_prev = NULL;
                    192:
                    193:     return(item);
                    194: }
                    195:
                    196: void *
                    197: new_alloc(size_t size)
                    198: {
                    199:     void *space = ur_alloc(size);
                    200:
                    201:     if (space == NULL)
                    202:     {
                    203:         sprintf(errbuf, "Rogue ran out of memory.");
                    204:         fatal(errbuf);
                    205:     }
                    206:
                    207:     return(space);
                    208: }
                    209:
                    210: struct linked_list *
                    211: new_list(void)
                    212: {
                    213:     union /* ugly_lint_hack */
                    214:     {
                    215:         struct linked_list *ll;
                    216:         void              *vptr;
                    217:     } newp;
                    218:
                    219:     newp.vptr = mem_malloc(sizeof(struct linked_list));
                    220:     memset(newp.vptr,0,sizeof(struct linked_list));
                    221:     return(newp.ll);
                    222: }

CVSweb