# Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
# 2007 Free Software Foundation, Inc.
-# This program is free software; you can redistribute it and/or modify
+# 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
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
-
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-
+#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301 USA
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Check the value of %define push_pull.
+b4_percent_define_default([[push_pull]], [[pull]])
+b4_percent_define_check_values([[[[push_pull]], [[pull]], [[push]], [[both]]]])
+b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]])
+b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]])
+m4_case(b4_percent_define_get([[push_pull]]),
+ [pull], [m4_define([b4_push_flag], [[0]])],
+ [push], [m4_define([b4_pull_flag], [[0]])])
# Handle BISON_USE_PUSH_FOR_PULL for the test suite. So that push parsing
# tests function as written, don't let BISON_USE_PUSH_FOR_PULL modify Bison's
# behavior at all when push parsing is already requested.
+b4_define_flag_if([use_push_for_pull])
b4_use_push_for_pull_if([
- b4_push_if([
- m4_define([b4_use_push_for_pull_flag], [[0]])
- b4_define_flag_if([use_push_for_pull])
- ], [
- m4_define([b4_push_flag], [[1]])
- b4_define_flag_if([push])
- ])])
+ b4_push_if([m4_define([b4_use_push_for_pull_flag], [[0]])],
+ [m4_define([b4_push_flag], [[1]])])])
m4_include(b4_pkgdatadir/[c.m4])
define necessary library symbols; they are noted "INFRINGES ON
USER NAME SPACE" below. */
-]b4_identification
-b4_percent_code_get([[top]])[]dnl
+]b4_identification[
+/* Push parsers. */
+#define YYPUSH ]b4_push_flag[
+
+/* Pull parsers. */
+#define YYPULL ]b4_pull_flag[
+
+]b4_percent_code_get([[top]])[]dnl
m4_if(b4_prefix, [yy], [],
[[/* Substitute the variable and function names. */
]b4_pull_if([[#define yyparse ]b4_prefix[parse
{
return yypull_parse (0]m4_ifset([b4_parse_param],
[[, ]b4_c_args(b4_parse_param)])[);
-}
+}]b4_pure_if([], [[
+
+static char yypstate_allocated = 0;]])[
]b4_c_function_def([[yypull_parse]], [[int]],
[[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
{
yyps_local = yypstate_new ();
if (!yyps_local)
- {
- yyerror (]b4_yyerror_args[YY_("memory exhausted"));
+ {]b4_pure_if([[
+ yyerror (]b4_yyerror_args[YY_("memory exhausted"));]], [[
+ if (!yypstate_allocated)
+ yyerror (]b4_yyerror_args[YY_("memory exhausted"));]])[
return 2;
}
}
/* Initialize the parser data structure. */
]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
{
- yypstate *yyps = (yypstate *) malloc (sizeof *yyps);
+ yypstate *yyps;]b4_pure_if([], [[
+ if (yypstate_allocated)
+ {
+ yyerror (]b4_yyerror_args[YY_("cannot allocate multiple impure push-parser instances"));
+ return 0;
+ }]])[
+ yyps = (yypstate *) malloc (sizeof *yyps);
if (!yyps)
return 0;
- yyps->yynew = 1;
+ yyps->yynew = 1;]b4_pure_if([], [[
+ yypstate_allocated = 1;]])[
return yyps;
}
]b4_c_function_def([[yypstate_delete]], [[void]],
[[[yypstate *yyps]], [[yyps]]])[
{
- free (yyps);
+#ifndef yyoverflow
+ /* If the stack was reallocated but the parse did not complete, then the
+ stack still needs to be freed. */
+ if (!yyps->yynew && yyps->yyss != yyps->yyssa)
+ YYSTACK_FREE (yyps->yyss);
+#endif
+ free (yyps);]b4_pure_if([], [[
+ yypstate_allocated = 0;]])[
}
]b4_pure_if([[#define ]b4_prefix[nerrs yyps->]b4_prefix[nerrs