Annotation of early-roguelike/rogue5/list.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Functions for dealing with linked lists of goodies
! 3: *
! 4: * @(#)list.c 4.12 (Berkeley) 02/05/99
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
! 8: * All rights reserved.
! 9: *
! 10: * See the file LICENSE.TXT for full copyright and licensing information.
! 11: */
! 12:
! 13: #include <stdlib.h>
! 14: #include <curses.h>
! 15: #include "rogue.h"
! 16:
! 17: #ifdef MASTER
! 18: int total = 0; /* total dynamic memory bytes */
! 19: #endif
! 20:
! 21: /*
! 22: * detach:
! 23: * takes an item out of whatever linked list it might be in
! 24: */
! 25:
! 26: void
! 27: _detach(THING **list, THING *item)
! 28: {
! 29: if (*list == item)
! 30: *list = next(item);
! 31: if (prev(item) != NULL)
! 32: item->l_prev->l_next = next(item);
! 33: if (next(item) != NULL)
! 34: item->l_next->l_prev = prev(item);
! 35: item->l_next = NULL;
! 36: item->l_prev = NULL;
! 37: }
! 38:
! 39: /*
! 40: * _attach:
! 41: * add an item to the head of a list
! 42: */
! 43:
! 44: void
! 45: _attach(THING **list, THING *item)
! 46: {
! 47: if (*list != NULL)
! 48: {
! 49: item->l_next = *list;
! 50: (*list)->l_prev = item;
! 51: item->l_prev = NULL;
! 52: }
! 53: else
! 54: {
! 55: item->l_next = NULL;
! 56: item->l_prev = NULL;
! 57: }
! 58: *list = item;
! 59: }
! 60:
! 61: /*
! 62: * _free_list:
! 63: * Throw the whole blamed thing away
! 64: */
! 65:
! 66: void
! 67: _free_list(THING **ptr)
! 68: {
! 69: THING *item;
! 70:
! 71: while (*ptr != NULL)
! 72: {
! 73: item = *ptr;
! 74: *ptr = next(item);
! 75: discard(item);
! 76: }
! 77: }
! 78:
! 79: /*
! 80: * discard:
! 81: * Free up an item
! 82: */
! 83:
! 84: void
! 85: discard(THING *item)
! 86: {
! 87: #ifdef MASTER
! 88: total--;
! 89: #endif
! 90: free(item);
! 91: }
! 92:
! 93: /*
! 94: * new_item
! 95: * Get a new item with a specified size
! 96: */
! 97: THING *
! 98: new_item(void)
! 99: {
! 100: THING *item;
! 101:
! 102: if ((item = calloc(1, sizeof *item)) == NULL) {
! 103: #ifdef MASTER
! 104: msg("ran out of memory after %d items", total);
! 105: #endif
! 106: return NULL;
! 107: }
! 108:
! 109: #ifdef MASTER
! 110: total++;
! 111: #endif
! 112:
! 113: item->l_next = NULL;
! 114: item->l_prev = NULL;
! 115: return item;
! 116: }
CVSweb