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

Comparing deliantra/server/server/cfperl.xs (file contents):
Revision 1.36 by elmex, Thu Aug 31 10:15:14 2006 UTC vs.
Revision 1.37 by root, Thu Aug 31 17:54:15 2006 UTC

410} 410}
411 411
412#include "kw_hash.h" 412#include "kw_hash.h"
413 413
414object_freezer::object_freezer () 414object_freezer::object_freezer ()
415: dynbuf (128 * 1024, 64 * 1024)
415{ 416{
416 av = newAV (); 417 av = newAV ();
417 // TODO: fast dynbuf implementation... yeah, we need obstacks
418 text = newSV (10 * 1024 * 1024); // only temporarily used, so be generous
419} 418}
420 419
421object_freezer::~object_freezer () 420object_freezer::~object_freezer ()
422{ 421{
423 SvREFCNT_dec (text);
424 SvREFCNT_dec (av); 422 SvREFCNT_dec (av);
425} 423}
426 424
427void object_freezer::put (attachable_base *ext) 425void object_freezer::put (attachable_base *ext)
428{ 426{
431 if (ext->self) 429 if (ext->self)
432 { 430 {
433 int idx = AvFILLp ((AV *)av) + 1; 431 int idx = AvFILLp ((AV *)av) + 1;
434 av_store (av, idx, SvREFCNT_inc (ext->self)); 432 av_store (av, idx, SvREFCNT_inc (ext->self));
435 433
436 sv_catpvf (text, "oid %d\n", idx); 434 add ((void *)"oid ", 4);
435 add ((sint32)idx);
436 add ('\n');
437 } 437 }
438} 438}
439 439
440void object_freezer::put (keyword k) 440void object_freezer::put (const char *k, const char *v)
441{ 441{
442 sv_catpv (text, keyword_str [k]); 442 add (k);
443}
444 443
444 //if (v)
445 add (' '); //TODO//cf compatibility always add space
446 if (v)
447 add (v);
448
449 add ('\n');
450}
451
445void object_freezer::put (const char *v) 452void object_freezer::put (const char *k, int v)
446{ 453{
447 sv_catpv (text, v); 454 add (k);
455 add (' ');
456 add (sint32 (v));
457 add ('\n');
448} 458}
449 459
460void object_freezer::put (keyword k, const char *v)
461{
462 int klen = keyword_len [k];
463 int vlen = v ? strlen (v) : 0;
464
465 char *p = (char *)alloc (klen + 1 + vlen + 1);
466
467 memcpy (p, keyword_str [k], klen); p += klen;
468 *p++ = ' '; //TODO//cf compatibility always add space
469 memcpy (p, v, vlen); p += vlen;
470 *p = '\n';
471}
472
473void object_freezer::put (keyword k, double v)
474{
475 char buf [128];
476
477 snprintf (buf, 128, "%.7g", v);
478
479 put (k, (const char *)buf);
480}
481
450void object_freezer::put (int v) 482void object_freezer::put_(keyword k, sint64 v)
451{ 483{
452 sv_catpvf (text, "%d\n", v); 484 add (keyword_str [k], keyword_len [k]);
485 add (' ');
486 add (v);
487 add ('\n');
488}
489
490void object_freezer::put_(keyword k, sint32 v)
491{
492 add (keyword_str [k], keyword_len [k]);
493 add (' ');
494 add (v);
495 add ('\n');
496}
497
498void object_freezer::put (keyword kbeg, keyword kend, const char *v)
499{
500 add (keyword_str [kbeg], keyword_len [kbeg]); add ('\n');
501
502 if (v)
503 {
504 add (v);
505 add ('\n');
506 }
507
508 add (keyword_str [kend], keyword_len [kend]); add ('\n');
453} 509}
454 510
455bool object_freezer::save (const char *filename) 511bool object_freezer::save (const char *filename)
456{ 512{
457 dSP; 513 dSP;
458 ENTER; 514 ENTER;
459 SAVETMPS; 515 SAVETMPS;
460 PUSHMARK (SP); 516 PUSHMARK (SP);
461 EXTEND (SP, 3); 517 EXTEND (SP, 3);
462 PUSHs (sv_2mortal (newSVpv (filename, 0))); 518 PUSHs (sv_2mortal (newSVpv (filename, 0)));
463 PUSHs (sv_2mortal (newRV_inc (text))); 519 PUSHs (sv_2mortal (newRV_noinc (newSVpvn ((char *)linearise (), size ()))));
464 PUSHs (sv_2mortal (newRV_inc ((SV *)av))); 520 PUSHs (sv_2mortal (newRV_inc ((SV *)av)));
465 PUTBACK; 521 PUTBACK;
466 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); 522 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL);
467 FREETMPS; 523 FREETMPS;
468 LEAVE; 524 LEAVE;
471int fprintf (object_freezer &freezer, const char *format, ...) 527int fprintf (object_freezer &freezer, const char *format, ...)
472{ 528{
473 va_list ap; 529 va_list ap;
474 530
475 va_start (ap, format); 531 va_start (ap, format);
476 sv_vcatpvfn (freezer.text, format, strlen (format), &ap, 0, 0, 0); 532
533 int len = vsnprintf ((char *)freezer.force (1024), 1024, format, ap);
534
535 if (len >= 0)
536 freezer.alloc (len);
537
477 va_end (ap); 538 va_end (ap);
478} 539}
479 540
480int fputs (const char *s, object_freezer &freezer) 541int fputs (const char *s, object_freezer &freezer)
481{ 542{
482 sv_catpvn (freezer.text, s, strlen (s)); 543 freezer.add (s);
483} 544}
484 545
485object_thawer::object_thawer (const char *filename) 546object_thawer::object_thawer (const char *filename)
486{ 547{
487 av = 0; 548 av = 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines