# HG changeset patch # User Mark Doliner # Date 1229136072 0 # Node ID 19f18fc9caed9ff9073cf34658cc6d99943bca61 # Parent b25abc303e5a59e844601924754bac3b0f2384dd Use one GString and pass it around instead of allocating and freeing a bunch of smaller gchars when converting to and from html and myspace im markup diff -r b25abc303e5a -r 19f18fc9caed libpurple/protocols/myspace/markup.c --- a/libpurple/protocols/myspace/markup.c Fri Dec 12 19:42:19 2008 +0000 +++ b/libpurple/protocols/myspace/markup.c Sat Dec 13 02:41:12 2008 +0000 @@ -76,8 +76,6 @@ { NULL, NULL } }; - - /* Indexes of this array + 1 map HTML font size to scale of normal font size. * * Based on _point_sizes from libpurple/gtkimhtml.c * 1 2 3 4 5 6 7 */ @@ -100,7 +98,6 @@ * in account options. */ #define MSIM_DEFAULT_DPI 96 - /* round is part of C99, but sometimes is unavailable before then. * Based on http://forums.belution.com/en/cpp/000/050/13.shtml */ @@ -113,7 +110,6 @@ } } - /** Convert typographical font point size to HTML font size. * Based on libpurple/gtkimhtml.c */ static guint @@ -550,29 +546,26 @@ * * @return An HTML string. Caller frees. */ -static gchar * -msim_convert_xmlnode(MsimSession *session, xmlnode *root, MSIM_XMLNODE_CONVERT f, int nodes_processed) +static void +msim_convert_xmlnode(MsimSession *session, GString *out, xmlnode *root, MSIM_XMLNODE_CONVERT f, int nodes_processed) { xmlnode *node; gchar *begin, *inner, *end; - GString *final; int descended = nodes_processed; - if (!root || !root->name) { - return g_strdup(""); - } + if (!root || !root->name) + return; purple_debug_info("msim", "msim_convert_xmlnode: got root=%s\n", root->name); begin = inner = end = NULL; - final = g_string_new(""); - if (descended == 0) /* We've not formatted this yet.. :) */ descended = f(session, root, &begin, &end); /* Get the value that our format function has already descended for us */ - g_string_append(final, begin); + g_string_append(out, begin); + g_free(begin); /* Loop over all child nodes. */ for (node = root->child; node != NULL; node = node->next) { @@ -583,29 +576,20 @@ case XMLNODE_TYPE_TAG: /* A tag or tag with attributes. Recursively descend. */ - inner = msim_convert_xmlnode(session, node, f, descended); - g_return_val_if_fail(inner != NULL, NULL); + msim_convert_xmlnode(session, out, node, f, descended); purple_debug_info("msim", " ** node name=%s\n", - (node && node->name) ? node->name : "(NULL)"); + node->name ? node->name : "(NULL)"); break; case XMLNODE_TYPE_DATA: /* Literal text. */ - inner = g_strndup(node->data, node->data_sz); - purple_debug_info("msim", " ** node data=%s\n", - inner ? inner : "(NULL)"); + g_string_append_len(out, node->data, node->data_sz); break; default: - purple_debug_info("msim", - "msim_convert_xmlnode: strange node\n"); - } - - if (inner) { - g_string_append(final, inner); - g_free(inner); - inner = NULL; + purple_debug_warning("msim", + "msim_convert_xmlnode: unknown node type\n"); } } @@ -613,15 +597,8 @@ * a paragraph and will display each on its own line. You actually have * to _nest_ tags to intersperse different text in one paragraph! * Comment out this line below to see. */ - g_string_append(final, end); - - g_free(begin); + g_string_append(out, end); g_free(end); - - purple_debug_info("msim", "msim_markup_xmlnode_to_gtkhtml: RETURNING %s\n", - (final && final->str) ? final->str : "(NULL)"); - - return g_string_free(final, FALSE); } /** Convert XML to something based on MSIM_XMLNODE_CONVERT. */ @@ -629,7 +606,7 @@ msim_convert_xml(MsimSession *session, const gchar *raw, MSIM_XMLNODE_CONVERT f) { xmlnode *root; - gchar *str; + GString *str; gchar *enclosed_raw; g_return_val_if_fail(raw != NULL, NULL); @@ -640,7 +617,7 @@ root = xmlnode_from_str(enclosed_raw, -1); if (!root) { - purple_debug_info("msim", "msim_markup_to_html: couldn't parse " + purple_debug_warning("msim", "msim_markup_to_html: couldn't parse " "%s as XML, returning raw: %s\n", enclosed_raw, raw); /* TODO: msim_unrecognized */ g_free(enclosed_raw); @@ -649,13 +626,13 @@ g_free(enclosed_raw); - str = msim_convert_xmlnode(session, root, f, 0); - g_return_val_if_fail(str != NULL, NULL); - purple_debug_info("msim", "msim_markup_to_html: returning %s\n", str); - + str = g_string_new(NULL); + msim_convert_xmlnode(session, str, root, f, 0); xmlnode_free(root); - return str; + purple_debug_info("msim", "msim_markup_to_html: returning %s\n", str->str); + + return g_string_free(str, FALSE); } /** Convert plaintext smileys to markup tags.