Another soptimization for g_convert()
authorJeffrey Stedfast <fejj@gnome.org>
Sat, 23 Apr 2011 02:26:18 +0000 (22:26 -0400)
committerJeffrey Stedfast <fejj@gnome.org>
Sat, 23 Apr 2011 02:26:18 +0000 (22:26 -0400)
If we need to grow our buffer, instead of growing by 'inleft'
bytes, grow by 2 * inleft bytes.

eglib/src/gunicode.c

index cb82409e57cdc15a8bfa0b34c729bfc30b3d0465..7215cb9e2eb1593b84269ed69df3dc41327880c4 100644 (file)
@@ -220,7 +220,7 @@ gchar *
 g_convert (const gchar *str, gssize len, const gchar *to_charset, const gchar *from_charset,
           gsize *bytes_read, gsize *bytes_written, GError **err)
 {
-       size_t outsize, outused, outleft, inleft, rc;
+       size_t outsize, outused, outleft, inleft, grow, rc;
        char *result, *outbuf, *inbuf;
        gboolean flush = FALSE;
        gboolean done = FALSE;
@@ -258,9 +258,10 @@ g_convert (const gchar *str, gssize len, const gchar *to_charset, const gchar *f
                        switch (errno) {
                        case E2BIG:
                                /* grow our result buffer */
+                               grow = MAX (inleft, 8) << 1;
                                outused = outbuf - result;
-                               outsize += MAX (inleft, 8);
-                               outleft += MAX (inleft, 8);
+                               outsize += grow;
+                               outleft += grow;
                                result = g_realloc (result, outsize + 4);
                                outbuf = result + outused;
                                break;