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.33 by elmex, Thu Aug 31 01:03:36 2006 UTC vs.
Revision 1.34 by root, Thu Aug 31 06:23:20 2006 UTC

24*/ 24*/
25 25
26#define PLUGIN_NAME "perl" 26#define PLUGIN_NAME "perl"
27#define PLUGIN_VERSION "cfperl 0.5" 27#define PLUGIN_VERSION "cfperl 0.5"
28 28
29#ifndef __CEXTRACT__
30#include <plugin.h>
31#endif
32
33#undef MODULEAPI
34#ifdef WIN32
35#else
36#define MODULEAPI
37#endif
38
39#include <plugin_common.h> 29#include <plugin_common.h>
40#include <sounds.h> 30#include <sounds.h>
41#include <cstdarg> 31#include <cstdarg>
42#include <sproto.h> 32#include <sproto.h>
43 33
417 407
418 if (obj->self) 408 if (obj->self)
419 reattach (subclass::get_dt (), (subclass *)obj); 409 reattach (subclass::get_dt (), (subclass *)obj);
420} 410}
421 411
422object_freezer::object_freezer (const char *filename) 412object_freezer::object_freezer ()
423{ 413{
424 this->filename = (SV *)newSVpv (filename, 0);
425
426 char filename2 [4096];
427 snprintf (filename2, 4096, "%s~", filename);
428
429 av = newAV (); 414 av = newAV ();
430
431 // TODO: fast dynbuf implementation... yeah, we need obstacks 415 // TODO: fast dynbuf implementation... yeah, we need obstacks
432 text = newSV (10 * 1024 * 1024); // only temporarily used, so be generous 416 text = newSV (10 * 1024 * 1024); // only temporarily used, so be generous
433} 417}
434 418
435object_freezer::~object_freezer () 419object_freezer::~object_freezer ()
420{
421 SvREFCNT_dec (text);
422 SvREFCNT_dec (av);
423}
424
425void object_freezer::put (attachable_base *ext)
426{
427 ext->optimise ();
428
429 if (ext->self)
430 {
431 int idx = AvFILLp ((AV *)av) + 1;
432 av_store (av, idx, SvREFCNT_inc (ext->self));
433
434 sv_catpvf (text, "oid %d\n", idx);
435 }
436}
437
438bool object_freezer::save (const char *filename)
436{ 439{
437 dSP; 440 dSP;
438 ENTER; 441 ENTER;
439 SAVETMPS; 442 SAVETMPS;
440 PUSHMARK (SP); 443 PUSHMARK (SP);
444 EXTEND (SP, 3);
441 XPUSHs (sv_2mortal ((SV *)filename)); 445 PUSHs (sv_2mortal (newSVpv (filename, 0)));
442 XPUSHs (sv_2mortal (newRV_noinc (text))); 446 PUSHs (sv_2mortal (newRV_inc (text)));
443 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 447 PUSHs (sv_2mortal (newRV_inc ((SV *)av)));
444 PUTBACK; 448 PUTBACK;
445 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); 449 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL);
446 FREETMPS; 450 FREETMPS;
447 LEAVE; 451 LEAVE;
448}
449
450void object_freezer::put (attachable_base *ext)
451{
452 ext->optimise ();
453
454 if (ext->self)
455 {
456 int idx = AvFILLp ((AV *)av) + 1;
457 av_store (av, idx, SvREFCNT_inc (ext->self));
458
459 sv_catpvf (text, "oid %d\n", idx);
460 }
461} 452}
462 453
463int fprintf (object_freezer &freezer, const char *format, ...) 454int fprintf (object_freezer &freezer, const char *format, ...)
464{ 455{
465 va_list ap; 456 va_list ap;
537{ 528{
538 if (fp) fclose (fp); 529 if (fp) fclose (fp);
539 if (av) SvREFCNT_dec ((AV *)av); 530 if (av) SvREFCNT_dec ((AV *)av);
540} 531}
541 532
533token object_thawer::get_token ()
534{
535#if 0
536 for (;;)
537 {
538 if (!fgets (line, sizeof (line), fp))
539 return token (KW_eof);
540
541 unsigned char *p = (unsigned char *)line;
542
543 while (*p > ' ')
544 p++;
545
546 int len = p - (unsigned char *)line;
547
548 while ((*p - 1) < ' ')
549 p++;
550
551 if (*p)
552 {
553 char *v = p;
554
555 while (*p && *p != '\n')
556 p++;
557
558 *p = 0;
559
560 return token (k, v);
561 }
562 else
563 return token (k);
564 }
565#endif
566}
567
542///////////////////////////////////////////////////////////////////////////// 568/////////////////////////////////////////////////////////////////////////////
543 569
544extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 570extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
545{ 571{
546 return 0; 572 return 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines