summaryrefslogtreecommitdiff
path: root/src/treebuilder
diff options
context:
space:
mode:
authorAndrew Sidwell <andy@entai.co.uk>2008-07-10 13:42:43 +0000
committerAndrew Sidwell <andy@entai.co.uk>2008-07-10 13:42:43 +0000
commitd354b2d78f226b370fd6720ff84aa43bfa4d930d (patch)
tree0b2f5abebe9903f394df5c368d33c01fac7ca67b /src/treebuilder
parent0438fcc8b80bf080e2dcd7708d728adad1ba1e5f (diff)
downloadlibhubbub-d354b2d78f226b370fd6720ff84aa43bfa4d930d.tar.gz
libhubbub-d354b2d78f226b370fd6720ff84aa43bfa4d930d.tar.bz2
- Handle in_table_foster for element insertion (yet to do comment/character).
- Fix test harness's insert_before() method. - Foster parenting now correctly taints the current table. svn path=/trunk/hubbub/; revision=4568
Diffstat (limited to 'src/treebuilder')
-rw-r--r--src/treebuilder/in_body.c4
-rw-r--r--src/treebuilder/internal.h3
-rw-r--r--src/treebuilder/treebuilder.c65
3 files changed, 41 insertions, 31 deletions
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 2904933..3658ebe 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -100,8 +100,6 @@ static void aa_remove_element_stack_item(hubbub_treebuilder *treebuilder,
uint32_t index, uint32_t limit);
static void aa_clone_and_replace_entries(hubbub_treebuilder *treebuilder,
formatting_list_entry *element);
-static void aa_insert_into_foster_parent(hubbub_treebuilder *treebuilder,
- void *node);
/**
@@ -1738,6 +1736,8 @@ void aa_insert_into_foster_parent(hubbub_treebuilder *treebuilder, void *node)
bool insert = false;
void *inserted;
+ stack[treebuilder->context.current_table].tainted = true;
+
if (treebuilder->context.current_table == 0) {
treebuilder->tree_handler->ref_node(
treebuilder->tree_handler->ctx,
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index f8091a2..c43401e 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -176,6 +176,9 @@ bool formatting_list_replace(hubbub_treebuilder *treebuilder,
void adjust_foreign_attributes(hubbub_treebuilder *treebuilder,
hubbub_tag *tag);
+/* This one's in in_body.c */
+void aa_insert_into_foster_parent(hubbub_treebuilder *treebuilder, void *node);
+
#ifndef NDEBUG
#include <stdio.h>
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index e276bc0..ef23631 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -712,31 +712,34 @@ 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) {
/** \todo errors */
}
- success = treebuilder->tree_handler->append_child(
- treebuilder->tree_handler->ctx,
- treebuilder->context.element_stack[
- treebuilder->context.current_node].node,
- node, &appended);
- if (success != 0) {
- /** \todo errors */
- }
+ if (!treebuilder->context.in_table_foster) {
+ success = treebuilder->tree_handler->append_child(
+ treebuilder->tree_handler->ctx,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node,
+ node, &appended);
+ if (success != 0) {
+ /** \todo errors */
+ }
- treebuilder->tree_handler->unref_node(treebuilder->tree_handler->ctx,
- appended);
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, appended);
- if (!element_stack_push(treebuilder,
- tag->ns,
- element_type_from_name(treebuilder, &tag->name),
- node)) {
- /** \todo errors */
+ if (!element_stack_push(treebuilder,
+ tag->ns,
+ element_type_from_name(treebuilder, &tag->name),
+ node)) {
+ /** \todo errors */
+ }
+ } else {
+ printf("should be inserting foster here\n");
+ aa_insert_into_foster_parent(treebuilder, node);
}
}
@@ -760,19 +763,23 @@ void insert_element_no_push(hubbub_treebuilder *treebuilder,
/** \todo errors */
}
- success = treebuilder->tree_handler->append_child(
- treebuilder->tree_handler->ctx,
- treebuilder->context.element_stack[
- treebuilder->context.current_node].node,
- node, &appended);
- if (success != 0) {
- /** \todo errors */
- }
+ if (!treebuilder->context.in_table_foster) {
+ success = treebuilder->tree_handler->append_child(
+ treebuilder->tree_handler->ctx,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node,
+ node, &appended);
+ if (success != 0) {
+ /** \todo errors */
+ }
- treebuilder->tree_handler->unref_node(treebuilder->tree_handler->ctx,
- appended);
- treebuilder->tree_handler->unref_node(treebuilder->tree_handler->ctx,
- node);
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, appended);
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, node);
+ } else {
+ aa_insert_into_foster_parent(treebuilder, node);
+ }
}
/**