Annotation of early-roguelike/urogue/list.c, Revision 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