X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/78143faa1652400c22826281258a196084ed0312..a005a9c4dc5588fc017a1cb1d19c1560e0e68943:/data/push.c diff --git a/data/push.c b/data/push.c index 739ac2a7..b0cbeb32 100644 --- a/data/push.c +++ b/data/push.c @@ -5,32 +5,36 @@ # 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 . + +# Check the value of %define api.push_pull. +b4_percent_define_default([[api.push_pull]], [[pull]]) +b4_percent_define_check_values([[[[api.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([[api.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]) @@ -47,6 +51,10 @@ m4_define_default([b4_stack_depth_init], [200]) ## Pure/impure interfaces. ## ## ------------------------ ## +b4_percent_define_default([[api.pure]], [[false]]) +b4_define_flag_if([pure]) +m4_define([b4_pure_flag], + [b4_percent_define_flag_if([[api.pure]], [[1]], [[0]])]) # b4_yacc_pure_if(IF-TRUE, IF-FALSE) # ---------------------------------- @@ -160,7 +168,8 @@ b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],dnl ' USER NAME SPACE" below. */ ]b4_identification -b4_get_percent_code([[top]])[]dnl + +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 @@ -198,7 +207,7 @@ m4_if(b4_prefix, [yy], [], # define YYTOKEN_TABLE ]b4_token_table[ #endif -]b4_get_percent_code([[requires]])[]dnl +]b4_percent_code_get([[requires]])[]dnl b4_token_enums_defines(b4_tokens)[ @@ -250,11 +259,11 @@ b4_c_function_decl([[yypstate_delete]], [[void]], [[[yypstate *yyps]], [[yyps]]])[ #endif ]]) -b4_get_percent_code([[provides]])[]dnl +b4_percent_code_get([[provides]])[]dnl [/* Copy the second part of user declarations. */ ]b4_user_post_prologue -b4_get_percent_code[]dnl +b4_percent_code_get[]dnl [#ifdef short # undef short @@ -750,12 +759,12 @@ do { \ /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { - fprintf (stderr, " $%d = ", yyi + 1); + YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &]b4_rhs_value(yynrhs, yyi + 1)[ ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl b4_user_args[); - fprintf (stderr, "\n"); + YYFPRINTF (stderr, "\n"); } } @@ -1078,7 +1087,9 @@ b4_push_if( { 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], [, @@ -1091,7 +1102,16 @@ b4_push_if( ]b4_locations_if([[ YYLTYPE yylloc; ]])])[ if (yyps == 0) - yyps_local = yypstate_new (); + { + yyps_local = yypstate_new (); + if (!yyps_local) + {]b4_pure_if([[ + yyerror (]b4_yyerror_args[YY_("memory exhausted"));]], [[ + if (!yypstate_allocated) + yyerror (]b4_yyerror_args[YY_("memory exhausted"));]])[ + return 2; + } + } else yyps_local = yyps; do { @@ -1107,15 +1127,31 @@ b4_push_if( /* Initialize the parser data structure. */ ]b4_c_function_def([[yypstate_new]], [[yypstate *]])[ { - yypstate *yyps = (yypstate *) malloc (sizeof *yyps); - yyps->yynew = 1; + 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;]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 @@ -1656,7 +1692,7 @@ b4_defines_if( b4_copyright([Skeleton interface for Bison's Yacc-like parsers in C],dnl ' [1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006]) -b4_get_percent_code([[requires]])[]dnl +b4_percent_code_get([[requires]])[]dnl b4_token_enums_defines(b4_tokens) @@ -1714,6 +1750,6 @@ b4_c_function_decl([b4_prefix[pstate_delete]], [[void]], [[b4_prefix[pstate *yyps]], [[yyps]]])[ #endif ]]) -b4_get_percent_code([[provides]])[]dnl +b4_percent_code_get([[provides]])[]dnl ])dnl b4_defines_if m4_divert_pop(0)