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.32 by root, Wed Aug 30 16:30:37 2006 UTC vs.
Revision 1.39 by elmex, Fri Sep 1 17:16:47 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
440bool object_freezer::save (const char *filename)
436{ 441{
437 dSP; 442 dSP;
438 ENTER; 443 ENTER;
439 SAVETMPS; 444 SAVETMPS;
440 PUSHMARK (SP); 445 PUSHMARK (SP);
446 EXTEND (SP, 3);
441 XPUSHs (sv_2mortal ((SV *)filename)); 447 PUSHs (sv_2mortal (newSVpv (filename, 0)));
442 XPUSHs (sv_2mortal (newRV_noinc (text))); 448 PUSHs (sv_2mortal (newRV_noinc (newSVpvn ((char *)linearise (), size ()))));
443 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 449 PUSHs (sv_2mortal (newRV_inc ((SV *)av)));
444 PUTBACK; 450 PUTBACK;
445 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); 451 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL);
446 FREETMPS; 452 FREETMPS;
447 LEAVE; 453 LEAVE;
448} 454}
449 455
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, ...) 456int fprintf (object_freezer &freezer, const char *format, ...)
464{ 457{
465 va_list ap; 458 va_list ap;
466 459
467 va_start (ap, format); 460 va_start (ap, format);
468 sv_vcatpvfn (freezer.text, format, strlen (format), &ap, 0, 0, 0); 461
462 int len = vsnprintf ((char *)freezer.force (1024), 1024, format, ap);
463
464 if (len >= 0)
465 freezer.alloc (len);
466
469 va_end (ap); 467 va_end (ap);
470} 468}
471 469
472int fputs (const char *s, object_freezer &freezer) 470int fputs (const char *s, object_freezer &freezer)
473{ 471{
474 sv_catpvn (freezer.text, s, strlen (s)); 472 freezer.add (s);
475} 473}
476 474
477object_thawer::object_thawer (const char *filename) 475object_thawer::object_thawer (const char *filename)
478{ 476{
479 av = 0; 477 av = 0;
537{ 535{
538 if (fp) fclose (fp); 536 if (fp) fclose (fp);
539 if (av) SvREFCNT_dec ((AV *)av); 537 if (av) SvREFCNT_dec ((AV *)av);
540} 538}
541 539
540token object_thawer::get_token ()
541{
542#if 0
543 for (;;)
544 {
545 if (!fgets (line, sizeof (line), fp))
546 return token (KW_eof);
547
548 unsigned char *p = (unsigned char *)line;
549
550 while (*p > ' ')
551 p++;
552
553 int len = p - (unsigned char *)line;
554
555 while ((*p - 1) < ' ')
556 p++;
557
558 if (*p)
559 {
560 char *v = p;
561
562 while (*p && *p != '\n')
563 p++;
564
565 *p = 0;
566
567 return token (k, v);
568 }
569 else
570 return token (k);
571 }
572#endif
573}
574
542///////////////////////////////////////////////////////////////////////////// 575/////////////////////////////////////////////////////////////////////////////
543 576
544extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 577extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
545{ 578{
546 return 0; 579 return 0;
1255 1288
1256 const_iv (SK_EXP_ADD_SKILL) 1289 const_iv (SK_EXP_ADD_SKILL)
1257 const_iv (SK_EXP_TOTAL) 1290 const_iv (SK_EXP_TOTAL)
1258 const_iv (SK_EXP_NONE) 1291 const_iv (SK_EXP_NONE)
1259 const_iv (SK_SUBTRACT_SKILL_EXP) 1292 const_iv (SK_SUBTRACT_SKILL_EXP)
1293 const_iv (SK_EXP_SKILL_ONLY)
1260 1294
1261 const_iv (SK_LOCKPICKING) 1295 const_iv (SK_LOCKPICKING)
1262 const_iv (SK_HIDING) 1296 const_iv (SK_HIDING)
1263 const_iv (SK_SMITHERY) 1297 const_iv (SK_SMITHERY)
1264 const_iv (SK_BOWYER) 1298 const_iv (SK_BOWYER)
1844 1878
1845void cf_object_drop (object *op, object *author) 1879void cf_object_drop (object *op, object *author)
1846 1880
1847void cf_object_take (object *op, object *author) 1881void cf_object_take (object *op, object *author)
1848 1882
1849void cf_object_say (object *op, char *msg)
1850
1851void cf_object_speak (object *op, char *msg)
1852
1853object *cf_object_insert_object (object *op, object *container) 1883object *cf_object_insert_object (object *op, object *container)
1854 1884
1855const char *cf_object_get_msg (object *ob) 1885const char *cf_object_get_msg (object *ob)
1856 ALIAS: msg = 0 1886 ALIAS: msg = 0
1857 1887
2323 OUTPUT: 2353 OUTPUT:
2324 RETVAL 2354 RETVAL
2325 2355
2326 2356
2327MODULE = cf PACKAGE = cf::arch 2357MODULE = cf PACKAGE = cf::arch
2358
2359archetype *find (const char *name)
2360 CODE:
2361 RETVAL = find_archetype (name);
2362 OUTPUT:
2363 RETVAL
2328 2364
2329archetype *first() 2365archetype *first()
2330 PROTOTYPE: 2366 PROTOTYPE:
2331 CODE: 2367 CODE:
2332 RETVAL = first_archetype; 2368 RETVAL = first_archetype;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines