… | |
… | |
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 | |
422 | object_freezer::object_freezer (const char *filename) |
412 | object_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 | |
435 | object_freezer::~object_freezer () |
419 | object_freezer::~object_freezer () |
|
|
420 | { |
|
|
421 | SvREFCNT_dec (text); |
|
|
422 | SvREFCNT_dec (av); |
|
|
423 | } |
|
|
424 | |
|
|
425 | void 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 | |
|
|
438 | bool 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 | |
|
|
450 | void 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 | |
463 | int fprintf (object_freezer &freezer, const char *format, ...) |
454 | int 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 | |
|
|
533 | token 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 | |
544 | extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) |
570 | extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) |
545 | { |
571 | { |
546 | return 0; |
572 | return 0; |