summaryrefslogtreecommitdiff
path: root/src/treebuilder
diff options
context:
space:
mode:
Diffstat (limited to 'src/treebuilder')
-rw-r--r--src/treebuilder/after_body.c6
-rw-r--r--src/treebuilder/after_head.c3
-rw-r--r--src/treebuilder/before_head.c3
-rw-r--r--src/treebuilder/before_html.c3
-rw-r--r--src/treebuilder/generic_rcdata.c17
-rw-r--r--src/treebuilder/in_body.c76
-rw-r--r--src/treebuilder/in_foreign_content.c21
-rw-r--r--src/treebuilder/in_head.c2
-rw-r--r--src/treebuilder/in_row.c3
-rw-r--r--src/treebuilder/in_table.c16
-rw-r--r--src/treebuilder/in_table_body.c3
-rw-r--r--src/treebuilder/initial.c11
-rw-r--r--src/treebuilder/internal.h21
-rw-r--r--src/treebuilder/script_collect.c6
-rw-r--r--src/treebuilder/treebuilder.c115
-rw-r--r--src/treebuilder/treebuilder.h6
16 files changed, 115 insertions, 197 deletions
diff --git a/src/treebuilder/after_body.c b/src/treebuilder/after_body.c
index 65f4e53..98191c0 100644
--- a/src/treebuilder/after_body.c
+++ b/src/treebuilder/after_body.c
@@ -31,9 +31,7 @@ bool handle_after_body(hubbub_treebuilder *treebuilder,
{
/* mostly cribbed from process_characters_expect_whitespace */
- const uint8_t *data = treebuilder->input_buffer +
- token->data.character.data.off;
-
+ const uint8_t *data = token->data.character.ptr;
size_t len = token->data.character.len;
size_t c;
@@ -57,7 +55,7 @@ bool handle_after_body(hubbub_treebuilder *treebuilder,
/* 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.ptr += c;
((hubbub_token *) token)->data.character.len -= c;
treebuilder->context.mode = IN_BODY;
diff --git a/src/treebuilder/after_head.c b/src/treebuilder/after_head.c
index 0243727..5bd4b40 100644
--- a/src/treebuilder/after_head.c
+++ b/src/treebuilder/after_head.c
@@ -100,8 +100,7 @@ bool handle_after_head(hubbub_treebuilder *treebuilder,
if (reprocess) {
/* Manufacture body */
tag.ns = HUBBUB_NS_HTML;
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr = (const uint8_t *) "body";
+ tag.name.ptr = (const uint8_t *) "body";
tag.name.len = SLEN("body");
tag.n_attributes = 0;
diff --git a/src/treebuilder/before_head.c b/src/treebuilder/before_head.c
index 459a411..eb9c917 100644
--- a/src/treebuilder/before_head.c
+++ b/src/treebuilder/before_head.c
@@ -78,8 +78,7 @@ bool handle_before_head(hubbub_treebuilder *treebuilder,
if (reprocess) {
/* Manufacture head tag */
tag.ns = HUBBUB_NS_HTML;
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr = (const uint8_t *) "head";
+ tag.name.ptr = (const uint8_t *) "head";
tag.name.len = SLEN("head");
tag.n_attributes = 0;
diff --git a/src/treebuilder/before_html.c b/src/treebuilder/before_html.c
index 8401087..70eebde 100644
--- a/src/treebuilder/before_html.c
+++ b/src/treebuilder/before_html.c
@@ -73,8 +73,7 @@ bool handle_before_html(hubbub_treebuilder *treebuilder,
/** \todo UTF-16 */
tag.ns = HUBBUB_NS_HTML;
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr = (const uint8_t *) "html";
+ tag.name.ptr = (const uint8_t *) "html";
tag.name.len = SLEN("html");
tag.n_attributes = 0;
diff --git a/src/treebuilder/generic_rcdata.c b/src/treebuilder/generic_rcdata.c
index 0ab3b8c..e15cf97 100644
--- a/src/treebuilder/generic_rcdata.c
+++ b/src/treebuilder/generic_rcdata.c
@@ -35,20 +35,16 @@ bool handle_generic_rcdata(hubbub_treebuilder *treebuilder,
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
- if (treebuilder->context.collect.string.len == 0) {
- treebuilder->context.collect.string.data.off =
- token->data.character.data.off;
- }
- treebuilder->context.collect.string.len +=
- token->data.character.len;
+ treebuilder->context.collect.string =
+ token->data.character;
if (treebuilder->context.strip_leading_lr) {
- const uint8_t *str = treebuilder->input_buffer +
- treebuilder->context.collect.string.data.off;
+ const uint8_t *str =
+ treebuilder->context.collect.string.ptr;
/** \todo UTF-16 */
if (*str == '\n') {
- treebuilder->context.collect.string.data.off++;
+ treebuilder->context.collect.string.ptr++;
treebuilder->context.collect.string.len--;
}
@@ -79,7 +75,7 @@ bool handle_generic_rcdata(hubbub_treebuilder *treebuilder,
break;
}
- if (done && treebuilder->context.collect.string.len) {
+ if (treebuilder->context.collect.string.len) {
int success;
void *text, *appended;
@@ -107,6 +103,7 @@ bool handle_generic_rcdata(hubbub_treebuilder *treebuilder,
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx, text);
+ treebuilder->context.collect.string.len = 0;
}
if (done) {
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 57b346d..699152e 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -185,12 +185,11 @@ void process_character(hubbub_treebuilder *treebuilder,
reconstruct_active_formatting_list(treebuilder);
if (treebuilder->context.strip_leading_lr) {
- const uint8_t *str =
- treebuilder->input_buffer + dummy.data.off;
+ const uint8_t *str = dummy.ptr;
/** \todo UTF-16 */
if (*str == '\n') {
- dummy.data.off++;
+ dummy.ptr++;
dummy.len--;
}
@@ -627,12 +626,13 @@ void process_a_in_body(hubbub_treebuilder *treebuilder,
/* Remove from formatting list, if it's still there */
if (entry2 == entry && entry2->details.node == node) {
+ hubbub_ns ons;
element_type otype;
void *onode;
uint32_t oindex;
formatting_list_remove(treebuilder, entry,
- &otype, &onode, &oindex);
+ &ons, &otype, &onode, &oindex);
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx, onode);
@@ -657,7 +657,7 @@ void process_a_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- formatting_list_append(treebuilder, A,
+ formatting_list_append(treebuilder, token->data.tag.ns, A,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
treebuilder->context.current_node);
@@ -682,7 +682,7 @@ void process_presentational_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- formatting_list_append(treebuilder, type,
+ formatting_list_append(treebuilder, token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
treebuilder->context.current_node);
@@ -716,7 +716,7 @@ void process_nobr_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- formatting_list_append(treebuilder, NOBR,
+ formatting_list_append(treebuilder, token->data.tag.ns, NOBR,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
treebuilder->context.current_node);
@@ -756,7 +756,7 @@ void process_button_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- formatting_list_append(treebuilder, BUTTON,
+ formatting_list_append(treebuilder, token->data.tag.ns, BUTTON,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
treebuilder->context.current_node);
@@ -781,7 +781,7 @@ void process_applet_marquee_object_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- formatting_list_append(treebuilder, type,
+ formatting_list_append(treebuilder, token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
treebuilder->context.current_node);
@@ -816,8 +816,7 @@ void process_image_in_body(hubbub_treebuilder *treebuilder,
/** \todo UTF-16 */
tag.ns = HUBBUB_NS_HTML;
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr = (const uint8_t *) "img";
+ tag.name.ptr = (const uint8_t *) "img";
tag.name.len = SLEN("img");
tag.n_attributes = token->data.tag.n_attributes;
@@ -883,7 +882,7 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
/* First up, clone the token's attributes */
if (token->data.tag.n_attributes > 0) {
- attrs = treebuilder->alloc(NULL,
+ attrs = treebuilder->alloc(NULL,
(token->data.tag.n_attributes + 1) *
sizeof(hubbub_attribute),
treebuilder->alloc_pw);
@@ -894,12 +893,11 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
for (uint32_t i = 0; i < token->data.tag.n_attributes; i++) {
hubbub_attribute *attr = &token->data.tag.attributes[i];
- const uint8_t *name = treebuilder->input_buffer +
- attr->name.data.off;
+ const uint8_t *name = attr->name.ptr;
- if (strncmp((const char *) name, "action",
+ if (strncmp((const char *) name, "action",
attr->name.len) == 0) {
- action = attr;
+ action = attr;
} else if (strncmp((const char *) name, "prompt",
attr->name.len) == 0) {
prompt = attr;
@@ -911,11 +909,9 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
}
attrs[n_attrs].ns = HUBBUB_NS_HTML;
- attrs[n_attrs].name.type = HUBBUB_STRING_PTR;
- attrs[n_attrs].name.data.ptr = (const uint8_t *) "name";
+ attrs[n_attrs].name.ptr = (const uint8_t *) "name";
attrs[n_attrs].name.len = SLEN("name");
- attrs[n_attrs].value.type = HUBBUB_STRING_PTR;
- attrs[n_attrs].value.data.ptr = (const uint8_t *) "isindex";
+ attrs[n_attrs].value.ptr = (const uint8_t *) "isindex";
attrs[n_attrs].value.len = SLEN("isindex");
n_attrs++;
}
@@ -925,10 +921,9 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
/* Set up dummy as a start tag token */
dummy.type = HUBBUB_TOKEN_START_TAG;
dummy.data.tag.ns = HUBBUB_NS_HTML;
- dummy.data.tag.name.type = HUBBUB_STRING_PTR;
/* Act as if <form> were seen */
- dummy.data.tag.name.data.ptr = (const uint8_t *) "form";
+ dummy.data.tag.name.ptr = (const uint8_t *) "form";
dummy.data.tag.name.len = SLEN("form");
dummy.data.tag.n_attributes = action != NULL ? 1 : 0;
@@ -937,7 +932,7 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
process_form_in_body(treebuilder, &dummy);
/* Act as if <hr> were seen */
- dummy.data.tag.name.data.ptr = (const uint8_t *) "hr";
+ dummy.data.tag.name.ptr = (const uint8_t *) "hr";
dummy.data.tag.name.len = SLEN("hr");
dummy.data.tag.n_attributes = 0;
dummy.data.tag.attributes = NULL;
@@ -945,7 +940,7 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
process_hr_in_body(treebuilder, &dummy);
/* Act as if <p> were seen */
- dummy.data.tag.name.data.ptr = (const uint8_t *) "p";
+ dummy.data.tag.name.ptr = (const uint8_t *) "p";
dummy.data.tag.name.len = SLEN("p");
dummy.data.tag.n_attributes = 0;
dummy.data.tag.attributes = NULL;
@@ -953,7 +948,7 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
process_container_in_body(treebuilder, &dummy);
/* Act as if <label> were seen */
- dummy.data.tag.name.data.ptr = (const uint8_t *) "label";
+ dummy.data.tag.name.ptr = (const uint8_t *) "label";
dummy.data.tag.name.len = SLEN("label");
dummy.data.tag.n_attributes = 0;
dummy.data.tag.attributes = NULL;
@@ -967,8 +962,7 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
} else {
/** \todo Localisation */
#define PROMPT "This is a searchable index. Insert your search keywords here: "
- dummy.data.character.type = HUBBUB_STRING_PTR;
- dummy.data.character.data.ptr = (const uint8_t *) PROMPT;
+ dummy.data.character.ptr = (const uint8_t *) PROMPT;
dummy.data.character.len = SLEN(PROMPT);
#undef PROMPT
}
@@ -977,8 +971,8 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
/* Act as if <input> was seen */
dummy.type = HUBBUB_TOKEN_START_TAG;
- dummy.data.tag.name.type = HUBBUB_STRING_PTR;
- dummy.data.tag.name.data.ptr = (const uint8_t *) "input";
+ dummy.data.tag.ns = HUBBUB_NS_HTML;
+ dummy.data.tag.name.ptr = (const uint8_t *) "input";
dummy.data.tag.name.len = SLEN("input");
dummy.data.tag.n_attributes = n_attrs;
@@ -993,7 +987,7 @@ void process_isindex_in_body(hubbub_treebuilder *treebuilder,
process_0p_in_body(treebuilder);
/* Act as if <hr> was seen */
- dummy.data.tag.name.data.ptr = (const uint8_t *) "hr";
+ dummy.data.tag.name.ptr = (const uint8_t *) "hr";
dummy.data.tag.name.len = SLEN("hr");
dummy.data.tag.n_attributes = 0;
dummy.data.tag.attributes = NULL;
@@ -1171,9 +1165,8 @@ void process_0p_in_body(hubbub_treebuilder *treebuilder)
dummy.type = HUBBUB_TOKEN_START_TAG;
dummy.data.tag.ns = HUBBUB_NS_HTML;
- dummy.data.tag.name.type = HUBBUB_STRING_PTR;
/** \todo UTF-16 */
- dummy.data.tag.name.data.ptr = (const uint8_t *) "p";
+ dummy.data.tag.name.ptr = (const uint8_t *) "p";
dummy.data.tag.name.len = SLEN("p");
dummy.data.tag.n_attributes = 0;
dummy.data.tag.attributes = NULL;
@@ -1415,19 +1408,20 @@ void process_0presentational_in_body(hubbub_treebuilder *treebuilder,
stack[furthest_block + 1].node = clone_appended;
/* 12 */
+ hubbub_ns ons;
element_type otype;
void *onode;
uint32_t oindex;
formatting_list_remove(treebuilder, entry,
- &otype, &onode, &oindex);
+ &ons, &otype, &onode, &oindex);
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx, onode);
formatting_list_insert(treebuilder,
bookmark.prev, bookmark.next,
- otype, clone_appended, furthest_block + 1);
+ ons, otype, clone_appended, furthest_block + 1);
/* 14 */
}
@@ -1457,6 +1451,7 @@ bool aa_find_and_validate_formatting_element(hubbub_treebuilder *treebuilder,
if (entry->stack_index == 0) {
/* Not in element stack => remove from formatting list */
+ hubbub_ns ns;
element_type type;
void *node;
uint32_t index;
@@ -1464,7 +1459,7 @@ bool aa_find_and_validate_formatting_element(hubbub_treebuilder *treebuilder,
/** \todo parse error */
if (!formatting_list_remove(treebuilder, entry,
- &type, &node, &index)) {
+ &ns, &type, &node, &index)) {
/** \todo errors */
}
@@ -1553,7 +1548,7 @@ bool aa_find_furthest_block(hubbub_treebuilder *treebuilder,
/* Remove the formatting element from the list */
if (!formatting_list_remove(treebuilder, formatting_element,
- &type, &node, &index)) {
+ &ns, &type, &node, &index)) {
/* \todo errors */
}
@@ -1786,6 +1781,7 @@ void aa_remove_element_stack_item(hubbub_treebuilder *treebuilder,
void aa_clone_and_replace_entries(hubbub_treebuilder *treebuilder,
formatting_list_entry *element)
{
+ hubbub_ns ons;
element_type otype;
uint32_t oindex;
void *clone, *onode;
@@ -1796,8 +1792,9 @@ void aa_clone_and_replace_entries(hubbub_treebuilder *treebuilder,
/* Replace formatting list entry for node with clone */
formatting_list_replace(treebuilder, element,
- element->details.type, clone, element->stack_index,
- &otype, &onode, &oindex);
+ element->details.ns, element->details.type,
+ clone, element->stack_index,
+ &ons, &otype, &onode, &oindex);
treebuilder->tree_handler->unref_node(treebuilder->tree_handler->ctx,
onode);
@@ -1935,8 +1932,7 @@ void process_0br_in_body(hubbub_treebuilder *treebuilder)
/** \todo UTF-16 */
tag.ns = HUBBUB_NS_HTML;
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr = (const uint8_t *) "br";
+ tag.name.ptr = (const uint8_t *) "br";
tag.name.len = SLEN("br");
tag.n_attributes = 0;
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index 5b38839..a5dda6b 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -147,16 +147,14 @@ void adjust_svg_attributes(hubbub_treebuilder *treebuilder,
for (size_t i = 0; i < tag->n_attributes; i++) {
hubbub_attribute *attr = &tag->attributes[i];
- const uint8_t *name = treebuilder->input_buffer +
- attr->name.data.off;
+ const uint8_t *name = attr->name.ptr;
size_t len = attr->name.len;
for (size_t j = 0; j < N_ELEMENTS(svg_attributes); j++) {
if (hubbub_string_match(name, len,
(uint8_t *)svg_attributes[j].attr,
svg_attributes[j].len)) {
- attr->name.type = HUBBUB_STRING_PTR;
- attr->name.data.ptr =
+ attr->name.ptr =
(uint8_t *)svg_attributes[j].proper;
}
}
@@ -172,16 +170,14 @@ void adjust_svg_attributes(hubbub_treebuilder *treebuilder,
void adjust_svg_tagname(hubbub_treebuilder *treebuilder,
hubbub_tag *tag)
{
- uint8_t *name = (uint8_t *) treebuilder->input_buffer +
- tag->name.data.off;
+ const uint8_t *name = tag->name.ptr;
size_t len = tag->name.len;
for (size_t i = 0; i < N_ELEMENTS(svg_tagnames); i++) {
if (hubbub_string_match(name, len,
(uint8_t *)svg_tagnames[i].attr,
svg_tagnames[i].len)) {
- tag->name.type = HUBBUB_STRING_PTR;
- tag->name.data.ptr =
+ tag->name.ptr =
(uint8_t *)svg_tagnames[i].proper;
}
}
@@ -202,8 +198,7 @@ void adjust_foreign_attributes(hubbub_treebuilder *treebuilder,
{
for (size_t i = 0; i < tag->n_attributes; i++) {
hubbub_attribute *attr = &tag->attributes[i];
- const uint8_t *name = treebuilder->input_buffer +
- attr->name.data.off;
+ const uint8_t *name = attr->name.ptr;
/* 10 == strlen("xlink:href") */
if (attr->name.len >= 10 &&
@@ -226,7 +221,7 @@ void adjust_foreign_attributes(hubbub_treebuilder *treebuilder,
hubbub_string_match(name, len,
S("type"))) {
attr->ns = HUBBUB_NS_XLINK;
- attr->name.data.off += 6;
+ attr->name.ptr += 6;
attr->name.len -= 6;
}
/* 8 == strlen("xml:base") */
@@ -241,7 +236,7 @@ void adjust_foreign_attributes(hubbub_treebuilder *treebuilder,
hubbub_string_match(name, len,
S("space"))) {
attr->ns = HUBBUB_NS_XML;
- attr->name.data.off += 4;
+ attr->name.ptr += 4;
attr->name.len -= 4;
}
} else if (hubbub_string_match(name, attr->name.len,
@@ -249,7 +244,7 @@ void adjust_foreign_attributes(hubbub_treebuilder *treebuilder,
hubbub_string_match(name, attr->name.len,
S("xmlns:xlink"))) {
attr->ns = HUBBUB_NS_XMLNS;
- attr->name.data.off += 6;
+ attr->name.ptr += 6;
attr->name.len -= 6;
}
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index 7b78973..79cfbc8 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -68,7 +68,7 @@ static void process_script_in_head(hubbub_treebuilder *treebuilder,
treebuilder->context.collect.mode = treebuilder->context.mode;
treebuilder->context.collect.node = script;
treebuilder->context.collect.type = SCRIPT;
- treebuilder->context.collect.string.data.off = 0;
+ treebuilder->context.collect.string.ptr = NULL;
treebuilder->context.collect.string.len = 0;
treebuilder->context.mode = SCRIPT_COLLECT_CHARACTERS;
diff --git a/src/treebuilder/in_row.c b/src/treebuilder/in_row.c
index c7afb1c..7264f5c 100644
--- a/src/treebuilder/in_row.c
+++ b/src/treebuilder/in_row.c
@@ -103,7 +103,8 @@ bool handle_in_row(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- formatting_list_append(treebuilder, type,
+ formatting_list_append(treebuilder,
+ token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
treebuilder->context.current_node);
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c
index ec5173e..70969dd 100644
--- a/src/treebuilder/in_table.c
+++ b/src/treebuilder/in_table.c
@@ -49,10 +49,8 @@ static inline bool process_input_in_table(hubbub_treebuilder *treebuilder,
for (size_t i = 0; i < token->data.tag.n_attributes; i++) {
hubbub_attribute *attr = &token->data.tag.attributes[i];
- if (!hubbub_string_match_ci(treebuilder->input_buffer +
- attr->value.data.off,
- attr->value.len, (uint8_t *) "hidden",
- SLEN("hidden"))) {
+ if (!hubbub_string_match_ci(attr->value.ptr, attr->value.len,
+ (uint8_t *) "hidden", SLEN("hidden"))) {
continue;
}
@@ -120,7 +118,8 @@ bool handle_in_table(hubbub_treebuilder *treebuilder,
treebuilder->tree_handler->ctx,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- formatting_list_append(treebuilder, type,
+ formatting_list_append(treebuilder,
+ token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
treebuilder->context.current_node);
@@ -132,9 +131,7 @@ bool handle_in_table(hubbub_treebuilder *treebuilder,
if (type == COL) {
/* Insert colgroup and reprocess */
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr =
- (const uint8_t *) "colgroup";
+ tag.name.ptr = (const uint8_t *) "colgroup";
tag.name.len = SLEN("colgroup");
reprocess = true;
@@ -149,8 +146,7 @@ bool handle_in_table(hubbub_treebuilder *treebuilder,
if (type == TD || type == TH || type == TR) {
/* Insert tbody and reprocess */
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr = (const uint8_t *) "tbody";
+ tag.name.ptr = (const uint8_t *) "tbody";
tag.name.len = SLEN("tbody");
reprocess = true;
diff --git a/src/treebuilder/in_table_body.c b/src/treebuilder/in_table_body.c
index 0bf8df7..6a6c82a 100644
--- a/src/treebuilder/in_table_body.c
+++ b/src/treebuilder/in_table_body.c
@@ -114,8 +114,7 @@ bool handle_in_table_body(hubbub_treebuilder *treebuilder,
/* Manufacture tr tag */
tag.ns = HUBBUB_NS_HTML;
- tag.name.type = HUBBUB_STRING_PTR;
- tag.name.data.ptr = (const uint8_t *) "tr";
+ tag.name.ptr = (const uint8_t *) "tr";
tag.name.len = SLEN("tr");
tag.n_attributes = 0;
diff --git a/src/treebuilder/initial.c b/src/treebuilder/initial.c
index 1bce044..a90af13 100644
--- a/src/treebuilder/initial.c
+++ b/src/treebuilder/initial.c
@@ -120,15 +120,13 @@ static bool lookup_full_quirks(hubbub_treebuilder *treebuilder,
{
size_t i;
- const uint8_t *name = treebuilder->input_buffer + cdoc->name.data.off;
+ const uint8_t *name = cdoc->name.ptr;
size_t name_len = cdoc->name.len;
- const uint8_t *public_id = treebuilder->input_buffer +
- cdoc->public_id.data.off;
+ const uint8_t *public_id = cdoc->public_id.ptr;
size_t public_id_len = cdoc->public_id.len;
- const uint8_t *system_id = treebuilder->input_buffer +
- cdoc->system_id.data.off;
+ const uint8_t *system_id = cdoc->system_id.ptr;
size_t system_id_len = cdoc->system_id.len;
#define S(s) (uint8_t *) s, sizeof s
@@ -183,8 +181,7 @@ static bool lookup_full_quirks(hubbub_treebuilder *treebuilder,
static bool lookup_limited_quirks(hubbub_treebuilder *treebuilder,
const hubbub_doctype *cdoc)
{
- const uint8_t *public_id = treebuilder->input_buffer +
- cdoc->public_id.data.off;
+ const uint8_t *public_id = cdoc->public_id.ptr;
size_t public_id_len = cdoc->public_id.len;
#define S(s) (uint8_t *) s, sizeof s
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index ae293a9..5c9eb49 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -102,16 +102,10 @@ struct hubbub_treebuilder
{
hubbub_tokeniser *tokeniser; /**< Underlying tokeniser */
- const uint8_t *input_buffer; /**< Start of tokeniser's buffer */
- size_t input_buffer_len; /**< Length of input buffer */
-
hubbub_treebuilder_context context;
hubbub_tree_handler *tree_handler;
- hubbub_buffer_handler buffer_handler;
- void *buffer_pw;
-
hubbub_error_handler error_handler;
void *error_pw;
@@ -163,17 +157,22 @@ element_type current_node(hubbub_treebuilder *treebuilder);
element_type prev_node(hubbub_treebuilder *treebuilder);
bool formatting_list_append(hubbub_treebuilder *treebuilder,
- element_type type, void *node, uint32_t stack_index);
+ hubbub_ns ns, element_type type, void *node,
+ uint32_t stack_index);
bool formatting_list_insert(hubbub_treebuilder *treebuilder,
formatting_list_entry *prev, formatting_list_entry *next,
- element_type type, void *node, uint32_t stack_index);
+ hubbub_ns ns, element_type type, void *node,
+ uint32_t stack_index);
bool formatting_list_remove(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry,
- element_type *type, void **node, uint32_t *stack_index);
+ hubbub_ns *ns, element_type *type, void **node,
+ uint32_t *stack_index);
bool formatting_list_replace(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry,
- element_type type, void *node, uint32_t stack_index,
- element_type *otype, void **onode, uint32_t *ostack_index);
+ hubbub_ns ns, element_type type, void *node,
+ uint32_t stack_index,
+ hubbub_ns *ons, element_type *otype, void **onode,
+ uint32_t *ostack_index);
/* in_foreign_content.c */
void adjust_svg_attributes(hubbub_treebuilder *treebuilder,
diff --git a/src/treebuilder/script_collect.c b/src/treebuilder/script_collect.c
index e55b17c..e016409 100644
--- a/src/treebuilder/script_collect.c
+++ b/src/treebuilder/script_collect.c
@@ -30,10 +30,10 @@ bool handle_script_collect_characters(hubbub_treebuilder *treebuilder,
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
if (treebuilder->context.collect.string.len == 0) {
- treebuilder->context.collect.string.data.off =
- token->data.character.data.off;
+ treebuilder->context.collect.string.ptr =
+ token->data.character.ptr;
}
- treebuilder->context.collect.string.len +=
+ treebuilder->context.collect.string.len +=
token->data.character.len;
break;
case HUBBUB_TOKEN_END_TAG:
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index f739113..c6d8f69 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -76,9 +76,6 @@ static const struct {
};
-static void hubbub_treebuilder_buffer_handler(const uint8_t *data,
- size_t len, void *pw);
-
/**
* Create a hubbub treebuilder
@@ -103,9 +100,6 @@ hubbub_treebuilder *hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
tb->tokeniser = tokeniser;
- tb->input_buffer = NULL;
- tb->input_buffer_len = 0;
-
tb->tree_handler = NULL;
memset(&tb->context, 0, sizeof(hubbub_treebuilder_context));
@@ -124,13 +118,8 @@ hubbub_treebuilder *hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
assert(HTML != 0);
tb->context.element_stack[0].type = 0;
- tb->context.collect.string.type = HUBBUB_STRING_OFF;
-
tb->context.strip_leading_lr = false;
- tb->buffer_handler = NULL;
- tb->buffer_pw = NULL;
-
tb->error_handler = NULL;
tb->error_pw = NULL;
@@ -147,17 +136,7 @@ hubbub_treebuilder *hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
return NULL;
}
- tokparams.buffer_handler.handler = hubbub_treebuilder_buffer_handler;
- tokparams.buffer_handler.pw = tb;
-
- if (hubbub_tokeniser_setopt(tokeniser, HUBBUB_TOKENISER_BUFFER_HANDLER,
- &tokparams) != HUBBUB_OK) {
- alloc(tb->context.element_stack, 0, pw);
- alloc(tb, 0, pw);
- return NULL;
- }
-
- return tb;
+ return tb;
}
/**
@@ -173,12 +152,6 @@ void hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder)
if (treebuilder == NULL)
return;
- tokparams.buffer_handler.handler = treebuilder->buffer_handler;
- tokparams.buffer_handler.pw = treebuilder->buffer_pw;
-
- hubbub_tokeniser_setopt(treebuilder->tokeniser,
- HUBBUB_TOKENISER_BUFFER_HANDLER, &tokparams);
-
tokparams.token_handler.handler = NULL;
tokparams.token_handler.pw = NULL;
@@ -253,13 +226,6 @@ hubbub_error hubbub_treebuilder_setopt(hubbub_treebuilder *treebuilder,
return HUBBUB_BADPARM;
switch (type) {
- case HUBBUB_TREEBUILDER_BUFFER_HANDLER:
- treebuilder->buffer_handler = params->buffer_handler.handler;
- treebuilder->buffer_pw = params->buffer_handler.pw;
- treebuilder->buffer_handler(treebuilder->input_buffer,
- treebuilder->input_buffer_len,
- treebuilder->buffer_pw);
- break;
case HUBBUB_TREEBUILDER_ERROR_HANDLER:
treebuilder->error_handler = params->error_handler.handler;
treebuilder->error_pw = params->error_handler.pw;
@@ -276,29 +242,6 @@ hubbub_error hubbub_treebuilder_setopt(hubbub_treebuilder *treebuilder,
}
/**
- * Handle tokeniser buffer moving
- *
- * \param data New location of buffer
- * \param len Length of buffer in bytes
- * \param pw Pointer to treebuilder instance
- */
-void hubbub_treebuilder_buffer_handler(const uint8_t *data,
- size_t len, void *pw)
-{
- hubbub_treebuilder *treebuilder = (hubbub_treebuilder *) pw;
-
- treebuilder->input_buffer = data;
- treebuilder->input_buffer_len = len;
-
- /* Inform client buffer handler, too (if there is one) */
- if (treebuilder->buffer_handler != NULL) {
- treebuilder->buffer_handler(treebuilder->input_buffer,
- treebuilder->input_buffer_len,
- treebuilder->buffer_pw);
- }
-}
-
-/**
* Handle tokeniser emitting a token
*
* \param token The emitted token
@@ -418,8 +361,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 +
- token->data.character.data.off;
+ const uint8_t *data = token->data.character.ptr;
size_t len = token->data.character.len;
size_t c;
@@ -434,8 +376,7 @@ bool process_characters_expect_whitespace(hubbub_treebuilder *treebuilder,
if (c > 0 && insert_into_current_node) {
hubbub_string temp;
- temp.type = HUBBUB_STRING_OFF;
- temp.data.off = token->data.character.data.off;
+ temp.ptr = data;
temp.len = c;
append_text(treebuilder, &temp);
@@ -444,7 +385,7 @@ bool process_characters_expect_whitespace(hubbub_treebuilder *treebuilder,
/* Non-whitespace characters in token, so reprocess */
if (c != len) {
/* Update token data to strip leading whitespace */
- ((hubbub_token *) token)->data.character.data.off += c;
+ ((hubbub_token *) token)->data.character.ptr += c;
((hubbub_token *) token)->data.character.len -= c;
return true;
@@ -566,7 +507,7 @@ void parse_generic_rcdata(hubbub_treebuilder *treebuilder,
treebuilder->context.collect.mode = treebuilder->context.mode;
treebuilder->context.collect.type = type;
treebuilder->context.collect.node = appended;
- treebuilder->context.collect.string.data.off = 0;
+ treebuilder->context.collect.string.ptr = NULL;
treebuilder->context.collect.string.len = 0;
treebuilder->tree_handler->unref_node(
@@ -651,6 +592,7 @@ void reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder)
while (entry != NULL) {
int success;
void *clone, *appended;
+ hubbub_ns prev_ns;
element_type prev_type;
void *prev_node;
uint32_t prev_stack_index;
@@ -719,9 +661,9 @@ void reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder)
}
if (!formatting_list_replace(treebuilder, entry,
- entry->details.type, appended,
- treebuilder->context.current_node,
- &prev_type, &prev_node,
+ entry->details.ns, entry->details.type,
+ appended, treebuilder->context.current_node,
+ &prev_ns, &prev_type, &prev_node,
&prev_stack_index)) {
/** \todo handle errors */
treebuilder->tree_handler->unref_node(
@@ -748,6 +690,7 @@ void clear_active_formatting_list_to_marker(hubbub_treebuilder *treebuilder)
bool done = false;
while ((entry = treebuilder->context.formatting_list_end) != NULL) {
+ hubbub_ns ns;
element_type type;
void *node;
uint32_t stack_index;
@@ -756,7 +699,7 @@ void clear_active_formatting_list_to_marker(hubbub_treebuilder *treebuilder)
done = true;
if (!formatting_list_remove(treebuilder, entry,
- &type, &node, &stack_index)) {
+ &ns, &type, &node, &stack_index)) {
/** \todo handle errors */
}
@@ -1009,18 +952,9 @@ void append_text(hubbub_treebuilder *treebuilder,
element_type element_type_from_name(hubbub_treebuilder *treebuilder,
const hubbub_string *tag_name)
{
- const uint8_t *name = NULL;
+ const uint8_t *name = tag_name->ptr;
size_t len = tag_name->len;
- switch (tag_name->type) {
- case HUBBUB_STRING_OFF:
- name = treebuilder->input_buffer + tag_name->data.off;
- break;
- case HUBBUB_STRING_PTR:
- name = tag_name->data.ptr;
- break;
- }
-
/** \todo UTF-16 support */
/** \todo optimise this */
@@ -1249,13 +1183,15 @@ element_type prev_node(hubbub_treebuilder *treebuilder)
* Append an element to the end of the list of active formatting elements
*
* \param treebuilder Treebuilder instance containing list
+ * \param ns Namespace of node being inserted
* \param type Type of node being inserted
* \param node Node being inserted
* \param stack_index Index into stack of open elements
* \return True on success, false on memory exhaustion
*/
bool formatting_list_append(hubbub_treebuilder *treebuilder,
- element_type type, void *node, uint32_t stack_index)
+ hubbub_ns ns, element_type type, void *node,
+ uint32_t stack_index)
{
formatting_list_entry *entry;
@@ -1264,6 +1200,7 @@ bool formatting_list_append(hubbub_treebuilder *treebuilder,
if (entry == NULL)
return false;
+ entry->details.ns = ns;
entry->details.type = type;
entry->details.node = node;
entry->stack_index = stack_index;
@@ -1287,6 +1224,7 @@ bool formatting_list_append(hubbub_treebuilder *treebuilder,
* \param treebuilder Treebuilder instance containing list
* \param prev Previous entry
* \param next Next entry
+ * \param ns Namespace of node being inserted
* \param type Type of node being inserted
* \param node Node being inserted
* \param stack_index Index into stack of open elements
@@ -1294,7 +1232,8 @@ bool formatting_list_append(hubbub_treebuilder *treebuilder,
*/
bool formatting_list_insert(hubbub_treebuilder *treebuilder,
formatting_list_entry *prev, formatting_list_entry *next,
- element_type type, void *node, uint32_t stack_index)
+ hubbub_ns ns, element_type type, void *node,
+ uint32_t stack_index)
{
formatting_list_entry *entry;
@@ -1311,6 +1250,7 @@ bool formatting_list_insert(hubbub_treebuilder *treebuilder,
if (entry == NULL)
return false;
+ entry->details.ns = ns;
entry->details.type = type;
entry->details.node = node;
entry->stack_index = stack_index;
@@ -1337,6 +1277,7 @@ bool formatting_list_insert(hubbub_treebuilder *treebuilder,
*
* \param treebuilder Treebuilder instance containing list
* \param entry The item to remove
+ * \param ns Pointer to location to receive namespace of node
* \param type Pointer to location to receive type of node
* \param node Pointer to location to receive node
* \param stack_index Pointer to location to receive stack index
@@ -1344,8 +1285,10 @@ bool formatting_list_insert(hubbub_treebuilder *treebuilder,
*/
bool formatting_list_remove(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry,
- element_type *type, void **node, uint32_t *stack_index)
+ hubbub_ns *ns, element_type *type, void **node,
+ uint32_t *stack_index)
{
+ *ns = entry->details.ns;
*type = entry->details.type;
*node = entry->details.node;
*stack_index = entry->stack_index;
@@ -1370,9 +1313,11 @@ bool formatting_list_remove(hubbub_treebuilder *treebuilder,
*
* \param treebuilder Treebuilder instance containing list
* \param entry The item to replace
+ * \param ns Replacement node namespace
* \param type Replacement node type
* \param node Replacement node
* \param stack_index Replacement stack index
+ * \param ons Pointer to location to receive old namespace
* \param otype Pointer to location to receive old type
* \param onode Pointer to location to receive old node
* \param ostack_index Pointer to location to receive old stack index
@@ -1380,15 +1325,19 @@ bool formatting_list_remove(hubbub_treebuilder *treebuilder,
*/
bool formatting_list_replace(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry,
- element_type type, void *node, uint32_t stack_index,
- element_type *otype, void **onode, uint32_t *ostack_index)
+ hubbub_ns ns, element_type type, void *node,
+ uint32_t stack_index,
+ hubbub_ns *ons, element_type *otype, void **onode,
+ uint32_t *ostack_index)
{
UNUSED(treebuilder);
+ *ons = entry->details.ns;
*otype = entry->details.type;
*onode = entry->details.node;
*ostack_index = entry->stack_index;
+ entry->details.ns = ns;
entry->details.type = type;
entry->details.node = node;
entry->stack_index = stack_index;
diff --git a/src/treebuilder/treebuilder.h b/src/treebuilder/treebuilder.h
index 9d690b1..67451b8 100644
--- a/src/treebuilder/treebuilder.h
+++ b/src/treebuilder/treebuilder.h
@@ -24,7 +24,6 @@ typedef struct hubbub_treebuilder hubbub_treebuilder;
* Hubbub treebuilder option types
*/
typedef enum hubbub_treebuilder_opttype {
- HUBBUB_TREEBUILDER_BUFFER_HANDLER,
HUBBUB_TREEBUILDER_ERROR_HANDLER,
HUBBUB_TREEBUILDER_TREE_HANDLER,
HUBBUB_TREEBUILDER_DOCUMENT_NODE,
@@ -35,11 +34,6 @@ typedef enum hubbub_treebuilder_opttype {
*/
typedef union hubbub_treebuilder_optparams {
struct {
- hubbub_buffer_handler handler;
- void *pw;
- } buffer_handler;
-
- struct {
hubbub_error_handler handler;
void *pw;
} error_handler;