diff options
author | Andrew Sidwell <andy@entai.co.uk> | 2008-07-09 15:35:11 +0000 |
---|---|---|
committer | Andrew Sidwell <andy@entai.co.uk> | 2008-07-09 15:35:11 +0000 |
commit | 6b9d7b0e859aa06b0f39e716f2576a19e025f955 (patch) | |
tree | 8c6251fe4ad12509a7c4374825d0e35cb3af5ede /src | |
parent | 5ff90817b11f159af1261ef60de983030f358974 (diff) | |
download | libhubbub-6b9d7b0e859aa06b0f39e716f2576a19e025f955.tar.gz libhubbub-6b9d7b0e859aa06b0f39e716f2576a19e025f955.tar.bz2 |
- Fix process_character_expect_whitespace()'s idea of whitespace to match current spec.
- Add a few more asserts (they can't hurt).
- Fix infinite loop "in frameset"
- Make the "after body" mode behave properly wrt character data
svn path=/trunk/hubbub/; revision=4543
Diffstat (limited to 'src')
-rw-r--r-- | src/treebuilder/after_body.c | 38 | ||||
-rw-r--r-- | src/treebuilder/in_frameset.c | 6 | ||||
-rw-r--r-- | src/treebuilder/treebuilder.c | 14 |
3 files changed, 50 insertions, 8 deletions
diff --git a/src/treebuilder/after_body.c b/src/treebuilder/after_body.c index 66bcd06..81c654a 100644 --- a/src/treebuilder/after_body.c +++ b/src/treebuilder/after_body.c @@ -28,8 +28,42 @@ bool handle_after_body(hubbub_treebuilder *treebuilder, switch (token->type) { case HUBBUB_TOKEN_CHARACTER: - reprocess = process_characters_expect_whitespace(treebuilder, - token, true); + { + /* mostly cribbed from process_characters_expect_whitespace */ + + const uint8_t *data = treebuilder->input_buffer + + token->data.character.data.off; + + size_t len = token->data.character.len; + size_t c; + + /** \todo utf-16 */ + + /* Scan for whitespace */ + for (c = 0; c < len; c++) { + if (data[c] != 0x09 && data[c] != 0x0A && + data[c] != 0x0C && data[c] != 0x20) + break; + } + + /* Non-whitespace characters in token, so handle as in body */ + if (c > 0) { + hubbub_token temp = *token; + temp.data.character.len = c; + + handle_in_body(treebuilder, &temp); + } + + /* Anything else, switch to in body */ + if (c != len) { + /* Update token data to strip leading whitespace */ + ((hubbub_token *) token)->data.character.data.off += c; + ((hubbub_token *) token)->data.character.len -= c; + + treebuilder->context.mode = IN_BODY; + reprocess = true; + } + } break; case HUBBUB_TOKEN_COMMENT: process_comment_append(treebuilder, token, diff --git a/src/treebuilder/in_frameset.c b/src/treebuilder/in_frameset.c index f46431c..465f7e6 100644 --- a/src/treebuilder/in_frameset.c +++ b/src/treebuilder/in_frameset.c @@ -28,8 +28,10 @@ bool handle_in_frameset(hubbub_treebuilder *treebuilder, switch (token->type) { case HUBBUB_TOKEN_CHARACTER: - reprocess = process_characters_expect_whitespace(treebuilder, - token, true); + if (process_characters_expect_whitespace(treebuilder, + token, true)) { + /** \todo parser error */ + } break; case HUBBUB_TOKEN_COMMENT: process_comment_append(treebuilder, token, diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c index 670c1db..20649e1 100644 --- a/src/treebuilder/treebuilder.c +++ b/src/treebuilder/treebuilder.c @@ -407,7 +407,7 @@ void hubbub_treebuilder_token_handler(const hubbub_token *token, bool process_characters_expect_whitespace(hubbub_treebuilder *treebuilder, const hubbub_token *token, bool insert_into_current_node) { - const uint8_t *data = treebuilder->input_buffer + + const uint8_t *data = treebuilder->input_buffer + token->data.character.data.off; size_t len = token->data.character.len; size_t c; @@ -415,9 +415,8 @@ bool process_characters_expect_whitespace(hubbub_treebuilder *treebuilder, /** \todo UTF-16 */ for (c = 0; c < len; c++) { - if (data[c] != 0x09 && data[c] != 0x0A && - data[c] != 0x0B && data[c] != 0x0C && - data[c] != 0x20) + if (data[c] != 0x09 && data[c] != 0x0A && + data[c] != 0x0C && data[c] != 0x20) break; } /* Non-whitespace characters in token, so reprocess */ @@ -713,6 +712,8 @@ void insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag) int success; void *node, *appended; + /** \todo handle treebuilder->context.in_table_foster */ + success = treebuilder->tree_handler->create_element( treebuilder->tree_handler->ctx, tag, &node); if (success != 0) { @@ -751,6 +752,8 @@ void insert_element_no_push(hubbub_treebuilder *treebuilder, int success; void *node, *appended; + /** \todo handle treebuilder->context.in_table_foster */ + success = treebuilder->tree_handler->create_element( treebuilder->tree_handler->ctx, tag, &node); if (success != 0) { @@ -1081,6 +1084,7 @@ bool element_stack_pop(hubbub_treebuilder *treebuilder, /** \todo reduce allocated stack size once there's enough free */ treebuilder->context.current_node = slot - 1; + assert((signed) treebuilder->context.current_node >= 0); return true; } @@ -1105,6 +1109,8 @@ bool element_stack_pop_until(hubbub_treebuilder *treebuilder, treebuilder->tree_handler->unref_node( treebuilder->tree_handler->ctx, node); + + assert((signed) treebuilder->context.current_node >= 0); } return true; |