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.2 by root, Tue Aug 29 08:01:36 2006 UTC vs.
Revision 1.17 by root, Thu Jan 25 03:54:44 2007 UTC

1/* 1/*
2 * static char *rcsid_map_c =
3 * "$Id: region.C,v 1.2 2006/08/29 08:01:36 root Exp $";
4 */
5
6/*
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
14 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version. 11 * (at your option) any later version.
16 12 *
17 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details. 16 * GNU General Public License for more details.
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->default_region)
80 return m->default_region->name;
81
74 for (reg=first_region;reg!=NULL;reg=reg->next) { 82 for (reg = first_region; reg; 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))
127 return reg;
110 } 128 }
111 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)
136 return reg;
117 } 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)
140 {
120 /* 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)
149 return reg;
128 } 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 }
250 else
211 else reg=reg->parent; 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;
326 }
284 } else { 327 else
328 {
285 *value = 0; 329 *value = 0;
330 value++;
331 while (isspace (*value))
286 value++; 332 value++;
287 while (isspace(*value)) value++;
288 end = strchr(value, '\n'); 333 end = strchr (value, '\n');
289 }
290 334 }
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"))
350 {
305 *end=0; 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"))
356 {
310 /* 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"))
366 {
319 *end=0; 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)
388 {
336 if (!strcmp(buf,"endmsg\n")) break; 389 if (!strcmp (buf, "endmsg\n"))
390 break;
337 else { 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"))
409 {
354 *end=0; 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
418 if (reg == NULL)
361 if (reg==NULL) first_region=newreg; 419 first_region = newreg;
420 else
362 else reg->next=newreg; 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;
428 }
429 else
368 } 430 {
369 else {
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