1
#include <perl_libyaml.h>
4
call_coderef(SV *code, AV *args)
8
I32 count = (args && args != Nullav) ? av_len(args) : -1;
12
for (i = 0; i <= count; i++) {
13
if ((svp = av_fetch(args, i, FALSE))) {
18
count = call_sv(code, G_ARRAY);
21
return fold_results(count);
25
fold_results(I32 count)
28
SV *retval = &PL_sv_undef;
31
/* convert multiple return items into a list reference */
33
SV *last_sv = &PL_sv_undef;
34
SV *sv = &PL_sv_undef;
37
av_extend(av, count - 1);
38
for(i = 1; i <= count; i++) {
41
if (SvOK(sv) && !av_store(av, count - i, SvREFCNT_inc(sv)))
46
retval = sv_2mortal((SV *) newRV_noinc((SV *) av));
48
if (!SvOK(sv) || sv == &PL_sv_undef) {
49
/* if first element was undef, die */
50
croak(ERRMSG "Call error");
64
find_coderef(char *perl_var)
68
if ((coderef = get_sv(perl_var, FALSE))
70
&& SvTYPE(SvRV(coderef)) == SVt_PVCV)
77
* Piece together a parser/loader error message
80
loader_error_msg(perl_yaml_loader_t *loader, char *problem)
84
problem = (char *)loader->parser.problem;
89
(problem ? form("The problem:\n\n %s\n\n", problem) : "A problem "),
93
loader->parser.problem_mark.line ||
94
loader->parser.problem_mark.column
96
msg = form("%s, line: %d, column: %d\n",
98
loader->parser.problem_mark.line + 1,
99
loader->parser.problem_mark.column + 1
102
msg = form("%s\n", msg);
103
if (loader->parser.context)
104
msg = form("%s%s at line: %d, column: %d\n",
106
loader->parser.context,
107
loader->parser.context_mark.line + 1,
108
loader->parser.context_mark.column + 1
115
* This is the main Load function.
116
* It takes a yaml stream and turns it into 0 or more Perl objects.
122
perl_yaml_loader_t loader;
124
const unsigned char *yaml_str;
127
yaml_str = (const unsigned char *)SvPV_const(yaml_sv, yaml_len);
129
if (DO_UTF8(yaml_sv)) {
130
yaml_sv = sv_mortalcopy(yaml_sv);
131
if (!sv_utf8_downgrade(yaml_sv, TRUE))
132
croak("Wide character in YAML::XS::Load()");
133
yaml_str = (const unsigned char *)SvPV_const(yaml_sv, yaml_len);
137
if (0 && (items || ax)) {} /* XXX Quiet the -Wall warnings for now. */
139
yaml_parser_initialize(&loader.parser);
141
yaml_parser_set_input_string(
147
/* Get the first event. Must be a STREAM_START */
148
if (!yaml_parser_parse(&loader.parser, &loader.event))
150
if (loader.event.type != YAML_STREAM_START_EVENT)
151
croak(ERRMSG "Expected STREAM_START_EVENT; Got: %d != %d",
153
YAML_STREAM_START_EVENT
156
loader.anchors = newHV();
157
sv_2mortal((SV *)loader.anchors);
159
/* Keep calling load_node until end of stream */
162
/* We are through with the previous event - delete it! */
163
yaml_event_delete(&loader.event);
164
if (!yaml_parser_parse(&loader.parser, &loader.event))
166
if (loader.event.type == YAML_STREAM_END_EVENT)
168
node = load_node(&loader);
169
/* We are through with the previous event - delete it! */
170
yaml_event_delete(&loader.event);
171
hv_clear(loader.anchors);
173
XPUSHs(sv_2mortal(node));
174
if (!yaml_parser_parse(&loader.parser, &loader.event))
176
if (loader.event.type != YAML_DOCUMENT_END_EVENT)
177
croak(ERRMSG "Expected DOCUMENT_END_EVENT");
180
/* Make sure the last event is a STREAM_END */
181
if (loader.event.type != YAML_STREAM_END_EVENT)
182
croak(ERRMSG "Expected STREAM_END_EVENT; Got: %d != %d",
184
YAML_STREAM_END_EVENT
186
yaml_parser_delete(&loader.parser);
191
croak(loader_error_msg(&loader, NULL));
195
* This is the main function for dumping any node.
198
load_node(perl_yaml_loader_t *loader)
200
SV* return_sv = NULL;
201
/* This uses stack, but avoids (severe!) memory leaks */
202
yaml_event_t uplevel_event;
204
uplevel_event = loader->event;
206
/* Get the next parser event */
207
if (!yaml_parser_parse(&loader->parser, &loader->event))
210
/* These events don't need yaml_event_delete */
211
/* Some kind of error occurred */
212
if (loader->event.type == YAML_NO_EVENT)
215
/* Return NULL when we hit the end of a scope */
216
if (loader->event.type == YAML_DOCUMENT_END_EVENT ||
217
loader->event.type == YAML_MAPPING_END_EVENT ||
218
loader->event.type == YAML_SEQUENCE_END_EVENT) {
219
/* restore the uplevel event, so it can be properly deleted */
220
loader->event = uplevel_event;
224
/* The rest all need cleanup */
225
switch (loader->event.type) {
228
/* Handle loading a mapping */
229
case YAML_MAPPING_START_EVENT:
230
tag = (char *)loader->event.data.mapping_start.tag;
232
/* Handle mapping tagged as a Perl hard reference */
233
if (tag && strEQ(tag, TAG_PERL_REF)) {
234
return_sv = load_scalar_ref(loader);
238
/* Handle mapping tagged as a Perl typeglob */
239
if (tag && strEQ(tag, TAG_PERL_GLOB)) {
240
return_sv = load_glob(loader);
244
return_sv = load_mapping(loader, NULL);
247
/* Handle loading a sequence into an array */
248
case YAML_SEQUENCE_START_EVENT:
249
return_sv = load_sequence(loader);
252
/* Handle loading a scalar */
253
case YAML_SCALAR_EVENT:
254
return_sv = load_scalar(loader);
257
/* Handle loading an alias node */
258
case YAML_ALIAS_EVENT:
259
return_sv = load_alias(loader);
263
croak(ERRMSG "Invalid event '%d' at top level", (int) loader->event.type);
266
yaml_event_delete(&loader->event);
268
/* restore the uplevel event, so it can be properly deleted */
269
loader->event = uplevel_event;
274
croak(loader_error_msg(loader, NULL));
278
* Load a YAML mapping into a Perl hash
281
load_mapping(perl_yaml_loader_t *loader, char *tag)
286
SV *hash_ref = (SV *)newRV_noinc((SV *)hash);
287
char *anchor = (char *)loader->event.data.mapping_start.anchor;
290
tag = (char *)loader->event.data.mapping_start.tag;
292
/* Store the anchor label if any */
294
hv_store(loader->anchors, anchor, strlen(anchor), SvREFCNT_inc(hash_ref), 0);
296
/* Get each key string and value node and put them in the hash */
297
while ((key_node = load_node(loader))) {
298
assert(SvPOK(key_node));
299
value_node = load_node(loader);
301
hash, sv_2mortal(key_node), value_node, 0
305
/* Deal with possibly blessing the hash if the YAML tag has a class */
306
if (tag && strEQ(tag, TAG_PERL_PREFIX "hash"))
310
char *prefix = TAG_PERL_PREFIX "hash:";
314
else if (strlen(tag) <= strlen(prefix) ||
315
! strnEQ(tag, prefix, strlen(prefix))
317
loader_error_msg(loader, form("bad tag found for hash: '%s'", tag))
319
class = tag + strlen(prefix);
320
sv_bless(hash_ref, gv_stashpv(class, TRUE));
326
/* Load a YAML sequence into a Perl array */
328
load_sequence(perl_yaml_loader_t *loader)
332
SV *array_ref = (SV *)newRV_noinc((SV *)array);
333
char *anchor = (char *)loader->event.data.sequence_start.anchor;
334
char *tag = (char *)loader->event.data.mapping_start.tag;
336
hv_store(loader->anchors, anchor, strlen(anchor), SvREFCNT_inc(array_ref), 0);
337
while ((node = load_node(loader))) {
338
av_push(array, node);
340
if (tag && strEQ(tag, TAG_PERL_PREFIX "array"))
344
char *prefix = TAG_PERL_PREFIX "array:";
347
else if (strlen(tag) <= strlen(prefix) ||
348
! strnEQ(tag, prefix, strlen(prefix))
350
loader_error_msg(loader, form("bad tag found for array: '%s'", tag))
352
class = tag + strlen(prefix);
353
sv_bless(array_ref, gv_stashpv(class, TRUE));
358
/* Load a YAML scalar into a Perl scalar */
360
load_scalar(perl_yaml_loader_t *loader)
363
char *string = (char *)loader->event.data.scalar.value;
364
STRLEN length = (STRLEN)loader->event.data.scalar.length;
365
char *anchor = (char *)loader->event.data.scalar.anchor;
366
char *tag = (char *)loader->event.data.scalar.tag;
369
char *prefix = TAG_PERL_PREFIX "regexp";
370
if (strnEQ(tag, prefix, strlen(prefix)))
371
return load_regexp(loader);
372
prefix = TAG_PERL_PREFIX "scalar:";
375
else if (strlen(tag) <= strlen(prefix) ||
376
! strnEQ(tag, prefix, strlen(prefix))
377
) croak(ERRMSG "bad tag found for scalar: '%s'", tag);
378
class = tag + strlen(prefix);
379
scalar = sv_setref_pvn(newSV(0), class, string, strlen(string));
384
if (loader->event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE) {
385
if (strEQ(string, "~"))
387
else if (strEQ(string, ""))
389
else if (strEQ(string, "null"))
391
else if (strEQ(string, "true"))
393
else if (strEQ(string, "false"))
397
scalar = newSVpvn(string, length);
399
if (loader->event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE && looks_like_number(scalar) ) {
404
(void)sv_utf8_decode(scalar);
406
hv_store(loader->anchors, anchor, strlen(anchor), SvREFCNT_inc(scalar), 0);
410
/* Load a scalar marked as a regexp as a Perl regular expression.
411
* This operation is less common and is tricky, so doing it in Perl code for
415
load_regexp(perl_yaml_loader_t * loader)
418
char *string = (char *)loader->event.data.scalar.value;
419
STRLEN length = (STRLEN)loader->event.data.scalar.length;
420
char *anchor = (char *)loader->event.data.scalar.anchor;
421
char *tag = (char *)loader->event.data.scalar.tag;
422
char *prefix = TAG_PERL_PREFIX "regexp:";
424
SV *regexp = newSVpvn(string, length);
432
call_pv("YAML::XS::__qr_loader", G_SCALAR);
434
regexp = newSVsv(POPs);
436
if (strlen(tag) > strlen(prefix) && strnEQ(tag, prefix, strlen(prefix))) {
437
char *class = tag + strlen(prefix);
438
sv_bless(regexp, gv_stashpv(class, TRUE));
442
hv_store(loader->anchors, anchor, strlen(anchor), SvREFCNT_inc(regexp), 0);
447
* Load a reference to a previously loaded node.
450
load_alias(perl_yaml_loader_t *loader)
452
char *anchor = (char *)loader->event.data.alias.anchor;
453
SV **entry = hv_fetch(loader->anchors, anchor, strlen(anchor), 0);
455
return SvREFCNT_inc(*entry);
456
croak(ERRMSG "No anchor for alias '%s'", anchor);
460
* Load a Perl hard reference.
463
load_scalar_ref(perl_yaml_loader_t *loader)
466
char *anchor = (char *)loader->event.data.mapping_start.anchor;
467
SV *rv = newRV_noinc(&PL_sv_undef);
469
hv_store(loader->anchors, anchor, strlen(anchor), SvREFCNT_inc(rv), 0);
470
load_node(loader); /* Load the single hash key (=) */
471
value_node = load_node(loader);
472
SvRV(rv) = value_node;
473
if (load_node(loader))
474
croak(ERRMSG "Expected end of node");
479
* Load a Perl typeglob.
482
load_glob(perl_yaml_loader_t *loader)
484
/* XXX Call back a Perl sub to do something interesting here */
485
return load_mapping(loader, TAG_PERL_PREFIX "hash");
488
/* -------------------------------------------------------------------------- */
491
* Set dumper options from global variables.
494
set_dumper_options(perl_yaml_dumper_t *dumper)
497
dumper->dump_code = (
498
((gv = gv_fetchpv("YAML::XS::UseCode", TRUE, SVt_PV)) &&
501
((gv = gv_fetchpv("YAML::XS::DumpCode", TRUE, SVt_PV)) &&
505
dumper->quote_number_strings = (
506
((gv = gv_fetchpv("YAML::XS::QuoteNumericStrings", TRUE, SVt_PV)) &&
512
* This is the main Dump function.
513
* Take zero or more Perl objects and return a YAML stream (as a string)
519
perl_yaml_dumper_t dumper;
520
yaml_event_t event_stream_start;
521
yaml_event_t event_stream_end;
523
SV *yaml = sv_2mortal(newSVpvn("", 0));
526
set_dumper_options(&dumper);
528
/* Set up the emitter object and begin emitting */
529
yaml_emitter_initialize(&dumper.emitter);
530
yaml_emitter_set_unicode(&dumper.emitter, 1);
531
yaml_emitter_set_width(&dumper.emitter, 2);
532
yaml_emitter_set_output(
537
yaml_stream_start_event_initialize(
541
yaml_emitter_emit(&dumper.emitter, &event_stream_start);
543
dumper.anchors = newHV();
544
dumper.shadows = newHV();
546
sv_2mortal((SV *)dumper.anchors);
547
sv_2mortal((SV *)dumper.shadows);
549
for (i = 0; i < items; i++) {
552
dump_prewalk(&dumper, ST(i));
553
dump_document(&dumper, ST(i));
555
hv_clear(dumper.anchors);
556
hv_clear(dumper.shadows);
559
/* End emitting and destroy the emitter object */
560
yaml_stream_end_event_initialize(&event_stream_end);
561
yaml_emitter_emit(&dumper.emitter, &event_stream_end);
562
yaml_emitter_delete(&dumper.emitter);
564
/* Put the YAML stream scalar on the XS output stack */
573
* In order to know which nodes will need anchors (for later aliasing) it is
574
* necessary to walk the entire data structure first. Once a node has been
575
* seen twice you can stop walking it. That way we can handle circular refs.
576
* All the node information is stored in an HV.
579
dump_prewalk(perl_yaml_dumper_t *dumper, SV *node)
584
if (! (SvROK(node) || SvTYPE(node) == SVt_PVGV)) return;
587
SV *object = SvROK(node) ? SvRV(node) : node;
589
hv_fetch(dumper->anchors, (char *)&object, sizeof(object), 0);
591
if (*seen == &PL_sv_undef) {
593
dumper->anchors, (char *)&object, sizeof(object),
600
dumper->anchors, (char *)&object, sizeof(object), &PL_sv_undef, 0
604
if (SvTYPE(node) == SVt_PVGV) {
605
node = dump_glob(dumper, node);
608
ref_type = SvTYPE(SvRV(node));
609
if (ref_type == SVt_PVAV) {
610
AV *array = (AV *)SvRV(node);
611
int array_size = av_len(array) + 1;
612
for (i = 0; i < array_size; i++) {
613
SV **entry = av_fetch(array, i, 0);
615
dump_prewalk(dumper, *entry);
618
else if (ref_type == SVt_PVHV) {
619
HV *hash = (HV *)SvRV(node);
622
while ((he = hv_iternext(hash))) {
625
dump_prewalk(dumper, val);
628
else if (ref_type <= SVt_PVNV || ref_type == SVt_PVGV) {
629
SV *scalar = SvRV(node);
630
dump_prewalk(dumper, scalar);
635
dump_document(perl_yaml_dumper_t *dumper, SV *node)
637
yaml_event_t event_document_start;
638
yaml_event_t event_document_end;
639
yaml_document_start_event_initialize(
640
&event_document_start, NULL, NULL, NULL, 0
642
yaml_emitter_emit(&dumper->emitter, &event_document_start);
643
dump_node(dumper, node);
644
yaml_document_end_event_initialize(&event_document_end, 1);
645
yaml_emitter_emit(&dumper->emitter, &event_document_end);
649
dump_node(perl_yaml_dumper_t *dumper, SV *node)
651
yaml_char_t *anchor = NULL;
652
yaml_char_t *tag = NULL;
653
const char *class = NULL;
655
if (SvTYPE(node) == SVt_PVGV) {
657
tag = (yaml_char_t *)TAG_PERL_PREFIX "glob";
658
anchor = get_yaml_anchor(dumper, node);
659
if (anchor && strEQ((char *)anchor, "")) return;
660
svr = hv_fetch(dumper->shadows, (char *)&node, sizeof(node), 0);
662
node = SvREFCNT_inc(*svr);
667
SV *rnode = SvRV(node);
668
U32 ref_type = SvTYPE(rnode);
669
if (ref_type == SVt_PVHV)
670
dump_hash(dumper, node, anchor, tag);
671
else if (ref_type == SVt_PVAV)
672
dump_array(dumper, node);
673
else if (ref_type <= SVt_PVNV || ref_type == SVt_PVGV)
674
dump_ref(dumper, node);
675
else if (ref_type == SVt_PVCV)
676
dump_code(dumper, node);
677
else if (ref_type == SVt_PVMG) {
679
yaml_char_t *tag = NULL;
680
if (SvMAGICAL(rnode)) {
681
if ((mg = mg_find(rnode, PERL_MAGIC_qr))) {
682
tag = (yaml_char_t *)form(TAG_PERL_PREFIX "regexp");
683
class = sv_reftype(rnode, TRUE);
684
if (!strEQ(class, "Regexp"))
685
tag = (yaml_char_t *)form("%s:%s", tag, class);
689
tag = (yaml_char_t *)form(
690
TAG_PERL_PREFIX "scalar:%s",
691
sv_reftype(rnode, TRUE)
695
dump_scalar(dumper, node, tag);
697
#if PERL_REVISION > 5 || (PERL_REVISION == 5 && PERL_VERSION >= 11)
698
else if (ref_type == SVt_REGEXP) {
699
yaml_char_t *tag = (yaml_char_t *)form(TAG_PERL_PREFIX "regexp");
700
class = sv_reftype(rnode, TRUE);
701
if (!strEQ(class, "Regexp"))
702
tag = (yaml_char_t *)form("%s:%s", tag, class);
703
dump_scalar(dumper, node, tag);
708
"YAML::XS dump unhandled ref. type == '%d'!\n",
711
dump_scalar(dumper, rnode, NULL);
715
dump_scalar(dumper, node, NULL);
720
get_yaml_anchor(perl_yaml_dumper_t *dumper, SV *node)
722
yaml_event_t event_alias;
724
SV **seen = hv_fetch(dumper->anchors, (char *)&node, sizeof(node), 0);
725
if (seen && *seen != &PL_sv_undef) {
726
if (*seen == &PL_sv_yes) {
728
iv = newSViv(dumper->anchor);
729
hv_store(dumper->anchors, (char *)&node, sizeof(node), iv, 0);
730
return (yaml_char_t*)SvPV_nolen(iv);
733
yaml_char_t *anchor = (yaml_char_t *)SvPV_nolen(*seen);
734
yaml_alias_event_initialize(&event_alias, anchor);
735
yaml_emitter_emit(&dumper->emitter, &event_alias);
736
return (yaml_char_t *) "";
743
get_yaml_tag(SV *node)
747
const char *kind = "";
750
(SvRV(node) && ( SvTYPE(SvRV(node)) == SVt_PVCV))
752
class = sv_reftype(SvRV(node), TRUE);
754
switch (SvTYPE(SvRV(node))) {
755
case SVt_PVAV: { kind = "array"; break; }
756
case SVt_PVHV: { kind = "hash"; break; }
757
case SVt_PVCV: { kind = "code"; break; }
759
if ((strlen(kind) == 0))
760
tag = (yaml_char_t *)form("%s%s", TAG_PERL_PREFIX, class);
761
else if (SvTYPE(SvRV(node)) == SVt_PVCV && strEQ(class, "CODE"))
762
tag = (yaml_char_t *)form("%s%s", TAG_PERL_PREFIX, kind);
764
tag = (yaml_char_t *)form("%s%s:%s", TAG_PERL_PREFIX, kind, class);
770
perl_yaml_dumper_t *dumper, SV *node,
771
yaml_char_t *anchor, yaml_char_t *tag)
773
yaml_event_t event_mapping_start;
774
yaml_event_t event_mapping_end;
778
HV *hash = (HV *)SvRV(node);
782
anchor = get_yaml_anchor(dumper, (SV *)hash);
783
if (anchor && strEQ((char*)anchor, "")) return;
786
tag = get_yaml_tag(node);
788
yaml_mapping_start_event_initialize(
789
&event_mapping_start, anchor, tag, 0, YAML_BLOCK_MAPPING_STYLE
791
yaml_emitter_emit(&dumper->emitter, &event_mapping_start);
796
while ((he = hv_iternext(hash))) {
797
SV *key = hv_iterkeysv(he);
798
av_store(av, AvFILLp(av)+1, key); /* av_push(), really */
802
for (i = 0; i < len; i++) {
803
SV *key = av_shift(av);
804
HE *he = hv_fetch_ent(hash, key, 0, 0);
805
SV *val = he ? HeVAL(he) : NULL;
806
if (val == NULL) { val = &PL_sv_undef; }
807
dump_node(dumper, key);
808
dump_node(dumper, val);
813
yaml_mapping_end_event_initialize(&event_mapping_end);
814
yaml_emitter_emit(&dumper->emitter, &event_mapping_end);
818
dump_array(perl_yaml_dumper_t *dumper, SV *node)
820
yaml_event_t event_sequence_start;
821
yaml_event_t event_sequence_end;
824
AV *array = (AV *)SvRV(node);
825
int array_size = av_len(array) + 1;
827
yaml_char_t *anchor = get_yaml_anchor(dumper, (SV *)array);
828
if (anchor && strEQ((char *)anchor, "")) return;
829
tag = get_yaml_tag(node);
831
yaml_sequence_start_event_initialize(
832
&event_sequence_start, anchor, tag, 0, YAML_BLOCK_SEQUENCE_STYLE
835
yaml_emitter_emit(&dumper->emitter, &event_sequence_start);
836
for (i = 0; i < array_size; i++) {
837
SV **entry = av_fetch(array, i, 0);
839
dump_node(dumper, &PL_sv_undef);
841
dump_node(dumper, *entry);
843
yaml_sequence_end_event_initialize(&event_sequence_end);
844
yaml_emitter_emit(&dumper->emitter, &event_sequence_end);
848
dump_scalar(perl_yaml_dumper_t *dumper, SV *node, yaml_char_t *tag)
850
yaml_event_t event_scalar;
853
int plain_implicit, quoted_implicit;
854
yaml_scalar_style_t style = YAML_PLAIN_SCALAR_STYLE;
857
plain_implicit = quoted_implicit = 0;
860
tag = (yaml_char_t *)TAG_PERL_STR;
861
plain_implicit = quoted_implicit = 1;
868
style = YAML_PLAIN_SCALAR_STYLE;
870
else if (node == &PL_sv_yes) {
873
style = YAML_PLAIN_SCALAR_STYLE;
875
else if (node == &PL_sv_no) {
878
style = YAML_PLAIN_SCALAR_STYLE;
881
string = SvPV_nomg(node, string_len);
884
strEQ(string, "~") ||
885
strEQ(string, "true") ||
886
strEQ(string, "false") ||
887
strEQ(string, "null") ||
888
(SvTYPE(node) >= SVt_PVGV) ||
889
( dumper->quote_number_strings && !SvNIOK(node) && looks_like_number(node) )
891
style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
894
/* copy to new SV and promote to utf8 */
895
SV *utf8sv = sv_mortalcopy(node);
897
/* get string and length out of utf8 */
898
string = SvPVutf8(utf8sv, string_len);
901
yaml_scalar_event_initialize(
905
(unsigned char *) string,
911
if (! yaml_emitter_emit(&dumper->emitter, &event_scalar))
913
ERRMSG "Emit scalar '%s', error: %s\n",
914
string, dumper->emitter.problem
919
dump_code(perl_yaml_dumper_t *dumper, SV *node)
921
yaml_event_t event_scalar;
923
yaml_scalar_style_t style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
924
char *string = "{ \"DUMMY\" }";
925
if (dumper->dump_code) {
926
/* load_module(PERL_LOADMOD_NOIMPORT, newSVpv("B::Deparse", 0), NULL);
929
SV *code = find_coderef("YAML::XS::coderef2text");
931
av_push(args, SvREFCNT_inc(node));
932
args = (AV *)sv_2mortal((SV *)args);
933
result = call_coderef(code, args);
934
if (result && result != &PL_sv_undef) {
935
string = SvPV_nolen(result);
936
style = YAML_LITERAL_SCALAR_STYLE;
939
tag = get_yaml_tag(node);
941
yaml_scalar_event_initialize(
945
(unsigned char *)string,
952
yaml_emitter_emit(&dumper->emitter, &event_scalar);
956
dump_glob(perl_yaml_dumper_t *dumper, SV *node)
959
SV *code = find_coderef("YAML::XS::glob2hash");
961
av_push(args, SvREFCNT_inc(node));
962
args = (AV *)sv_2mortal((SV *)args);
963
result = call_coderef(code, args);
965
dumper->shadows, (char *)&node, sizeof(node),
971
/* XXX Refo this to just dump a special map */
973
dump_ref(perl_yaml_dumper_t *dumper, SV *node)
975
yaml_event_t event_mapping_start;
976
yaml_event_t event_mapping_end;
977
yaml_event_t event_scalar;
978
SV *referent = SvRV(node);
980
yaml_char_t *anchor = get_yaml_anchor(dumper, referent);
981
if (anchor && strEQ((char *)anchor, "")) return;
983
yaml_mapping_start_event_initialize(
984
&event_mapping_start, anchor,
985
(unsigned char *)TAG_PERL_PREFIX "ref",
986
0, YAML_BLOCK_MAPPING_STYLE
988
yaml_emitter_emit(&dumper->emitter, &event_mapping_start);
990
yaml_scalar_event_initialize(
993
(unsigned char *)"=", 1,
995
YAML_PLAIN_SCALAR_STYLE
997
yaml_emitter_emit(&dumper->emitter, &event_scalar);
998
dump_node(dumper, referent);
1000
yaml_mapping_end_event_initialize(&event_mapping_end);
1001
yaml_emitter_emit(&dumper->emitter, &event_mapping_end);
1005
append_output(void *yaml, unsigned char *buffer, size_t size)
1007
sv_catpvn((SV *)yaml, (const char *)buffer, (STRLEN)size);
1011
/* XXX Make -Wall not complain about 'local_patches' not being used. */
1012
#if !defined(PERL_PATCHLEVEL_H_IMPLICIT)
1013
void xxx_local_patches() {
1014
printf("%s", local_patches[0]);