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.40 by root, Sun Sep 3 00:18:42 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
336 { 326 {
337 SvREFCNT_dec (cb); 327 SvREFCNT_dec (cb);
338 cb = 0; 328 cb = 0;
339 } 329 }
340 330
341 if (attach)
342 {
343 free_string (attach);
344 attach = 0; 331 attach = 0;
345 }
346} 332}
347 333
348void attachable_base::optimise () 334void attachable_base::optimise ()
349{ 335{
350 if (!self) 336 if (!self)
369 PUSHMARK (SP); 355 PUSHMARK (SP);
370 EXTEND (SP, 2); 356 EXTEND (SP, 2);
371 PUSHs (sv_2mortal (newSVdt (type, obj))); 357 PUSHs (sv_2mortal (newSVdt (type, obj)));
372 PUSHs (sv_2mortal (newSVpv (attach, 0))); 358 PUSHs (sv_2mortal (newSVpv (attach, 0)));
373 359
374 free_string (attach);
375 attach = 0; 360 attach = 0;
376 361
377 PUTBACK; 362 PUTBACK;
378 call_pv ("cf::instantiate", G_DISCARD | G_VOID | G_EVAL); 363 call_pv ("cf::instantiate", G_DISCARD | G_VOID | G_EVAL);
379 FREETMPS; 364 FREETMPS;
414void reattach (attachable<subclass> *obj) 399void reattach (attachable<subclass> *obj)
415{ 400{
416 obj->optimise (); 401 obj->optimise ();
417 402
418 if (obj->self) 403 if (obj->self)
419 reattach (subclass::get_dt (), (subclass *)obj); 404 reattach ((data_type) cftype<subclass>::dt, (subclass *)obj);
420} 405}
421 406
407#include "kw_hash.h"
408
422object_freezer::object_freezer (const char *filename) 409object_freezer::object_freezer ()
410: dynbuf (128 * 1024, 64 * 1024)
423{ 411{
424 this->filename = (SV *)newSVpv (filename, 0);
425
426 char filename2 [4096];
427 snprintf (filename2, 4096, "%s~", filename);
428
429 av = newAV (); 412 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} 413}
434 414
435object_freezer::~object_freezer () 415object_freezer::~object_freezer ()
416{
417 SvREFCNT_dec (av);
418}
419
420void object_freezer::put (attachable_base *ext)
421{
422 ext->optimise ();
423
424 if (ext->self)
425 {
426 int idx = AvFILLp ((AV *)av) + 1;
427 av_store (av, idx, SvREFCNT_inc (ext->self));
428
429 add ((void *)"oid ", 4);
430 add ((sint32)idx);
431 add ('\n');
432 }
433}
434
435bool object_freezer::save (const char *filename)
436{ 436{
437 dSP; 437 dSP;
438 ENTER; 438 ENTER;
439 SAVETMPS; 439 SAVETMPS;
440 PUSHMARK (SP); 440 PUSHMARK (SP);
441 EXTEND (SP, 3);
441 XPUSHs (sv_2mortal ((SV *)filename)); 442 PUSHs (sv_2mortal (newSVpv (filename, 0)));
442 XPUSHs (sv_2mortal (newRV_noinc (text))); 443 PUSHs (sv_2mortal (newRV_noinc (newSVpvn ((char *)linearise (), size ()))));
443 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 444 PUSHs (sv_2mortal (newRV_inc ((SV *)av)));
444 PUTBACK; 445 PUTBACK;
445 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); 446 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL);
446 FREETMPS; 447 FREETMPS;
447 LEAVE; 448 LEAVE;
448} 449}
449 450
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, ...) 451int fprintf (object_freezer &freezer, const char *format, ...)
464{ 452{
465 va_list ap; 453 va_list ap;
466 454
467 va_start (ap, format); 455 va_start (ap, format);
468 sv_vcatpvfn (freezer.text, format, strlen (format), &ap, 0, 0, 0); 456
457 int len = vsnprintf ((char *)freezer.force (1024), 1024, format, ap);
458
459 if (len >= 0)
460 freezer.alloc (len);
461
469 va_end (ap); 462 va_end (ap);
470} 463}
471 464
472int fputs (const char *s, object_freezer &freezer) 465int fputs (const char *s, object_freezer &freezer)
473{ 466{
474 sv_catpvn (freezer.text, s, strlen (s)); 467 freezer.add (s);
475} 468}
476 469
477object_thawer::object_thawer (const char *filename) 470object_thawer::object_thawer (const char *filename)
478{ 471{
479 av = 0; 472 av = 0;
537{ 530{
538 if (fp) fclose (fp); 531 if (fp) fclose (fp);
539 if (av) SvREFCNT_dec ((AV *)av); 532 if (av) SvREFCNT_dec ((AV *)av);
540} 533}
541 534
535token object_thawer::get_token ()
536{
537#if 0
538 for (;;)
539 {
540 if (!fgets (line, sizeof (line), fp))
541 return token (KW_eof);
542
543 unsigned char *p = (unsigned char *)line;
544
545 while (*p > ' ')
546 p++;
547
548 int len = p - (unsigned char *)line;
549
550 while ((*p - 1) < ' ')
551 p++;
552
553 if (*p)
554 {
555 char *v = p;
556
557 while (*p && *p != '\n')
558 p++;
559
560 *p = 0;
561
562 return token (k, v);
563 }
564 else
565 return token (k);
566 }
567#endif
568}
569
542///////////////////////////////////////////////////////////////////////////// 570/////////////////////////////////////////////////////////////////////////////
543 571
544extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 572extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
545{ 573{
546 return 0; 574 return 0;
1255 1283
1256 const_iv (SK_EXP_ADD_SKILL) 1284 const_iv (SK_EXP_ADD_SKILL)
1257 const_iv (SK_EXP_TOTAL) 1285 const_iv (SK_EXP_TOTAL)
1258 const_iv (SK_EXP_NONE) 1286 const_iv (SK_EXP_NONE)
1259 const_iv (SK_SUBTRACT_SKILL_EXP) 1287 const_iv (SK_SUBTRACT_SKILL_EXP)
1288 const_iv (SK_EXP_SKILL_ONLY)
1260 1289
1261 const_iv (SK_LOCKPICKING) 1290 const_iv (SK_LOCKPICKING)
1262 const_iv (SK_HIDING) 1291 const_iv (SK_HIDING)
1263 const_iv (SK_SMITHERY) 1292 const_iv (SK_SMITHERY)
1264 const_iv (SK_BOWYER) 1293 const_iv (SK_BOWYER)
2320 RETVAL 2349 RETVAL
2321 2350
2322 2351
2323MODULE = cf PACKAGE = cf::arch 2352MODULE = cf PACKAGE = cf::arch
2324 2353
2354archetype *find (const char *name)
2355 CODE:
2356 RETVAL = find_archetype (name);
2357 OUTPUT:
2358 RETVAL
2359
2325archetype *first() 2360archetype *first()
2326 PROTOTYPE: 2361 PROTOTYPE:
2327 CODE: 2362 CODE:
2328 RETVAL = first_archetype; 2363 RETVAL = first_archetype;
2329 OUTPUT: RETVAL 2364 OUTPUT: RETVAL

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines