Annotation of early-roguelike/arogue7/list.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * list.c - Functions for dealing with linked lists of goodies
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Rogue: Exploring the Dungeons of Doom"
! 9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: /*
! 16: * Functions for dealing with linked lists of goodies
! 17: *
! 18: */
! 19:
! 20: #include "curses.h"
! 21: #include <stdlib.h>
! 22: #include "rogue.h"
! 23:
! 24: void r_discard(struct linked_list *item);
! 25: void t_discard(struct linked_list *item);
! 26:
! 27: /*
! 28: * detach:
! 29: * Takes an item out of whatever linked list it might be in
! 30: */
! 31:
! 32: void
! 33: _detach(struct linked_list **list, struct linked_list *item)
! 34: {
! 35: if (*list == item)
! 36: *list = next(item);
! 37: if (prev(item) != NULL) item->l_prev->l_next = next(item);
! 38: if (next(item) != NULL) item->l_next->l_prev = prev(item);
! 39: item->l_next = NULL;
! 40: item->l_prev = NULL;
! 41: }
! 42:
! 43: /*
! 44: * _attach:
! 45: * add an item to the head of a list
! 46: */
! 47:
! 48: void
! 49: _attach(struct linked_list **list, struct linked_list *item)
! 50: {
! 51: if (*list != NULL)
! 52: {
! 53: item->l_next = *list;
! 54: (*list)->l_prev = item;
! 55: item->l_prev = NULL;
! 56: }
! 57: else
! 58: {
! 59: item->l_next = NULL;
! 60: item->l_prev = NULL;
! 61: }
! 62:
! 63: *list = item;
! 64: }
! 65:
! 66: /*
! 67: * o_free_list:
! 68: * Throw the whole object list away
! 69: */
! 70:
! 71: void
! 72: _o_free_list(struct linked_list **ptr)
! 73: {
! 74: register struct linked_list *item;
! 75:
! 76: while (*ptr != NULL)
! 77: {
! 78: item = *ptr;
! 79: *ptr = next(item);
! 80: o_discard(item);
! 81: }
! 82: }
! 83:
! 84: /*
! 85: * o_discard:
! 86: * free up an item and its object(and maybe contents)
! 87: */
! 88:
! 89: void
! 90: o_discard(struct linked_list *item)
! 91: {
! 92: register struct object *obj;
! 93:
! 94: obj = OBJPTR(item);
! 95: if (obj->contents != NULL)
! 96: o_free_list(obj->contents);
! 97: total -= 2;
! 98: FREE(obj);
! 99: FREE(item);
! 100: }
! 101:
! 102: /*
! 103: * r_free_list:
! 104: * Throw the whole list of room exits away
! 105: */
! 106:
! 107: void
! 108: _r_free_list(struct linked_list **ptr)
! 109: {
! 110: register struct linked_list *item;
! 111:
! 112: while (*ptr != NULL)
! 113: {
! 114: item = *ptr;
! 115: *ptr = next(item);
! 116: r_discard(item);
! 117: }
! 118: }
! 119:
! 120: /*
! 121: * r_discard:
! 122: * free up an item and its room
! 123: */
! 124:
! 125: void
! 126: r_discard(struct linked_list *item)
! 127: {
! 128: total -= 2;
! 129: FREE(DOORPTR(item));
! 130: FREE(item);
! 131: }
! 132:
! 133: /*
! 134: * t_free_list:
! 135: * Throw the whole thing list away
! 136: */
! 137:
! 138: void
! 139: _t_free_list(struct linked_list **ptr)
! 140: {
! 141: register struct linked_list *item;
! 142:
! 143: while (*ptr != NULL)
! 144: {
! 145: item = *ptr;
! 146: *ptr = next(item);
! 147: t_discard(item);
! 148: }
! 149: }
! 150:
! 151: /*
! 152: * t_discard:
! 153: * free up an item and its thing
! 154: */
! 155:
! 156: void
! 157: t_discard(struct linked_list *item)
! 158: {
! 159: register struct thing *tp;
! 160:
! 161: total -= 2;
! 162: tp = THINGPTR(item);
! 163: if (tp->t_name != NULL) FREE(tp->t_name);
! 164: FREE(tp);
! 165: FREE(item);
! 166: }
! 167:
! 168: /*
! 169: * destroy_item:
! 170: * get rid of an item structure -- don't worry about contents
! 171: */
! 172:
! 173: void
! 174: destroy_item(struct linked_list *item)
! 175: {
! 176: total--;
! 177: FREE(item);
! 178: }
! 179:
! 180: /*
! 181: * new_item
! 182: * get a new item with a specified size
! 183: */
! 184:
! 185: struct linked_list *
! 186: new_item(int size)
! 187: {
! 188: register struct linked_list *item;
! 189:
! 190: if ((item = (struct linked_list *) new(sizeof *item)) == NULL)
! 191: msg("Ran out of memory for header after %d items", total);
! 192: if ((item->l_data = new(size)) == NULL)
! 193: msg("Ran out of memory for data after %d items", total);
! 194: item->l_next = item->l_prev = NULL;
! 195: return item;
! 196: }
! 197:
! 198: /*
! 199: * creat_item:
! 200: * Create just an item structure -- don't make any contents
! 201: */
! 202:
! 203: struct linked_list *
! 204: creat_item(void)
! 205: {
! 206: register struct linked_list *item;
! 207:
! 208: if ((item = (struct linked_list *) new(sizeof *item)) == NULL)
! 209: msg("Ran out of memory for header after %d items", total);
! 210: item->l_next = item->l_prev = NULL;
! 211: return item;
! 212: }
! 213:
! 214: char *
! 215: new(int size)
! 216: {
! 217: register char *space = ALLOC(size);
! 218: static char errbuf[LINELEN];
! 219:
! 220: if (space == NULL) {
! 221: sprintf(errbuf,"Rogue ran out of memory (used = %ld, wanted = %d).",
! 222: md_memused(), size);
! 223: fatal(errbuf);
! 224: }
! 225: total++;
! 226: return space;
! 227: }
CVSweb