delay memory allocation until after the first read. Saves a bunch of
authorSven Neumann <sven@gimp.org>
Thu, 10 Mar 2005 12:56:01 +0000 (12:56 +0000)
committerSven Neumann <neo@src.gnome.org>
Thu, 10 Mar 2005 12:56:01 +0000 (12:56 +0000)
2005-03-10  Sven Neumann  <sven@gimp.org>

* glib/gfileutils.c (get_contents_stdio): delay memory allocation
until after the first read. Saves a bunch of reallocs. Also
increased the buffer size to 4096 bytes. (bug #165954)

* tests/file-test.c (test_get_contents): added a (very basic) test
for g_file_get_contents().

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-8
glib/gfileutils.c
tests/.cvsignore
tests/file-test.c

index e55daed..0942ad4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-03-10  Sven Neumann  <sven@gimp.org>
+
+       * glib/gfileutils.c (get_contents_stdio): delay memory allocation
+       until after the first read. Saves a bunch of reallocs. Also
+       increased the buffer size to 4096 bytes. (bug #165954)
+
+       * tests/file-test.c (test_get_contents): added a (very basic) test
+       for g_file_get_contents().
+
 Wed Mar  9 19:06:45 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/glib.symbols: Add g_file_replace.
index e55daed..0942ad4 100644 (file)
@@ -1,3 +1,12 @@
+2005-03-10  Sven Neumann  <sven@gimp.org>
+
+       * glib/gfileutils.c (get_contents_stdio): delay memory allocation
+       until after the first read. Saves a bunch of reallocs. Also
+       increased the buffer size to 4096 bytes. (bug #165954)
+
+       * tests/file-test.c (test_get_contents): added a (very basic) test
+       for g_file_get_contents().
+
 Wed Mar  9 19:06:45 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/glib.symbols: Add g_file_replace.
index e55daed..0942ad4 100644 (file)
@@ -1,3 +1,12 @@
+2005-03-10  Sven Neumann  <sven@gimp.org>
+
+       * glib/gfileutils.c (get_contents_stdio): delay memory allocation
+       until after the first read. Saves a bunch of reallocs. Also
+       increased the buffer size to 4096 bytes. (bug #165954)
+
+       * tests/file-test.c (test_get_contents): added a (very basic) test
+       for g_file_get_contents().
+
 Wed Mar  9 19:06:45 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/glib.symbols: Add g_file_replace.
index e55daed..0942ad4 100644 (file)
@@ -1,3 +1,12 @@
+2005-03-10  Sven Neumann  <sven@gimp.org>
+
+       * glib/gfileutils.c (get_contents_stdio): delay memory allocation
+       until after the first read. Saves a bunch of reallocs. Also
+       increased the buffer size to 4096 bytes. (bug #165954)
+
+       * tests/file-test.c (test_get_contents): added a (very basic) test
+       for g_file_get_contents().
+
 Wed Mar  9 19:06:45 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/glib.symbols: Add g_file_replace.
index 6deac68..415d6fe 100644 (file)
@@ -464,33 +464,31 @@ static gboolean
 get_contents_stdio (const gchar *display_filename,
                     FILE        *f,
                     gchar      **contents,
-                    gsize       *length, 
+                    gsize       *length,
                     GError     **error)
 {
-  gchar buf[2048];
+  gchar buf[4096];
   size_t bytes;
-  char *str;
-  size_t total_bytes;
-  size_t total_allocated;
-  
+  gchar *str = NULL;
+  size_t total_bytes = 0;
+  size_t total_allocated = 0;
+
   g_assert (f != NULL);
 
-#define STARTING_ALLOC 64
-  
-  total_bytes = 0;
-  total_allocated = STARTING_ALLOC;
-  str = g_malloc (STARTING_ALLOC);
-  
   while (!feof (f))
     {
-      int save_errno;
+      gint save_errno;
 
-      bytes = fread (buf, 1, 2048, f);
+      bytes = fread (buf, 1, sizeof (buf), f);
       save_errno = errno;
 
       while ((total_bytes + bytes + 1) > total_allocated)
         {
-          total_allocated *= 2;
+          if (str)
+            total_allocated *= 2;
+          else
+            total_allocated = MIN (bytes + 1, sizeof (buf));
+
           str = g_try_realloc (str, total_allocated);
 
           if (str == NULL)
@@ -499,13 +497,13 @@ get_contents_stdio (const gchar *display_filename,
                            G_FILE_ERROR,
                            G_FILE_ERROR_NOMEM,
                            _("Could not allocate %lu bytes to read file \"%s\""),
-                           (gulong) total_allocated, 
+                           (gulong) total_allocated,
                           display_filename);
 
               goto error;
             }
         }
-      
+
       if (ferror (f))
         {
           g_set_error (error,
@@ -525,20 +523,20 @@ get_contents_stdio (const gchar *display_filename,
   fclose (f);
 
   str[total_bytes] = '\0';
-  
+
   if (length)
     *length = total_bytes;
-  
+
   *contents = str;
-  
+
   return TRUE;
 
  error:
 
   g_free (str);
   fclose (f);
-  
-  return FALSE;  
+
+  return FALSE;
 }
 
 #ifndef G_OS_WIN32
index 7ef1b11..ffe95d0 100644 (file)
@@ -24,6 +24,7 @@ date-test
 dirname-test
 env-test
 file-test
+file-test-get-contents
 hash-test
 iochannel-test
 iochannel-test-outfile
index 293a555..f083e4f 100644 (file)
@@ -131,11 +131,36 @@ test_readlink (void)
 #endif
 }
 
+static void
+test_get_contents (void)
+{
+  const gchar *text = "abcdefghijklmnopqrstuvwxyz";
+  const gchar *filename = "file-test-get-contents";
+  gchar *contents;
+  gsize len;
+  FILE *f;
+  GError *error = NULL;
+
+  f = g_fopen (filename, "w");
+  fwrite (text, 1, strlen (text), f);
+  fclose (f);
+
+  g_assert (g_file_test (filename, G_FILE_TEST_IS_REGULAR));
+
+  if (! g_file_get_contents (filename, &contents, &len, &error))
+    g_error ("g_file_get_contents() failed: %s", error->message);
+
+  g_assert (strcmp (text, contents) == 0 && "content mismatch");
+
+  g_free (contents);
+}
+
 int 
 main (int argc, char *argv[])
 {
   test_mkstemp ();
   test_readlink ();
+  test_get_contents ();
 
   return 0;
 }