From e9e4c321148155fd9129b12bf5996d4b9ae15367 Mon Sep 17 00:00:00 2001
From: Akim Demaille <akim@epita.fr>
Date: Mon, 12 Nov 2001 09:24:50 +0000
Subject: [PATCH] * src/bison.simple (YYSTACK_REALLOC): New. (yyparse)
 [!yyoverflow]: Use it and free the old stack. Reported by FIXME: Who.

---
 ChangeLog        |  6 ++++++
 THANKS           |  3 ++-
 src/bison.simple | 39 ++++++++++++++++++++++++---------------
 3 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 93cc7f02..3d660360 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-11-12  Akim Demaille  <akim@epita.fr>
+
+	* src/bison.simple (YYSTACK_REALLOC): New.
+	(yyparse) [!yyoverflow]: Use it and free the old stack.
+	Reported by FIXME: Who.
+
 2001-11-12  Pascal Bart  <pascal.bart@epita.fr>
 
 	* src/bison.simple: Define type yystype instead of YYSTYPE, and
diff --git a/THANKS b/THANKS
index e74019f0..f74230bb 100644
--- a/THANKS
+++ b/THANKS
@@ -2,7 +2,7 @@ Bison was originally written by Robert Corbett.  It would not be what
 it is today without the invaluable help of these people:
 
 Airy Andre              Airy.Andre@edf.fr
-Akim Demaille           akim@epita.fr
+Akim Demaille           akim@freefriends.org
 Albert Chin-A-Young     china@thewrittenword.com
 Alexander Belopolsky    alexb@rentec.com
 Daniel Hagerty          hag@gnu.org
@@ -20,6 +20,7 @@ Neil Booth              NeilB@earthling.net
 Noah Friedman           friedman@gnu.org
 Pascal Bart             pascal.bart@epita.fr
 Paul Eggert             eggert@twinsun.com
+Per Allansson           per@appgate.com
 Piotr Gackiewicz        gacek@intertel.com.pl
 Richard Stallman        rms@gnu.org
 Robert Anisko           anisko_r@epita.fr
diff --git a/src/bison.simple b/src/bison.simple
index eb94f301..d08be3ff 100644
--- a/src/bison.simple
+++ b/src/bison.simple
@@ -102,10 +102,27 @@
 # define YYSTACK_USE_ALLOCA 0
 #endif
 
+/* Realloc WHAT from SIZE to YYSTACKSIZE elements of TYPE.
+   If WHAT was malloc'ed (not the original automatic ARRAY), free it. */
 #if YYSTACK_USE_ALLOCA
-# define YYSTACK_ALLOC alloca
+# define YYSTACK_REALLOC(Type, What, Array)				\
+do {									\
+  Type *old = What;							\
+  What = (Type *) malloc (yystacksize * sizeof (Type));			\
+  __yy_memcpy ((char *) What, (char *) old,				\
+	       (size) * (unsigned int) sizeof (Type));			\
+  yyfree_stacks = 1;							\
+  if (old != Array)							\
+    free (old);								\
+} while (0)
 #else
-# define YYSTACK_ALLOC malloc
+# define YYSTACK_REALLOC(Type, What, Array)				\
+do {									\
+  Type *old = What;							\
+  What = (Type *) alloca (yystacksize * sizeof (Type));			\
+  __yy_memcpy ((char *) What, (char *) old,				\
+	       (size) * (unsigned int) sizeof (Type));			\
+} while (0)
 #endif
 
 #define YYBISON	1	/* Identify Bison output.  */
@@ -452,7 +469,7 @@ yyparse (YYPARSE_PARAM_ARG)
 
   /* Three stacks and their tools:
      `yyss': related to states,
-     `yysv': related to semantic values,
+     `yyvs': related to semantic values,
      `yyls': related to locations.
 
      Refer to the stacks thru separate pointers, to allow yyoverflow
@@ -580,19 +597,11 @@ yyparse (YYPARSE_PARAM_ARG)
       yystacksize *= 2;
       if (yystacksize > YYMAXDEPTH)
 	yystacksize = YYMAXDEPTH;
-# if !YYSTACK_USE_ALLOCA
-      yyfree_stacks = 1;
-# endif
-      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
-      __yy_memcpy ((char *)yyss, (char *)yyss1,
-		   size * (unsigned int) sizeof (*yyssp));
-      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
-      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
-		   size * (unsigned int) sizeof (*yyvsp));
+
+      YYSTACK_REALLOC (short, yyss, yyssa);
+      YYSTACK_REALLOC (YYSTYPE, yyvs, yyvsa);
 # if YYLSP_NEEDED
-      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
-      __yy_memcpy ((char *)yyls, (char *)yyls1,
-		   size * (unsigned int) sizeof (*yylsp));
+      YYSTACK_REALLOC (YYLTYPE, yyls, yylsa);
 # endif
 #endif /* no yyoverflow */
 
-- 
2.47.2