+2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * 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 <eggert@cs.ucla.edu>
* openat.c (openat): Use ?:, not if, to work around GCC bug 4210
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)
{
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 *
FILE *stream = fopen (filename, mode);
char *out;
int save_errno;
- int rc;
if (!stream)
return NULL;