summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-05-22 05:39:09 +0000
committermental <mental@users.sourceforge.net>2006-05-22 05:39:09 +0000
commit8af4596d3ccc73239192315fdd25012cd2464fe6 (patch)
treecd83a10b432dfd93b73b80a27c3884946d27e9f6 /src
parent* Make sure the warning image regarding a non installed font is always initia... (diff)
downloadinkscape-8af4596d3ccc73239192315fdd25012cd2464fe6.tar.gz
inkscape-8af4596d3ccc73239192315fdd25012cd2464fe6.zip
replace super-linear complexity stacked C stirng concatenations with O(1) append to std::vector
(bzr r932)
Diffstat (limited to 'src')
-rw-r--r--src/extension/internal/svg.cpp18
1 files changed, 5 insertions, 13 deletions
diff --git a/src/extension/internal/svg.cpp b/src/extension/internal/svg.cpp
index 5f8517c3d..ab9c59830 100644
--- a/src/extension/internal/svg.cpp
+++ b/src/extension/internal/svg.cpp
@@ -20,6 +20,7 @@
#include "file.h"
#include "extension/system.h"
#include "extension/output.h"
+#include <vector>
#ifdef WITH_GNOME_VFS
# include <libgnomevfs/gnome-vfs.h>
@@ -106,9 +107,6 @@ _load_uri (const gchar *uri)
{
GnomeVFSHandle *handle = NULL;
GnomeVFSFileSize bytes_read;
- gchar buffer[BUF_SIZE] = "";
- gchar *doc = NULL;
- gchar *new_doc = NULL;
gsize bytesRead = 0;
gsize bytesWritten = 0;
@@ -125,20 +123,14 @@ _load_uri (const gchar *uri)
g_warning(gnome_vfs_result_to_string(result));
}
+ std::vector<gchar> doc;
while (result == GNOME_VFS_OK) {
+ gchar buffer[BUF_SIZE];
result = gnome_vfs_read (handle, buffer, BUF_SIZE, &bytes_read);
- buffer[bytes_read] = '\0';
-
- if (doc == NULL) {
- doc = g_strndup(buffer, bytes_read);
- } else {
- new_doc = g_strconcat(doc, buffer, NULL);
- g_free(doc);
- doc = new_doc;
- }
+ doc.insert(doc.end(), buffer, buffer+bytes_read);
}
- return doc;
+ return g_strndup(&doc[0], doc.size());
}
#endif