#include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* #include "ppport.h" */ #include SYMID perl_syck_handler(SyckParser *p, SyckNode *n) { SYMID obj; SV *sv, *scalar, *entry, *key, *value; AV *seq; HV *map; long i; switch (n->kind) { case syck_str_kind: sv = newSVpv(n->data.str->ptr, n->data.str->len); break; case syck_seq_kind: seq = newAV(); for (i = 0; i < n->data.list->idx; i++) { obj = syck_seq_read(n, i); syck_lookup_sym(p, obj, (char**)&entry); av_push(seq, entry); } sv = newRV_inc((SV*)seq); break; case syck_map_kind: map = newHV(); for (i = 0; i < n->data.pairs->idx; i++) { obj = syck_map_read( n, map_key, i); syck_lookup_sym(p, obj, (char**)&key); obj = syck_map_read(n, map_value, i); syck_lookup_sym(p, obj, (char**)&value); hv_store_ent(map, key, value, 0); } sv = newRV_inc((SV*)map); break; } obj = syck_add_sym(p, (char *)sv); return obj; } static SV * Parse(char *s) { SV *obj; SYMID v; SyckParser *parser = syck_new_parser(); syck_parser_str_auto(parser, s, NULL); syck_parser_handler(parser, perl_syck_handler); syck_parser_error_handler(parser, NULL); syck_parser_implicit_typing(parser, 1); syck_parser_taguri_expansion(parser, 0); v = syck_parse(parser); syck_lookup_sym(parser, v, (char **)&obj); syck_free_parser(parser); return obj; } MODULE = YAML::Parser::Syck PACKAGE = YAML::Parser::Syck PROTOTYPES: DISABLE SV * Parse (s) char * s