1#include "EXTERN.h" 2#include "perl.h" 3#include "XSUB.h" 4 5#define NEED_eval_pv 6#define NEED_grok_hex 7#define NEED_grok_number 8#define NEED_grok_numeric_radix 9#define NEED_grok_oct 10#define NEED_newRV_noinc 11#define NEED_newSVpvn_share 12#define NEED_sv_2pv_flags 13 14#include "ppport.h" 15#include "ppport_math.h" 16#include "ppport_sort.h" 17 18#ifndef is_utf8_string 19#define is_utf8_string(x, y) (0==1) 20#endif 21 22#undef DEBUG /* maybe defined in perl.h */ 23#include <syck.h> 24 25#ifndef newSVpvn_share 26#define newSVpvn_share(x, y, z) newSVpvn(x, y) 27#endif 28 29/* 30#undef ASSERT 31#include "Storable.xs" 32*/ 33 34struct emitter_xtra { 35 SV* port; 36 char* tag; 37 char dump_code; 38 bool implicit_binary; 39}; 40 41struct parser_xtra { 42 AV *objects; 43 bool implicit_unicode; 44 bool load_code; 45}; 46 47SV* perl_syck_lookup_sym( SyckParser *p, SYMID v) { 48 /* Not "undef" becase otherwise we have a warning on self-recursive nodes */ 49 SV *obj = &PL_sv_no; 50 syck_lookup_sym(p, v, (char **)&obj); 51 return obj; 52} 53 54#ifdef SvUTF8_on 55#define CHECK_UTF8 \ 56 if (((struct parser_xtra *)p->bonus)->implicit_unicode \ 57 && is_utf8_string((U8*)n->data.str->ptr, n->data.str->len)) \ 58 SvUTF8_on(sv); 59#else 60#define CHECK_UTF8 ; 61#endif 62 63SyckNode * perl_syck_bad_anchor_handler(SyckParser *p, char *a) { 64 SyckNode *badanc = syck_new_map( 65 (SYMID)newSVpvn_share("name", 4, 0), 66 (SYMID)newSVpvn_share(a, strlen(a), 0) 67 ); 68 badanc->type_id = syck_strndup( "!perl:YAML::Syck::BadAlias", 25 ); 69 return badanc; 70} 71 72void perl_syck_error_handler(SyckParser *p, char *msg) { 73 croak(form( "%s parser (line %d, column %d): %s", 74 "Syck", 75 p->linect + 1, 76 p->cursor - p->lineptr, 77 msg )); 78} 79 80void perl_syck_output_handler(SyckEmitter *e, char *str, long len) { 81 struct emitter_xtra *bonus = (struct emitter_xtra *)e->bonus; 82 sv_catpvn_nomg(bonus->port, str, len); 83} 84 85