1 /* These definitions affect -pedantic warnings...
2 
3 #define PERL_GCC_BRACE_GROUPS_FORBIDDEN 1
4 #define __STRICT_ANSI__ 1
5 #define PERL_GCC_PEDANTIC 1
6 */
7 
8 #include "EXTERN.h"
9 #include "perl.h"
10 #define NO_XSLOCKS
11 #include "XSUB.h"
12 #define NEED_newRV_noinc
13 #define NEED_sv_2pv_nolen
14 #define NEED_sv_2pvbyte
15 #include "ppport.h"
16 #include <yaml.h>
17 #include <ppport_sort.h>
18 
19 #define TAG_PERL_PREFIX "tag:yaml.org,2002:perl/"
20 #define TAG_PERL_REF TAG_PERL_PREFIX "ref"
21 #define TAG_PERL_STR TAG_PERL_PREFIX "str"
22 #define TAG_PERL_GLOB TAG_PERL_PREFIX "glob"
23 #define ERRMSG "YAML::XS Error: "
24 #define LOADERRMSG "YAML::XS::Load Error: "
25 #define DUMPERRMSG "YAML::XS::Dump Error: "
26 
27 typedef struct {
28     yaml_parser_t parser;
29     yaml_event_t event;
30     HV *anchors;
31     int load_code;
32     int load_bool_jsonpp;
33     int load_bool_boolean;
34     int load_blessed;
35     int document;
36 } perl_yaml_loader_t;
37 
38 typedef struct {
39     yaml_emitter_t emitter;
40     long anchor;
41     HV *anchors;
42     HV *shadows;
43     int dump_code;
44     int dump_bool_jsonpp;
45     int dump_bool_boolean;
46     int quote_number_strings;
47 } perl_yaml_dumper_t;
48 
49 static SV *
50 call_coderef(SV *, AV *);
51 
52 static SV *
53 fold_results(I32);
54 
55 static SV *
56 find_coderef(char *);
57 
58 void
59 set_dumper_options(perl_yaml_dumper_t *);
60 
61 void
62 set_loader_options(perl_yaml_dumper_t *);
63 
64 void
65 Dump(SV *, ...);
66 
67 void
68 Load(SV *);
69 
70 SV *
71 load_node(perl_yaml_loader_t *);
72 
73 SV *
74 load_mapping(perl_yaml_loader_t *, char *);
75 
76 SV *
77 load_sequence(perl_yaml_loader_t *);
78 
79 SV *
80 load_scalar(perl_yaml_loader_t *);
81 
82 SV *
83 load_alias(perl_yaml_loader_t *);
84 
85 SV *
86 load_scalar_ref(perl_yaml_loader_t *);
87 
88 SV *
89 load_code(perl_yaml_loader_t *);
90 
91 SV *
92 load_regexp(perl_yaml_loader_t *);
93 
94 SV *
95 load_glob(perl_yaml_loader_t *);
96 
97 
98 void
99 dump_prewalk(perl_yaml_dumper_t *, SV *);
100 
101 void
102 dump_document(perl_yaml_dumper_t *, SV *);
103 
104 void
105 dump_node(perl_yaml_dumper_t *, SV *);
106 
107 void
108 dump_hash(perl_yaml_dumper_t *, SV *, yaml_char_t *, yaml_char_t *);
109 
110 void
111 dump_array(perl_yaml_dumper_t *, SV *);
112 
113 void
114 dump_scalar(perl_yaml_dumper_t *, SV *, yaml_char_t *);
115 
116 void
117 dump_ref(perl_yaml_dumper_t *, SV *);
118 
119 void
120 dump_code(perl_yaml_dumper_t *, SV *);
121 
122 SV*
123 dump_glob(perl_yaml_dumper_t *, SV *);
124 
125 
126 yaml_char_t *
127 get_yaml_anchor(perl_yaml_dumper_t *, SV *);
128 
129 yaml_char_t *
130 get_yaml_tag(SV *);
131 
132 
133 int
134 append_output(void *, unsigned char *, size_t size);
135 
136