From: Sven Neumann Date: Thu, 10 Mar 2005 12:56:01 +0000 (+0000) Subject: delay memory allocation until after the first read. Saves a bunch of X-Git-Tag: GLIB_2_7_0~138 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aec8923fa6a0f9272b4eddcac508f5852f5c8483;p=platform%2Fupstream%2Fglib.git delay memory allocation until after the first read. Saves a bunch of 2005-03-10 Sven Neumann * 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(). --- diff --git a/ChangeLog b/ChangeLog index e55daed..0942ad4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2005-03-10 Sven Neumann + + * 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 * glib/glib.symbols: Add g_file_replace. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index e55daed..0942ad4 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,12 @@ +2005-03-10 Sven Neumann + + * 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 * glib/glib.symbols: Add g_file_replace. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index e55daed..0942ad4 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,12 @@ +2005-03-10 Sven Neumann + + * 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 * glib/glib.symbols: Add g_file_replace. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index e55daed..0942ad4 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,12 @@ +2005-03-10 Sven Neumann + + * 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 * glib/glib.symbols: Add g_file_replace. diff --git a/glib/gfileutils.c b/glib/gfileutils.c index 6deac68..415d6fe 100644 --- a/glib/gfileutils.c +++ b/glib/gfileutils.c @@ -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 diff --git a/tests/.cvsignore b/tests/.cvsignore index 7ef1b11..ffe95d0 100644 --- a/tests/.cvsignore +++ b/tests/.cvsignore @@ -24,6 +24,7 @@ date-test dirname-test env-test file-test +file-test-get-contents hash-test iochannel-test iochannel-test-outfile diff --git a/tests/file-test.c b/tests/file-test.c index 293a555..f083e4f 100644 --- a/tests/file-test.c +++ b/tests/file-test.c @@ -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; }