xml_GNode*
xml_node_add_new (xml_GNode* tree, const gchar* name, gsize off1, gsize off2)
{
g_return_val_if_fail (off1 <= off2, 0);
if (! tree->children)
{
tree->children = node_new (name, tree->text, off1, off2);
tree->children->parent = tree;
return tree->children;
} |
___ xml_GNode *node1;
node1 = tree->children;
if (off2 <= node1->off)
{
X(("prepend node1.off=%i\n", node1->off));
return xml_g_node_stick_before_ (
node1, node_new (name, tree->text, off1, off2));
} |
while (off1 >= node1->end)
{
if (! node1->next)
{
X(("append node1.end=%i\n", node1->end));
return xml_g_node_stick_after_ (
node1, node_new (name, tree->text, off1, off2));
} |
node1 = node1->next;
} |
g_assert (node1 && off1 < node1->end);
if (off1 > node1->off)
g_assert (node1 && off1 <= node1->off);
if (off2 <= node1->off)
{
X(("insert-no-children before node1.off=%i\n", node1->off));
return xml_g_node_stick_before_ (
node1, node_new (name, tree->text, off1, off2));
} |
if (! node1->next)
{
X(("insert-instead-of-last node1.end=%i\n", node1->end));
return xml_g_node_group1 (node1,
node_new (name, tree->text, off1, off2));
} |
___ xml_GNode* node2 = node1;
while (off2 > node2->off)
{
if (off2 < node2->end)
if (! node2->next) goto doit;
node2 = node2->next;
} |
g_assert (node2 && off2 <= node2->off);
g_assert (node2 != node1 && node2->prev);
node2 = node2->prev;
doit:
g_assert (node2 && off2 >= node2->end &&
(! node2->next || off2 <= node2->next->off));
X(("insert node1.end=%i node2.off=%i\n", node1->end, node2->off));
return xml_g_node_group2_ (node1, node2,
node_new (name, tree->text, off1, off2));
____;____;
} |
|