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.37 by root, Thu Aug 31 17:54:15 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 ()
415: dynbuf (128 * 1024, 64 * 1024)
423{ 416{
424 this->filename = (SV *)newSVpv (filename, 0);
425
426 char filename2 [4096];
427 snprintf (filename2, 4096, "%s~", filename);
428
429 av = newAV (); 417 av = newAV ();
430
431 // TODO: fast dynbuf implementation... yeah, we need obstacks
432 text = newSV (10 * 1024 * 1024); // only temporarily used, so be generous
433} 418}
434 419
435object_freezer::~object_freezer () 420object_freezer::~object_freezer ()
421{
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 add ((void *)"oid ", 4);
435 add ((sint32)idx);
436 add ('\n');
437 }
438}
439
440void object_freezer::put (const char *k, const char *v)
441{
442 add (k);
443
444 //if (v)
445 add (' '); //TODO//cf compatibility always add space
446 if (v)
447 add (v);
448
449 add ('\n');
450}
451
452void object_freezer::put (const char *k, int v)
453{
454 add (k);
455 add (' ');
456 add (sint32 (v));
457 add ('\n');
458}
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
482void object_freezer::put_(keyword k, sint64 v)
483{
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');
509}
510
511bool object_freezer::save (const char *filename)
436{ 512{
437 dSP; 513 dSP;
438 ENTER; 514 ENTER;
439 SAVETMPS; 515 SAVETMPS;
440 PUSHMARK (SP); 516 PUSHMARK (SP);
517 EXTEND (SP, 3);
441 XPUSHs (sv_2mortal ((SV *)filename)); 518 PUSHs (sv_2mortal (newSVpv (filename, 0)));
442 XPUSHs (sv_2mortal (newRV_noinc (text))); 519 PUSHs (sv_2mortal (newRV_noinc (newSVpvn ((char *)linearise (), size ()))));
443 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 520 PUSHs (sv_2mortal (newRV_inc ((SV *)av)));
444 PUTBACK; 521 PUTBACK;
445 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);
446 FREETMPS; 523 FREETMPS;
447 LEAVE; 524 LEAVE;
448} 525}
449 526
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}
462
463int fprintf (object_freezer &freezer, const char *format, ...) 527int fprintf (object_freezer &freezer, const char *format, ...)
464{ 528{
465 va_list ap; 529 va_list ap;
466 530
467 va_start (ap, format); 531 va_start (ap, format);
468 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
469 va_end (ap); 538 va_end (ap);
470} 539}
471 540
472int fputs (const char *s, object_freezer &freezer) 541int fputs (const char *s, object_freezer &freezer)
473{ 542{
474 sv_catpvn (freezer.text, s, strlen (s)); 543 freezer.add (s);
475} 544}
476 545
477object_thawer::object_thawer (const char *filename) 546object_thawer::object_thawer (const char *filename)
478{ 547{
479 av = 0; 548 av = 0;
537{ 606{
538 if (fp) fclose (fp); 607 if (fp) fclose (fp);
539 if (av) SvREFCNT_dec ((AV *)av); 608 if (av) SvREFCNT_dec ((AV *)av);
540} 609}
541 610
611token object_thawer::get_token ()
612{
613#if 0
614 for (;;)
615 {
616 if (!fgets (line, sizeof (line), fp))
617 return token (KW_eof);
618
619 unsigned char *p = (unsigned char *)line;
620
621 while (*p > ' ')
622 p++;
623
624 int len = p - (unsigned char *)line;
625
626 while ((*p - 1) < ' ')
627 p++;
628
629 if (*p)
630 {
631 char *v = p;
632
633 while (*p && *p != '\n')
634 p++;
635
636 *p = 0;
637
638 return token (k, v);
639 }
640 else
641 return token (k);
642 }
643#endif
644}
645
542///////////////////////////////////////////////////////////////////////////// 646/////////////////////////////////////////////////////////////////////////////
543 647
544extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 648extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
545{ 649{
546 return 0; 650 return 0;
2320 RETVAL 2424 RETVAL
2321 2425
2322 2426
2323MODULE = cf PACKAGE = cf::arch 2427MODULE = cf PACKAGE = cf::arch
2324 2428
2429archetype *find (const char *name)
2430 CODE:
2431 RETVAL = find_archetype (name);
2432 OUTPUT:
2433 RETVAL
2434
2325archetype *first() 2435archetype *first()
2326 PROTOTYPE: 2436 PROTOTYPE:
2327 CODE: 2437 CODE:
2328 RETVAL = first_archetype; 2438 RETVAL = first_archetype;
2329 OUTPUT: RETVAL 2439 OUTPUT: RETVAL

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines