… | |
… | |
410 | } |
410 | } |
411 | |
411 | |
412 | #include "kw_hash.h" |
412 | #include "kw_hash.h" |
413 | |
413 | |
414 | object_freezer::object_freezer () |
414 | object_freezer::object_freezer () |
|
|
415 | : dynbuf (128 * 1024, 64 * 1024) |
415 | { |
416 | { |
416 | av = newAV (); |
417 | av = newAV (); |
417 | // TODO: fast dynbuf implementation... yeah, we need obstacks |
|
|
418 | text = newSV (10 * 1024 * 1024); // only temporarily used, so be generous |
|
|
419 | } |
418 | } |
420 | |
419 | |
421 | object_freezer::~object_freezer () |
420 | object_freezer::~object_freezer () |
422 | { |
421 | { |
423 | SvREFCNT_dec (text); |
|
|
424 | SvREFCNT_dec (av); |
422 | SvREFCNT_dec (av); |
425 | } |
423 | } |
426 | |
424 | |
427 | void object_freezer::put (attachable_base *ext) |
425 | void object_freezer::put (attachable_base *ext) |
428 | { |
426 | { |
… | |
… | |
431 | if (ext->self) |
429 | if (ext->self) |
432 | { |
430 | { |
433 | int idx = AvFILLp ((AV *)av) + 1; |
431 | int idx = AvFILLp ((AV *)av) + 1; |
434 | av_store (av, idx, SvREFCNT_inc (ext->self)); |
432 | av_store (av, idx, SvREFCNT_inc (ext->self)); |
435 | |
433 | |
436 | sv_catpvf (text, "oid %d\n", idx); |
434 | add ((void *)"oid ", 4); |
|
|
435 | add ((sint32)idx); |
|
|
436 | add ('\n'); |
437 | } |
437 | } |
438 | } |
|
|
439 | |
|
|
440 | void object_freezer::put (keyword k) |
|
|
441 | { |
|
|
442 | sv_catpv (text, keyword_str [k]); |
|
|
443 | } |
|
|
444 | |
|
|
445 | void object_freezer::put (const char *v) |
|
|
446 | { |
|
|
447 | sv_catpv (text, v); |
|
|
448 | } |
|
|
449 | |
|
|
450 | void object_freezer::put (int v) |
|
|
451 | { |
|
|
452 | sv_catpvf (text, "%d\n", v); |
|
|
453 | } |
438 | } |
454 | |
439 | |
455 | bool object_freezer::save (const char *filename) |
440 | bool object_freezer::save (const char *filename) |
456 | { |
441 | { |
457 | dSP; |
442 | dSP; |
458 | ENTER; |
443 | ENTER; |
459 | SAVETMPS; |
444 | SAVETMPS; |
460 | PUSHMARK (SP); |
445 | PUSHMARK (SP); |
461 | EXTEND (SP, 3); |
446 | EXTEND (SP, 3); |
462 | PUSHs (sv_2mortal (newSVpv (filename, 0))); |
447 | PUSHs (sv_2mortal (newSVpv (filename, 0))); |
463 | PUSHs (sv_2mortal (newRV_inc (text))); |
448 | PUSHs (sv_2mortal (newRV_noinc (newSVpvn ((char *)linearise (), size ())))); |
464 | PUSHs (sv_2mortal (newRV_inc ((SV *)av))); |
449 | PUSHs (sv_2mortal (newRV_inc ((SV *)av))); |
465 | PUTBACK; |
450 | PUTBACK; |
466 | 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); |
467 | FREETMPS; |
452 | FREETMPS; |
468 | LEAVE; |
453 | LEAVE; |
… | |
… | |
471 | int fprintf (object_freezer &freezer, const char *format, ...) |
456 | int fprintf (object_freezer &freezer, const char *format, ...) |
472 | { |
457 | { |
473 | va_list ap; |
458 | va_list ap; |
474 | |
459 | |
475 | va_start (ap, format); |
460 | va_start (ap, format); |
476 | 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 | |
477 | va_end (ap); |
467 | va_end (ap); |
478 | } |
468 | } |
479 | |
469 | |
480 | int fputs (const char *s, object_freezer &freezer) |
470 | int fputs (const char *s, object_freezer &freezer) |
481 | { |
471 | { |
482 | sv_catpvn (freezer.text, s, strlen (s)); |
472 | freezer.add (s); |
483 | } |
473 | } |
484 | |
474 | |
485 | object_thawer::object_thawer (const char *filename) |
475 | object_thawer::object_thawer (const char *filename) |
486 | { |
476 | { |
487 | av = 0; |
477 | av = 0; |
… | |
… | |
1298 | |
1288 | |
1299 | const_iv (SK_EXP_ADD_SKILL) |
1289 | const_iv (SK_EXP_ADD_SKILL) |
1300 | const_iv (SK_EXP_TOTAL) |
1290 | const_iv (SK_EXP_TOTAL) |
1301 | const_iv (SK_EXP_NONE) |
1291 | const_iv (SK_EXP_NONE) |
1302 | const_iv (SK_SUBTRACT_SKILL_EXP) |
1292 | const_iv (SK_SUBTRACT_SKILL_EXP) |
|
|
1293 | const_iv (SK_EXP_SKILL_ONLY) |
1303 | |
1294 | |
1304 | const_iv (SK_LOCKPICKING) |
1295 | const_iv (SK_LOCKPICKING) |
1305 | const_iv (SK_HIDING) |
1296 | const_iv (SK_HIDING) |
1306 | const_iv (SK_SMITHERY) |
1297 | const_iv (SK_SMITHERY) |
1307 | const_iv (SK_BOWYER) |
1298 | const_iv (SK_BOWYER) |
… | |
… | |
2363 | RETVAL |
2354 | RETVAL |
2364 | |
2355 | |
2365 | |
2356 | |
2366 | MODULE = cf PACKAGE = cf::arch |
2357 | MODULE = cf PACKAGE = cf::arch |
2367 | |
2358 | |
|
|
2359 | archetype *find (const char *name) |
|
|
2360 | CODE: |
|
|
2361 | RETVAL = find_archetype (name); |
|
|
2362 | OUTPUT: |
|
|
2363 | RETVAL |
|
|
2364 | |
2368 | archetype *first() |
2365 | archetype *first() |
2369 | PROTOTYPE: |
2366 | PROTOTYPE: |
2370 | CODE: |
2367 | CODE: |
2371 | RETVAL = first_archetype; |
2368 | RETVAL = first_archetype; |
2372 | OUTPUT: RETVAL |
2369 | OUTPUT: RETVAL |