summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2000-07-31 07:23:01 +0000
committerJim Meyering <jim@meyering.net>2000-07-31 07:23:01 +0000
commit62a3c6b1d5d8c7bc4b6b8eb0623acd1257998996 (patch)
treed1a2490ce9ac88365abbacc486229936a455ef8a
parent3ff49f4a29bd0c284802faac0680055e4e80a7e4 (diff)
downloadgnulib-62a3c6b1d5d8c7bc4b6b8eb0623acd1257998996.tar.gz
(quotearg_n_options): Preallocate a slot 0
buffer, so that the caller can always quote one small component of a "memory exhausted" message in slot 0. From a suggestion by Jim Meyering.
-rw-r--r--lib/quotearg.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/quotearg.c b/lib/quotearg.c
index 9ed8a5fb12..a9c9fe339c 100644
--- a/lib/quotearg.c
+++ b/lib/quotearg.c
@@ -530,12 +530,17 @@ static char *
quotearg_n_options (int n, char const *arg,
struct quoting_options const *options)
{
- static unsigned int nslots;
- static struct slotvec
+ /* Preallocate a slot 0 buffer, so that the caller can always quote
+ one small component of a "memory exhausted" message in slot 0. */
+ static char slot0[256];
+ static unsigned int nslots = 1;
+ struct slotvec
{
size_t size;
char *val;
- } *slotvec;
+ };
+ static struct slotvec const slotvec0 = {sizeof slot0, slot0};
+ static struct slotvec *slotvec = (struct slotvec *) &slotvec0;
if (nslots <= n)
{
@@ -543,6 +548,11 @@ quotearg_n_options (int n, char const *arg,
size_t s = n1 * sizeof (struct slotvec);
if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
abort ();
+ if (slotvec == &slotvec0)
+ {
+ slotvec = (struct slotvec *) xmalloc (sizeof (struct slotvec));
+ *slotvec = slotvec0;
+ }
slotvec = (struct slotvec *) xrealloc (slotvec, s);
memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
nslots = n;
@@ -556,7 +566,7 @@ quotearg_n_options (int n, char const *arg,
if (size <= qsize)
{
slotvec[n].size = size = qsize + 1;
- slotvec[n].val = val = xrealloc (val, size);
+ slotvec[n].val = val = xrealloc (val == slot0 ? 0 : val, size);
quotearg_buffer (val, size, arg, (size_t) -1, options);
}