Changeset 1715

Show
Ignore:
Timestamp:
01/10/06 04:09:47
Author:
miyagawa
Message:

merged YAML::Syck 0.14 changes

Files:

Legend:

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

    r1706 r1715  
    2323ppport.h 
    2424README 
    25 Storable.xs 
    2625syck.h 
    2726Syck.xs 
  • JSON-Syck/trunk/Makefile.PL

    r1707 r1715  
    66inc_paths   '.'; 
    77c_files     (glob("*.c"), (-e 'Syck.c' ? () : 'Syck.c')); 
    8 optimize_flags '-g3'; 
     8#optimize_flags '-g3'; 
    99 
    1010can_cc or die "This module requires a C compiler"; 
  • JSON-Syck/trunk/Syck.xs

    r1707 r1715  
    3131    switch (n->kind) { 
    3232        case syck_str_kind: 
    33             if (n->type_id == NULL || strcmp( n->type_id, "str" ) == 0 ) { 
     33            if (n->type_id == NULL) { 
     34                if ((strcmp( n->data.str->ptr, "~" ) == 0) && (n->data.str->style == scalar_plain)) { 
     35                    sv = &PL_sv_undef; 
     36                } else { 
     37                    sv = newSVpvn(n->data.str->ptr, n->data.str->len); 
     38                } 
     39            } else if (strcmp( n->type_id, "str" ) == 0 ) { 
    3440                sv = newSVpvn(n->data.str->ptr, n->data.str->len); 
    3541            } else if (strcmp( n->type_id, "null" ) == 0 ) { 
    3642                sv = &PL_sv_undef; 
     43            } else if (strcmp( n->type_id, "bool#yes" ) == 0 ) { 
     44                sv = &PL_sv_yes; 
     45            } else if (strcmp( n->type_id, "bool#no" ) == 0 ) { 
     46                sv = &PL_sv_no; 
     47            } else if (strcmp( n->type_id, "default" ) == 0 ) { 
     48                sv = newSVpvn(n->data.str->ptr, n->data.str->len); 
     49            } else if (strcmp( n->type_id, "float#base60" ) == 0 ) { 
     50                char *ptr, *end; 
     51                UV sixty = 1; 
     52                NV total = 0.0; 
     53                syck_str_blow_away_commas( n ); 
     54                ptr = n->data.str->ptr; 
     55                end = n->data.str->ptr + n->data.str->len; 
     56                while ( end > ptr ) 
     57                { 
     58                    NV bnum = 0; 
     59                    char *colon = end - 1; 
     60                    while ( colon >= ptr && *colon != ':' ) 
     61                    { 
     62                        colon--; 
     63                    } 
     64                    if ( *colon == ':' ) *colon = '\0'; 
     65 
     66                    bnum = strtod( colon + 1, NULL ); 
     67                    total += bnum * sixty; 
     68                    sixty *= 60; 
     69                    end = colon; 
     70                } 
     71                sv = newSVnv(total); 
     72            } else if (strcmp( n->type_id, "float#nan" ) == 0 ) { 
     73                sv = newSVnv(NV_NAN); 
     74            } else if (strcmp( n->type_id, "float#inf" ) == 0 ) { 
     75                sv = newSVnv(NV_INF); 
     76            } else if (strcmp( n->type_id, "float#neginf" ) == 0 ) { 
     77                sv = newSVnv(-NV_INF); 
     78            } else if (strncmp( n->type_id, "float", 5 ) == 0) { 
     79                NV f; 
     80                syck_str_blow_away_commas( n ); 
     81                f = strtod( n->data.str->ptr, NULL ); 
     82                sv = newSVnv( f ); 
     83            } else if (strcmp( n->type_id, "int#base60" ) == 0 ) { 
     84                char *ptr, *end; 
     85                UV sixty = 1; 
     86                UV total = 0; 
     87                syck_str_blow_away_commas( n ); 
     88                ptr = n->data.str->ptr; 
     89                end = n->data.str->ptr + n->data.str->len; 
     90                while ( end > ptr ) 
     91                { 
     92                    long bnum = 0; 
     93                    char *colon = end - 1; 
     94                    while ( colon >= ptr && *colon != ':' ) 
     95                    { 
     96                        colon--; 
     97                    } 
     98                    if ( *colon == ':' ) *colon = '\0'; 
     99 
     100                    bnum = strtol( colon + 1, NULL, 10 ); 
     101                    total += bnum * sixty; 
     102                    sixty *= 60; 
     103                    end = colon; 
     104                } 
     105                sv = newSVuv(total); 
     106            } else if (strcmp( n->type_id, "int#hex" ) == 0 ) { 
     107                STRLEN len = n->data.str->len; 
     108                syck_str_blow_away_commas( n ); 
     109                sv = newSVuv( grok_hex( n->data.str->ptr, &len, 0, NULL) ); 
     110            } else if (strcmp( n->type_id, "int#oct" ) == 0 ) { 
     111                STRLEN len = n->data.str->len; 
     112                syck_str_blow_away_commas( n ); 
     113                sv = newSVuv( grok_oct( n->data.str->ptr, &len, 0, NULL) ); 
     114            } else if (strncmp( n->type_id, "int", 3 ) == 0) { 
     115                UV uv = 0; 
     116                syck_str_blow_away_commas( n ); 
     117                grok_number( n->data.str->ptr, n->data.str->len, &uv); 
     118                sv = newSVuv(uv); 
    37119            } else { 
     120                /* croak("unknown node type: %s", n->type_id); */ 
    38121                sv = newSVpvn(n->data.str->ptr, n->data.str->len); 
    39                 /* croak("unknown node type: %s", n->type_id); */ 
    40122            } 
    41123        break; 
     
    85167    SV *obj; 
    86168    SYMID v; 
    87     SyckParser *parser = syck_new_parser(); 
     169    SyckParser *parser; 
     170    SV *implicit = GvSV(gv_fetchpv("YAML::Syck::ImplicitTyping", TRUE, SVt_PV)); 
     171 
     172    /* Don't even bother if the string is empty. */ 
     173    if (*s == '\0') { return &PL_sv_undef; } 
     174 
     175    parser = syck_new_parser(); 
    88176    syck_parser_str_auto(parser, s, NULL); 
    89177    syck_parser_handler(parser, perl_syck_parser_handler); 
    90178    syck_parser_error_handler(parser, perl_syck_error_handler); 
    91     syck_parser_implicit_typing(parser, 1); 
     179    syck_parser_implicit_typing(parser, SvTRUE(implicit)); 
    92180    syck_parser_taguri_expansion(parser, 0); 
    93181    v = syck_parse(parser); 
     
    100188    struct emitter_xtra *bonus = (struct emitter_xtra *)e->bonus; 
    101189    sv_catpvn_nomg(bonus->port, str, len); 
     190    e->headless = 1; 
    102191} 
    103192 
     
    233322    perl_syck_mark_emitter( emitter ); 
    234323    syck_emit( emitter, (st_data_t)sv ); 
    235     syck_emitter_flush( emitter, 1 ); 
    236324    syck_emitter_flush( emitter, 0 ); 
     325    syck_free_emitter( emitter ); 
     326 
    237327    Safefree(bonus->tag); 
    238     syck_free_emitter( emitter ); 
    239  
    240328    return out; 
    241329}