"Joel E. Denny" <[EMAIL PROTECTED]> writes: > Most importantly, the end of the patch includes a small change to > lib/quotearg.*, which I see are part of gnulib. I'll need some guidance > on whether that change makes sense for gnulib in general and on what to do > with it.
OK, on further thought I guess it's all right. To start off, I installed this into gnulib: 2006-11-08 Paul Eggert <[EMAIL PROTECTED]> * 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. --- lib/quotearg.h 14 May 2005 06:03:58 -0000 1.12 +++ lib/quotearg.h 8 Nov 2006 20:10:31 -0000 @@ -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, ch /* Equivalent to quotearg_char (ARG, ':'). */ char *quotearg_colon (char const *arg); +/* Free any dynamically allocated memory. */ +void quotearg_free (void); + #endif /* !QUOTEARG_H_ */ --- lib/quotearg.c 31 Oct 2006 21:51:45 -0000 1.51 +++ lib/quotearg.c 8 Nov 2006 20:10:30 -0000 @@ -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 *a { 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)