delay memory allocation until after the first read. Saves a bunch of

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().
This commit is contained in:
Sven Neumann 2005-03-10 12:56:01 +00:00 committed by Sven Neumann
parent 2d7ada2898
commit aec8923fa6
7 changed files with 82 additions and 22 deletions

View 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.

View 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.

View 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.

View 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.

View 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

View File

@ -24,6 +24,7 @@ date-test
dirname-test
env-test
file-test
file-test-get-contents
hash-test
iochannel-test
iochannel-test-outfile

View 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;
}