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.14 by pippijn, Fri Mar 2 10:15:40 2007 UTC vs.
Revision 1.20 by root, Sun May 27 23:14:37 2007 UTC

26#include "logger.h" 26#include "logger.h"
27#include "cfperl.h" 27#include "cfperl.h"
28#include "kw_hash.h" 28#include "kw_hash.h"
29 29
30object_freezer::object_freezer () 30object_freezer::object_freezer ()
31: dynbuf (128 * 1024, 64 * 1024) 31: dynbuf_text (128 * 1024, 64 * 1024)
32{ 32{
33 av = newAV (); 33 av = newAV ();
34} 34}
35 35
36object_freezer::~object_freezer () 36object_freezer::~object_freezer ()
82 CALL_END; 82 CALL_END;
83 83
84 return res; 84 return res;
85} 85}
86 86
87#if 0
87void 88void
88fprintf (object_freezer &freezer, const char *format, ...) 89fprintf (object_freezer &freezer, const char *format, ...)
89{ 90{
90 va_list ap; 91 va_list ap;
91 92
103void 104void
104fputs (const char *s, object_freezer &freezer) 105fputs (const char *s, object_freezer &freezer)
105{ 106{
106 freezer.add (s); 107 freezer.add (s);
107} 108}
109#endif
108 110
109static const char thawer_eof[] = "\n\n\n\0\0\0"; 111static const char thawer_eof[] = "\n\n\n\0\0\0";
110 112
111object_thawer::object_thawer (const char *path) 113object_thawer::object_thawer (const char *path)
112: name (strdup (path)) 114: name (strdup (path))
172 174
173 SV **svp = av_fetch ((AV *)av, oid, 0); 175 SV **svp = av_fetch ((AV *)av, oid, 0);
174 176
175 if (!svp || !SvROK (*svp)) 177 if (!svp || !SvROK (*svp))
176 { 178 {
177 printf ("trying to thaw duplicate or never-issued oid %d, ignoring.\n", oid); 179 LOG (llevError, "trying to thaw duplicate or never-issued oid %d, ignoring.\n", oid);
178 return; 180 return;
179 } 181 }
180 182
181 if (!SvROK (*svp)) 183 if (!SvROK (*svp))
182 { 184 {
183 LOG (llevError, "deserialised perl object is not an RV"); 185 LOG (llevError, "deserialised perl object is not an RV\n");
184 return; 186 return;
185 } 187 }
186 188
187 HV *hv = (HV *)SvRV (*svp); 189 HV *hv = (HV *)SvRV (*svp);
188 190
189 if (SvTYPE (hv) != SVt_PVHV) 191 if (SvTYPE (hv) != SVt_PVHV)
190 { 192 {
191 LOG (llevError, "deserialised perl object is not a PVHV"); 193 LOG (llevError, "deserialised perl object is not a PVHV\n");
192 return; 194 return;
193 } 195 }
194 196
195 if (obj->self) 197 if (obj->self)
196 { 198 {
297 299
298 for (;;) 300 for (;;)
299 { 301 {
300 char *p = line; 302 char *p = line;
301 303
304 if (*p <= ' ')
305 {
306 // skip whitespace (only some files need this)
307 while (*p == ' ' || *p == '\t')
308 p++;
309
310 line = p;
311 }
312
302 if (!*p) 313 if (!*p)
303 { 314 {
304 kw = KW_EOF; 315 kw = KW_EOF;
305 break; 316 break;
306 } 317 }
309 while (*p > ' ') 320 while (*p > ' ')
310 p++; 321 p++;
311 322
312 int klen = p - line; 323 int klen = p - line;
313 324
325 value_nn = "";
326 value = 0;
327
314 if (*p++ != '\n') 328 if (*p++ != '\n')
315 { 329 {
316 // parse value 330 // parse value
317 while (*(unsigned char *)p <= ' ' && *p != '\n') // skip 0x01 .. 0x20 331 while (*(unsigned char *)p <= ' ' && *p != '\n')
318 ++p; 332 ++p;
319 333
320 value = p; 334 value_nn = value = p;
321 335
322 while (*p != '\n') 336 while (*p != '\n')
323 p++; 337 p++;
324 338
325 *p++ = 0; 339 *p++ = 0;
326 } 340 }
327 else
328 value = 0;
329 341
330 ++linenum; 342 ++linenum;
331 line [klen] = 0; 343 line [klen] = 0;
332 keyword_idx *kw_idx = kw_lex::match (line, klen); 344 keyword_idx *kw_idx = kw_lex::match (line, klen);
333
334 //printf ("KV %d<%s,%s>\n", kw ? kw->index : 0, line, value);//D
335 345
336 kw_str = line; 346 kw_str = line;
337 line = p; 347 line = p;
338 348
339 if (kw_idx) 349 if (kw_idx)
366 376
367 next (); 377 next ();
368} 378}
369 379
370void 380void
371object_thawer::get (shstr &sh) const
372{
373 if (value)
374 sh = value;
375 else
376 {
377 sh = "<value missing>";
378 LOG (llevError, "keyword \"%s\" requires value, substituting with <value missing>\n", kw_str);//TODO: add filename
379 }
380}
381
382void
383object_thawer::get_ml (keyword kend, shstr &sh) 381object_thawer::get_ml (keyword kend, shstr &sh)
384{ 382{
385 char kw[128]; 383 char kw[128];
386 384
387 int klen = keyword_len [kend]; 385 int klen = keyword_len [kend];
431} 429}
432 430
433sint32 431sint32
434object_thawer::get_sint32 () const 432object_thawer::get_sint32 () const
435{ 433{
436 char *p = value; 434 char *p = value_nn;
437
438 if (!p)
439 return 0;
440 435
441 sint32 val = 0; 436 sint32 val = 0;
442 bool negate; 437 bool negate;
443 438
444 if (*p == '-') 439 if (*p == '-')
457 while (*p); 452 while (*p);
458 453
459 return negate ? -val : val; 454 return negate ? -val : val;
460} 455}
461 456
462sint64
463object_thawer::get_sint64 () const
464{
465 return value ? atoll (value) : 0;
466}
467
468double
469object_thawer::get_double () const
470{
471 return value ? atof (value) : 0;
472}
473

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines