Changeset 216


Ignore:
Timestamp:
07/30/06 08:49:17 (8 years ago)
Author:
xi
Message:

Fix Emitter bugs and leaks.

Location:
libyaml/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libyaml/trunk/src/api.c

    r215 r216  
    392392        yaml_event_delete(&DEQUEUE(emitter, emitter->events)); 
    393393    } 
     394    QUEUE_DEL(emitter, emitter->events); 
    394395    STACK_DEL(emitter, emitter->indents); 
    395396    while (!STACK_EMPTY(empty, emitter->tag_directives)) { 
     
    745746 
    746747    DOCUMENT_START_EVENT_INIT(*event, version_directive_copy, 
    747             tag_directives_copy.start, tag_directives_copy.end, 
     748            tag_directives_copy.start, tag_directives_copy.top, 
    748749            implicit, mark, mark); 
    749750 
  • libyaml/trunk/src/emitter.c

    r215 r216  
    291291        if (!yaml_emitter_state_machine(emitter, emitter->events.head)) 
    292292            return 0; 
    293         DEQUEUE(emitter, emitter->events); 
     293        yaml_event_delete(&DEQUEUE(emitter, emitter->events)); 
    294294    } 
    295295 
     
    688688        emitter->state = YAML_EMIT_DOCUMENT_START_STATE; 
    689689 
     690        while (!STACK_EMPTY(emitter, emitter->tag_directives)) { 
     691            yaml_tag_directive_t tag_directive = POP(emitter, 
     692                    emitter->tag_directives); 
     693            yaml_free(tag_directive.handle); 
     694            yaml_free(tag_directive.prefix); 
     695        } 
     696 
    690697        return 1; 
    691698    } 
     
    696703 
    697704/* 
     705 *  
    698706 * Expect a flow item node. 
    699707 */ 
     
    729737    } 
    730738 
     739    if (!first) { 
     740        if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0)) 
     741            return 0; 
     742    } 
     743 
    731744    if (emitter->canonical || emitter->column > emitter->best_width) { 
    732745        if (!yaml_emitter_write_indent(emitter)) 
    733746            return 0; 
    734747    } 
    735     if (PUSH(emitter, emitter->states, YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE)) 
     748    if (!PUSH(emitter, emitter->states, YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE)) 
    736749        return 0; 
    737750 
     
    11791192    if (style == YAML_LITERAL_SCALAR_STYLE || style == YAML_FOLDED_SCALAR_STYLE) 
    11801193    { 
    1181         if (!emitter->scalar_data.block_allowed) 
     1194        if (!emitter->scalar_data.block_allowed 
     1195                || emitter->flow_level || emitter->simple_key_context) 
    11821196            style = YAML_DOUBLE_QUOTED_SCALAR_STYLE; 
    11831197    } 
     
    13411355    handle.pointer ++; 
    13421356 
    1343     while (handle.pointer != handle.end-1) { 
     1357    while (handle.pointer < handle.end-1) { 
    13441358        if (!IS_ALPHA(handle)) { 
    13451359            return yaml_emitter_set_emitter_error(emitter, 
     
    13811395        MOVE(string); 
    13821396    } 
     1397 
     1398    emitter->anchor_data.anchor = string.start; 
     1399    emitter->anchor_data.anchor_length = string.end - string.start; 
     1400    emitter->anchor_data.alias = alias; 
     1401 
     1402    return 1; 
    13831403} 
    13841404 
     
    14001420 
    14011421    for (tag_directive = emitter->tag_directives.start; 
    1402             tag_directive != emitter->tag_directives.end; tag_directive ++) { 
     1422            tag_directive != emitter->tag_directives.top; tag_directive ++) { 
    14031423        size_t prefix_length = strlen((char *)tag_directive->prefix); 
    14041424        if (prefix_length < (string.end - string.start) 
     
    15871607        } 
    15881608 
     1609        if ((spaces || breaks) && string.pointer == string.end-1) 
     1610        { 
     1611            if (spaces && breaks) { 
     1612                mixed_breaks_spaces = 1; 
     1613            } 
     1614            else if (spaces) { 
     1615                if (leading) { 
     1616                    leading_spaces = 1; 
     1617                } 
     1618                trailing_spaces = 1; 
     1619            } 
     1620            else if (breaks) { 
     1621                if (leading) { 
     1622                    leading_breaks = 1; 
     1623                } 
     1624                trailing_breaks = 1; 
     1625            } 
     1626        } 
     1627 
    15891628        preceeded_by_space = IS_BLANKZ(string); 
    15901629        MOVE(string); 
     
    18401879                value = *(string.pointer++); 
    18411880                if (!PUT(emitter, '%')) return 0; 
    1842                 if (!PUT(emitter, (value >> 8) 
    1843                             + ((value >> 8) < 10 ? '0' : 'A' - 10))) 
     1881                if (!PUT(emitter, (value >> 4) 
     1882                            + ((value >> 4) < 10 ? '0' : 'A' - 10))) 
    18441883                    return 0; 
    18451884                if (!PUT(emitter, (value & 0x0F) 
     
    20842123                        width = 8; 
    20852124                    } 
    2086                     for (k = width*4; k >= 0; k -= 4) { 
    2087                         if (!PUT(emitter, (value >> k) & 0x0F)) return 0; 
     2125                    for (k = (width-1)*4; k >= 0; k -= 4) { 
     2126                        int digit = (value >> k) & 0x0F; 
     2127                        if (!PUT(emitter, digit + (digit < 10 ? '0' : 'A'-10))) 
     2128                            return 0; 
    20882129                    } 
    20892130            } 
     
    21302171    if (string.start == string.pointer) 
    21312172        return -1; 
    2132     while ((string.pointer[-1] & 0xC0) == 0x80) { 
     2173    do { 
    21332174        string.pointer --; 
    2134     } 
     2175    } while ((*string.pointer & 0xC0) == 0x80); 
    21352176    if (!IS_BREAK(string)) 
    21362177        return -1; 
    21372178    if (string.start == string.pointer) 
    21382179        return 0; 
    2139     while ((string.pointer[-1] & 0xC0) == 0x80) { 
     2180    do { 
    21402181        string.pointer --; 
    2141     } 
     2182    } while ((*string.pointer & 0xC0) == 0x80); 
    21422183    if (!IS_BREAK(string)) 
    21432184        return 0; 
     
    21792220    } 
    21802221 
    2181     if (!yaml_emitter_write_indent(emitter)) return 0; 
    2182  
    21832222    return 1; 
    21842223} 
     
    21902229    yaml_string_t string = STRING(value, length); 
    21912230    int chomp = yaml_emitter_determine_chomping(emitter, string); 
    2192     int breaks = 0; 
    2193     int leading_spaces = 1; 
     2231    int breaks = 1; 
     2232    int leading_spaces = 0; 
    21942233 
    21952234    if (!yaml_emitter_write_indicator(emitter, 
     
    22352274    } 
    22362275 
    2237     if (!yaml_emitter_write_indent(emitter)) return 0; 
    2238  
    2239     return 1; 
    2240 } 
    2241  
     2276    return 1; 
     2277} 
     2278 
  • libyaml/trunk/src/parser.c

    r213 r216  
    12531253            } 
    12541254            if (token->data.version_directive.major != 1 
    1255                     && token->data.version_directive.minor != 1) { 
     1255                    || token->data.version_directive.minor != 1) { 
    12561256                yaml_parser_set_parser_error(parser, 
    12571257                        "found incompatible YAML document", token->start_mark); 
  • libyaml/trunk/tests/Makefile.am

    r208 r216  
    22LDADD = $(top_builddir)/src/libyaml.la 
    33TESTS = test-version test-reader 
    4 check_PROGRAMS = test-version test-reader run-scanner run-parser 
     4check_PROGRAMS = test-version test-reader run-scanner run-parser run-emitter 
Note: See TracChangeset for help on using the changeset viewer.