[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Valgrind and Bison memory leaks
From: |
Paul Eggert |
Subject: |
Re: Valgrind and Bison memory leaks |
Date: |
Wed, 08 Nov 2006 12:14:10 -0800 |
User-agent: |
Gnus/5.1008 (Gnus v5.10.8) Emacs/21.4 (gnu/linux) |
"Joel E. Denny" <address@hidden> 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 <address@hidden>
* 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)