… | |
… | |
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 | |
348 | void attachable_base::optimise () |
334 | void 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; |
… | |
… | |
414 | void reattach (attachable<subclass> *obj) |
399 | void 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 | |
422 | object_freezer::object_freezer (const char *filename) |
409 | object_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 | |
435 | object_freezer::~object_freezer () |
415 | object_freezer::~object_freezer () |
|
|
416 | { |
|
|
417 | SvREFCNT_dec (av); |
|
|
418 | } |
|
|
419 | |
|
|
420 | void 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 | |
|
|
435 | bool 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 | |
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 | } |
|
|
462 | |
|
|
463 | int fprintf (object_freezer &freezer, const char *format, ...) |
451 | int 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 | |
472 | int fputs (const char *s, object_freezer &freezer) |
465 | int 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 | |
477 | object_thawer::object_thawer (const char *filename) |
470 | object_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 | |
|
|
535 | token 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 | |
544 | extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) |
572 | extern "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 | |
2323 | MODULE = cf PACKAGE = cf::arch |
2352 | MODULE = cf PACKAGE = cf::arch |
2324 | |
2353 | |
|
|
2354 | archetype *find (const char *name) |
|
|
2355 | CODE: |
|
|
2356 | RETVAL = find_archetype (name); |
|
|
2357 | OUTPUT: |
|
|
2358 | RETVAL |
|
|
2359 | |
2325 | archetype *first() |
2360 | archetype *first() |
2326 | PROTOTYPE: |
2361 | PROTOTYPE: |
2327 | CODE: |
2362 | CODE: |
2328 | RETVAL = first_archetype; |
2363 | RETVAL = first_archetype; |
2329 | OUTPUT: RETVAL |
2364 | OUTPUT: RETVAL |