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.5 by root, Tue Jan 9 21:32:42 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));
186 194
187 if (obj->self) 195 if (obj->self)
188 { 196 {
189 // the hard way(?) 197 // the hard way(?)
190 198
191 // the dirty blues: "just" swap the XPVHV's 199 CALL_BEGIN (2);
192 swap (SvANY (obj->self), SvANY (hv)); 200 CALL_ARG_SV (newRV_inc ((SV *)obj->self));
193 201 CALL_ARG_SV (newRV_inc ((SV *)hv));
194 // do not swap magic, though 202 PUTBACK;
195 swap (SvMAGIC (obj->self), SvMAGIC (hv)); 203 call_method ("thawer_merge", G_DISCARD | G_EVAL);
204 SPAGAIN;
205 CALL_END;
196 } 206 }
197 else 207 else
198 { 208 {
199 // the easy way(?) 209 // the easy way(?)
200 210
201 obj->self = hv; 211 obj->self = hv;
202 SvRV_set (*svp, &PL_sv_undef); 212 SvRV_set (*svp, &PL_sv_undef);
203 213
204 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);
205
206 // borrow a refcount for the perl object
207 obj->flags |= attachable::F_BORROWED;
208 obj->refcnt_dec ();
209 } 215 }
210 216
211 obj->reattach (); 217 obj->reattach ();
212} 218}
213 219
217 if (av) SvREFCNT_dec (av); 223 if (av) SvREFCNT_dec (av);
218 224
219 free ((void *)name); 225 free ((void *)name);
220} 226}
221 227
228//TODO: remove
222char * 229char *
223fgets (char *s, int n, object_thawer &thawer) 230fgets (char *s, int n, object_thawer &thawer)
224{ 231{
225 char *p = thawer.line; 232 char *p = thawer.line;
226 char *q = s; 233 char *q = s;
234 break; 241 break;
235 242
236 *q++ = *p; 243 *q++ = *p;
237 244
238 if (*p++ == '\n') 245 if (*p++ == '\n')
246 {
247 ++thawer.linenum;
239 break; 248 break;
249 }
240 } 250 }
241 251
242 *q = 0; 252 *q = 0;
243 thawer.line = p; 253 thawer.line = p;
244 254
245 return s == q ? 0 : s; 255 return s == q ? 0 : s;
246} 256}
247 257
248keyword 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
249object_thawer::get_kv () 290object_thawer::next ()
250{ 291{
251 if (!line) 292 if (!line)
252 return KW_EOF; 293 {
294 kw = KW_ERROR;
295 return;
296 }
253 297
254 for (;;) 298 for (;;)
255 { 299 {
256 char *p = line; 300 char *p = line;
257 301
258 if (!*p) 302 if (!*p)
259 return KW_EOF; 303 {
304 kw = KW_EOF;
305 break;
306 }
260 307
261 // parse keyword 308 // parse keyword
262 while (*p > ' ') 309 while (*p > ' ')
263 p++; 310 p++;
264 311
268 { 315 {
269 // parse value 316 // parse value
270 while (*(unsigned char *)p <= ' ' && *p != '\n') // skip 0x01 .. 0x20 317 while (*(unsigned char *)p <= ' ' && *p != '\n') // skip 0x01 .. 0x20
271 ++p; 318 ++p;
272 319
273 last_value = p; 320 value = p;
274 321
275 while (*p != '\n') 322 while (*p != '\n')
276 p++; 323 p++;
277 324
278 *p++ = 0; 325 *p++ = 0;
279 } 326 }
280 else 327 else
281 last_value = 0; 328 value = 0;
282 329
330 ++linenum;
283 line [klen] = 0; 331 line [klen] = 0;
284 keyword_idx *kw = kw_lex::match (line, klen); 332 keyword_idx *kw_idx = kw_lex::match (line, klen);
285 333
286 //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
287 335
288 last_keyword = line; 336 kw_str = line;
289 line = p; 337 line = p;
290 338
291 if (kw) 339 if (kw_idx)
292 return kw->index; 340 {
341 kw = kw_idx->index;
342 break;
343 }
293 else if (!*last_keyword || *last_keyword == '#') 344 else if (!*kw_str || *kw_str == '#')
294 ; // empty/comment line 345 ; // empty/comment line
295 else 346 else
347 {
296 return KW_ERROR; 348 kw = KW_ERROR;
349 break;
350 }
297 } 351 }
298} 352}
299 353
300void 354void
301object_thawer::skip_kv (keyword kw) 355object_thawer::skip ()
302{ 356{
303 shstr ml; 357 shstr ml;
304 358
305 switch (kw) 359 switch (kw)
306 { 360 {
307 case KW_msg: get_ml (KW_endmsg , ml); break; 361 case KW_msg: get_ml (KW_endmsg , ml); break;
308 case KW_lore: get_ml (KW_endlore , ml); break; 362 case KW_lore: get_ml (KW_endlore , ml); break;
309 case KW_maplore: get_ml (KW_endmaplore, ml); break; 363 case KW_maplore: get_ml (KW_endmaplore, ml); break;
364 default: break;
310 } 365 }
366
367 next ();
311} 368}
312 369
313void 370void
314object_thawer::get (shstr &sh) const 371object_thawer::get (shstr &sh) const
315{ 372{
316 if (last_value) 373 if (value)
317 sh = last_value; 374 sh = value;
318 else 375 else
319 { 376 {
320 sh = "<value missing>"; 377 sh = "<value missing>";
321 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
322 } 379 }
323} 380}
324 381
325void 382void
326object_thawer::get_ml (keyword kend, shstr &sh) 383object_thawer::get_ml (keyword kend, shstr &sh)
332 kw [0] = '\n'; 389 kw [0] = '\n';
333 memcpy (kw + 1, keyword_str [kend], klen); 390 memcpy (kw + 1, keyword_str [kend], klen);
334 kw [klen + 1] = '\n'; 391 kw [klen + 1] = '\n';
335 kw [klen + 2] = 0; 392 kw [klen + 2] = 0;
336 393
394 ++linenum;
395
337 // first test for completely empty msg... "endXXX\n" 396 // first test for completely empty msg... "endXXX\n"
338 if (!strncmp (line, kw + 1, klen + 1)) 397 if (!strncmp (line, kw + 1, klen + 1))
339 { 398 {
340 sh = 0; 399 sh = 0;
341 400
356 } 415 }
357 416
358 *end = 0; 417 *end = 0;
359 sh = line; 418 sh = line;
360 419
420 // count line numbers
421 while (line < end)
422 linenum += *line++ == '\n';
423
361 line = end + keyword_len [kend] + 1; 424 line += keyword_len [kend];
362 425
363 while (*line++ != '\n') 426 while (*line++ != '\n')
364 ; 427 ;
428
429 ++linenum;
365 } 430 }
366} 431}
367 432
368sint32 433sint32
369object_thawer::get_sint32 () const 434object_thawer::get_sint32 () const
370{ 435{
371 char *p = last_value; 436 char *p = value;
372 437
373 if (!p) 438 if (!p)
374 return 0; 439 return 0;
375 440
376 sint32 val = 0; 441 sint32 val = 0;
395} 460}
396 461
397sint64 462sint64
398object_thawer::get_sint64 () const 463object_thawer::get_sint64 () const
399{ 464{
400 return last_value ? atoll (last_value) : 0; 465 return value ? atoll (value) : 0;
401} 466}
402 467
403double 468double
404object_thawer::get_double () const 469object_thawer::get_double () const
405{ 470{
406 return last_value ? atof (last_value) : 0; 471 return value ? atof (value) : 0;
407} 472}
408 473

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines