Annotation of early-roguelike/xrogue/list.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: list.c - Functions for dealing with linked lists of goodies
3:
4: XRogue: Expeditions into the Dungeons of Doom
5: Copyright (C) 1991 Robert Pietkivitch
6: All rights reserved.
7:
8: Based on "Advanced Rogue"
9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
10: All rights reserved.
11:
12: Based on "Rogue: Exploring the Dungeons of Doom"
13: Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14: All rights reserved.
15:
16: See the file LICENSE.TXT for full copyright and licensing information.
17: */
18:
19: #include <stdlib.h>
20: #include <string.h>
21: #include <curses.h>
22: #include "rogue.h"
23:
24: void r_discard(struct linked_list *item);
25: void t_discard(struct linked_list *item);
26:
27: /*
28: * detach:
29: * Takes an item out of whatever linked list it might be in
30: */
31:
32: void
33: _detach(struct linked_list **list, struct linked_list *item)
34: {
35: if (*list == item)
36: *list = next(item);
37: if (prev(item) != NULL) item->l_prev->l_next = next(item);
38: if (next(item) != NULL) item->l_next->l_prev = prev(item);
39: item->l_next = NULL;
40: item->l_prev = NULL;
41: }
42:
43: /*
44: * _attach:
45: * add an item to the head of a list
46: */
47:
48: void
49: _attach(struct linked_list **list, struct linked_list *item)
50: {
51: if (*list != NULL)
52: {
53: item->l_next = *list;
54: (*list)->l_prev = item;
55: item->l_prev = NULL;
56: }
57: else
58: {
59: item->l_next = NULL;
60: item->l_prev = NULL;
61: }
62:
63: *list = item;
64: }
65:
66: /*
67: * o_free_list:
68: * Throw the whole object list away
69: */
70:
71: void
72: _o_free_list(struct linked_list **ptr)
73: {
74: register struct linked_list *item;
75:
76: while (*ptr != NULL)
77: {
78: item = *ptr;
79: *ptr = next(item);
80: o_discard(item);
81: }
82: }
83:
84: /*
85: * o_discard:
86: * free up an item and its object(and maybe contents)
87: */
88:
89: void
90: o_discard(struct linked_list *item)
91: {
92: register struct object *obj;
93:
94: obj = OBJPTR(item);
95: if (obj->contents != NULL)
96: o_free_list(obj->contents);
97: total -= 2;
98: FREE(obj);
99: FREE(item);
100: }
101:
102: /*
103: r_free_fire_list
104: Throw the whole list of fire monsters away. But don't
105: discard the item (monster) itself as that belong to mlist.
106: */
107:
108: void
109: _r_free_fire_list(struct linked_list **ptr)
110: {
111: register struct linked_list *item;
112:
113: while (*ptr != NULL)
114: {
115: item = *ptr;
116: *ptr = next(item);
117: free(item);
118: }
119: }
120: /*
121: * r_free_list:
122: * Throw the whole list of room exits away
123: */
124:
125: void
126: _r_free_list(struct linked_list **ptr)
127: {
128: register struct linked_list *item;
129:
130: while (*ptr != NULL)
131: {
132: item = *ptr;
133: *ptr = next(item);
134: r_discard(item);
135: }
136: }
137:
138: /*
139: * r_discard:
140: * free up an item and its room
141: */
142:
143: void
144: r_discard(struct linked_list *item)
145: {
146: total -= 2;
147: FREE(DOORPTR(item));
148: FREE(item);
149: }
150:
151: /*
152: * t_free_list:
153: * Throw the whole thing list away
154: */
155:
156: void
157: _t_free_list(struct linked_list **ptr)
158: {
159: register struct linked_list *item;
160:
161: while (*ptr != NULL)
162: {
163: item = *ptr;
164: *ptr = next(item);
165: t_discard(item);
166: }
167: }
168:
169: /*
170: * t_discard:
171: * free up an item and its thing
172: */
173:
174: void
175: t_discard(struct linked_list *item)
176: {
177: register struct thing *tp;
178:
179: total -= 2;
180: tp = THINGPTR(item);
181: if (tp->t_name != NULL) FREE(tp->t_name);
182: if (tp->t_pack != NULL)
183: o_free_list(tp->t_pack);
184: FREE(tp);
185: FREE(item);
186: }
187:
188: /*
189: * destroy_item:
190: * get rid of an item structure -- don't worry about contents
191: */
192:
193: void
194: destroy_item(struct linked_list *item)
195: {
196: total--;
197: FREE(item);
198: }
199:
200: /*
201: * new_item
202: * get a new item with a specified size
203: */
204:
205: struct linked_list *
206: new_item(int size)
207: {
208: register struct linked_list *item;
209:
210: if ((item = (struct linked_list *) new(sizeof *item)) == NULL)
211: msg("Ran out of memory for header after %d items", total);
212: if ((item->l_data = new(size)) == NULL)
213: msg("Ran out of memory for data after %d items", total);
214: item->l_next = item->l_prev = NULL;
215: memset(item->l_data,0,size);
216: return item;
217: }
218:
219: /*
220: * creat_item:
221: * Create just an item structure -- don't make any contents
222: */
223:
224: struct linked_list *
225: creat_item(void)
226: {
227: register struct linked_list *item;
228:
229: if ((item = (struct linked_list *) new(sizeof *item)) == NULL)
230: msg("Ran out of memory for header after %d items", total);
231: item->l_next = item->l_prev = NULL;
232: return item;
233: }
234:
235: char *
236: new(int size)
237: {
238: register char *space = ALLOC(size);
239:
240: if (space == NULL) {
241: sprintf(prbuf,"Rogue ran out of memory (used = %ld, wanted = %d).",
242: md_memused(), size);
243: fatal(prbuf);
244: }
245: total++;
246: return space;
247: }
248:
CVSweb