SyckPatches: emitter.c.diff

File emitter.c.diff, 5.0 KB (added by xi, 8 years ago)

patch for the Complex Key bug

  • emitter.c

     
    359359    char *anchor_name = NULL; 
    360360    int indent = 0; 
    361361    long x = 0; 
     362    SyckLevel *parent; 
    362363    SyckLevel *lvl = syck_emitter_current_level( e ); 
    363364     
    364365    /* 
     
    386387        indent = lvl->spaces + e->indent; 
    387388    } 
    388389    syck_emitter_add_level( e, indent, syck_lvl_open ); 
     390    parent = lvl; 
    389391    lvl = syck_emitter_current_level( e ); 
    390392 
    391393    /* Look for anchor */ 
     
    402404        { 
    403405            char *an = S_ALLOC_N( char, strlen( anchor_name ) + 3 ); 
    404406            sprintf( an, "&%s ", anchor_name ); 
     407 
     408            /* Complex key */ 
     409            if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1) { 
     410                syck_emitter_write( e, "? ", 2 ); 
     411                parent->status = syck_lvl_mapx; 
     412            } 
     413 
    405414            syck_emitter_write( e, an, strlen( anchor_name ) + 2 ); 
    406415            free( an ); 
    407416 
     
    9961005{ 
    9971006    SyckLevel *parent = syck_emitter_parent_level( e ); 
    9981007    SyckLevel *lvl = syck_emitter_current_level( e ); 
     1008 
     1009    /* complex key 
     1010     * There should also be the check "&& style == seq_none", 
     1011     * but unfortunately syck cannot parse flow collections as simple keys 
     1012     * now, so we will make a complex key. 
     1013     * Add the check when syck is able to parse "[]: foo" */ 
     1014    if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) { 
     1015        syck_emitter_write( e, "? ", 2 ); 
     1016        parent->status = syck_lvl_mapx; 
     1017    } 
     1018 
    9991019    syck_emit_tag( e, tag, "tag:yaml.org,2002:seq" ); 
    10001020    if ( style == seq_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) { 
    10011021        syck_emitter_write( e, "[", 1 ); 
     
    10121032{ 
    10131033    SyckLevel *parent = syck_emitter_parent_level( e ); 
    10141034    SyckLevel *lvl = syck_emitter_current_level( e ); 
     1035 
     1036    /* complex key 
     1037     * There should also be the check "&& style == map_none", 
     1038     * but unfortunately syck cannot parse flow collections as simple keys 
     1039     * now, so we will make a complex key. 
     1040     * Add the check when syck is able to parse "{}: foo". */ 
     1041    if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) { 
     1042        syck_emitter_write( e, "? ", 2 ); 
     1043        parent->status = syck_lvl_mapx; 
     1044    } 
     1045 
    10151046    syck_emit_tag( e, tag, "tag:yaml.org,2002:map" ); 
    10161047    if ( style == map_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) { 
    10171048        syck_emitter_write( e, "{", 1 ); 
     
    10351066            SyckLevel *parent = syck_emitter_parent_level( e ); 
    10361067 
    10371068            /* seq-in-map shortcut */ 
    1038             if ( parent->status == syck_lvl_map && lvl->ncount == 0 ) { 
    1039                 /* complex key */ 
    1040                 if ( parent->ncount % 2 == 1 ) { 
    1041                     syck_emitter_write( e, "?", 1 ); 
    1042                     parent->status = syck_lvl_mapx; 
     1069            if ( parent->status == syck_lvl_mapx && lvl->ncount == 0 ) { 
    10431070                /* shortcut -- the lvl->anctag check should be unneccesary but 
    10441071                 * there is a nasty shift/reduce in the parser on this point and 
    10451072                 * i'm not ready to tickle it. */ 
    1046                 } else if ( lvl->anctag == 0 ) {  
     1073                if ( parent->ncount % 2 == 0 && lvl->anctag == 0 ) { 
    10471074                    lvl->spaces = parent->spaces; 
    10481075                } 
    10491076            } 
     
    10781105        { 
    10791106            SyckLevel *parent = syck_emitter_parent_level( e ); 
    10801107 
    1081             /* map-in-map */ 
    1082             if ( parent->status == syck_lvl_map && lvl->ncount == 0 ) { 
    1083                 /* complex key */ 
    1084                 if ( parent->ncount % 2 == 1 ) { 
    1085                     syck_emitter_write( e, "?", 1 ); 
    1086                     parent->status = syck_lvl_mapx; 
    1087                 } 
    1088             } 
    1089  
    10901108            /* map-in-seq shortcut */ 
    10911109            if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) { 
    10921110                int spcs = ( lvl->spaces - parent->spaces ) - 2; 
     
    11641182        break; 
    11651183 
    11661184        case syck_lvl_iseq: 
    1167             syck_emitter_write( e, "]\n", 1 ); 
     1185            syck_emitter_write( e, "]", 1 ); 
     1186            if ( parent->status == syck_lvl_mapx ) { 
     1187                syck_emitter_write( e, "\n", 1 ); 
     1188            } 
    11681189        break; 
    11691190 
    11701191        case syck_lvl_map: 
    11711192            if ( lvl->ncount == 0 ) { 
    11721193                syck_emitter_write( e, "{}\n", 3 ); 
    11731194            } else if ( lvl->ncount % 2 == 1 ) { 
    1174                 syck_emitter_write( e, ":\n", 1 ); 
     1195                syck_emitter_write( e, ":", 1 ); 
    11751196            } else if ( parent->status == syck_lvl_mapx ) { 
    11761197                syck_emitter_write( e, "\n", 1 ); 
    11771198            } 
    11781199        break; 
    11791200 
    11801201        case syck_lvl_imap: 
    1181             syck_emitter_write( e, "}\n", 1 ); 
     1202            syck_emitter_write( e, "}", 1 ); 
     1203            if ( parent->status == syck_lvl_mapx ) { 
     1204                syck_emitter_write( e, "\n", 1 ); 
     1205            } 
    11821206        break; 
    11831207 
    11841208        default: break;