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

Comparing deliantra/server/server/freezethaw.C (file contents):
Revision 1.6 by root, Sun Jan 14 02:00:37 2007 UTC vs.
Revision 1.14 by pippijn, Fri Mar 2 10:15:40 2007 UTC

61 CALL_ARG_SV (newSVpv (path, 0)); 61 CALL_ARG_SV (newSVpv (path, 0));
62 CALL_ARG_SV (newRV_noinc (newSVpvn ((char *)linearise (), size ()))); 62 CALL_ARG_SV (newRV_noinc (newSVpvn ((char *)linearise (), size ())));
63 CALL_ARG_SV (newRV_inc ((SV *)av)); 63 CALL_ARG_SV (newRV_inc ((SV *)av));
64 CALL_CALL ("cf::object_freezer_save", G_VOID | G_DISCARD); 64 CALL_CALL ("cf::object_freezer_save", G_VOID | G_DISCARD);
65 CALL_END; 65 CALL_END;
66
67 return 1;
66} 68}
67 69
68char * 70char *
69object_freezer::as_string () 71object_freezer::as_string ()
70{ 72{
80 CALL_END; 82 CALL_END;
81 83
82 return res; 84 return res;
83} 85}
84 86
85int 87void
86fprintf (object_freezer &freezer, const char *format, ...) 88fprintf (object_freezer &freezer, const char *format, ...)
87{ 89{
88 va_list ap; 90 va_list ap;
89 91
90 va_start (ap, format); 92 va_start (ap, format);
95 freezer.alloc (len); 97 freezer.alloc (len);
96 98
97 va_end (ap); 99 va_end (ap);
98} 100}
99 101
100int 102// XXX: function not returning an int
103void
101fputs (const char *s, object_freezer &freezer) 104fputs (const char *s, object_freezer &freezer)
102{ 105{
103 freezer.add (s); 106 freezer.add (s);
104} 107}
105 108
108object_thawer::object_thawer (const char *path) 111object_thawer::object_thawer (const char *path)
109: name (strdup (path)) 112: name (strdup (path))
110{ 113{
111 static const char eof[] = "\n\n\n\0\0\0"; 114 static const char eof[] = "\n\n\n\0\0\0";
112 115
113 av = 0; 116 av = 0;
114 text = 0; 117 text = 0;
115 line = 0; 118 line = 0;
119 linenum = 0;
120
121 kw = KW_ERROR;
122 kw_str = 0;
123 value = 0;
116 124
117 if (path) 125 if (path)
118 { 126 {
119 CALL_BEGIN (1); 127 CALL_BEGIN (1);
120 CALL_ARG_SV (newSVpv (path, 0)); 128 CALL_ARG_SV (newSVpv (path, 0));
202 210
203 obj->self = hv; 211 obj->self = hv;
204 SvRV_set (*svp, &PL_sv_undef); 212 SvRV_set (*svp, &PL_sv_undef);
205 213
206 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 214 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
207
208 // borrow a refcount for the perl object
209 obj->flags |= attachable::F_BORROWED;
210 obj->refcnt_dec ();
211 } 215 }
212 216
213 obj->reattach (); 217 obj->reattach ();
214} 218}
215 219
219 if (av) SvREFCNT_dec (av); 223 if (av) SvREFCNT_dec (av);
220 224
221 free ((void *)name); 225 free ((void *)name);
222} 226}
223 227
228//TODO: remove
224char * 229char *
225fgets (char *s, int n, object_thawer &thawer) 230fgets (char *s, int n, object_thawer &thawer)
226{ 231{
227 char *p = thawer.line; 232 char *p = thawer.line;
228 char *q = s; 233 char *q = s;
236 break; 241 break;
237 242
238 *q++ = *p; 243 *q++ = *p;
239 244
240 if (*p++ == '\n') 245 if (*p++ == '\n')
246 {
247 ++thawer.linenum;
241 break; 248 break;
249 }
242 } 250 }
243 251
244 *q = 0; 252 *q = 0;
245 thawer.line = p; 253 thawer.line = p;
246 254
247 return s == q ? 0 : s; 255 return s == q ? 0 : s;
248} 256}
249 257
250keyword 258bool
259object_thawer::parse_error (const char *type, const char *name, bool skip)
260{
261 if (!type) type = "file section";
262 if (!name) name = "generic";
263
264 switch (kw)
265 {
266 case KW_EOF:
267 LOG (llevError, "%s:%d end of file while reading %s '%s', aborting load.\n",
268 this->name, linenum, type, name);
269 return false;
270
271 case KW_ERROR:
272 LOG (llevError, "%s:%d error while reading %s '%s', at '%s', aborting load.\n",
273 this->name, linenum,
274 type, name,
275 kw_str ? kw_str : "<file load>");
276 return false;
277
278 default:
279 LOG (llevError, "%s:%d unexpected line (%s %s) while reading %s '%s', %s.\n",
280 this->name, linenum,
281 kw_str ? kw_str : "<null>",
282 value ? value : "<null>",
283 type, name,
284 skip ? "skipping line" : "aborting load");
285 return skip;
286 }
287}
288
289void
251object_thawer::get_kv () 290object_thawer::next ()
252{ 291{
253 if (!line) 292 if (!line)
254 return KW_EOF; 293 {
294 kw = KW_ERROR;
295 return;
296 }
255 297
256 for (;;) 298 for (;;)
257 { 299 {
258 char *p = line; 300 char *p = line;
259 301
260 if (!*p) 302 if (!*p)
261 return KW_EOF; 303 {
304 kw = KW_EOF;
305 break;
306 }
262 307
263 // parse keyword 308 // parse keyword
264 while (*p > ' ') 309 while (*p > ' ')
265 p++; 310 p++;
266 311
270 { 315 {
271 // parse value 316 // parse value
272 while (*(unsigned char *)p <= ' ' && *p != '\n') // skip 0x01 .. 0x20 317 while (*(unsigned char *)p <= ' ' && *p != '\n') // skip 0x01 .. 0x20
273 ++p; 318 ++p;
274 319
275 last_value = p; 320 value = p;
276 321
277 while (*p != '\n') 322 while (*p != '\n')
278 p++; 323 p++;
279 324
280 *p++ = 0; 325 *p++ = 0;
281 } 326 }
282 else 327 else
283 last_value = 0; 328 value = 0;
284 329
330 ++linenum;
285 line [klen] = 0; 331 line [klen] = 0;
286 keyword_idx *kw = kw_lex::match (line, klen); 332 keyword_idx *kw_idx = kw_lex::match (line, klen);
287 333
288 //printf ("KV %d<%s,%s>\n", kw ? kw->index : 0, line, last_value);//D 334 //printf ("KV %d<%s,%s>\n", kw ? kw->index : 0, line, value);//D
289 335
290 last_keyword = line; 336 kw_str = line;
291 line = p; 337 line = p;
292 338
293 if (kw) 339 if (kw_idx)
294 return kw->index; 340 {
341 kw = kw_idx->index;
342 break;
343 }
295 else if (!*last_keyword || *last_keyword == '#') 344 else if (!*kw_str || *kw_str == '#')
296 ; // empty/comment line 345 ; // empty/comment line
297 else 346 else
347 {
298 return KW_ERROR; 348 kw = KW_ERROR;
349 break;
350 }
299 } 351 }
300} 352}
301 353
302void 354void
303object_thawer::skip_kv (keyword kw) 355object_thawer::skip ()
304{ 356{
305 shstr ml; 357 shstr ml;
306 358
307 switch (kw) 359 switch (kw)
308 { 360 {
309 case KW_msg: get_ml (KW_endmsg , ml); break; 361 case KW_msg: get_ml (KW_endmsg , ml); break;
310 case KW_lore: get_ml (KW_endlore , ml); break; 362 case KW_lore: get_ml (KW_endlore , ml); break;
311 case KW_maplore: get_ml (KW_endmaplore, ml); break; 363 case KW_maplore: get_ml (KW_endmaplore, ml); break;
364 default: break;
312 } 365 }
366
367 next ();
313} 368}
314 369
315void 370void
316object_thawer::get (shstr &sh) const 371object_thawer::get (shstr &sh) const
317{ 372{
318 if (last_value) 373 if (value)
319 sh = last_value; 374 sh = value;
320 else 375 else
321 { 376 {
322 sh = "<value missing>"; 377 sh = "<value missing>";
323 LOG (llevError, "keyword \"%s\" requires value, substituting with <value missing>\n", last_keyword);//TODO: add filename 378 LOG (llevError, "keyword \"%s\" requires value, substituting with <value missing>\n", kw_str);//TODO: add filename
324 } 379 }
325} 380}
326 381
327void 382void
328object_thawer::get_ml (keyword kend, shstr &sh) 383object_thawer::get_ml (keyword kend, shstr &sh)
334 kw [0] = '\n'; 389 kw [0] = '\n';
335 memcpy (kw + 1, keyword_str [kend], klen); 390 memcpy (kw + 1, keyword_str [kend], klen);
336 kw [klen + 1] = '\n'; 391 kw [klen + 1] = '\n';
337 kw [klen + 2] = 0; 392 kw [klen + 2] = 0;
338 393
394 ++linenum;
395
339 // first test for completely empty msg... "endXXX\n" 396 // first test for completely empty msg... "endXXX\n"
340 if (!strncmp (line, kw + 1, klen + 1)) 397 if (!strncmp (line, kw + 1, klen + 1))
341 { 398 {
342 sh = 0; 399 sh = 0;
343 400
358 } 415 }
359 416
360 *end = 0; 417 *end = 0;
361 sh = line; 418 sh = line;
362 419
420 // count line numbers
421 while (line < end)
422 linenum += *line++ == '\n';
423
363 line = end + keyword_len [kend] + 1; 424 line += keyword_len [kend];
364 425
365 while (*line++ != '\n') 426 while (*line++ != '\n')
366 ; 427 ;
428
429 ++linenum;
367 } 430 }
368} 431}
369 432
370sint32 433sint32
371object_thawer::get_sint32 () const 434object_thawer::get_sint32 () const
372{ 435{
373 char *p = last_value; 436 char *p = value;
374 437
375 if (!p) 438 if (!p)
376 return 0; 439 return 0;
377 440
378 sint32 val = 0; 441 sint32 val = 0;
397} 460}
398 461
399sint64 462sint64
400object_thawer::get_sint64 () const 463object_thawer::get_sint64 () const
401{ 464{
402 return last_value ? atoll (last_value) : 0; 465 return value ? atoll (value) : 0;
403} 466}
404 467
405double 468double
406object_thawer::get_double () const 469object_thawer::get_double () const
407{ 470{
408 return last_value ? atof (last_value) : 0; 471 return value ? atof (value) : 0;
409} 472}
410 473

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines