xml_GNode*
xml_node_append (xml_GNode* node, const char* format, ...)
{
if (! format) return node;
___ va_list args;
va_start (args, format);
for ( ; *format ; format++)
{
if (*format == '%')
{
if (*++format == 's')
{
const gchar* str = va_arg (args, const gchar*);
g_return_val_if_fail (str, 0);
g_string_append (node->text, str);
} |
} |
else if (*format == '<')
{
node->end = node->text->len;
if (! memcmp (format, "<%s/", 4) ||
! memcmp (format, "<%s%p/", 7))
{
gchar* nodename = va_arg (args, gchar*);
if (! nodename) nodename = strdup (":");
node = xml_node_append_node_new (node, nodename);
if (format[3] != '%')
format += 3;
else
{
xml_AttrList* list = va_arg (args, xml_AttrList*);
if (list) node->attributes = xml_attr_list_copy (list);
format += 5;
} |
} |
else if (! memcmp (format, "<%#s/", 5) ||
! memcmp (format, "<%#s%p/", 7))
{
const gchar* nodename = va_arg (args, const gchar*);
if (! nodename) nodename = ":";
node = xml_node_append_node_new_data (node, nodename);
if (format[4] != '%')
format += 4;
else
{
xml_AttrList* list = va_arg (args, xml_AttrList*);
if (list) node->attributes = xml_attr_list_copy (list);
format += 6;
} |
} | else
{
const gchar* nodename = ++format;
while (*format && *format != '/') format++;
if (format-nodename < 3 ||
format[-2] != '%' || format[-1] != 'p')
{
node = xml_node_append_node_new (
node, g_strndup (nodename, format-nodename));
} | else{
node = xml_node_append_node_new (
node, g_strndup (nodename, format-2-nodename));
___ xml_AttrList* list = va_arg (args, xml_AttrList*);
node->attributes = xml_attr_list_copy (list); ____;
} |
if (!*format) break;
} |
} |
else if (*format == '>')
{
node->end = node->text->len;
node = node->parent;
} |
else
{
g_string_append_c (node->text, *format);
} |
} |
va_end (args);
____;
update_to_new_end (node);
return node;
} |
|