Changeset 1724

Show
Ignore:
Timestamp:
01/10/06 20:58:07
Author:
miyagawa
Message:

merge audrey's work

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • JSON-Syck/trunk/Syck.xs

    r1723 r1724  
     1#define YAML_IS_JSON 1 
    12#include "perl_syck.h" 
    2 #undef YAML_IS_JSON 
    33 
    44MODULE = JSON::Syck             PACKAGE = JSON::Syck             
     
    1111 
    1212SV * 
    13 _Dump (sv) 
     13Dump (sv) 
    1414        SV *    sv 
  • JSON-Syck/trunk/lib/JSON/Syck.pm

    r1716 r1724  
    1212 
    1313$JSON::Syck::ImplicitTyping = 1; 
    14  
    15 sub Dump { 
    16     my $json = JSON::Syck::_Dump(@_); 
    17     chomp($json); 
    18     $json; 
    19 
     14$JSON::Syck::Headless       = 1; 
    2015 
    21161; 
  • JSON-Syck/trunk/perl_syck.h

    r1723 r1724  
    1010#ifdef YAML_IS_JSON 
    1111#  define PACKAGE_NAME  "JSON::Syck" 
    12 #  define NULL_TYPE     "str" 
    1312#  define NULL_LITERAL  "null" 
    14 #  define SCALAR_NONE   scalar_2quote 
    15 #  define SCALAR_1QUOTE scalar_2quote 
     13#  define SCALAR_NUMBER scalar_none 
     14#  define SCALAR_STRING scalar_2quote 
     15#  define SCALAR_QUOTED scalar_2quote 
    1616#  define SEQ_NONE      seq_inline 
    1717#  define MAP_NONE      map_inline 
     18#  define TYPE_IS_NULL(x) ((x == NULL) || (strcmp( x, "str" ) == 0)) 
    1819#else 
    1920#  define PACKAGE_NAME  "YAML::Syck" 
    20 #  define NULL_TYPE     NULL 
    2121#  define NULL_LITERAL  "~" 
    22 #  define SCALAR_NONE   scalar_none 
    23 #  define SCALAR_1QUOTE scalar_1quote 
     22#  define SCALAR_NUMBER scalar_none 
     23#  define SCALAR_STRING scalar_none 
     24#  define SCALAR_QUOTED scalar_1quote 
    2425#  define SEQ_NONE      seq_none 
    2526#  define MAP_NONE      map_none 
     27#  define TYPE_IS_NULL(x) (x == NULL) 
    2628#endif 
    2729 
     
    5052    switch (n->kind) { 
    5153        case syck_str_kind: 
    52             if (n->type_id == NULL_TYPE) { 
     54            if (TYPE_IS_NULL(n->type_id)) { 
    5355                if ((strcmp( n->data.str->ptr, NULL_LITERAL ) == 0) 
    5456                    && (n->data.str->style == scalar_plain)) { 
     
    189191} 
    190192 
     193static char* perl_json_preprocess(char *s) { 
     194    int i; 
     195    char *out; 
     196    char ch; 
     197    bool in_string = 0; 
     198    bool in_quote  = 0; 
     199    char *pos; 
     200    STRLEN len = strlen(s); 
     201 
     202    Newz(2006, out, len*2+1, char); 
     203    pos = out; 
     204 
     205    for (i = 0; i < len; i++) { 
     206        ch = *(s+i); 
     207        *pos++ = ch; 
     208        if (in_quote) { 
     209            in_quote = !in_quote; 
     210        } 
     211        else if (ch == '\"') { 
     212            in_string = !in_string; 
     213        } 
     214        else if ((ch == ':' || ch == ',') && !in_string) { 
     215            *pos++ = ' '; 
     216        } 
     217    } 
     218 
     219    *pos = '\0'; 
     220    return out; 
     221} 
     222 
    191223static SV * Load(char *s) { 
    192224    SYMID v; 
     
    197229    /* Don't even bother if the string is empty. */ 
    198230    if (*s == '\0') { return &PL_sv_undef; } 
     231 
     232#ifdef YAML_IS_JSON 
     233    s = perl_json_preprocess(s); 
     234#endif 
    199235 
    200236    parser = syck_new_parser(); 
     
    259295        case SVt_PVNV: { 
    260296            if (SvCUR(sv) > 0) { 
    261                 syck_emit_scalar(e, OBJOF("string"), SCALAR_NONE, 0, 0, 0, SvPVX(sv), SvCUR(sv)); 
     297                syck_emit_scalar(e, OBJOF("string"), SCALAR_STRING, 0, 0, 0, SvPVX(sv), SvCUR(sv)); 
    262298            } 
    263299            else { 
    264                 syck_emit_scalar(e, OBJOF("string"), SCALAR_1QUOTE, 0, 0, 0, "", 0); 
     300                syck_emit_scalar(e, OBJOF("string"), SCALAR_QUOTED, 0, 0, 0, "", 0); 
    265301            } 
    266302            break; 
     
    272308        case SVt_PVLV: { 
    273309            if (sv_len(sv) > 0) { 
    274                 syck_emit_scalar(e, OBJOF("string"), SCALAR_NONE, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
     310                syck_emit_scalar(e, OBJOF("string"), SCALAR_NUMBER, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
    275311            } 
    276312            else { 
    277                 syck_emit_scalar(e, OBJOF("string"), SCALAR_1QUOTE, 0, 0, 0, "", 0); 
     313                syck_emit_scalar(e, OBJOF("string"), SCALAR_QUOTED, 0, 0, 0, "", 0); 
    278314            } 
    279315            break; 
     
    295331        } 
    296332        case SVt_PVHV: { 
    297             syck_emit_map(e, OBJOF("hash"), map_none); 
     333            syck_emit_map(e, OBJOF("hash"), MAP_NONE); 
    298334            *tag = '\0'; 
    299335#ifdef HAS_RESTRICTED_HASHES 
     
    320356        case SVt_PVCV: { 
    321357            /* XXX TODO XXX */ 
    322             syck_emit_scalar(e, OBJOF("string"), scalar_none, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
     358            syck_emit_scalar(e, OBJOF("string"), SCALAR_STRING, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
    323359            break; 
    324360        } 
     
    326362        case SVt_PVFM: { 
    327363            /* XXX TODO XXX */ 
    328             syck_emit_scalar(e, OBJOF("string"), scalar_none, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
     364            syck_emit_scalar(e, OBJOF("string"), SCALAR_STRING, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
    329365            break; 
    330366        } 
    331367        case SVt_PVIO: { 
    332             syck_emit_scalar(e, OBJOF("string"), scalar_none, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
     368            syck_emit_scalar(e, OBJOF("string"), SCALAR_STRING, 0, 0, 0, SvPV_nolen(sv), sv_len(sv)); 
    333369            break; 
    334370        } 
     
    342378    SV* out = newSVpvn("", 0); 
    343379    SyckEmitter *emitter = syck_new_emitter(); 
    344     SV *implicit = GvSV(gv_fetchpv(form("%s::Headless", PACKAGE_NAME), TRUE, SVt_PV)); 
     380    SV *headless = GvSV(gv_fetchpv(form("%s::Headless", PACKAGE_NAME), TRUE, SVt_PV)); 
     381 
     382    emitter->headless = SvTRUE(headless); 
    345383 
    346384    bonus = emitter->bonus = S_ALLOC_N(struct emitter_xtra, 1); 
     
    359397 
    360398#ifdef YAML_IS_JSON 
    361     Perl_do_chomp(out); 
     399    if (SvCUR(out) > 0) { 
     400        /* Trim the trailing newline */ 
     401        SvCUR_set(out, SvCUR(out)-1); 
     402    } 
    362403#endif 
    363404 
  • JSON-Syck/trunk/t/01_json.t

    r1722 r1724  
    33use Test::More; 
    44use JSON::Syck; 
     5use JSON; 
    56use Storable; 
    67 
     
    1213    '[1, 2, 3]', 
    1314    '[1, 2, 3]', 
    14 #    '1', 
    15 #    '"foo\'bar"', 
    16 #    '[1,2,3]', 
     15    '2', 
     16    '2.1', 
     17    '"foo\'bar"', 
     18    '[1,2,3]', 
    1719    '[1.1, 2.2, 3.3]', 
    18 #    '[1.1,2.2,3.3]', 
    19 #    '{"foo": "bar"}', 
    20 #    '{"foo":"bar"}', 
     20    '[1.1,2.2,3.3]', 
     21    '{"foo": "bar"}', 
     22    '{"foo":"bar"}', 
     23    '[{"foo": 2}, {"foo": "bar"}]', 
    2124); 
    2225 
    2326plan tests => scalar @tests; 
    2427 
     28my $conv = JSON::Converter->new; 
     29 
    2530for my $test (@tests) { 
    26     my $data = JSON::Syck::Load($test)
     31    my $data = eval { JSON::Syck::Load($test) }
    2732    my $json = JSON::Syck::Dump($data); 
    2833    is $json, $test, "roundtrip $test -> " . Dumper($data) . " -> $json"; 
     34 
     35    # try parsing the data with JSON.pm 
     36    my $data_pp = JSON::jsonToObj($json); 
     37    is_deeply $data_pp, $data, "compatibility with JSON.pm $test"; 
    2938}