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