+2008-05-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/getndelim2.c (getndelim2): Fix newsize computation during
+ reallocation. Rename 'done' to 'found_delimiter'.
+
2008-05-01 Jim Meyering <meyering@redhat.com>
vc-list-files: accommodate /bin/sh like the one from Solaris 10
ssize_t bytes_stored = -1;
char *ptr = *lineptr;
size_t size = *linesize;
- bool done = false;
+ bool found_delimiter;
if (!ptr)
{
flockfile (stream);
- while (!done)
+ found_delimiter = false;
+ do
{
/* Here always ptr + size == read_pos + nbytes_avail.
Also nbytes_avail > 0 || size < nmax. */
if (end)
{
buffer_len = end - buffer + 1;
- done = true;
+ found_delimiter = true;
}
}
}
break;
}
if (c == delim1 || c == delim2)
- done = true;
+ found_delimiter = true;
buffer_len = 1;
}
always (unless we get an error while reading the first byte)
NUL-terminate the line buffer. */
- if (nbytes_avail < 1 + buffer_len && size < nmax)
+ if (nbytes_avail < buffer_len + 1 && size < nmax)
{
+ /* Grow size proportionally, not linearly, to avoid O(n^2)
+ running time. */
size_t newsize = size < MIN_CHUNK ? size + MIN_CHUNK : 2 * size;
char *newptr;
- if (newsize < buffer_len)
- newsize = buffer_len + size;
+ /* Increase newsize so that it becomes
+ >= (read_pos - ptr) + buffer_len. */
+ if (newsize - (read_pos - ptr) < buffer_len + 1)
+ newsize = (read_pos - ptr) + buffer_len + 1;
+ /* Respect nmax. This handles possible integer overflow. */
if (! (size < newsize && newsize <= nmax))
newsize = nmax;
if (buffer && freadseek (stream, buffer_len))
goto unlock_done;
}
+ while (!found_delimiter);
/* Done - NUL terminate and return the number of bytes read.
At this point we know that nbytes_avail >= 1. */