+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.
+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.
+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.
+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.
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)
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,
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
dirname-test
env-test
file-test
+file-test-get-contents
hash-test
iochannel-test
iochannel-test-outfile
#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;
}