comparison arogue7/list.c @ 125:adfa37e67084

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