From: Paul Eggert Date: Wed, 8 Nov 2006 20:13:12 +0000 (+0000) Subject: * lib/quotearg.h (quotearg_free): New decl. X-Git-Tag: cvs-readonly~1591 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=96159f3a857b1eb302118ab0add8f725981dbca0;p=gnulib.git * lib/quotearg.h (quotearg_free): New decl. * lib/quotearg.c (quotearg_free): New function. (slot0, nslots, slotvec0, slotvec): Now file-scope so that quotearg_free can get at them. --- diff --git a/ChangeLog b/ChangeLog index 9cc361f9c..9269f399e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-11-08 Paul Eggert + + * lib/quotearg.h (quotearg_free): New decl. + * lib/quotearg.c (quotearg_free): New function. + (slot0, nslots, slotvec0, slotvec): + Now file-scope so that quotearg_free can get at them. + 2006-11-08 Ralf Wildenhues Sync from Automake. diff --git a/lib/quotearg.c b/lib/quotearg.c index dae291547..6f3ee9e86 100644 --- a/lib/quotearg.c +++ b/lib/quotearg.c @@ -567,6 +567,34 @@ struct slotvec char *val; }; +/* 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; +static struct slotvec slotvec0 = {sizeof slot0, slot0}; +static struct slotvec *slotvec = &slotvec0; + +void +quotearg_free (void) +{ + struct slotvec *sv = slotvec; + unsigned int i; + for (i = 1; i < nslots; i++) + free (sv[i].val); + if (sv[0].val != slot0) + { + free (sv[0].val); + slotvec0.size = sizeof slot0; + slotvec0.val = slot0; + } + if (sv != &slotvec0) + { + free (sv); + slotvec = &slotvec0; + } + nslots = 1; +} + /* Use storage slot N to return a quoted version of argument ARG. ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a null-terminated string. @@ -581,13 +609,7 @@ quotearg_n_options (int n, char const *arg, size_t argsize, { int e = errno; - /* 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; unsigned int n0 = n; - static struct slotvec slotvec0 = {sizeof slot0, slot0}; - static struct slotvec *slotvec = &slotvec0; struct slotvec *sv = slotvec; if (n < 0) diff --git a/lib/quotearg.h b/lib/quotearg.h index 24f26f7d4..4887df3b6 100644 --- a/lib/quotearg.h +++ b/lib/quotearg.h @@ -1,7 +1,7 @@ /* quotearg.h - quote arguments for output - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software - Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 Free + Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -134,4 +134,7 @@ char *quotearg_char (char const *arg, char ch); /* Equivalent to quotearg_char (ARG, ':'). */ char *quotearg_colon (char const *arg); +/* Free any dynamically allocated memory. */ +void quotearg_free (void); + #endif /* !QUOTEARG_H_ */