Mercurial > pidgin
changeset 9837:dafebadcf8d2
[gaim-migrate @ 10714]
this should at least mostly work...
adda xmlnode_to_formatted_str() function that makes the XML readable,
rather than spitting it out all on 1 line, which the parser may be OK with,
but most of us humans have a harder time with
this is the result of grim kicking my ass into gear, and much discussion
with him, so he gets a sizeable chunk of the credit for this, if it works.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Mon, 23 Aug 2004 05:06:38 +0000 |
parents | d5a2232f83e4 |
children | ad7fab671e6f |
files | src/xmlnode.c src/xmlnode.h |
diffstat | 2 files changed, 33 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xmlnode.c Mon Aug 23 00:47:45 2004 +0000 +++ b/src/xmlnode.c Mon Aug 23 05:06:38 2004 +0000 @@ -246,18 +246,27 @@ return ret; } -char *xmlnode_to_str(xmlnode *node, int *len) +static char *xmlnode_to_str_helper(xmlnode *node, int *len, gboolean pretty, int depth) { char *ret; GString *text = g_string_new(""); xmlnode *c; - char *node_name, *esc, *esc2; - gboolean need_end = FALSE; + char *node_name, *esc, *esc2, *tab = NULL; + gboolean need_end = FALSE, has_data = FALSE; +#ifdef _WIN32 + static const char *newline = "\r\n"; +#else + static const char *newline = "\n"; +#endif + + if(pretty && depth) { + tab = g_strnfill(depth, '\t'); + text = g_string_append(text, tab); + } node_name = g_markup_escape_text(node->name, -1); g_string_append_printf(text, "<%s", node_name); - for(c = node->child; c; c = c->next) { if(c->type == XMLNODE_TYPE_ATTRIB) { @@ -267,18 +276,20 @@ g_free(esc); g_free(esc2); } else if(c->type == XMLNODE_TYPE_TAG || c->type == XMLNODE_TYPE_DATA) { + if(c->type == XMLNODE_TYPE_DATA) + has_data = TRUE; need_end = TRUE; } } if(need_end) { - text = g_string_append_c(text, '>'); + g_string_append_printf(text, ">%s", (pretty && !has_data) ? newline : ""); for(c = node->child; c; c = c->next) { if(c->type == XMLNODE_TYPE_TAG) { int esc_len; - esc = xmlnode_to_str(c, &esc_len); + esc = xmlnode_to_str_helper(c, &esc_len, (pretty && !has_data), depth+1); text = g_string_append_len(text, esc, esc_len); g_free(esc); } else if(c->type == XMLNODE_TYPE_DATA) { @@ -288,13 +299,18 @@ } } - g_string_append_printf(text, "</%s>", node_name); + if(tab && pretty && !has_data) + text = g_string_append(text, tab); + g_string_append_printf(text, "</%s>%s", node_name, pretty ? newline : ""); } else { - g_string_append_printf(text, "/>"); + g_string_append_printf(text, "/>%s", pretty ? newline : ""); } g_free(node_name); + if(tab) + g_free(tab); + ret = text->str; if(len) *len = text->len; @@ -302,6 +318,14 @@ return ret; } +char *xmlnode_to_str(xmlnode *node, int *len) { + return xmlnode_to_str_helper(node, len, FALSE, 0); +} + +char *xmlnode_to_formatted_str(xmlnode *node, int *len) { + return xmlnode_to_str_helper(node, len, TRUE, 0); +} + struct _xmlnode_parser_data { xmlnode *current; };
--- a/src/xmlnode.h Mon Aug 23 00:47:45 2004 +0000 +++ b/src/xmlnode.h Mon Aug 23 05:06:38 2004 +0000 @@ -54,6 +54,7 @@ const char *xmlnode_get_attrib(xmlnode *node, const char *attr); void xmlnode_remove_attrib(xmlnode *node, const char *attr); char *xmlnode_to_str(xmlnode *node, int *len); +char *xmlnode_to_formatted_str(xmlnode *node, int *len); xmlnode *xmlnode_from_str(const char *str, size_t size); xmlnode *xmlnode_copy(xmlnode *src);