summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Sidwell <andy@entai.co.uk>2008-07-09 15:35:11 +0000
committerAndrew Sidwell <andy@entai.co.uk>2008-07-09 15:35:11 +0000
commit6b9d7b0e859aa06b0f39e716f2576a19e025f955 (patch)
tree8c6251fe4ad12509a7c4374825d0e35cb3af5ede
parent5ff90817b11f159af1261ef60de983030f358974 (diff)
downloadlibhubbub-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
-rw-r--r--src/treebuilder/after_body.c38
-rw-r--r--src/treebuilder/in_frameset.c6
-rw-r--r--src/treebuilder/treebuilder.c14
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;