diff options
author | Claudio Saavedra <csaavedra@gnome.org> | 2008-03-22 23:52:39 +0000 |
---|---|---|
committer | Claudio Saavedra <csaavedra@src.gnome.org> | 2008-03-22 23:52:39 +0000 |
commit | 05b1004080a458b13390571ea2834b4a33a436a5 (patch) | |
tree | 174b3757f7187c40ab8e29af3c4d5447e346e96f /glib/gbookmarkfile.c | |
parent | c14b3842f211ab9ec8ecb6b4fe058c6d12934350 (diff) | |
download | glib-05b1004080a458b13390571ea2834b4a33a436a5.tar.gz |
Bug 523877 – gbookmarkfile: avoid using g_string_append_printf() and
2008-03-22 Claudio Saavedra <csaavedra@gnome.org>
Bug 523877 – gbookmarkfile: avoid using g_string_append_printf() and
other optimizations
* glib/gbookmarkfile.c: (bookmark_metadata_dump),
(bookmark_item_dump), (g_bookmark_file_dump), (expand_exec_line):
Replace all calls to g_string_append_printf with g_strconcat () or
g_string_append () where appropriate, to reduce the file creation time.
Also, use g_string_sized_new () with an appropriate buffer size instead
of g_string_new (NULL), to reduce time spent in memory reallocation.
(#523877, Claudio Saavedra, Emmanuele Bassi)
svn path=/trunk/; revision=6752
Diffstat (limited to 'glib/gbookmarkfile.c')
-rw-r--r-- | glib/gbookmarkfile.c | 242 |
1 files changed, 131 insertions, 111 deletions
diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c index 5cf320d5e..70ce6ee53 100644 --- a/glib/gbookmarkfile.c +++ b/glib/gbookmarkfile.c @@ -339,56 +339,62 @@ static gchar * bookmark_metadata_dump (BookmarkMetadata *metadata) { GString *retval; + gchar *buffer; if (!metadata->applications) return NULL; - retval = g_string_new (NULL); + retval = g_string_sized_new (1024); /* metadata container */ - g_string_append_printf (retval, - " <%s %s=\"%s\">\n", - XBEL_METADATA_ELEMENT, - XBEL_OWNER_ATTRIBUTE, BOOKMARK_METADATA_OWNER); - + g_string_append (retval, + " " + "<" XBEL_METADATA_ELEMENT + " " XBEL_OWNER_ATTRIBUTE "=\"" BOOKMARK_METADATA_OWNER + "\">\n"); + /* mime type */ - if (metadata->mime_type) - g_string_append_printf (retval, - " <%s:%s %s=\"%s\"/>\n", - MIME_NAMESPACE_NAME, - MIME_TYPE_ELEMENT, - MIME_TYPE_ATTRIBUTE, metadata->mime_type); - + if (metadata->mime_type) { + buffer = g_strconcat (" " + "<" MIME_NAMESPACE_NAME ":" MIME_TYPE_ELEMENT " " + MIME_TYPE_ATTRIBUTE "=\"", metadata->mime_type, "\"/>\n", + NULL); + g_string_append (retval, buffer); + g_free (buffer); + } + if (metadata->groups) { GList *l; /* open groups container */ - g_string_append_printf (retval, - " <%s:%s>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUPS_ELEMENT); + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUPS_ELEMENT ">\n"); for (l = g_list_last (metadata->groups); l != NULL; l = l->prev) { gchar *group_name; group_name = g_markup_escape_text ((gchar *) l->data, -1); - g_string_append_printf (retval, - " <%s:%s>%s</%s:%s>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUP_ELEMENT, - group_name, - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUP_ELEMENT); + buffer = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUP_ELEMENT ">", + group_name, + "</" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUP_ELEMENT ">\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); g_free (group_name); } /* close groups container */ - g_string_append_printf (retval, - " </%s:%s>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUPS_ELEMENT); + g_string_append (retval, + " " + "</" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUPS_ELEMENT ">\n"); } if (metadata->applications) @@ -396,10 +402,10 @@ bookmark_metadata_dump (BookmarkMetadata *metadata) GList *l; /* open applications container */ - g_string_append_printf (retval, - " <%s:%s>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_APPLICATIONS_ELEMENT); + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_APPLICATIONS_ELEMENT ">\n"); for (l = g_list_last (metadata->applications); l != NULL; l = l->prev) { @@ -419,10 +425,10 @@ bookmark_metadata_dump (BookmarkMetadata *metadata) } /* close applications container */ - g_string_append_printf (retval, - " </%s:%s>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_APPLICATIONS_ELEMENT); + g_string_append (retval, + " " + "</" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_APPLICATIONS_ELEMENT ">\n"); } /* icon */ @@ -430,24 +436,28 @@ bookmark_metadata_dump (BookmarkMetadata *metadata) { if (!metadata->icon_mime) metadata->icon_mime = g_strdup ("application/octet-stream"); - - g_string_append_printf (retval, - " <%s:%s %s=\"%s\" %s=\"%s\"/>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_ICON_ELEMENT, - BOOKMARK_HREF_ATTRIBUTE, metadata->icon_href, - BOOKMARK_TYPE_ATTRIBUTE, metadata->icon_mime); + + buffer = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_ICON_ELEMENT + " " BOOKMARK_HREF_ATTRIBUTE "=\"", metadata->icon_href, + "\" " BOOKMARK_TYPE_ATTRIBUTE "=\"", metadata->icon_mime, "\"/>\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); } /* private hint */ if (metadata->is_private) - g_string_append_printf (retval, - " <%s:%s/>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_PRIVATE_ELEMENT); + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_PRIVATE_ELEMENT "/>\n"); /* close metadata container */ - g_string_append_printf (retval, " </%s>\n", XBEL_METADATA_ELEMENT); + g_string_append (retval, + " " + "</" XBEL_METADATA_ELEMENT ">\n"); return g_string_free (retval, FALSE); } @@ -501,6 +511,7 @@ bookmark_item_dump (BookmarkItem *item) GString *retval; gchar *added, *visited, *modified; gchar *escaped_uri; + gchar *buffer; /* at this point, we must have at least a registered application; if we don't * we don't screw up the bookmark file, and just skip this item @@ -511,37 +522,45 @@ bookmark_item_dump (BookmarkItem *item) return NULL; } - retval = g_string_new (NULL); + retval = g_string_sized_new (4096); added = timestamp_to_iso8601 (item->added); modified = timestamp_to_iso8601 (item->modified); visited = timestamp_to_iso8601 (item->visited); escaped_uri = g_markup_escape_text (item->uri, -1); - - g_string_append_printf (retval, - " <%s %s=\"%s\" %s=\"%s\" %s=\"%s\" %s=\"%s\">\n", - XBEL_BOOKMARK_ELEMENT, - XBEL_HREF_ATTRIBUTE, escaped_uri, - XBEL_ADDED_ATTRIBUTE, added, - XBEL_MODIFIED_ATTRIBUTE, modified, - XBEL_VISITED_ATTRIBUTE, visited); + + buffer = g_strconcat (" <" + XBEL_BOOKMARK_ELEMENT + " " + XBEL_HREF_ATTRIBUTE "=\"", escaped_uri, "\" " + XBEL_ADDED_ATTRIBUTE "=\"", added, "\" " + XBEL_MODIFIED_ATTRIBUTE "=\"", modified, "\" " + XBEL_VISITED_ATTRIBUTE "=\"", visited, "\">\n", + NULL); + + g_string_append (retval, buffer); + g_free (escaped_uri); g_free (visited); g_free (modified); g_free (added); + g_free (buffer); if (item->title) { gchar *escaped_title; escaped_title = g_markup_escape_text (item->title, -1); - g_string_append_printf (retval, - " <%s>%s</%s>\n", - XBEL_TITLE_ELEMENT, - escaped_title, - XBEL_TITLE_ELEMENT); + buffer = g_strconcat (" " + "<" XBEL_TITLE_ELEMENT ">", + escaped_title, + "</" XBEL_TITLE_ELEMENT ">\n", + NULL); + g_string_append (retval, buffer); + g_free (escaped_title); + g_free (buffer); } if (item->description) @@ -549,34 +568,38 @@ bookmark_item_dump (BookmarkItem *item) gchar *escaped_desc; escaped_desc = g_markup_escape_text (item->description, -1); - g_string_append_printf (retval, - " <%s>%s</%s>\n", - XBEL_DESC_ELEMENT, - escaped_desc, - XBEL_DESC_ELEMENT); + buffer = g_strconcat (" " + "<" XBEL_DESC_ELEMENT ">", + escaped_desc, + "</" XBEL_DESC_ELEMENT ">\n", + NULL); + g_string_append (retval, buffer); + g_free (escaped_desc); + g_free (buffer); } if (item->metadata) { gchar *metadata; - /* open info container */ - g_string_append_printf (retval, " <%s>\n", XBEL_INFO_ELEMENT); - metadata = bookmark_metadata_dump (item->metadata); if (metadata) { - retval = g_string_append (retval, metadata); + buffer = g_strconcat (" " + "<" XBEL_INFO_ELEMENT ">\n", + metadata, + " " + "</" XBEL_INFO_ELEMENT ">\n", + NULL); + retval = g_string_append (retval, buffer); + g_free (buffer); g_free (metadata); } - - /* close info container */ - g_string_append_printf (retval, " </%s>\n", XBEL_INFO_ELEMENT); } - - g_string_append_printf (retval, " </%s>\n", XBEL_BOOKMARK_ELEMENT); + + g_string_append (retval, " </" XBEL_BOOKMARK_ELEMENT ">\n"); return g_string_free (retval, FALSE); } @@ -1435,56 +1458,53 @@ g_bookmark_file_dump (GBookmarkFile *bookmark, GError **error) { GString *retval; + gchar *buffer; GList *l; - retval = g_string_new (NULL); - - g_string_append_printf (retval, - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" -#if 0 - /* XXX - do we really need the doctype? */ - "<!DOCTYPE %s\n" - " PUBLIC \"%s\"\n" - " \"%s\">\n" -#endif - "<%s %s=\"%s\"\n" - " xmlns:%s=\"%s\"\n" - " xmlns:%s=\"%s\"\n>", + retval = g_string_sized_new (4096); + + g_string_append (retval, + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" #if 0 - /* XXX - do we really need the doctype? */ - XBEL_DTD_NICK, - XBEL_DTD_SYSTEM, XBEL_DTD_URI, + /* XXX - do we really need the doctype? */ + "<!DOCTYPE " XBEL_DTD_NICK "\n" + " PUBLIC \"" XBEL_DTD_SYSTEM "\"\n" + " \"" XBEL_DTD_URI "\">\n" #endif - XBEL_ROOT_ELEMENT, - XBEL_VERSION_ATTRIBUTE, XBEL_VERSION, - BOOKMARK_NAMESPACE_NAME, BOOKMARK_NAMESPACE_URI, - MIME_NAMESPACE_NAME, MIME_NAMESPACE_URI); + "<" XBEL_ROOT_ELEMENT " " XBEL_VERSION_ATTRIBUTE "=\"" XBEL_VERSION "\"\n" + " xmlns:" BOOKMARK_NAMESPACE_NAME "=\"" BOOKMARK_NAMESPACE_URI "\"\n" + " xmlns:" MIME_NAMESPACE_NAME "=\"" MIME_NAMESPACE_URI "\"\n>"); if (bookmark->title) { gchar *escaped_title; - + escaped_title = g_markup_escape_text (bookmark->title, -1); + + buffer = g_strconcat (" " + "<" XBEL_TITLE_ELEMENT ">", + escaped_title, + "</" XBEL_TITLE_ELEMENT ">\n", NULL); - g_string_append_printf (retval, " <%s>%s</%s>\n", - XBEL_TITLE_ELEMENT, - escaped_title, - XBEL_TITLE_ELEMENT); - + g_string_append (retval, buffer); + + g_free (buffer); g_free (escaped_title); } if (bookmark->description) { gchar *escaped_desc; - + escaped_desc = g_markup_escape_text (bookmark->description, -1); - - g_string_append_printf (retval, " <%s>%s</%s>\n", - XBEL_DESC_ELEMENT, - escaped_desc, - XBEL_DESC_ELEMENT); - + + buffer = g_strconcat (" " + "<" XBEL_DESC_ELEMENT ">", + escaped_desc, + "</" XBEL_DESC_ELEMENT ">\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); g_free (escaped_desc); } @@ -1510,7 +1530,7 @@ g_bookmark_file_dump (GBookmarkFile *bookmark, } out: - g_string_append_printf (retval, "</%s>", XBEL_ROOT_ELEMENT); + g_string_append (retval, "</" XBEL_ROOT_ELEMENT ">"); if (length) *length = retval->len; @@ -3271,7 +3291,7 @@ expand_exec_line (const gchar *exec_fmt, GString *exec; gchar ch; - exec = g_string_new (NULL); + exec = g_string_sized_new (512); while ((ch = *exec_fmt++) != '\0') { if (ch != '%') |