From: Simon Josefsson Date: Wed, 21 Jun 2006 08:02:40 +0000 (+0000) Subject: 2006-06-19 Paul Eggert X-Git-Tag: cvs-readonly~2338 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=7a8df33d7bb42eaff21c657ba88a79c5a293b0e5;p=gnulib.git 2006-06-19 Paul Eggert * read-file.c (fread_file): Start with buffer allocation of 0 bytes rather than 1 byte; this simplifies the code. Don't invoke feof; it's not needed. Refactor to avoid duplicate code to free buffer and save/restore errno. (internal_read_file): Remove unused local. --- diff --git a/lib/ChangeLog b/lib/ChangeLog index 3f5e4daf8..60bf305ab 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,11 @@ +2006-06-19 Paul Eggert + + * read-file.c (fread_file): Start with buffer allocation of + 0 bytes rather than 1 byte; this simplifies the code. + Don't invoke feof; it's not needed. Refactor to avoid duplicate + code to free buffer and save/restore errno. + (internal_read_file): Remove unused local. + 2006-06-20 Paul Eggert * openat.c (openat): Use ?:, not if, to work around GCC bug 4210 diff --git a/lib/read-file.c b/lib/read-file.c index ac53dd4c9..4e2ebd560 100644 --- a/lib/read-file.c +++ b/lib/read-file.c @@ -36,16 +36,15 @@ char * fread_file (FILE * stream, size_t * length) { - char *buf = malloc (1); - size_t alloc = 1; + char *buf = NULL; + size_t alloc = 0; size_t size = 0; + int save_errno; - if (!buf) - return NULL; - - while (!feof (stream)) + for (;;) { size_t count; + size_t requested; if (size + BUFSIZ + 1 > alloc) { @@ -58,32 +57,31 @@ fread_file (FILE * stream, size_t * length) new_buf = realloc (buf, alloc); if (!new_buf) { - int save_errno = errno; - free (buf); - errno = save_errno; - return NULL; + save_errno = errno; + break; } buf = new_buf; } - count = fread (buf + size, 1, alloc - size - 1, stream); + requested = alloc - size - 1; + count = fread (buf + size, 1, requested, stream); size += count; - if (ferror (stream)) + if (count != requested) { - int save_errno = errno; - free (buf); - errno = save_errno; - return NULL; + save_errno = errno; + if (ferror (stream)) + break; + buf[size] = '\0'; + *length = size; + return buf; } } - buf[size] = '\0'; - - *length = size; - - return buf; + free (buf); + errno = save_errno; + return NULL; } static char * @@ -92,7 +90,6 @@ internal_read_file (const char *filename, size_t * length, const char *mode) FILE *stream = fopen (filename, mode); char *out; int save_errno; - int rc; if (!stream) return NULL;