Annotation of early-roguelike/rogue3/list.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Functions for dealing with linked lists of goodies
! 3: *
! 4: * @(#)list.c 3.3 (Berkeley) 6/15/81
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980, 1981 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 "curses.h"
! 14: #include <stdlib.h>
! 15: #include <string.h>
! 16: #include "machdep.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: * _free_list:
! 60: * Throw the whole blamed thing away
! 61: */
! 62:
! 63: void
! 64: _free_list(struct linked_list **ptr)
! 65: {
! 66: struct linked_list *item;
! 67:
! 68: while (*ptr != NULL)
! 69: {
! 70: item = *ptr;
! 71: *ptr = next(item);
! 72: discard(item);
! 73: }
! 74: }
! 75:
! 76: /*
! 77: * discard:
! 78: * free up an item
! 79: */
! 80:
! 81: void
! 82: discard(struct linked_list *item)
! 83: {
! 84: total -= 2;
! 85: FREE(item->l_data);
! 86: FREE(item);
! 87: }
! 88:
! 89: /*
! 90: * new_item
! 91: * get a new item with a specified size
! 92: */
! 93:
! 94: struct linked_list *
! 95: new_item(int size)
! 96: {
! 97: struct linked_list *item;
! 98:
! 99: if ((item = (struct linked_list *) _new(sizeof *item)) == NULL)
! 100: {
! 101: msg("Ran out of memory for header after %d items", total);
! 102: return NULL;
! 103: }
! 104:
! 105: if ((item->l_data = _new(size)) == NULL)
! 106: {
! 107: msg("Ran out of memory for data after %d items", total);
! 108: free(item);
! 109: return NULL;
! 110: }
! 111:
! 112: item->l_next = item->l_prev = NULL;
! 113: memset(item->l_data,0,size);
! 114: return item;
! 115: }
! 116:
! 117: char *
! 118: _new(size_t size)
! 119: {
! 120: char *space = ALLOC(size);
! 121:
! 122: if (space == NULL)
! 123: {
! 124: sprintf(prbuf, "Rogue ran out of memory (%ld). Fatal error!", md_memused());
! 125: fatal(prbuf);
! 126: }
! 127: total++;
! 128: return space;
! 129: }
CVSweb