Annotation of early-roguelike/srogue/list.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * Functions for dealing with linked lists of goodies
3: *
4: * @(#)list.c 9.0 (rdk) 7/17/84
5: *
6: * Super-Rogue
7: * Copyright (C) 1984 Robert D. Kindelberger
8: * All rights reserved.
9: *
10: * Based on "Rogue: Exploring the Dungeons of Doom"
11: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
12: * All rights reserved.
13: *
14: * See the file LICENSE.TXT for full copyright and licensing information.
15: */
16:
17: #include <stdlib.h>
18: #include "rogue.h"
19: #include "rogue.ext"
20:
21: /*
22: * detach:
23: * Takes an item out of whatever linked list it might be in
24: */
25:
26: void
27: _detach(struct linked_list **list, struct linked_list *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: add an item to the head of a list
41: */
42: void
43: _attach(struct linked_list **list, struct linked_list *item)
44: {
45: if (*list != NULL) {
46: item->l_next = *list;
47: (*list)->l_prev = item;
48: item->l_prev = NULL;
49: }
50: else {
51: item->l_next = NULL;
52: item->l_prev = NULL;
53: }
54: *list = item;
55: }
56:
57: /*
58: * _free_list: Throw the whole blamed thing away
59: */
60: void
61: _free_list(struct linked_list **ptr)
62: {
63: register struct linked_list *item;
64:
65: while (*ptr != NULL) {
66: item = *ptr;
67: *ptr = next(item);
68: discard(item);
69: }
70: }
71:
72: /*
73: * discard: free up an item
74: */
75: void
76: discard(struct linked_list *item)
77: {
78: total -= 2;
79: FREE(item->l_data);
80: FREE(item);
81: }
82:
83: /*
84: * new_item: get a new item with a specified size
85: */
86: struct linked_list *
87: new_item(int size)
88: {
89: register struct linked_list *item;
90:
91: item = (struct linked_list *) new(sizeof *item);
92: item->l_data = new(size);
93: item->l_next = item->l_prev = NULL;
94: return item;
95: }
96:
97: char *
98: new(int size)
99: {
100: register char *space = ALLOC(size);
101:
102: if (space == NULL) {
103: sprintf(prbuf,"Rogue ran out of memory (%ld).", md_memused());
104: fatal(prbuf);
105: }
106: total++;
107: return space;
108: }
CVSweb