|
|
1.1 ! root 1: /* ! 2: * Functions for dealing with linked lists of goodies ! 3: * ! 4: * @(#)list.c 3.3 (Berkeley) 6/15/81 ! 5: */ ! 6: ! 7: #include <curses.h> ! 8: #include "rogue.h" ! 9: ! 10: /* ! 11: * detach: ! 12: * Takes an item out of whatever linked list it might be in ! 13: */ ! 14: ! 15: _detach(list, item) ! 16: register struct linked_list **list, *item; ! 17: { ! 18: if (*list == item) ! 19: *list = next(item); ! 20: if (prev(item) != NULL) item->l_prev->l_next = next(item); ! 21: if (next(item) != NULL) item->l_next->l_prev = prev(item); ! 22: item->l_next = NULL; ! 23: item->l_prev = NULL; ! 24: } ! 25: ! 26: /* ! 27: * _attach: ! 28: * add an item to the head of a list ! 29: */ ! 30: ! 31: _attach(list, item) ! 32: register struct linked_list **list, *item; ! 33: { ! 34: if (*list != NULL) ! 35: { ! 36: item->l_next = *list; ! 37: (*list)->l_prev = item; ! 38: item->l_prev = NULL; ! 39: } ! 40: else ! 41: { ! 42: item->l_next = NULL; ! 43: item->l_prev = NULL; ! 44: } ! 45: ! 46: *list = item; ! 47: } ! 48: ! 49: /* ! 50: * _free_list: ! 51: * Throw the whole blamed thing away ! 52: */ ! 53: ! 54: _free_list(ptr) ! 55: register struct linked_list **ptr; ! 56: { ! 57: register struct linked_list *item; ! 58: ! 59: while (*ptr != NULL) ! 60: { ! 61: item = *ptr; ! 62: *ptr = next(item); ! 63: discard(item); ! 64: } ! 65: } ! 66: ! 67: /* ! 68: * discard: ! 69: * free up an item ! 70: */ ! 71: ! 72: discard(item) ! 73: register struct linked_list *item; ! 74: { ! 75: total -= 2; ! 76: FREE(item->l_data); ! 77: FREE(item); ! 78: } ! 79: ! 80: /* ! 81: * new_item ! 82: * get a new item with a specified size ! 83: */ ! 84: ! 85: struct linked_list * ! 86: new_item(size) ! 87: int size; ! 88: { ! 89: register struct linked_list *item; ! 90: ! 91: if ((item = (struct linked_list *) new(sizeof *item)) == NULL) ! 92: msg("Ran out of memory for header after %d items", total); ! 93: if ((item->l_data = new(size)) == NULL) ! 94: msg("Ran out of memory for data after %d items", total); ! 95: item->l_next = item->l_prev = NULL; ! 96: return item; ! 97: } ! 98: ! 99: char * ! 100: new(size) ! 101: int size; ! 102: { ! 103: register char *space = ALLOC(size); ! 104: ! 105: if (space == NULL) ! 106: fatal(sprintf(prbuf, "Rogue ran out of memory (%d). Fatal error!", sbrk(0))); ! 107: total++; ! 108: return space; ! 109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.