From d354b2d78f226b370fd6720ff84aa43bfa4d930d Mon Sep 17 00:00:00 2001 From: Andrew Sidwell Date: Thu, 10 Jul 2008 13:42:43 +0000 Subject: - 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 --- src/treebuilder/in_body.c | 4 +-- src/treebuilder/internal.h | 3 ++ src/treebuilder/treebuilder.c | 65 ++++++++++++++++++++++++------------------- test/tree2.c | 6 ++-- 4 files changed, 45 insertions(+), 33 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 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); + } } /** diff --git a/test/tree2.c b/test/tree2.c index e5a1e94..a56304f 100644 --- a/test/tree2.c +++ b/test/tree2.c @@ -475,11 +475,13 @@ int insert_before(void *ctx, void *parent, void *child, void *ref_child, tchild->next = tref; tref->prev = tchild; - if (tref->prev) - tref->prev->next = tchild; + if (tchild->prev) + tchild->prev->next = tchild; else tparent->child = tchild; + *result = child; + return 0; } -- cgit v1.2.3