Annotation of early-roguelike/arogue5/list.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Functions for dealing with linked lists of goodies
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985 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: #include <stdlib.h>
! 16: #include "curses.h"
! 17: #include "rogue.h"
! 18:
! 19: /*
! 20: * detach:
! 21: * Takes an item out of whatever linked list it might be in
! 22: */
! 23:
! 24: void
! 25: _detach(struct linked_list **list, struct linked_list *item)
! 26: {
! 27: if (*list == item)
! 28: *list = next(item);
! 29: if (prev(item) != NULL) item->l_prev->l_next = next(item);
! 30: if (next(item) != NULL) item->l_next->l_prev = prev(item);
! 31: item->l_next = NULL;
! 32: item->l_prev = NULL;
! 33: }
! 34:
! 35: /*
! 36: * _attach:
! 37: * add an item to the head of a list
! 38: */
! 39:
! 40: void
! 41: _attach(struct linked_list **list, struct linked_list *item)
! 42: {
! 43: if (*list != NULL)
! 44: {
! 45: item->l_next = *list;
! 46: (*list)->l_prev = item;
! 47: item->l_prev = NULL;
! 48: }
! 49: else
! 50: {
! 51: item->l_next = NULL;
! 52: item->l_prev = NULL;
! 53: }
! 54:
! 55: *list = item;
! 56: }
! 57:
! 58: /*
! 59: * o_free_list:
! 60: * Throw the whole object list away
! 61: */
! 62:
! 63: void
! 64: _o_free_list(struct linked_list **ptr)
! 65: {
! 66: register struct linked_list *item;
! 67:
! 68: while (*ptr != NULL)
! 69: {
! 70: item = *ptr;
! 71: *ptr = next(item);
! 72: o_discard(item);
! 73: }
! 74: }
! 75:
! 76: /*
! 77: * o_discard:
! 78: * free up an item and its object(and maybe contents)
! 79: */
! 80:
! 81: void
! 82: o_discard(struct linked_list *item)
! 83: {
! 84: register struct object *obj;
! 85: obj = OBJPTR(item);
! 86: if (obj->contents != NULL)
! 87: o_free_list(obj->contents);
! 88: total -= 2;
! 89: FREE(item->l_data);
! 90: FREE(item);
! 91: }
! 92:
! 93: /*
! 94: * t_free_list:
! 95: * Throw the whole thing list away
! 96: */
! 97:
! 98: void
! 99: _t_free_list(struct linked_list **ptr)
! 100: {
! 101: register struct linked_list *item;
! 102:
! 103: while (*ptr != NULL)
! 104: {
! 105: item = *ptr;
! 106: *ptr = next(item);
! 107: t_discard(item);
! 108: }
! 109: }
! 110:
! 111: /*
! 112: * t_discard:
! 113: * free up an item and its thing
! 114: */
! 115:
! 116: void
! 117: t_discard(struct linked_list *item)
! 118: {
! 119: total -= 2;
! 120: FREE(item->l_data);
! 121: FREE(item);
! 122: }
! 123:
! 124: /*
! 125: * destroy_item:
! 126: * get rid of an item structure -- don't worry about contents
! 127: */
! 128:
! 129: void
! 130: destroy_item(struct linked_list *item)
! 131: {
! 132: total--;
! 133: FREE(item);
! 134: }
! 135:
! 136: /*
! 137: * new_item
! 138: * get a new item with a specified size
! 139: */
! 140:
! 141: struct linked_list *
! 142: new_item(int size)
! 143: {
! 144: register struct linked_list *item;
! 145:
! 146: if ((item = (struct linked_list *) new(sizeof *item)) == NULL)
! 147: msg("Ran out of memory for header after %d items", total);
! 148: if ((item->l_data = new(size)) == NULL)
! 149: msg("Ran out of memory for data after %d items", total);
! 150: item->l_next = item->l_prev = NULL;
! 151: return item;
! 152: }
! 153:
! 154: /*
! 155: * creat_item:
! 156: * Create just an item structure -- don't make any contents
! 157: */
! 158:
! 159: struct linked_list *
! 160: creat_item(void)
! 161: {
! 162: register struct linked_list *item;
! 163:
! 164: if ((item = (struct linked_list *) new(sizeof *item)) == NULL)
! 165: msg("Ran out of memory for header after %d items", total);
! 166: item->l_next = item->l_prev = NULL;
! 167: return item;
! 168: }
! 169:
! 170: char *
! 171: new(int size)
! 172: {
! 173: register char *space = ALLOC(size);
! 174: static char errbuf[LINELEN];
! 175:
! 176: if (space == NULL) {
! 177: sprintf(errbuf,"Rogue ran out of memory (used = %ld, wanted = %d).",
! 178: md_memused(), size);
! 179: fatal(errbuf);
! 180: }
! 181: total++;
! 182: return space;
! 183: }
CVSweb