The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
/* #include "ppport.h" */
#include <syck.h>

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