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.35 by root, Thu Aug 31 09:19:34 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
414void reattach (attachable<subclass> *obj) 404void reattach (attachable<subclass> *obj)
415{ 405{
416 obj->optimise (); 406 obj->optimise ();
417 407
418 if (obj->self) 408 if (obj->self)
419 reattach (subclass::get_dt (), (subclass *)obj); 409 reattach ((data_type) cftype<subclass>::dt, (subclass *)obj);
420} 410}
421 411
412#include "kw_hash.h"
413
422object_freezer::object_freezer (const char *filename) 414object_freezer::object_freezer ()
423{ 415{
424 this->filename = (SV *)newSVpv (filename, 0);
425
426 char filename2 [4096];
427 snprintf (filename2, 4096, "%s~", filename);
428
429 av = newAV (); 416 av = newAV ();
430
431 // TODO: fast dynbuf implementation... yeah, we need obstacks 417 // TODO: fast dynbuf implementation... yeah, we need obstacks
432 text = newSV (10 * 1024 * 1024); // only temporarily used, so be generous 418 text = newSV (10 * 1024 * 1024); // only temporarily used, so be generous
433} 419}
434 420
435object_freezer::~object_freezer () 421object_freezer::~object_freezer ()
422{
423 SvREFCNT_dec (text);
424 SvREFCNT_dec (av);
425}
426
427void object_freezer::put (attachable_base *ext)
428{
429 ext->optimise ();
430
431 if (ext->self)
432 {
433 int idx = AvFILLp ((AV *)av) + 1;
434 av_store (av, idx, SvREFCNT_inc (ext->self));
435
436 sv_catpvf (text, "oid %d\n", idx);
437 }
438}
439
440void object_freezer::put (keyword k)
441{
442 sv_catpv (text, keyword_str [k]);
443}
444
445void object_freezer::put (const char *v)
446{
447 sv_catpv (text, v);
448}
449
450void object_freezer::put (int v)
451{
452 sv_catpvf (text, "%d\n", v);
453}
454
455bool object_freezer::save (const char *filename)
436{ 456{
437 dSP; 457 dSP;
438 ENTER; 458 ENTER;
439 SAVETMPS; 459 SAVETMPS;
440 PUSHMARK (SP); 460 PUSHMARK (SP);
461 EXTEND (SP, 3);
441 XPUSHs (sv_2mortal ((SV *)filename)); 462 PUSHs (sv_2mortal (newSVpv (filename, 0)));
442 XPUSHs (sv_2mortal (newRV_noinc (text))); 463 PUSHs (sv_2mortal (newRV_inc (text)));
443 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 464 PUSHs (sv_2mortal (newRV_inc ((SV *)av)));
444 PUTBACK; 465 PUTBACK;
445 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); 466 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL);
446 FREETMPS; 467 FREETMPS;
447 LEAVE; 468 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} 469}
462 470
463int fprintf (object_freezer &freezer, const char *format, ...) 471int fprintf (object_freezer &freezer, const char *format, ...)
464{ 472{
465 va_list ap; 473 va_list ap;
537{ 545{
538 if (fp) fclose (fp); 546 if (fp) fclose (fp);
539 if (av) SvREFCNT_dec ((AV *)av); 547 if (av) SvREFCNT_dec ((AV *)av);
540} 548}
541 549
550token object_thawer::get_token ()
551{
552#if 0
553 for (;;)
554 {
555 if (!fgets (line, sizeof (line), fp))
556 return token (KW_eof);
557
558 unsigned char *p = (unsigned char *)line;
559
560 while (*p > ' ')
561 p++;
562
563 int len = p - (unsigned char *)line;
564
565 while ((*p - 1) < ' ')
566 p++;
567
568 if (*p)
569 {
570 char *v = p;
571
572 while (*p && *p != '\n')
573 p++;
574
575 *p = 0;
576
577 return token (k, v);
578 }
579 else
580 return token (k);
581 }
582#endif
583}
584
542///////////////////////////////////////////////////////////////////////////// 585/////////////////////////////////////////////////////////////////////////////
543 586
544extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 587extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
545{ 588{
546 return 0; 589 return 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines