mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 17:56:17 +01:00
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
This commit is contained in:
parent
c14b3842f2
commit
05b1004080
13
ChangeLog
13
ChangeLog
@ -1,3 +1,16 @@
|
||||
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)
|
||||
|
||||
2008-03-22 Emmanuele Bassi <ebassi@gnome.org>
|
||||
|
||||
Bug 518160 - replace two g_strdup_printf calls in GBookmarkFile
|
||||
|
@ -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"
|
||||
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? */
|
||||
"<!DOCTYPE %s\n"
|
||||
" PUBLIC \"%s\"\n"
|
||||
" \"%s\">\n"
|
||||
/* XXX - do we really need the doctype? */
|
||||
"<!DOCTYPE " XBEL_DTD_NICK "\n"
|
||||
" PUBLIC \"" XBEL_DTD_SYSTEM "\"\n"
|
||||
" \"" XBEL_DTD_URI "\">\n"
|
||||
#endif
|
||||
"<%s %s=\"%s\"\n"
|
||||
" xmlns:%s=\"%s\"\n"
|
||||
" xmlns:%s=\"%s\"\n>",
|
||||
#if 0
|
||||
/* XXX - do we really need the doctype? */
|
||||
XBEL_DTD_NICK,
|
||||
XBEL_DTD_SYSTEM, XBEL_DTD_URI,
|
||||
#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 != '%')
|
||||
|
Loading…
Reference in New Issue
Block a user