 7213324259
			
		
	
	
		7213324259
		
	
	
	
	
		
			
			git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@22291 e7fa87d3-cd2b-0410-9028-fcbf551c1848
		
			
				
	
	
		
			723 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			723 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|                                                             -*- Autoconf -*-
 | |
| 
 | |
| # C M4 Macros for Bison.
 | |
| 
 | |
| # Copyright (C) 2002, 2004-2012 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
 | |
| # 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, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| m4_include(b4_pkgdatadir/[c-like.m4])
 | |
| 
 | |
| # b4_tocpp(STRING)
 | |
| # ----------------
 | |
| # Convert STRING into a valid C macro name.
 | |
| m4_define([b4_tocpp],
 | |
| [m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))])
 | |
| 
 | |
| 
 | |
| # b4_cpp_guard(FILE)
 | |
| # ------------------
 | |
| # A valid C macro name to use as a CPP header guard for FILE.
 | |
| m4_define([b4_cpp_guard],
 | |
| [[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]])
 | |
| 
 | |
| 
 | |
| # b4_cpp_guard_open(FILE)
 | |
| # b4_cpp_guard_close(FILE)
 | |
| # ------------------------
 | |
| # If FILE does not expand to nothing, open/close CPP inclusion guards for FILE.
 | |
| m4_define([b4_cpp_guard_open],
 | |
| [m4_ifval(m4_quote($1),
 | |
| [#ifndef b4_cpp_guard([$1])
 | |
| # define b4_cpp_guard([$1])])])
 | |
| 
 | |
| m4_define([b4_cpp_guard_close],
 | |
| [m4_ifval(m4_quote($1),
 | |
| [#endif b4_comment([!b4_cpp_guard([$1])])])])
 | |
| 
 | |
| 
 | |
| ## ---------------- ##
 | |
| ## Identification.  ##
 | |
| ## ---------------- ##
 | |
| 
 | |
| # b4_comment(TEXT)
 | |
| # ----------------
 | |
| m4_define([b4_comment], [/* m4_bpatsubst([$1], [
 | |
| ], [
 | |
|    ])  */])
 | |
| 
 | |
| # b4_identification
 | |
| # -----------------
 | |
| # Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or
 | |
| # b4_pull_flag if they use the values of the %define variables api.pure or
 | |
| # api.push-pull.
 | |
| m4_define([b4_identification],
 | |
| [[/* Identify Bison output.  */
 | |
| #define YYBISON 1
 | |
| 
 | |
| /* Bison version.  */
 | |
| #define YYBISON_VERSION "]b4_version["
 | |
| 
 | |
| /* Skeleton name.  */
 | |
| #define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[
 | |
| 
 | |
| /* Pure parsers.  */
 | |
| #define YYPURE ]b4_pure_flag])[]m4_ifdef([b4_push_flag], [[
 | |
| 
 | |
| /* Push parsers.  */
 | |
| #define YYPUSH ]b4_push_flag])[]m4_ifdef([b4_pull_flag], [[
 | |
| 
 | |
| /* Pull parsers.  */
 | |
| #define YYPULL ]b4_pull_flag])[
 | |
| ]])
 | |
| 
 | |
| 
 | |
| ## ---------------- ##
 | |
| ## Default values.  ##
 | |
| ## ---------------- ##
 | |
| 
 | |
| # b4_api_prefix, b4_api_PREFIX
 | |
| # ----------------------------
 | |
| # Corresponds to %define api.prefix
 | |
| b4_percent_define_default([[api.prefix]], [[yy]])
 | |
| m4_define([b4_api_prefix],
 | |
| [b4_percent_define_get([[api.prefix]])])
 | |
| m4_define([b4_api_PREFIX],
 | |
| [m4_toupper(b4_api_prefix)])
 | |
| 
 | |
| 
 | |
| # b4_prefix
 | |
| # ---------
 | |
| # If the %name-prefix is not given, it is api.prefix.
 | |
| m4_define_default([b4_prefix], [b4_api_prefix])
 | |
| 
 | |
| # If the %union is not named, its name is YYSTYPE.
 | |
| m4_define_default([b4_union_name], [b4_api_PREFIX[]STYPE])
 | |
| 
 | |
| 
 | |
| ## ------------------------ ##
 | |
| ## Pure/impure interfaces.  ##
 | |
| ## ------------------------ ##
 | |
| 
 | |
| # b4_user_args
 | |
| # ------------
 | |
| m4_define([b4_user_args],
 | |
| [m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])])
 | |
| 
 | |
| 
 | |
| # b4_parse_param
 | |
| # --------------
 | |
| # If defined, b4_parse_param arrives double quoted, but below we prefer
 | |
| # it to be single quoted.
 | |
| m4_define([b4_parse_param],
 | |
| b4_parse_param)
 | |
| 
 | |
| 
 | |
| # b4_parse_param_for(DECL, FORMAL, BODY)
 | |
| # ---------------------------------------
 | |
| # Iterate over the user parameters, binding the declaration to DECL,
 | |
| # the formal name to FORMAL, and evaluating the BODY.
 | |
| m4_define([b4_parse_param_for],
 | |
| [m4_foreach([$1_$2], m4_defn([b4_parse_param]),
 | |
| [m4_pushdef([$1], m4_unquote(m4_car($1_$2)))dnl
 | |
| m4_pushdef([$2], m4_shift($1_$2))dnl
 | |
| $3[]dnl
 | |
| m4_popdef([$2])dnl
 | |
| m4_popdef([$1])dnl
 | |
| ])])
 | |
| 
 | |
| # b4_parse_param_use
 | |
| # ------------------
 | |
| # `YYUSE' all the parse-params.
 | |
| m4_define([b4_parse_param_use],
 | |
| [b4_parse_param_for([Decl], [Formal], [  YYUSE (Formal);
 | |
| ])dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| ## ------------ ##
 | |
| ## Data Types.  ##
 | |
| ## ------------ ##
 | |
| 
 | |
| # b4_int_type(MIN, MAX)
 | |
| # ---------------------
 | |
| # Return the smallest int type able to handle numbers ranging from
 | |
| # MIN to MAX (included).
 | |
| m4_define([b4_int_type],
 | |
| [m4_if(b4_ints_in($@,      [0],   [255]), [1], [unsigned char],
 | |
|        b4_ints_in($@,   [-128],   [127]), [1], [signed char],
 | |
| 
 | |
|        b4_ints_in($@,      [0], [65535]), [1], [unsigned short int],
 | |
|        b4_ints_in($@, [-32768], [32767]), [1], [short int],
 | |
| 
 | |
|        m4_eval([0 <= $1]),                [1], [unsigned int],
 | |
| 
 | |
|                                                [int])])
 | |
| 
 | |
| 
 | |
| # b4_int_type_for(NAME)
 | |
| # ---------------------
 | |
| # Return the smallest int type able to handle numbers ranging from
 | |
| # `NAME_min' to `NAME_max' (included).
 | |
| m4_define([b4_int_type_for],
 | |
| [b4_int_type($1_min, $1_max)])
 | |
| 
 | |
| 
 | |
| # b4_table_value_equals(TABLE, VALUE, LITERAL)
 | |
| # --------------------------------------------
 | |
| # Without inducing a comparison warning from the compiler, check if the
 | |
| # literal value LITERAL equals VALUE from table TABLE, which must have
 | |
| # TABLE_min and TABLE_max defined.  YYID must be defined as an identity
 | |
| # function that suppresses warnings about constant conditions.
 | |
| m4_define([b4_table_value_equals],
 | |
| [m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
 | |
|                || m4_indir([b4_]$1[_max]) < $3), [1],
 | |
|        [[YYID (0)]],
 | |
|        [(!!(($2) == ($3)))])])
 | |
| 
 | |
| 
 | |
| ## ---------##
 | |
| ## Values.  ##
 | |
| ## ---------##
 | |
| 
 | |
| 
 | |
| # b4_null_define
 | |
| # --------------
 | |
| # Portability issues: define a YY_NULL appropriate for the current
 | |
| # language (C, C++98, or C++11).
 | |
| m4_define([b4_null_define],
 | |
| [# ifndef YY_NULL
 | |
| #  if defined __cplusplus && 201103L <= __cplusplus
 | |
| #   define YY_NULL nullptr
 | |
| #  else
 | |
| #   define YY_NULL 0
 | |
| #  endif
 | |
| # endif[]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_null
 | |
| # -------
 | |
| # Return a null pointer constant.
 | |
| m4_define([b4_null], [YY_NULL])
 | |
| 
 | |
| 
 | |
| 
 | |
| ## ------------------------- ##
 | |
| ## Assigning token numbers.  ##
 | |
| ## ------------------------- ##
 | |
| 
 | |
| # b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
 | |
| # -----------------------------------------
 | |
| # Output the definition of this token as #define.
 | |
| m4_define([b4_token_define],
 | |
| [#define $1 $2
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 | |
| # -------------------------------------------------------
 | |
| # Output the definition of the tokens (if there are) as #defines.
 | |
| m4_define([b4_token_defines],
 | |
| [m4_if([$#$1], [1], [],
 | |
| [/* Tokens.  */
 | |
| m4_map([b4_token_define], [$@])])
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
 | |
| # ---------------------------------------
 | |
| # Output the definition of this token as an enum.
 | |
| m4_define([b4_token_enum],
 | |
| [$1 = $2])
 | |
| 
 | |
| 
 | |
| # b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 | |
| # -----------------------------------------------------
 | |
| # Output the definition of the tokens (if there are) as enums.
 | |
| m4_define([b4_token_enums],
 | |
| [m4_if([$#$1], [1], [],
 | |
| [[/* Tokens.  */
 | |
| #ifndef ]b4_api_PREFIX[TOKENTYPE
 | |
| # define ]b4_api_PREFIX[TOKENTYPE
 | |
|    /* Put the tokens into the symbol table, so that GDB and other debuggers
 | |
|       know about them.  */
 | |
|    enum ]b4_api_prefix[tokentype {
 | |
| ]m4_map_sep([     b4_token_enum], [,
 | |
| ],
 | |
|            [$@])[
 | |
|    };
 | |
| #endif
 | |
| ]])])
 | |
| 
 | |
| 
 | |
| # b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 | |
| # -------------------------------------------------------------
 | |
| # Output the definition of the tokens (if there are any) as enums and, if POSIX
 | |
| # Yacc is enabled, as #defines.
 | |
| m4_define([b4_token_enums_defines],
 | |
| [b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], [])
 | |
| ])
 | |
| 
 | |
| 
 | |
| 
 | |
| ## --------------------------------------------- ##
 | |
| ## Defining C functions in both K&R and ANSI-C.  ##
 | |
| ## --------------------------------------------- ##
 | |
| 
 | |
| 
 | |
| # b4_modern_c
 | |
| # -----------
 | |
| # A predicate useful in #if to determine whether C is ancient or modern.
 | |
| #
 | |
| # If __STDC__ is defined, the compiler is modern.  IBM xlc 7.0 when run
 | |
| # as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
 | |
| # reasons, but it defines __C99__FUNC__ so check that as well.
 | |
| # Microsoft C normally doesn't define these macros, but it defines _MSC_VER.
 | |
| # Consider a C++ compiler to be modern if it defines __cplusplus.
 | |
| #
 | |
| m4_define([b4_c_modern],
 | |
|   [[(defined __STDC__ || defined __C99__FUNC__ \
 | |
|      || defined __cplusplus || defined _MSC_VER)]])
 | |
| 
 | |
| # b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 | |
| # ----------------------------------------------------------
 | |
| # Declare the function NAME.
 | |
| m4_define([b4_c_function_def],
 | |
| [#if b4_c_modern
 | |
| b4_c_ansi_function_def($@)
 | |
| #else
 | |
| $2
 | |
| $1 (b4_c_knr_formal_names(m4_shift2($@)))
 | |
| b4_c_knr_formal_decls(m4_shift2($@))
 | |
| #endif[]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 | |
| # ---------------------------------------------------------------
 | |
| # Declare the function NAME in ANSI.
 | |
| m4_define([b4_c_ansi_function_def],
 | |
| [$2
 | |
| $1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_c_ansi_formals([DECL1, NAME1], ...)
 | |
| # --------------------------------------
 | |
| # Output the arguments ANSI-C definition.
 | |
| m4_define([b4_c_ansi_formals],
 | |
| [m4_if([$#], [0], [void],
 | |
|        [$#$1], [1], [void],
 | |
|                [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
 | |
| 
 | |
| m4_define([b4_c_ansi_formal],
 | |
| [$1])
 | |
| 
 | |
| 
 | |
| # b4_c_knr_formal_names([DECL1, NAME1], ...)
 | |
| # ------------------------------------------
 | |
| # Output the argument names.
 | |
| m4_define([b4_c_knr_formal_names],
 | |
| [m4_map_sep([b4_c_knr_formal_name], [, ], [$@])])
 | |
| 
 | |
| m4_define([b4_c_knr_formal_name],
 | |
| [$2])
 | |
| 
 | |
| 
 | |
| # b4_c_knr_formal_decls([DECL1, NAME1], ...)
 | |
| # ------------------------------------------
 | |
| # Output the K&R argument declarations.
 | |
| m4_define([b4_c_knr_formal_decls],
 | |
| [m4_map_sep([b4_c_knr_formal_decl],
 | |
|             [
 | |
| ],
 | |
|             [$@])])
 | |
| 
 | |
| m4_define([b4_c_knr_formal_decl],
 | |
| [    $1;])
 | |
| 
 | |
| 
 | |
| 
 | |
| ## ------------------------------------------------------------ ##
 | |
| ## Declaring (prototyping) C functions in both K&R and ANSI-C.  ##
 | |
| ## ------------------------------------------------------------ ##
 | |
| 
 | |
| 
 | |
| # b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 | |
| # ----------------------------------------------------------------
 | |
| # Declare the function NAME ANSI C style.
 | |
| m4_define([b4_c_ansi_function_decl],
 | |
| [$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| 
 | |
| # b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 | |
| # -----------------------------------------------------------
 | |
| # Declare the function NAME in both K&R and ANSI C.
 | |
| m4_define([b4_c_function_decl],
 | |
| [#if defined __STDC__ || defined __cplusplus
 | |
| b4_c_ansi_function_decl($@)
 | |
| #else
 | |
| $2 $1 ();
 | |
| #endif[]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| 
 | |
| ## --------------------- ##
 | |
| ## Calling C functions.  ##
 | |
| ## --------------------- ##
 | |
| 
 | |
| 
 | |
| # b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 | |
| # -----------------------------------------------------------
 | |
| # Call the function NAME with arguments NAME1, NAME2 etc.
 | |
| m4_define([b4_c_function_call],
 | |
| [$1 (b4_c_args(m4_shift2($@)))[]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_c_args([DECL1, NAME1], ...)
 | |
| # ------------------------------
 | |
| # Output the arguments NAME1, NAME2...
 | |
| m4_define([b4_c_args],
 | |
| [m4_map_sep([b4_c_arg], [, ], [$@])])
 | |
| 
 | |
| m4_define([b4_c_arg],
 | |
| [$2])
 | |
| 
 | |
| 
 | |
| ## ----------- ##
 | |
| ## Synclines.  ##
 | |
| ## ----------- ##
 | |
| 
 | |
| # b4_sync_start(LINE, FILE)
 | |
| # -----------------------
 | |
| m4_define([b4_sync_start], [[#]line $1 $2])
 | |
| 
 | |
| 
 | |
| ## -------------- ##
 | |
| ## User actions.  ##
 | |
| ## -------------- ##
 | |
| 
 | |
| # b4_case(LABEL, STATEMENTS)
 | |
| # --------------------------
 | |
| m4_define([b4_case],
 | |
| [  case $1:
 | |
| $2
 | |
|     break;])
 | |
| 
 | |
| # b4_symbol_actions(FILENAME, LINENO,
 | |
| #                   SYMBOL-TAG, SYMBOL-NUM,
 | |
| #                   SYMBOL-ACTION, SYMBOL-TYPENAME)
 | |
| # -------------------------------------------------
 | |
| # Issue the code for a symbol action (e.g., %printer).
 | |
| #
 | |
| # Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are
 | |
| # invoked where $<TYPE-NAME>$ and @$ were specified by the user.
 | |
| m4_define([b4_symbol_actions],
 | |
| [b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl
 | |
|       case $4: /* $3 */
 | |
| b4_syncline([$2], [$1])
 | |
|         $5;
 | |
| b4_syncline([@oline@], [@ofile@])
 | |
|         break;
 | |
| b4_dollar_popdef[]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_yydestruct_generate(FUNCTION-DECLARATOR)
 | |
| # -------------------------------------------
 | |
| # Generate the "yydestruct" function, which declaration is issued using
 | |
| # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
 | |
| # or "b4_c_function_def" for K&R.
 | |
| m4_define_default([b4_yydestruct_generate],
 | |
| [[/*-----------------------------------------------.
 | |
| | Release the memory associated to this symbol.  |
 | |
| `-----------------------------------------------*/
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| ]$1([yydestruct],
 | |
|     [static void],
 | |
|     [[const char *yymsg],    [yymsg]],
 | |
|     [[int yytype],           [yytype]],
 | |
|     [[YYSTYPE *yyvaluep],    [yyvaluep]][]dnl
 | |
| b4_locations_if(            [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
 | |
| m4_ifset([b4_parse_param], [, b4_parse_param]))[
 | |
| {
 | |
|   YYUSE (yyvaluep);
 | |
| ]b4_locations_if([  YYUSE (yylocationp);
 | |
| ])dnl
 | |
| b4_parse_param_use[]dnl
 | |
| [
 | |
|   if (!yymsg)
 | |
|     yymsg = "Deleting";
 | |
|   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 | |
| 
 | |
|   switch (yytype)
 | |
|     {
 | |
| ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
 | |
|       default:
 | |
|         break;
 | |
|     }
 | |
| }]dnl
 | |
| ])
 | |
| 
 | |
| 
 | |
| # b4_yy_symbol_print_generate(FUNCTION-DECLARATOR)
 | |
| # ------------------------------------------------
 | |
| # Generate the "yy_symbol_print" function, which declaration is issued using
 | |
| # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
 | |
| # or "b4_c_function_def" for K&R.
 | |
| m4_define_default([b4_yy_symbol_print_generate],
 | |
| [[
 | |
| /*--------------------------------.
 | |
| | Print this symbol on YYOUTPUT.  |
 | |
| `--------------------------------*/
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| ]$1([yy_symbol_value_print],
 | |
|     [static void],
 | |
|                [[FILE *yyoutput],                       [yyoutput]],
 | |
|                [[int yytype],                           [yytype]],
 | |
|                [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
 | |
| b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
 | |
| m4_ifset([b4_parse_param], [, b4_parse_param]))[
 | |
| {
 | |
|   FILE *yyo = yyoutput;
 | |
|   YYUSE (yyo);
 | |
|   if (!yyvaluep)
 | |
|     return;
 | |
| ]b4_locations_if([  YYUSE (yylocationp);
 | |
| ])dnl
 | |
| b4_parse_param_use[]dnl
 | |
| [# ifdef YYPRINT
 | |
|   if (yytype < YYNTOKENS)
 | |
|     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 | |
| # else
 | |
|   YYUSE (yyoutput);
 | |
| # endif
 | |
|   switch (yytype)
 | |
|     {
 | |
| ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 | |
| [      default:
 | |
|         break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| /*--------------------------------.
 | |
| | Print this symbol on YYOUTPUT.  |
 | |
| `--------------------------------*/
 | |
| 
 | |
| ]$1([yy_symbol_print],
 | |
|     [static void],
 | |
|                [[FILE *yyoutput],                       [yyoutput]],
 | |
|                [[int yytype],                           [yytype]],
 | |
|                [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
 | |
| b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
 | |
| m4_ifset([b4_parse_param], [, b4_parse_param]))[
 | |
| {
 | |
|   if (yytype < YYNTOKENS)
 | |
|     YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
 | |
|   else
 | |
|     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
 | |
| 
 | |
| ]b4_locations_if([  YY_LOCATION_PRINT (yyoutput, *yylocationp);
 | |
|   YYFPRINTF (yyoutput, ": ");
 | |
| ])dnl
 | |
| [  yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl
 | |
| b4_locations_if([, yylocationp])[]b4_user_args[);
 | |
|   YYFPRINTF (yyoutput, ")");
 | |
| }]dnl
 | |
| ])
 | |
| 
 | |
| ## -------------- ##
 | |
| ## Declarations.  ##
 | |
| ## -------------- ##
 | |
| 
 | |
| # b4_declare_yylstype
 | |
| # -------------------
 | |
| # Declarations that might either go into the header (if --defines) or
 | |
| # in the parser body.  Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
 | |
| m4_define([b4_declare_yylstype],
 | |
| [[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
 | |
| ]m4_ifdef([b4_stype],
 | |
| [[typedef union ]b4_union_name[
 | |
| {
 | |
| ]b4_user_stype[
 | |
| } ]b4_api_PREFIX[STYPE;
 | |
| # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]],
 | |
| [m4_if(b4_tag_seen_flag, 0,
 | |
| [[typedef int ]b4_api_PREFIX[STYPE;
 | |
| # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[
 | |
| # define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */
 | |
| # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
 | |
| #endif]b4_locations_if([[
 | |
| 
 | |
| #if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED
 | |
| typedef struct ]b4_api_PREFIX[LTYPE
 | |
| {
 | |
|   int first_line;
 | |
|   int first_column;
 | |
|   int last_line;
 | |
|   int last_column;
 | |
| } ]b4_api_PREFIX[LTYPE;
 | |
| # define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */
 | |
| # define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
 | |
| # define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
 | |
| #endif]])
 | |
| 
 | |
| b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval;
 | |
| ]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl
 | |
| ])
 | |
| 
 | |
| # b4_YYDEBUG_define
 | |
| # ------------------
 | |
| m4_define([b4_YYDEBUG_define],
 | |
| [[/* Enabling traces.  */
 | |
| ]m4_if(b4_api_prefix, [yy],
 | |
| [[#ifndef YYDEBUG
 | |
| # define YYDEBUG ]b4_debug_flag[
 | |
| #endif]],
 | |
| [[#ifndef ]b4_api_PREFIX[DEBUG
 | |
| # if defined YYDEBUG
 | |
| #  if YYDEBUG
 | |
| #   define ]b4_api_PREFIX[DEBUG 1
 | |
| #  else
 | |
| #   define ]b4_api_PREFIX[DEBUG 0
 | |
| #  endif
 | |
| # else /* ! defined YYDEBUG */
 | |
| #  define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[
 | |
| # endif /* ! defined YYDEBUG */
 | |
| #endif  /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
 | |
| ])
 | |
| 
 | |
| # b4_declare_yydebug
 | |
| # ------------------
 | |
| m4_define([b4_declare_yydebug],
 | |
| [b4_YYDEBUG_define[
 | |
| #if ]b4_api_PREFIX[DEBUG
 | |
| extern int ]b4_prefix[debug;
 | |
| #endif][]dnl
 | |
| ])
 | |
| 
 | |
| # b4_yylloc_default_define
 | |
| # ------------------------
 | |
| # Define YYLLOC_DEFAULT.
 | |
| m4_define([b4_yylloc_default_define],
 | |
| [[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
 | |
|    If N is 0, then set CURRENT to the empty location which ends
 | |
|    the previous symbol: RHS[0] (always defined).  */
 | |
| 
 | |
| #ifndef YYLLOC_DEFAULT
 | |
| # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
 | |
|     do                                                                  \
 | |
|       if (YYID (N))                                                     \
 | |
|         {                                                               \
 | |
|           (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
 | |
|           (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
 | |
|           (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
 | |
|           (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
 | |
|         }                                                               \
 | |
|       else                                                              \
 | |
|         {                                                               \
 | |
|           (Current).first_line   = (Current).last_line   =              \
 | |
|             YYRHSLOC (Rhs, 0).last_line;                                \
 | |
|           (Current).first_column = (Current).last_column =              \
 | |
|             YYRHSLOC (Rhs, 0).last_column;                              \
 | |
|         }                                                               \
 | |
|     while (YYID (0))
 | |
| #endif
 | |
| ]])
 | |
| 
 | |
| # b4_yy_location_print_define
 | |
| # ---------------------------
 | |
| # Define YY_LOCATION_PRINT.
 | |
| m4_define([b4_yy_location_print_define],
 | |
| [b4_locations_if([[
 | |
| /* YY_LOCATION_PRINT -- Print the location on the stream.
 | |
|    This macro was not mandated originally: define only if we know
 | |
|    we won't break user code: when these are the locations we know.  */
 | |
| 
 | |
| #ifndef __attribute__
 | |
| /* This feature is available in gcc versions 2.5 and later.  */
 | |
| # if (! defined __GNUC__ || __GNUC__ < 2 \
 | |
|       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
 | |
| #  define __attribute__(Spec) /* empty */
 | |
| # endif
 | |
| #endif
 | |
| 
 | |
| #ifndef YY_LOCATION_PRINT
 | |
| # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
 | |
| 
 | |
| /* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
 | |
| 
 | |
| __attribute__((__unused__))
 | |
| ]b4_c_function_def([yy_location_print_],
 | |
|     [static unsigned],
 | |
|                [[FILE *yyo],                    [yyo]],
 | |
|                [[YYLTYPE const * const yylocp], [yylocp]])[
 | |
| {
 | |
|   unsigned res = 0;
 | |
|   int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
 | |
|   if (0 <= yylocp->first_line)
 | |
|     {
 | |
|       res += fprintf (yyo, "%d", yylocp->first_line);
 | |
|       if (0 <= yylocp->first_column)
 | |
|         res += fprintf (yyo, ".%d", yylocp->first_column);
 | |
|     }
 | |
|   if (0 <= yylocp->last_line)
 | |
|     {
 | |
|       if (yylocp->first_line < yylocp->last_line)
 | |
|         {
 | |
|           res += fprintf (yyo, "-%d", yylocp->last_line);
 | |
|           if (0 <= end_col)
 | |
|             res += fprintf (yyo, ".%d", end_col);
 | |
|         }
 | |
|       else if (0 <= end_col && yylocp->first_column < end_col)
 | |
|         res += fprintf (yyo, "-%d", end_col);
 | |
|     }
 | |
|   return res;
 | |
|  }
 | |
| 
 | |
| #  define YY_LOCATION_PRINT(File, Loc)          \
 | |
|   yy_location_print_ (File, &(Loc))
 | |
| 
 | |
| # else
 | |
| #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 | |
| # endif
 | |
| #endif]],
 | |
| [[/* This macro is provided for backward compatibility. */
 | |
| #ifndef YY_LOCATION_PRINT
 | |
| # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 | |
| #endif]])
 | |
| ])
 | |
| 
 | |
| # b4_yyloc_default
 | |
| # ----------------
 | |
| # Expand to a possible default value for yylloc.
 | |
| m4_define([b4_yyloc_default],
 | |
| [[
 | |
| # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
 | |
|   = { ]m4_join([, ],
 | |
|                m4_defn([b4_location_initial_line]),
 | |
|                m4_defn([b4_location_initial_column]),
 | |
|                m4_defn([b4_location_initial_line]),
 | |
|                m4_defn([b4_location_initial_column]))[ }
 | |
| # endif
 | |
| ]])
 |