+2014-04-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ xalloc: allow x2nrealloc (P, PN, S) where P && !*PN
+ * lib/xalloc.h (x2nrealloc): Extend slightly, to allow the current
+ size to be zero even when the pointer is nonnull. This
+ accommodates the use case where P is malloc (0) and *PN is 0 on a
+ host where malloc (0) yields nonnull.
+
2014-04-09 Eric Blake <eblake@redhat.com>
fts: avoid unnecessary strlen calls
/* If P is null, allocate a block of at least *PN such objects;
otherwise, reallocate P so that it contains more than *PN objects
- each of S bytes. *PN must be nonzero unless P is null, and S must
- be nonzero. Set *PN to the new number of objects, and return the
- pointer to the new block. *PN is never set to zero, and the
- returned pointer is never null.
+ each of S bytes. S must be nonzero. Set *PN to the new number of
+ objects, and return the pointer to the new block. *PN is never set
+ to zero, and the returned pointer is never null.
Repeated reallocations are guaranteed to make progress, either by
allocating an initial block with a nonzero size, or by allocating a
}
else
{
- /* Set N = ceil (1.5 * N) so that progress is made if N == 1.
+ /* Set N = floor (1.5 * N) + 1 so that progress is made even if N == 0.
Check for overflow, so that N * S stays in size_t range.
- The check is slightly conservative, but an exact check isn't
+ The check may be slightly conservative, but an exact check isn't
worth the trouble. */
if ((size_t) -1 / 3 * 2 / s <= n)
xalloc_die ();
- n += (n + 1) / 2;
+ n += n / 2 + 1;
}
*pn = n;