X-Git-Url: http://andersk.mit.edu/gitweb/libyaml.git/blobdiff_plain/b1a54000b5f6bfc58221bbf6f9aa384c821264a3..1ef1171721dae8f4dee1d8cc49953c69a56913d9:/src/parser.c diff --git a/src/parser.c b/src/parser.c index 020d5d6..eb2a2c7 100644 --- a/src/parser.c +++ b/src/parser.c @@ -172,12 +172,14 @@ yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event) assert(parser); /* Non-NULL parser object is expected. */ assert(event); /* Non-NULL event object is expected. */ + /* Erase the event object. */ + + memset(event, 0, sizeof(yaml_event_t)); + /* No events after the end of the stream or error. */ if (parser->stream_end_produced || parser->error || parser->state == YAML_PARSE_END_STATE) { - memset(event, 0, sizeof(yaml_event_t)); - return 1; } @@ -317,7 +319,7 @@ yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event) if (token->type != YAML_STREAM_START_TOKEN) { return yaml_parser_set_parser_error(parser, - "did not found expected ", token->start_mark); + "did not find expected ", token->start_mark); } parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE; @@ -350,6 +352,17 @@ yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event, token = PEEK_TOKEN(parser); if (!token) return 0; + /* Parse extra document end indicators. */ + + if (!implicit) + { + while (token->type == YAML_DOCUMENT_END_TOKEN) { + SKIP_TOKEN(parser); + token = PEEK_TOKEN(parser); + if (!token) return 0; + } + } + /* Parse an implicit document. */ if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN && @@ -380,7 +393,7 @@ yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event, if (!token) goto error; if (token->type != YAML_DOCUMENT_START_TOKEN) { yaml_parser_set_parser_error(parser, - "did not found expected ", token->start_mark); + "did not find expected ", token->start_mark); goto error; } if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE)) @@ -465,11 +478,9 @@ yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event) start_mark = end_mark = token->start_mark; - while (token->type == YAML_DOCUMENT_END_TOKEN) { + if (token->type == YAML_DOCUMENT_END_TOKEN) { end_mark = token->end_mark; SKIP_TOKEN(parser); - token = PEEK_TOKEN(parser); - if (!token) return 0; implicit = 0; } @@ -690,7 +701,7 @@ yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event, yaml_parser_set_parser_error_context(parser, (block ? "while parsing a block node" : "while parsing a flow node"), start_mark, - "did not found expected node content", token->start_mark); + "did not find expected node content", token->start_mark); goto error; } } @@ -748,8 +759,9 @@ yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser, else if (token->type == YAML_BLOCK_END_TOKEN) { + yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */ parser->state = POP(parser, parser->states); - POP(parser, parser->marks); + dummy_mark = POP(parser, parser->marks); SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark); SKIP_TOKEN(parser); return 1; @@ -759,7 +771,7 @@ yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser, { return yaml_parser_set_parser_error_context(parser, "while parsing a block collection", POP(parser, parser->marks), - "did not found expected '-' indicator", token->start_mark); + "did not find expected '-' indicator", token->start_mark); } } @@ -857,8 +869,9 @@ yaml_parser_parse_block_mapping_key(yaml_parser_t *parser, else if (token->type == YAML_BLOCK_END_TOKEN) { + yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */ parser->state = POP(parser, parser->states); - POP(parser, parser->marks); + dummy_mark = POP(parser, parser->marks); MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark); SKIP_TOKEN(parser); return 1; @@ -868,7 +881,7 @@ yaml_parser_parse_block_mapping_key(yaml_parser_t *parser, { return yaml_parser_set_parser_error_context(parser, "while parsing a block mapping", POP(parser, parser->marks), - "did not found expected key", token->start_mark); + "did not find expected key", token->start_mark); } } @@ -939,6 +952,7 @@ yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, yaml_event_t *event, int first) { yaml_token_t *token; + yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */ if (first) { token = PEEK_TOKEN(parser); @@ -961,7 +975,7 @@ yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, else { return yaml_parser_set_parser_error_context(parser, "while parsing a flow sequence", POP(parser, parser->marks), - "did not found expected ',' or ']'", token->start_mark); + "did not find expected ',' or ']'", token->start_mark); } } @@ -983,7 +997,7 @@ yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, } parser->state = POP(parser, parser->states); - POP(parser, parser->marks); + dummy_mark = POP(parser, parser->marks); SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark); SKIP_TOKEN(parser); return 1; @@ -1090,6 +1104,7 @@ yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, yaml_event_t *event, int first) { yaml_token_t *token; + yaml_mark_t dummy_mark; /* Used to eliminate a compiler warning. */ if (first) { token = PEEK_TOKEN(parser); @@ -1112,7 +1127,7 @@ yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, else { return yaml_parser_set_parser_error_context(parser, "while parsing a flow mapping", POP(parser, parser->marks), - "did not found expected ',' or '}'", token->start_mark); + "did not find expected ',' or '}'", token->start_mark); } } @@ -1143,7 +1158,7 @@ yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, } parser->state = POP(parser, parser->states); - POP(parser, parser->marks); + dummy_mark = POP(parser, parser->marks); MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark); SKIP_TOKEN(parser); return 1; @@ -1250,7 +1265,7 @@ yaml_parser_process_directives(yaml_parser_t *parser, goto error; } if (token->data.version_directive.major != 1 - && token->data.version_directive.minor != 1) { + || token->data.version_directive.minor != 1) { yaml_parser_set_parser_error(parser, "found incompatible YAML document", token->start_mark); goto error; @@ -1265,10 +1280,10 @@ yaml_parser_process_directives(yaml_parser_t *parser, } else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) { - yaml_tag_directive_t value = { - token->data.tag_directive.handle, - token->data.tag_directive.prefix - }; + yaml_tag_directive_t value; + value.handle = token->data.tag_directive.handle; + value.prefix = token->data.tag_directive.prefix; + if (!yaml_parser_append_tag_directive(parser, value, 0, token->start_mark)) goto error; @@ -1318,6 +1333,10 @@ error: return 0; } +/* + * Append a tag directive to the directives stack. + */ + static int yaml_parser_append_tag_directive(yaml_parser_t *parser, yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark) @@ -1335,8 +1354,8 @@ yaml_parser_append_tag_directive(yaml_parser_t *parser, } } - copy.handle = (yaml_char_t *)yaml_strdup((char *)value.handle); - copy.prefix = (yaml_char_t *)yaml_strdup((char *)value.prefix); + copy.handle = yaml_strdup(value.handle); + copy.prefix = yaml_strdup(value.prefix); if (!copy.handle || !copy.prefix) { parser->error = YAML_MEMORY_ERROR; goto error;