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.22 by root, Sun Jul 1 05:00:20 2007 UTC vs.
Revision 1.25 by root, Tue Sep 4 05:43:22 2007 UTC

145 SvCUR_set (text, len); 145 SvCUR_set (text, len);
146 memcpy (SvPVX (text), sv_, len); 146 memcpy (SvPVX (text), sv_, len);
147 memcpy (SvEND (text), eof, sizeof (eof)); // just to be sure 147 memcpy (SvEND (text), eof, sizeof (eof)); // just to be sure
148 148
149 line = SvPVX (text); 149 line = SvPVX (text);
150 next ();
150 } 151 }
151 } 152 }
152 153
153 CALL_END; 154 CALL_END;
154 } 155 }
155} 156}
156 157
157object_thawer::object_thawer (const char *data, AV *perlav) 158object_thawer::object_thawer (const char *data, AV *perlav)
158: name (strdup ("(memory stream")) 159: name (strdup ("(memory stream)"))
159{ 160{
160 av = perlav; 161 av = perlav;
161 text = newSVpv (data, 0); 162 text = newSVpv (data, 0);
162 sv_catpv (text, thawer_eof); 163 sv_catpv (text, thawer_eof);
163 line = SvPVbyte_nolen (text); 164 line = SvPVbyte_nolen (text);
165 next ();
164} 166}
165 167
166void 168void
167object_thawer::get (attachable *obj, int oid) 169object_thawer::get (attachable *obj, int oid)
168{ 170{
219object_thawer::~object_thawer () 221object_thawer::~object_thawer ()
220{ 222{
221 if (text) SvREFCNT_dec (text); 223 if (text) SvREFCNT_dec (text);
222 if (av) SvREFCNT_dec (av); 224 if (av) SvREFCNT_dec (av);
223 225
226 resolve_delayed_derefs (false);
227
224 free ((void *)name); 228 free ((void *)name);
225} 229}
226 230
227//TODO: remove 231//TODO: remove
228char * 232char *
250 254
251 *q = 0; 255 *q = 0;
252 thawer.line = p; 256 thawer.line = p;
253 257
254 return s == q ? 0 : s; 258 return s == q ? 0 : s;
259}
260
261void
262object_thawer::parse_warn (const char *msg)
263{
264 LOG (llevWarn, "%s:%d, \"%s %s\": %s\n",
265 this->name, linenum,
266 kw_str ? kw_str : "<null>",
267 value ? value : "<null>",
268 msg);
255} 269}
256 270
257bool 271bool
258object_thawer::parse_error (const char *type, const char *name, bool skip) 272object_thawer::parse_error (const char *type, const char *name, bool skip)
259{ 273{
276 290
277 default: 291 default:
278 LOG (llevError, "%s:%d unexpected line (%s %s) while reading %s '%s', %s.\n", 292 LOG (llevError, "%s:%d unexpected line (%s %s) while reading %s '%s', %s.\n",
279 this->name, linenum, 293 this->name, linenum,
280 kw_str ? kw_str : "<null>", 294 kw_str ? kw_str : "<null>",
281 value ? value : "<null>", 295 value ? value : "<null>",
282 type, name, 296 type, name,
283 skip ? "skipping line" : "aborting load"); 297 skip ? "skipping line" : "aborting load");
284 return skip; 298 return skip;
285 } 299 }
286} 300}
373 387
374 next (); 388 next ();
375} 389}
376 390
377void 391void
392object_thawer::skip_block ()
393{
394 while (kw != KW_ERROR && kw != KW_EOF)
395 {
396 keyword w = kw;
397 skip ();
398 if (w == KW_end)
399 break;
400 }
401}
402
403void
378object_thawer::get_ml (keyword kend, shstr &sh) 404object_thawer::get_ml (keyword kend, shstr &sh)
379{ 405{
380 char kw[128]; 406 char kw[128];
381 407
382 int klen = keyword_len [kend]; 408 int klen = keyword_len [kend];
449 while (*p); 475 while (*p);
450 476
451 return negate ? -val : val; 477 return negate ? -val : val;
452} 478}
453 479
480void
481object_thawer::delayed_deref (attachable *op, object_ptr &ptr, const char *ref)
482{
483 op->refcnt_inc ();
484 delayed_ref r = { op, &ptr, ref ? strdup (ref) : 0 };
485 delrefs.push_back (r);
486 ptr = 0;
487}
488
489void
490object_thawer::resolve_delayed_derefs (bool deref)
491{
492 while (!delrefs.empty ())
493 {
494 delayed_ref r = delrefs.back ();
495 delrefs.pop_back ();
496
497 if (deref)
498 *r.ptr = object::deref (r.ref);
499
500 free ((void *)r.ref);
501 r.op->refcnt_dec ();
502 }
503}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines