ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/region.C
(Generate patch)

Comparing deliantra/server/common/region.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:00 2006 UTC vs.
Revision 1.15 by pippijn, Sat Jan 6 14:42:29 2007 UTC

1/*
2 * static char *rcsid_map_c =
3 * "$Id: region.C,v 1.1 2006/08/13 17:16:00 elmex Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
9 Copyright (C) 2001-2003 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2001-2003 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
11 7
12 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
21 17
22 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 21
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 23*/
28 24
29 25
30#include <global.h> 26#include <global.h>
31
32#ifndef WIN32 /* ---win32 exclude header */
33#include <unistd.h> 27#include <unistd.h>
34#endif /* win32 */ 28
35/* 29/*
36 * Pass a char array, returns a pointer to the region of the same name. 30 * Pass a char array, returns a pointer to the region of the same name.
37 * if it can't find a region of the same name it returns the first region 31 * if it can't find a region of the same name it returns the first region
38 * with the 'fallback' property set. 32 * with the 'fallback' property set.
39 * if it can't find a matching name /or/ a fallback region it logs an info message 33 * if it can't find a matching name /or/ a fallback region it logs an info message
40 * message and returns NULL 34 * message and returns NULL
41 * used by the map parsing code. 35 * used by the map parsing code.
42 */ 36 */
37region *
43region *get_region_by_name(const char *region_name) { 38get_region_by_name (const char *region_name)
39{
44 region *reg; 40 region *reg;
45 char *p = strchr(region_name, '\n'); 41 char *p = strchr (region_name, '\n');
42
43 if (p)
46 if (p) *p = '\0'; 44 *p = '\0';
47 for (reg=first_region;reg!=NULL;reg=reg->next) 45 for (reg = first_region; reg != NULL; reg = reg->next)
48 if (!strcmp(reg->name, region_name)) return reg; 46 if (!strcmp (reg->name, region_name))
49 47 return reg;
48
50 for (reg=first_region;reg!=NULL;reg=reg->next) { 49 for (reg = first_region; reg != NULL; reg = reg->next)
50 {
51 if (reg->fallback) { 51 if (reg->fallback)
52 {
52 LOG(llevDebug,"region called %s requested, but not found, fallback used.\n", region_name); 53 LOG (llevDebug, "region called %s requested, but not found, fallback used.\n", region_name);
53 return reg; 54 return reg;
54 } 55 }
55 } 56 }
56 LOG(llevInfo,"Got no region or fallback for region %s.\n", region_name); 57 LOG (llevInfo, "Got no region or fallback for region %s.\n", region_name);
57 return NULL; 58 return NULL;
58} 59}
59 60
60/* This might need optimising at some point. */ 61/* This might need optimising at some point. */
61region *get_region_by_map(mapstruct *m) { 62region *
63get_region_by_map (maptile *m)
64{
62 return get_region_by_name(get_name_of_region_for_map(m)); 65 return get_region_by_name (get_name_of_region_for_map (m));
63} 66}
64 67
65/* 68/*
66 * Since we won't assume all maps have a region set properly, we need an 69 * Since we won't assume all maps have a region set properly, we need an
67 * explicit check that it is, this is much nicer here than scattered throughout 70 * explicit check that it is, this is much nicer here than scattered throughout
68 * the map code. 71 * the map code.
69 */ 72 */
70 73
74const char *
71const char *get_name_of_region_for_map(const mapstruct *m) { 75get_name_of_region_for_map (const maptile *m)
76{
72 region *reg; 77 region *reg;
73 if (m->region!=NULL) return m->region->name; 78
79 if (m->region)
80 return m->region->name;
81
74 for (reg=first_region;reg!=NULL;reg=reg->next) { 82 for (reg = first_region; reg != NULL; reg = reg->next)
75 if (reg->fallback) return reg->name; 83 {
76 } 84 if (reg->fallback)
85 return reg->name;
86 }
87
77 LOG(llevInfo,"map %s had no region and I couldn't find a fallback to use.\n", m->name); 88 LOG (llevInfo, "map %s had no region and I couldn't find a fallback to use.\n", &m->name);
78 return "unknown"; 89 return "unknown";
79} 90}
80 91
81/* 92/*
82 * Tries to find a region that 'name' corresponds to. 93 * Tries to find a region that 'name' corresponds to.
83 * It looks, in order, for: 94 * It looks, in order, for:
88 * if it can find none of these it returns the first parentless region 99 * if it can find none of these it returns the first parentless region
89 * (there should be only one of these - the top level one) 100 * (there should be only one of these - the top level one)
90 * If we got a NULL, then just return the top level region 101 * If we got a NULL, then just return the top level region
91 * 102 *
92 */ 103 */
104region *
93region *get_region_from_string(const char *name) { 105get_region_from_string (const char *name)
106{
94 region *reg; 107 region *reg;
95 char *substr; 108 char *substr;
96 char *p; 109 char *p;
110
111 if (name == NULL)
97 112 {
98 if (name==NULL) {
99 for (reg=first_region;reg->parent!=NULL;reg=reg->parent); 113 for (reg = first_region; reg->parent != NULL; reg = reg->parent);
100 return reg; 114 return reg;
101 } 115 }
102 p = strchr(name, '\n'); 116 p = strchr (name, '\n');
117 if (p)
103 if (p) *p = '\0'; 118 *p = '\0';
104 for (reg=first_region;reg!=NULL;reg=reg->next) 119 for (reg = first_region; reg != NULL; reg = reg->next)
105 if (!strcasecmp(reg->name, name)) return reg; 120 if (!strcasecmp (reg->name, name))
106 121 return reg;
122
107 for (reg=first_region;reg!=NULL;reg=reg->next) 123 for (reg = first_region; reg != NULL; reg = reg->next)
108 if (reg->longname != NULL) { 124 if (reg->longname != NULL)
125 {
109 if (!strcasecmp(reg->longname, name)) return reg; 126 if (!strcasecmp (reg->longname, name))
110 } 127 return reg;
111 128 }
129
112 substr=NULL; 130 substr = NULL;
113 for (reg=first_region;reg!=NULL;reg=reg->next) 131 for (reg = first_region; reg != NULL; reg = reg->next)
114 if (reg->longname != NULL) { 132 if (reg->longname != NULL)
133 {
115 substr=strstr(reg->longname, name); 134 substr = strstr (reg->longname, name);
116 if (substr != NULL) return reg; 135 if (substr != NULL)
117 } 136 return reg;
137 }
118 for (reg=first_region;reg!=NULL;reg=reg->next) 138 for (reg = first_region; reg != NULL; reg = reg->next)
119 if (reg->longname != NULL) { 139 if (reg->longname != NULL)
120 /* 140 {
141 /*
121 * This is not a bug, we want the region that is most identifiably a discrete 142 * This is not a bug, we want the region that is most identifiably a discrete
122 * area in the game, eg if we have 'scor', we want to return 'scorn' and not 143 * area in the game, eg if we have 'scor', we want to return 'scorn' and not
123 * 'scornarena', regardless of their order on the list so we only look at those 144 * 'scornarena', regardless of their order on the list so we only look at those
124 * regions with a longname set. 145 * regions with a longname set.
125 */ 146 */
126 substr=strstr(reg->name, name); 147 substr = strstr (reg->name, name);
127 if (substr != NULL) return reg; 148 if (substr != NULL)
128 } 149 return reg;
150 }
129 for (reg=first_region;reg!=NULL;reg=reg->next) { 151 for (reg = first_region; reg != NULL; reg = reg->next)
152 {
130 substr=strstr(reg->name, name); 153 substr = strstr (reg->name, name);
131 if (substr != NULL) return reg; 154 if (substr != NULL)
155 return reg;
132 } 156 }
133 /* if we are still here, we are going to have to give up, and give the top level region */ 157 /* if we are still here, we are going to have to give up, and give the top level region */
134 for (reg=first_region;reg->parent!=NULL;reg=reg->parent); 158 for (reg = first_region; reg->parent != NULL; reg = reg->parent);
135 return reg; 159 return reg;
136} 160}
137 161
138/* 162/*
139 * returns 1 if the player is in the region reg, or a child region thereof 163 * returns 1 if the player is in the region reg, or a child region thereof
140 * otherwise returns 0 164 * otherwise returns 0
141 * if passed a NULL region returns -1 165 * if passed a NULL region returns -1
142 */ 166 */
143 167
168int
144int region_is_child_of_region(const region *child, const region *r) { 169region_is_child_of_region (const region * child, const region * r)
145 170{
171
146 if (r==NULL) 172 if (r == NULL)
147 return -1; 173 return -1;
148 if (child == NULL) 174 if (child == NULL)
149 return 0; 175 return 0;
150 if (!strcmp(child->name, r->name)) 176 if (!strcmp (child->name, r->name))
151 return 1; 177 return 1;
152 else if(child->parent!=NULL) 178 else if (child->parent != NULL)
153 return region_is_child_of_region(child->parent,r); 179 return region_is_child_of_region (child->parent, r);
180 else
154 else return 0; 181 return 0;
155} 182}
156 183
157/* 184/*
158 * the longname of a region is not a required field, any given region 185 * the longname of a region is not a required field, any given region
159 * may want to not set it and use the parent's one instead. so, we: 186 * may want to not set it and use the parent's one instead. so, we:
160 * 1. check if a longname is set and if so return it. 187 * 1. check if a longname is set and if so return it.
161 * 2. check if there is a parent and try and call the function against that 188 * 2. check if there is a parent and try and call the function against that
162 * 3. return a obviously wrong string if we can't get a longname, this should 189 * 3. return a obviously wrong string if we can't get a longname, this should
163 * never happen. We also log a debug message. 190 * never happen. We also log a debug message.
164 */ 191 */
192const char *
165const char *get_region_longname(const region *r) { 193get_region_longname (const region * r)
166 194{
195
167 if (r->longname!=NULL) 196 if (r->longname != NULL)
168 return r->longname; 197 return r->longname;
169 else if(r->parent!=NULL) 198 else if (r->parent != NULL)
170 return get_region_longname(r->parent); 199 return get_region_longname (r->parent);
171 else { 200 else
201 {
172 LOG(llevDebug,"NOTICE region %s has no parent and no longname.\n", r->name); 202 LOG (llevDebug, "NOTICE region %s has no parent and no longname.\n", r->name);
173 return "no name can be found for the current region"; 203 return "no name can be found for the current region";
174 } 204 }
175} 205}
176 206
207const char *
177const char *get_region_msg(const region *r) { 208get_region_msg (const region * r)
209{
178 if (r->msg!=NULL) 210 if (r->msg != NULL)
179 return r->msg; 211 return r->msg;
180 else if(r->parent!=NULL) 212 else if (r->parent != NULL)
181 return get_region_msg(r->parent); 213 return get_region_msg (r->parent);
182 else { 214 else
215 {
183 LOG(llevDebug,"NOTICE region %s has no parent and no msg.\n", r->name); 216 LOG (llevDebug, "NOTICE region %s has no parent and no msg.\n", r->name);
184 return "no description can be found for the current region"; 217 return "no description can be found for the current region";
185 } 218 }
186} 219}
187 220
188/** Returns an object which is an exit through which the player represented by op should be 221/** Returns an object which is an exit through which the player represented by op should be
189 * sent in order to be imprisoned. If there is no suitable place to which an exit can be 222 * sent in order to be imprisoned. If there is no suitable place to which an exit can be
190 * constructed, then NULL will be returned. The caller is responsible for freeing the object 223 * constructed, then NULL will be returned. The caller is responsible for freeing the object
191 * created by this function. 224 * created by this function.
192 */ 225 */
226object *
193object *get_jail_exit(object *op) { 227get_jail_exit (object *op)
228{
194 region *reg; 229 region *reg;
195 object *exit; 230 object *exit;
231
196 if (op->type != PLAYER) { 232 if (op->type != PLAYER)
233 {
197 LOG(llevError, "region.c: get_jail_exit called against non-player object.\n"); 234 LOG (llevError, "region.c: get_jail_exit called against non-player object.\n");
198 return NULL; 235 return NULL;
199 } 236 }
200 reg=get_region_by_map(op->map); 237 reg = get_region_by_map (op->map);
201 while (reg!=NULL) { 238 while (reg != NULL)
239 {
202 if (reg->jailmap) { 240 if (reg->jailmap)
203 exit=get_object(); 241 {
242 exit = object::create ();
204 EXIT_PATH(exit)=add_string(reg->jailmap); 243 EXIT_PATH (exit) = reg->jailmap;
205 /* damned exits reset savebed and remove teleports, so the prisoner can't escape */ 244 /* damned exits reset savebed and remove teleports, so the prisoner can't escape */
206 SET_FLAG(exit, FLAG_DAMNED); 245 SET_FLAG (exit, FLAG_DAMNED);
207 EXIT_X(exit) = reg->jailx; 246 EXIT_X (exit) = reg->jailx;
208 EXIT_Y(exit) = reg->jaily; 247 EXIT_Y (exit) = reg->jaily;
209 return exit; 248 return exit;
210 } 249 }
211 else reg=reg->parent; 250 else
251 reg = reg->parent;
212 } 252 }
213 LOG(llevDebug,"No suitable jailmap for region %s was found.\n", reg->name); 253 LOG (llevDebug, "No suitable jailmap for region %s was found.\n", reg->name);
214 return NULL; 254 return NULL;
215} 255}
216 256
217/* 257/*
218 * First initialises the archtype hash-table (init_archetable()). 258 * First initialises the archtype hash-table (init_archetable()).
219 * Reads and parses the archetype file (with the first and second-pass 259 * Reads and parses the archetype file (with the first and second-pass
220 * functions). 260 * functions).
221 * Then initialises treasures by calling load_treasures(). 261 * Then initialises treasures by calling load_treasures().
222 */ 262 */
263void
223void init_regions(void) { 264init_regions (void)
265{
224 FILE *fp; 266 FILE *fp;
225 char filename[MAX_BUF]; 267 char filename[MAX_BUF];
226 int comp; 268 int comp;
227 269
228 if(first_region!=NULL) /* Only do this once */ 270 if (first_region != NULL) /* Only do this once */
229 return; 271 return;
230 272
231 sprintf(filename,"%s/%s/%s",settings.datadir,settings.mapdir,settings.regions); 273 sprintf (filename, "%s/%s/%s", settings.datadir, settings.mapdir, settings.regions);
232 LOG(llevDebug,"Reading regions from %s...\n",filename); 274 LOG (llevDebug, "Reading regions from %s...\n", filename);
233 if((fp=open_and_uncompress(filename,0,&comp))==NULL) { 275 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
276 {
234 LOG(llevError," Can't open regions file %s in init_regions.\n", filename); 277 LOG (llevError, " Can't open regions file %s in init_regions.\n", filename);
235 return; 278 return;
236 } 279 }
237 parse_regions(fp); 280 parse_regions (fp);
238 assign_region_parents(); 281 assign_region_parents ();
239 LOG(llevDebug," done\n"); 282 LOG (llevDebug, " done\n");
240 283
241 close_and_delete(fp, comp); 284 close_and_delete (fp, comp);
242} 285}
243 286
244/* 287/*
245 * Allocates and zeros a region struct, this isn't free()'d anywhere, so might 288 * Allocates and zeros a region struct, this isn't free()'d anywhere, so might
246 * be a memory leak, but it shouldn't matter too much since it isn't called that 289 * be a memory leak, but it shouldn't matter too much since it isn't called that
247 * often.... 290 * often....
248 */ 291 */
249 292
293region *
250region *get_region_struct(void) { 294get_region_struct (void)
251 295{
252 region *reg; 296 return new region;
253
254 reg=(region *)CALLOC(1,sizeof(region));
255 if(reg==NULL)
256 fatal(OUT_OF_MEMORY);
257
258 memset(reg, '\0', sizeof(region));
259
260 return reg;
261} 297}
262 298
263/* 299/*
264 * Reads/parses the region file, and copies into a linked list 300 * Reads/parses the region file, and copies into a linked list
265 * of region structs. 301 * of region structs.
266 */ 302 */
303void
267void parse_regions(FILE *fp) { 304parse_regions (FILE * fp)
305{
268 region *newreg; 306 region *newreg;
269 region *reg; 307 region *reg;
270 308
271 char buf[HUGE_BUF], msgbuf[HUGE_BUF], *key=NULL, *value, *end; 309 char buf[HUGE_BUF], msgbuf[HUGE_BUF], *key = NULL, *value, *end;
272 int msgpos=0; 310 int msgpos = 0;
273 311
274 newreg = NULL; 312 newreg = NULL;
275 while (fgets(buf, HUGE_BUF-1, fp)!=NULL) { 313 while (fgets (buf, HUGE_BUF - 1, fp) != NULL)
314 {
276 buf[HUGE_BUF-1] = 0; 315 buf[HUGE_BUF - 1] = 0;
277 key = buf; 316 key = buf;
278 while (isspace(*key)) key++; 317 while (isspace (*key))
279 if (*key == 0) continue; /* empty line */ 318 key++;
319 if (*key == 0)
320 continue; /* empty line */
280 value = strchr(key, ' '); 321 value = strchr (key, ' ');
281 if (!value) { 322 if (!value)
323 {
282 end = strchr(key, '\n'); 324 end = strchr (key, '\n');
283 *end=0; 325 *end = 0;
284 } else { 326 }
327 else
328 {
285 *value = 0; 329 *value = 0;
286 value++; 330 value++;
287 while (isspace(*value)) value++; 331 while (isspace (*value))
332 value++;
288 end = strchr(value, '\n'); 333 end = strchr (value, '\n');
289 } 334 }
290 335
291 /* 336 /*
292 * This is a bizzare mutated form of the map and archetype parser 337 * This is a bizzare mutated form of the map and archetype parser
293 * rolled into one. Key is the field name, value is what it should 338 * rolled into one. Key is the field name, value is what it should
294 * be set to. 339 * be set to.
295 * We've already done the work to null terminate key, 340 * We've already done the work to null terminate key,
296 * and strip off any leading spaces for both of these. 341 * and strip off any leading spaces for both of these.
297 * We have not touched the newline at the end of the line - 342 * We have not touched the newline at the end of the line -
298 * these might be needed for some values. the end pointer 343 * these might be needed for some values. the end pointer
299 * points to the first of the newlines. 344 * points to the first of the newlines.
300 * value could be NULL! It would be easy enough to just point 345 * value could be NULL! It would be easy enough to just point
301 * this to "" to prevent cores, but that would let more errors slide 346 * this to "" to prevent cores, but that would let more errors slide
302 * through. 347 * through.
303 */ 348 */
304 if (!strcmp(key,"region")) { 349 if (!strcmp (key, "region"))
305 *end=0; 350 {
351 *end = 0;
306 newreg=get_region_struct(); 352 newreg = get_region_struct ();
307 newreg->name = strdup_local(value); 353 newreg->name = strdup (value);
308 } 354 }
309 else if (!strcmp(key,"parent")) { 355 else if (!strcmp (key, "parent"))
310 /* 356 {
357 /*
311 * Note that this is in the initialisation code, so we don't actually 358 * Note that this is in the initialisation code, so we don't actually
312 * assign the pointer to the parent yet, because it might not have been 359 * assign the pointer to the parent yet, because it might not have been
313 * parsed. 360 * parsed.
314 */ 361 */
315 *end=0; 362 *end = 0;
316 newreg->parent_name = strdup_local(value); 363 newreg->parent_name = strdup (value);
317 } 364 }
318 else if (!strcmp(key,"longname")) { 365 else if (!strcmp (key, "longname"))
319 *end=0; 366 {
367 *end = 0;
320 newreg->longname = strdup_local(value); 368 newreg->longname = strdup (value);
321 } 369 }
322 else if (!strcmp(key,"jail")) { 370 else if (!strcmp (key, "jail"))
371 {
323 /* jail entries are of the form: /path/to/map x y */ 372 /* jail entries are of the form: /path/to/map x y */
324 char path[MAX_BUF]; 373 char path[MAX_BUF];
325 int x,y; 374 int x, y;
375
326 if (sscanf(value, "%[^ ] %d %d\n", path, &x, &y) != 3) { 376 if (sscanf (value, "%[^ ] %d %d\n", path, &x, &y) != 3)
377 {
327 LOG(llevError, "region.c: malformated regions entry: jail %s\n", value); 378 LOG (llevError, "region.c: malformated regions entry: jail %s\n", value);
328 continue; 379 continue;
329 } 380 }
330 newreg->jailmap = strdup_local(path); 381 newreg->jailmap = strdup (path);
331 newreg->jailx = x; 382 newreg->jailx = x;
332 newreg->jaily = y; 383 newreg->jaily = y;
333 } 384 }
334 else if (!strcmp(key,"msg")) { 385 else if (!strcmp (key, "msg"))
386 {
335 while (fgets(buf, HUGE_BUF-1, fp)!=NULL) { 387 while (fgets (buf, HUGE_BUF - 1, fp) != NULL)
336 if (!strcmp(buf,"endmsg\n")) break; 388 {
337 else { 389 if (!strcmp (buf, "endmsg\n"))
390 break;
391 else
392 {
338 strcpy(msgbuf+msgpos, buf); 393 strcpy (msgbuf + msgpos, buf);
339 msgpos += strlen(buf); 394 msgpos += strlen (buf);
340 } 395 }
341 } 396 }
342 /* 397 /*
343 * There may be regions with empty messages (eg, msg/endmsg 398 * There may be regions with empty messages (eg, msg/endmsg
344 * with nothing between). When maps are loaded, this is done 399 * with nothing between). When maps are loaded, this is done
345 * so better do it here too... 400 * so better do it here too...
346 */ 401 */
347 if (msgpos != 0) 402 if (msgpos != 0)
348 newreg->msg = strdup_local(msgbuf); 403 newreg->msg = strdup (msgbuf);
349 404
350 /* we have to reset msgpos, or the next region will store both msg blocks.*/ 405 /* we have to reset msgpos, or the next region will store both msg blocks. */
351 msgpos=0; 406 msgpos = 0;
352 } 407 }
353 else if (!strcmp(key,"fallback")) { 408 else if (!strcmp (key, "fallback"))
354 *end=0; 409 {
410 *end = 0;
355 newreg->fallback = atoi(value); 411 newreg->fallback = atoi (value);
356 } 412 }
357 else if (!strcmp(key,"end")) { 413 else if (!strcmp (key, "end"))
414 {
358 /* Place this new region last on the list, if the list is empty put it first */ 415 /* Place this new region last on the list, if the list is empty put it first */
359 for (reg=first_region;reg!=NULL&&reg->next!=NULL;reg=reg->next); 416 for (reg = first_region; reg != NULL && reg->next != NULL; reg = reg->next);
360 417
361 if (reg==NULL) first_region=newreg; 418 if (reg == NULL)
362 else reg->next=newreg; 419 first_region = newreg;
420 else
421 reg->next = newreg;
363 newreg = NULL; 422 newreg = NULL;
364 } 423 }
365 else if (!strcmp(key,"nomore")) { 424 else if (!strcmp (key, "nomore"))
425 {
366 /* we have reached the end of the region specs....*/ 426 /* we have reached the end of the region specs.... */
367 break; 427 break;
368 } 428 }
369 else { 429 else
430 {
370 /* we should never get here, if we have, then something is wrong */ 431 /* we should never get here, if we have, then something is wrong */
371 LOG(llevError, "Got unknown value in region file: %s %s\n", key, value); 432 LOG (llevError, "Got unknown value in region file: %s %s\n", key, value);
372 } 433 }
373 } 434 }
374 if (!key || strcmp(key,"nomore")) 435 if (!key || strcmp (key, "nomore"))
375 LOG(llevError, "Got premature eof on regions file!\n"); 436 LOG (llevError, "Got premature eof on regions file!\n");
376} 437}
377 438
439void
378void assign_region_parents(void) { 440assign_region_parents (void)
441{
379 region *reg; 442 region *reg;
380 uint32 parent_count=0; 443 uint32 parent_count = 0;
381 uint32 region_count=0; 444 uint32 region_count = 0;
445
382 for (reg=first_region;reg!=NULL&&reg->next!=NULL;reg=reg->next) { 446 for (reg = first_region; reg != NULL && reg->next != NULL; reg = reg->next)
447 {
383 if (reg->parent_name!=NULL) { 448 if (reg->parent_name != NULL)
449 {
384 reg->parent=get_region_by_name(reg->parent_name); 450 reg->parent = get_region_by_name (reg->parent_name);
385 parent_count++; 451 parent_count++;
386 } 452 }
387 region_count++; 453 region_count++;
388 } 454 }
389 LOG(llevDebug, "Assigned %u regions with %u parents.", region_count, parent_count); 455 LOG (llevDebug, "Assigned %u regions with %u parents.\n", region_count, parent_count);
390} 456}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines