xref: /aosp_15_r20/prebuilts/build-tools/common/bison/skeletons/c.m4 (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker                                                            -*- Autoconf -*-
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Worker# C M4 Macros for Bison.
4*cda5da8dSAndroid Build Coastguard Worker
5*cda5da8dSAndroid Build Coastguard Worker# Copyright (C) 2002, 2004-2015, 2018-2021 Free Software Foundation,
6*cda5da8dSAndroid Build Coastguard Worker# Inc.
7*cda5da8dSAndroid Build Coastguard Worker
8*cda5da8dSAndroid Build Coastguard Worker# This program is free software: you can redistribute it and/or modify
9*cda5da8dSAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by
10*cda5da8dSAndroid Build Coastguard Worker# the Free Software Foundation, either version 3 of the License, or
11*cda5da8dSAndroid Build Coastguard Worker# (at your option) any later version.
12*cda5da8dSAndroid Build Coastguard Worker#
13*cda5da8dSAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful,
14*cda5da8dSAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of
15*cda5da8dSAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*cda5da8dSAndroid Build Coastguard Worker# GNU General Public License for more details.
17*cda5da8dSAndroid Build Coastguard Worker#
18*cda5da8dSAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License
19*cda5da8dSAndroid Build Coastguard Worker# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20*cda5da8dSAndroid Build Coastguard Worker
21*cda5da8dSAndroid Build Coastguard Workerm4_include(b4_skeletonsdir/[c-like.m4])
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker# b4_tocpp(STRING)
24*cda5da8dSAndroid Build Coastguard Worker# ----------------
25*cda5da8dSAndroid Build Coastguard Worker# Convert STRING into a valid C macro name.
26*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_tocpp],
27*cda5da8dSAndroid Build Coastguard Worker[m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))])
28*cda5da8dSAndroid Build Coastguard Worker
29*cda5da8dSAndroid Build Coastguard Worker
30*cda5da8dSAndroid Build Coastguard Worker# b4_cpp_guard(FILE)
31*cda5da8dSAndroid Build Coastguard Worker# ------------------
32*cda5da8dSAndroid Build Coastguard Worker# A valid C macro name to use as a CPP header guard for FILE.
33*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cpp_guard],
34*cda5da8dSAndroid Build Coastguard Worker[[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]])
35*cda5da8dSAndroid Build Coastguard Worker
36*cda5da8dSAndroid Build Coastguard Worker
37*cda5da8dSAndroid Build Coastguard Worker# b4_cpp_guard_open(FILE)
38*cda5da8dSAndroid Build Coastguard Worker# b4_cpp_guard_close(FILE)
39*cda5da8dSAndroid Build Coastguard Worker# ------------------------
40*cda5da8dSAndroid Build Coastguard Worker# If FILE does not expand to nothing, open/close CPP inclusion guards for FILE.
41*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cpp_guard_open],
42*cda5da8dSAndroid Build Coastguard Worker[m4_ifval(m4_quote($1),
43*cda5da8dSAndroid Build Coastguard Worker[#ifndef b4_cpp_guard([$1])
44*cda5da8dSAndroid Build Coastguard Worker# define b4_cpp_guard([$1])])])
45*cda5da8dSAndroid Build Coastguard Worker
46*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cpp_guard_close],
47*cda5da8dSAndroid Build Coastguard Worker[m4_ifval(m4_quote($1),
48*cda5da8dSAndroid Build Coastguard Worker[#endif b4_comment([!b4_cpp_guard([$1])])])])
49*cda5da8dSAndroid Build Coastguard Worker
50*cda5da8dSAndroid Build Coastguard Worker
51*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
52*cda5da8dSAndroid Build Coastguard Worker## Identification.  ##
53*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
54*cda5da8dSAndroid Build Coastguard Worker
55*cda5da8dSAndroid Build Coastguard Worker# b4_identification
56*cda5da8dSAndroid Build Coastguard Worker# -----------------
57*cda5da8dSAndroid Build Coastguard Worker# Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or
58*cda5da8dSAndroid Build Coastguard Worker# b4_pull_flag if they use the values of the %define variables api.pure or
59*cda5da8dSAndroid Build Coastguard Worker# api.push-pull.
60*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_identification],
61*cda5da8dSAndroid Build Coastguard Worker[[/* Identify Bison output, and Bison version.  */
62*cda5da8dSAndroid Build Coastguard Worker#define YYBISON ]b4_version[
63*cda5da8dSAndroid Build Coastguard Worker
64*cda5da8dSAndroid Build Coastguard Worker/* Bison version string.  */
65*cda5da8dSAndroid Build Coastguard Worker#define YYBISON_VERSION "]b4_version_string["
66*cda5da8dSAndroid Build Coastguard Worker
67*cda5da8dSAndroid Build Coastguard Worker/* Skeleton name.  */
68*cda5da8dSAndroid Build Coastguard Worker#define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[
69*cda5da8dSAndroid Build Coastguard Worker
70*cda5da8dSAndroid Build Coastguard Worker/* Pure parsers.  */
71*cda5da8dSAndroid Build Coastguard Worker#define YYPURE ]b4_pure_flag])[]m4_ifdef([b4_push_flag], [[
72*cda5da8dSAndroid Build Coastguard Worker
73*cda5da8dSAndroid Build Coastguard Worker/* Push parsers.  */
74*cda5da8dSAndroid Build Coastguard Worker#define YYPUSH ]b4_push_flag])[]m4_ifdef([b4_pull_flag], [[
75*cda5da8dSAndroid Build Coastguard Worker
76*cda5da8dSAndroid Build Coastguard Worker/* Pull parsers.  */
77*cda5da8dSAndroid Build Coastguard Worker#define YYPULL ]b4_pull_flag])[
78*cda5da8dSAndroid Build Coastguard Worker]])
79*cda5da8dSAndroid Build Coastguard Worker
80*cda5da8dSAndroid Build Coastguard Worker
81*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
82*cda5da8dSAndroid Build Coastguard Worker## Default values.  ##
83*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
84*cda5da8dSAndroid Build Coastguard Worker
85*cda5da8dSAndroid Build Coastguard Worker# b4_api_prefix, b4_api_PREFIX
86*cda5da8dSAndroid Build Coastguard Worker# ----------------------------
87*cda5da8dSAndroid Build Coastguard Worker# Corresponds to %define api.prefix
88*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.prefix]], [[yy]])
89*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_api_prefix],
90*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_get([[api.prefix]])])
91*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_api_PREFIX],
92*cda5da8dSAndroid Build Coastguard Worker[m4_toupper(b4_api_prefix)])
93*cda5da8dSAndroid Build Coastguard Worker
94*cda5da8dSAndroid Build Coastguard Worker
95*cda5da8dSAndroid Build Coastguard Worker# b4_prefix
96*cda5da8dSAndroid Build Coastguard Worker# ---------
97*cda5da8dSAndroid Build Coastguard Worker# If the %name-prefix is not given, it is api.prefix.
98*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_prefix], [b4_api_prefix])
99*cda5da8dSAndroid Build Coastguard Worker
100*cda5da8dSAndroid Build Coastguard Worker# If the %union is not named, its name is YYSTYPE.
101*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.value.union.name]],
102*cda5da8dSAndroid Build Coastguard Worker                          [b4_api_PREFIX[][STYPE]])
103*cda5da8dSAndroid Build Coastguard Worker
104*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.symbol.prefix]], [[YYSYMBOL_]])
105*cda5da8dSAndroid Build Coastguard Worker
106*cda5da8dSAndroid Build Coastguard Worker## ------------------------ ##
107*cda5da8dSAndroid Build Coastguard Worker## Pure/impure interfaces.  ##
108*cda5da8dSAndroid Build Coastguard Worker## ------------------------ ##
109*cda5da8dSAndroid Build Coastguard Worker
110*cda5da8dSAndroid Build Coastguard Worker# b4_yylex_formals
111*cda5da8dSAndroid Build Coastguard Worker# ----------------
112*cda5da8dSAndroid Build Coastguard Worker# All the yylex formal arguments.
113*cda5da8dSAndroid Build Coastguard Worker# b4_lex_param arrives quoted twice, but we want to keep only one level.
114*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yylex_formals],
115*cda5da8dSAndroid Build Coastguard Worker[b4_pure_if([[[b4_api_PREFIX[STYPE *yylvalp]], [[&yylval]]][]dnl
116*cda5da8dSAndroid Build Coastguard Workerb4_locations_if([, [b4_api_PREFIX[LTYPE *yyllocp], [&yylloc]]])])dnl
117*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([b4_lex_param], [, ]b4_lex_param)])
118*cda5da8dSAndroid Build Coastguard Worker
119*cda5da8dSAndroid Build Coastguard Worker
120*cda5da8dSAndroid Build Coastguard Worker# b4_yylex
121*cda5da8dSAndroid Build Coastguard Worker# --------
122*cda5da8dSAndroid Build Coastguard Worker# Call yylex.
123*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yylex],
124*cda5da8dSAndroid Build Coastguard Worker[b4_function_call([yylex], [int], b4_yylex_formals)])
125*cda5da8dSAndroid Build Coastguard Worker
126*cda5da8dSAndroid Build Coastguard Worker
127*cda5da8dSAndroid Build Coastguard Worker# b4_user_args
128*cda5da8dSAndroid Build Coastguard Worker# ------------
129*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_user_args],
130*cda5da8dSAndroid Build Coastguard Worker[m4_ifset([b4_parse_param], [, b4_user_args_no_comma])])
131*cda5da8dSAndroid Build Coastguard Worker
132*cda5da8dSAndroid Build Coastguard Worker# b4_user_args_no_comma
133*cda5da8dSAndroid Build Coastguard Worker# ---------------------
134*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_user_args_no_comma],
135*cda5da8dSAndroid Build Coastguard Worker[m4_ifset([b4_parse_param], [b4_args(b4_parse_param)])])
136*cda5da8dSAndroid Build Coastguard Worker
137*cda5da8dSAndroid Build Coastguard Worker
138*cda5da8dSAndroid Build Coastguard Worker# b4_user_formals
139*cda5da8dSAndroid Build Coastguard Worker# ---------------
140*cda5da8dSAndroid Build Coastguard Worker# The possible parse-params formal arguments preceded by a comma.
141*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_user_formals],
142*cda5da8dSAndroid Build Coastguard Worker[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
143*cda5da8dSAndroid Build Coastguard Worker
144*cda5da8dSAndroid Build Coastguard Worker
145*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param
146*cda5da8dSAndroid Build Coastguard Worker# --------------
147*cda5da8dSAndroid Build Coastguard Worker# If defined, b4_parse_param arrives double quoted, but below we prefer
148*cda5da8dSAndroid Build Coastguard Worker# it to be single quoted.
149*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param],
150*cda5da8dSAndroid Build Coastguard Workerb4_parse_param)
151*cda5da8dSAndroid Build Coastguard Worker
152*cda5da8dSAndroid Build Coastguard Worker
153*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_for(DECL, FORMAL, BODY)
154*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------
155*cda5da8dSAndroid Build Coastguard Worker# Iterate over the user parameters, binding the declaration to DECL,
156*cda5da8dSAndroid Build Coastguard Worker# the formal name to FORMAL, and evaluating the BODY.
157*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_for],
158*cda5da8dSAndroid Build Coastguard Worker[m4_foreach([$1_$2], m4_defn([b4_parse_param]),
159*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([$1], m4_unquote(m4_car($1_$2)))dnl
160*cda5da8dSAndroid Build Coastguard Workerm4_pushdef([$2], m4_shift($1_$2))dnl
161*cda5da8dSAndroid Build Coastguard Worker$3[]dnl
162*cda5da8dSAndroid Build Coastguard Workerm4_popdef([$2])dnl
163*cda5da8dSAndroid Build Coastguard Workerm4_popdef([$1])dnl
164*cda5da8dSAndroid Build Coastguard Worker])])
165*cda5da8dSAndroid Build Coastguard Worker
166*cda5da8dSAndroid Build Coastguard Worker
167*cda5da8dSAndroid Build Coastguard Worker# b4_use(EXPR)
168*cda5da8dSAndroid Build Coastguard Worker# ------------
169*cda5da8dSAndroid Build Coastguard Worker# Pacify the compiler about some maybe unused value.
170*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_use],
171*cda5da8dSAndroid Build Coastguard Worker[YY_USE ($1)])
172*cda5da8dSAndroid Build Coastguard Worker
173*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_use([VAL], [LOC])
174*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
175*cda5da8dSAndroid Build Coastguard Worker# 'YY_USE' VAL, LOC if locations are enabled, and all the parse-params.
176*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_use],
177*cda5da8dSAndroid Build Coastguard Worker[m4_ifvaln([$1], [  b4_use([$1]);])dnl
178*cda5da8dSAndroid Build Coastguard Workerb4_locations_if([m4_ifvaln([$2], [  b4_use([$2]);])])dnl
179*cda5da8dSAndroid Build Coastguard Workerb4_parse_param_for([Decl], [Formal], [  b4_use(Formal);
180*cda5da8dSAndroid Build Coastguard Worker])dnl
181*cda5da8dSAndroid Build Coastguard Worker])
182*cda5da8dSAndroid Build Coastguard Worker
183*cda5da8dSAndroid Build Coastguard Worker
184*cda5da8dSAndroid Build Coastguard Worker## ------------ ##
185*cda5da8dSAndroid Build Coastguard Worker## Data Types.  ##
186*cda5da8dSAndroid Build Coastguard Worker## ------------ ##
187*cda5da8dSAndroid Build Coastguard Worker
188*cda5da8dSAndroid Build Coastguard Worker# b4_int_type(MIN, MAX)
189*cda5da8dSAndroid Build Coastguard Worker# ---------------------
190*cda5da8dSAndroid Build Coastguard Worker# Return a narrow int type able to handle integers ranging from MIN
191*cda5da8dSAndroid Build Coastguard Worker# to MAX (included) in portable C code.  Assume MIN and MAX fall in
192*cda5da8dSAndroid Build Coastguard Worker# 'int' range.
193*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_int_type],
194*cda5da8dSAndroid Build Coastguard Worker[m4_if(b4_ints_in($@,   [-127],   [127]), [1], [signed char],
195*cda5da8dSAndroid Build Coastguard Worker       b4_ints_in($@,      [0],   [255]), [1], [unsigned char],
196*cda5da8dSAndroid Build Coastguard Worker
197*cda5da8dSAndroid Build Coastguard Worker       b4_ints_in($@, [-32767], [32767]), [1], [short],
198*cda5da8dSAndroid Build Coastguard Worker       b4_ints_in($@,      [0], [65535]), [1], [unsigned short],
199*cda5da8dSAndroid Build Coastguard Worker
200*cda5da8dSAndroid Build Coastguard Worker                                               [int])])
201*cda5da8dSAndroid Build Coastguard Worker
202*cda5da8dSAndroid Build Coastguard Worker# b4_c99_int_type(MIN, MAX)
203*cda5da8dSAndroid Build Coastguard Worker# -------------------------
204*cda5da8dSAndroid Build Coastguard Worker# Like b4_int_type, but for C99.
205*cda5da8dSAndroid Build Coastguard Worker# b4_c99_int_type_define replaces b4_int_type with this.
206*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_c99_int_type],
207*cda5da8dSAndroid Build Coastguard Worker[m4_if(b4_ints_in($@,   [-127],   [127]), [1], [yytype_int8],
208*cda5da8dSAndroid Build Coastguard Worker       b4_ints_in($@,      [0],   [255]), [1], [yytype_uint8],
209*cda5da8dSAndroid Build Coastguard Worker
210*cda5da8dSAndroid Build Coastguard Worker       b4_ints_in($@, [-32767], [32767]), [1], [yytype_int16],
211*cda5da8dSAndroid Build Coastguard Worker       b4_ints_in($@,      [0], [65535]), [1], [yytype_uint16],
212*cda5da8dSAndroid Build Coastguard Worker
213*cda5da8dSAndroid Build Coastguard Worker                                               [int])])
214*cda5da8dSAndroid Build Coastguard Worker
215*cda5da8dSAndroid Build Coastguard Worker# b4_c99_int_type_define
216*cda5da8dSAndroid Build Coastguard Worker# ----------------------
217*cda5da8dSAndroid Build Coastguard Worker# Define private types suitable for holding small integers in C99 or later.
218*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_c99_int_type_define],
219*cda5da8dSAndroid Build Coastguard Worker[m4_copy_force([b4_c99_int_type], [b4_int_type])dnl
220*cda5da8dSAndroid Build Coastguard Worker[#ifdef short
221*cda5da8dSAndroid Build Coastguard Worker# undef short
222*cda5da8dSAndroid Build Coastguard Worker#endif
223*cda5da8dSAndroid Build Coastguard Worker
224*cda5da8dSAndroid Build Coastguard Worker/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
225*cda5da8dSAndroid Build Coastguard Worker   <limits.h> and (if available) <stdint.h> are included
226*cda5da8dSAndroid Build Coastguard Worker   so that the code can choose integer types of a good width.  */
227*cda5da8dSAndroid Build Coastguard Worker
228*cda5da8dSAndroid Build Coastguard Worker#ifndef __PTRDIFF_MAX__
229*cda5da8dSAndroid Build Coastguard Worker# include <limits.h> /* INFRINGES ON USER NAME SPACE */
230*cda5da8dSAndroid Build Coastguard Worker# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
231*cda5da8dSAndroid Build Coastguard Worker#  include <stdint.h> /* INFRINGES ON USER NAME SPACE */
232*cda5da8dSAndroid Build Coastguard Worker#  define YY_STDINT_H
233*cda5da8dSAndroid Build Coastguard Worker# endif
234*cda5da8dSAndroid Build Coastguard Worker#endif
235*cda5da8dSAndroid Build Coastguard Worker
236*cda5da8dSAndroid Build Coastguard Worker/* Narrow types that promote to a signed type and that can represent a
237*cda5da8dSAndroid Build Coastguard Worker   signed or unsigned integer of at least N bits.  In tables they can
238*cda5da8dSAndroid Build Coastguard Worker   save space and decrease cache pressure.  Promoting to a signed type
239*cda5da8dSAndroid Build Coastguard Worker   helps avoid bugs in integer arithmetic.  */
240*cda5da8dSAndroid Build Coastguard Worker
241*cda5da8dSAndroid Build Coastguard Worker#ifdef __INT_LEAST8_MAX__
242*cda5da8dSAndroid Build Coastguard Workertypedef __INT_LEAST8_TYPE__ yytype_int8;
243*cda5da8dSAndroid Build Coastguard Worker#elif defined YY_STDINT_H
244*cda5da8dSAndroid Build Coastguard Workertypedef int_least8_t yytype_int8;
245*cda5da8dSAndroid Build Coastguard Worker#else
246*cda5da8dSAndroid Build Coastguard Workertypedef signed char yytype_int8;
247*cda5da8dSAndroid Build Coastguard Worker#endif
248*cda5da8dSAndroid Build Coastguard Worker
249*cda5da8dSAndroid Build Coastguard Worker#ifdef __INT_LEAST16_MAX__
250*cda5da8dSAndroid Build Coastguard Workertypedef __INT_LEAST16_TYPE__ yytype_int16;
251*cda5da8dSAndroid Build Coastguard Worker#elif defined YY_STDINT_H
252*cda5da8dSAndroid Build Coastguard Workertypedef int_least16_t yytype_int16;
253*cda5da8dSAndroid Build Coastguard Worker#else
254*cda5da8dSAndroid Build Coastguard Workertypedef short yytype_int16;
255*cda5da8dSAndroid Build Coastguard Worker#endif
256*cda5da8dSAndroid Build Coastguard Worker
257*cda5da8dSAndroid Build Coastguard Worker/* Work around bug in HP-UX 11.23, which defines these macros
258*cda5da8dSAndroid Build Coastguard Worker   incorrectly for preprocessor constants.  This workaround can likely
259*cda5da8dSAndroid Build Coastguard Worker   be removed in 2023, as HPE has promised support for HP-UX 11.23
260*cda5da8dSAndroid Build Coastguard Worker   (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
261*cda5da8dSAndroid Build Coastguard Worker   <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>.  */
262*cda5da8dSAndroid Build Coastguard Worker#ifdef __hpux
263*cda5da8dSAndroid Build Coastguard Worker# undef UINT_LEAST8_MAX
264*cda5da8dSAndroid Build Coastguard Worker# undef UINT_LEAST16_MAX
265*cda5da8dSAndroid Build Coastguard Worker# define UINT_LEAST8_MAX 255
266*cda5da8dSAndroid Build Coastguard Worker# define UINT_LEAST16_MAX 65535
267*cda5da8dSAndroid Build Coastguard Worker#endif
268*cda5da8dSAndroid Build Coastguard Worker
269*cda5da8dSAndroid Build Coastguard Worker#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
270*cda5da8dSAndroid Build Coastguard Workertypedef __UINT_LEAST8_TYPE__ yytype_uint8;
271*cda5da8dSAndroid Build Coastguard Worker#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
272*cda5da8dSAndroid Build Coastguard Worker       && UINT_LEAST8_MAX <= INT_MAX)
273*cda5da8dSAndroid Build Coastguard Workertypedef uint_least8_t yytype_uint8;
274*cda5da8dSAndroid Build Coastguard Worker#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
275*cda5da8dSAndroid Build Coastguard Workertypedef unsigned char yytype_uint8;
276*cda5da8dSAndroid Build Coastguard Worker#else
277*cda5da8dSAndroid Build Coastguard Workertypedef short yytype_uint8;
278*cda5da8dSAndroid Build Coastguard Worker#endif
279*cda5da8dSAndroid Build Coastguard Worker
280*cda5da8dSAndroid Build Coastguard Worker#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
281*cda5da8dSAndroid Build Coastguard Workertypedef __UINT_LEAST16_TYPE__ yytype_uint16;
282*cda5da8dSAndroid Build Coastguard Worker#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
283*cda5da8dSAndroid Build Coastguard Worker       && UINT_LEAST16_MAX <= INT_MAX)
284*cda5da8dSAndroid Build Coastguard Workertypedef uint_least16_t yytype_uint16;
285*cda5da8dSAndroid Build Coastguard Worker#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
286*cda5da8dSAndroid Build Coastguard Workertypedef unsigned short yytype_uint16;
287*cda5da8dSAndroid Build Coastguard Worker#else
288*cda5da8dSAndroid Build Coastguard Workertypedef int yytype_uint16;
289*cda5da8dSAndroid Build Coastguard Worker#endif]])
290*cda5da8dSAndroid Build Coastguard Worker
291*cda5da8dSAndroid Build Coastguard Worker
292*cda5da8dSAndroid Build Coastguard Worker# b4_sizes_types_define
293*cda5da8dSAndroid Build Coastguard Worker# ---------------------
294*cda5da8dSAndroid Build Coastguard Worker# Define YYPTRDIFF_T/YYPTRDIFF_MAXIMUM, YYSIZE_T/YYSIZE_MAXIMUM,
295*cda5da8dSAndroid Build Coastguard Worker# and YYSIZEOF.
296*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_sizes_types_define],
297*cda5da8dSAndroid Build Coastguard Worker[[#ifndef YYPTRDIFF_T
298*cda5da8dSAndroid Build Coastguard Worker# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
299*cda5da8dSAndroid Build Coastguard Worker#  define YYPTRDIFF_T __PTRDIFF_TYPE__
300*cda5da8dSAndroid Build Coastguard Worker#  define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
301*cda5da8dSAndroid Build Coastguard Worker# elif defined PTRDIFF_MAX
302*cda5da8dSAndroid Build Coastguard Worker#  ifndef ptrdiff_t
303*cda5da8dSAndroid Build Coastguard Worker#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
304*cda5da8dSAndroid Build Coastguard Worker#  endif
305*cda5da8dSAndroid Build Coastguard Worker#  define YYPTRDIFF_T ptrdiff_t
306*cda5da8dSAndroid Build Coastguard Worker#  define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
307*cda5da8dSAndroid Build Coastguard Worker# else
308*cda5da8dSAndroid Build Coastguard Worker#  define YYPTRDIFF_T long
309*cda5da8dSAndroid Build Coastguard Worker#  define YYPTRDIFF_MAXIMUM LONG_MAX
310*cda5da8dSAndroid Build Coastguard Worker# endif
311*cda5da8dSAndroid Build Coastguard Worker#endif
312*cda5da8dSAndroid Build Coastguard Worker
313*cda5da8dSAndroid Build Coastguard Worker#ifndef YYSIZE_T
314*cda5da8dSAndroid Build Coastguard Worker# ifdef __SIZE_TYPE__
315*cda5da8dSAndroid Build Coastguard Worker#  define YYSIZE_T __SIZE_TYPE__
316*cda5da8dSAndroid Build Coastguard Worker# elif defined size_t
317*cda5da8dSAndroid Build Coastguard Worker#  define YYSIZE_T size_t
318*cda5da8dSAndroid Build Coastguard Worker# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
319*cda5da8dSAndroid Build Coastguard Worker#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
320*cda5da8dSAndroid Build Coastguard Worker#  define YYSIZE_T size_t
321*cda5da8dSAndroid Build Coastguard Worker# else
322*cda5da8dSAndroid Build Coastguard Worker#  define YYSIZE_T unsigned
323*cda5da8dSAndroid Build Coastguard Worker# endif
324*cda5da8dSAndroid Build Coastguard Worker#endif
325*cda5da8dSAndroid Build Coastguard Worker
326*cda5da8dSAndroid Build Coastguard Worker#define YYSIZE_MAXIMUM                                  \
327*cda5da8dSAndroid Build Coastguard Worker  YY_CAST (YYPTRDIFF_T,                                 \
328*cda5da8dSAndroid Build Coastguard Worker           (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1)  \
329*cda5da8dSAndroid Build Coastguard Worker            ? YYPTRDIFF_MAXIMUM                         \
330*cda5da8dSAndroid Build Coastguard Worker            : YY_CAST (YYSIZE_T, -1)))
331*cda5da8dSAndroid Build Coastguard Worker
332*cda5da8dSAndroid Build Coastguard Worker#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
333*cda5da8dSAndroid Build Coastguard Worker]])
334*cda5da8dSAndroid Build Coastguard Worker
335*cda5da8dSAndroid Build Coastguard Worker
336*cda5da8dSAndroid Build Coastguard Worker# b4_int_type_for(NAME)
337*cda5da8dSAndroid Build Coastguard Worker# ---------------------
338*cda5da8dSAndroid Build Coastguard Worker# Return a narrow int type able to handle numbers ranging from
339*cda5da8dSAndroid Build Coastguard Worker# 'NAME_min' to 'NAME_max' (included).
340*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_int_type_for],
341*cda5da8dSAndroid Build Coastguard Worker[b4_int_type($1_min, $1_max)])
342*cda5da8dSAndroid Build Coastguard Worker
343*cda5da8dSAndroid Build Coastguard Worker
344*cda5da8dSAndroid Build Coastguard Worker# b4_table_value_equals(TABLE, VALUE, LITERAL, SYMBOL)
345*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------
346*cda5da8dSAndroid Build Coastguard Worker# Without inducing a comparison warning from the compiler, check if the
347*cda5da8dSAndroid Build Coastguard Worker# literal value LITERAL equals VALUE from table TABLE, which must have
348*cda5da8dSAndroid Build Coastguard Worker# TABLE_min and TABLE_max defined.  SYMBOL denotes
349*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_table_value_equals],
350*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
351*cda5da8dSAndroid Build Coastguard Worker               || m4_indir([b4_]$1[_max]) < $3), [1],
352*cda5da8dSAndroid Build Coastguard Worker       [[0]],
353*cda5da8dSAndroid Build Coastguard Worker       [(($2) == $4)])])
354*cda5da8dSAndroid Build Coastguard Worker
355*cda5da8dSAndroid Build Coastguard Worker
356*cda5da8dSAndroid Build Coastguard Worker## ----------------- ##
357*cda5da8dSAndroid Build Coastguard Worker## Compiler issues.  ##
358*cda5da8dSAndroid Build Coastguard Worker## ----------------- ##
359*cda5da8dSAndroid Build Coastguard Worker
360*cda5da8dSAndroid Build Coastguard Worker# b4_attribute_define([noreturn])
361*cda5da8dSAndroid Build Coastguard Worker# -------------------------------
362*cda5da8dSAndroid Build Coastguard Worker# Provide portable compiler "attributes".  If "noreturn" is passed, define
363*cda5da8dSAndroid Build Coastguard Worker# _Noreturn.
364*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_attribute_define],
365*cda5da8dSAndroid Build Coastguard Worker[[#ifndef YY_ATTRIBUTE_PURE
366*cda5da8dSAndroid Build Coastguard Worker# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
367*cda5da8dSAndroid Build Coastguard Worker#  define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
368*cda5da8dSAndroid Build Coastguard Worker# else
369*cda5da8dSAndroid Build Coastguard Worker#  define YY_ATTRIBUTE_PURE
370*cda5da8dSAndroid Build Coastguard Worker# endif
371*cda5da8dSAndroid Build Coastguard Worker#endif
372*cda5da8dSAndroid Build Coastguard Worker
373*cda5da8dSAndroid Build Coastguard Worker#ifndef YY_ATTRIBUTE_UNUSED
374*cda5da8dSAndroid Build Coastguard Worker# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
375*cda5da8dSAndroid Build Coastguard Worker#  define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
376*cda5da8dSAndroid Build Coastguard Worker# else
377*cda5da8dSAndroid Build Coastguard Worker#  define YY_ATTRIBUTE_UNUSED
378*cda5da8dSAndroid Build Coastguard Worker# endif
379*cda5da8dSAndroid Build Coastguard Worker#endif
380*cda5da8dSAndroid Build Coastguard Worker
381*cda5da8dSAndroid Build Coastguard Worker]m4_bmatch([$1], [\bnoreturn\b], [[/* The _Noreturn keyword of C11.  */
382*cda5da8dSAndroid Build Coastguard Worker]dnl This is close to lib/_Noreturn.h, except that we do enable
383*cda5da8dSAndroid Build Coastguard Workerdnl the use of [[noreturn]], because _Noreturn is used in places
384*cda5da8dSAndroid Build Coastguard Workerdnl where [[noreturn]] works in C++.  We need this in particular
385*cda5da8dSAndroid Build Coastguard Workerdnl because of glr.cc which compiles code from glr.c in C++.
386*cda5da8dSAndroid Build Coastguard Workerdnl And the C++ compiler chokes on _Noreturn.  Also, we do not
387*cda5da8dSAndroid Build Coastguard Workerdnl use C' _Noreturn in C++, to avoid -Wc11-extensions warnings.
388*cda5da8dSAndroid Build Coastguard Worker[#ifndef _Noreturn
389*cda5da8dSAndroid Build Coastguard Worker# if (defined __cplusplus \
390*cda5da8dSAndroid Build Coastguard Worker      && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
391*cda5da8dSAndroid Build Coastguard Worker          || (defined _MSC_VER && 1900 <= _MSC_VER)))
392*cda5da8dSAndroid Build Coastguard Worker#  define _Noreturn [[noreturn]]
393*cda5da8dSAndroid Build Coastguard Worker# elif ((!defined __cplusplus || defined __clang__) \
394*cda5da8dSAndroid Build Coastguard Worker        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
395*cda5da8dSAndroid Build Coastguard Worker            || (!defined __STRICT_ANSI__ \
396*cda5da8dSAndroid Build Coastguard Worker                && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
397*cda5da8dSAndroid Build Coastguard Worker                    || (defined __apple_build_version__ \
398*cda5da8dSAndroid Build Coastguard Worker                        ? 6000000 <= __apple_build_version__ \
399*cda5da8dSAndroid Build Coastguard Worker                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
400*cda5da8dSAndroid Build Coastguard Worker   /* _Noreturn works as-is.  */
401*cda5da8dSAndroid Build Coastguard Worker# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
402*cda5da8dSAndroid Build Coastguard Worker        || 0x5110 <= __SUNPRO_C)
403*cda5da8dSAndroid Build Coastguard Worker#  define _Noreturn __attribute__ ((__noreturn__))
404*cda5da8dSAndroid Build Coastguard Worker# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
405*cda5da8dSAndroid Build Coastguard Worker#  define _Noreturn __declspec (noreturn)
406*cda5da8dSAndroid Build Coastguard Worker# else
407*cda5da8dSAndroid Build Coastguard Worker#  define _Noreturn
408*cda5da8dSAndroid Build Coastguard Worker# endif
409*cda5da8dSAndroid Build Coastguard Worker#endif
410*cda5da8dSAndroid Build Coastguard Worker
411*cda5da8dSAndroid Build Coastguard Worker]])[/* Suppress unused-variable warnings by "using" E.  */
412*cda5da8dSAndroid Build Coastguard Worker#if ! defined lint || defined __GNUC__
413*cda5da8dSAndroid Build Coastguard Worker# define YY_USE(E) ((void) (E))
414*cda5da8dSAndroid Build Coastguard Worker#else
415*cda5da8dSAndroid Build Coastguard Worker# define YY_USE(E) /* empty */
416*cda5da8dSAndroid Build Coastguard Worker#endif
417*cda5da8dSAndroid Build Coastguard Worker
418*cda5da8dSAndroid Build Coastguard Worker/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
419*cda5da8dSAndroid Build Coastguard Worker#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
420*cda5da8dSAndroid Build Coastguard Worker# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
421*cda5da8dSAndroid Build Coastguard Worker#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
422*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic push")                                     \
423*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
424*cda5da8dSAndroid Build Coastguard Worker# else
425*cda5da8dSAndroid Build Coastguard Worker#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
426*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic push")                                     \
427*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")              \
428*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
429*cda5da8dSAndroid Build Coastguard Worker# endif
430*cda5da8dSAndroid Build Coastguard Worker# define YY_IGNORE_MAYBE_UNINITIALIZED_END      \
431*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic pop")
432*cda5da8dSAndroid Build Coastguard Worker#else
433*cda5da8dSAndroid Build Coastguard Worker# define YY_INITIAL_VALUE(Value) Value
434*cda5da8dSAndroid Build Coastguard Worker#endif
435*cda5da8dSAndroid Build Coastguard Worker#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
436*cda5da8dSAndroid Build Coastguard Worker# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
437*cda5da8dSAndroid Build Coastguard Worker# define YY_IGNORE_MAYBE_UNINITIALIZED_END
438*cda5da8dSAndroid Build Coastguard Worker#endif
439*cda5da8dSAndroid Build Coastguard Worker#ifndef YY_INITIAL_VALUE
440*cda5da8dSAndroid Build Coastguard Worker# define YY_INITIAL_VALUE(Value) /* Nothing. */
441*cda5da8dSAndroid Build Coastguard Worker#endif
442*cda5da8dSAndroid Build Coastguard Worker
443*cda5da8dSAndroid Build Coastguard Worker#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
444*cda5da8dSAndroid Build Coastguard Worker# define YY_IGNORE_USELESS_CAST_BEGIN                          \
445*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic push")                            \
446*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
447*cda5da8dSAndroid Build Coastguard Worker# define YY_IGNORE_USELESS_CAST_END            \
448*cda5da8dSAndroid Build Coastguard Worker    _Pragma ("GCC diagnostic pop")
449*cda5da8dSAndroid Build Coastguard Worker#endif
450*cda5da8dSAndroid Build Coastguard Worker#ifndef YY_IGNORE_USELESS_CAST_BEGIN
451*cda5da8dSAndroid Build Coastguard Worker# define YY_IGNORE_USELESS_CAST_BEGIN
452*cda5da8dSAndroid Build Coastguard Worker# define YY_IGNORE_USELESS_CAST_END
453*cda5da8dSAndroid Build Coastguard Worker#endif
454*cda5da8dSAndroid Build Coastguard Worker]])
455*cda5da8dSAndroid Build Coastguard Worker
456*cda5da8dSAndroid Build Coastguard Worker
457*cda5da8dSAndroid Build Coastguard Worker# b4_cast_define
458*cda5da8dSAndroid Build Coastguard Worker# --------------
459*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cast_define],
460*cda5da8dSAndroid Build Coastguard Worker[# ifndef YY_CAST
461*cda5da8dSAndroid Build Coastguard Worker#  ifdef __cplusplus
462*cda5da8dSAndroid Build Coastguard Worker#   define YY_CAST(Type, Val) static_cast<Type> (Val)
463*cda5da8dSAndroid Build Coastguard Worker#   define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
464*cda5da8dSAndroid Build Coastguard Worker#  else
465*cda5da8dSAndroid Build Coastguard Worker#   define YY_CAST(Type, Val) ((Type) (Val))
466*cda5da8dSAndroid Build Coastguard Worker#   define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
467*cda5da8dSAndroid Build Coastguard Worker#  endif
468*cda5da8dSAndroid Build Coastguard Worker# endif[]dnl
469*cda5da8dSAndroid Build Coastguard Worker])
470*cda5da8dSAndroid Build Coastguard Worker
471*cda5da8dSAndroid Build Coastguard Worker
472*cda5da8dSAndroid Build Coastguard Worker# b4_null_define
473*cda5da8dSAndroid Build Coastguard Worker# --------------
474*cda5da8dSAndroid Build Coastguard Worker# Portability issues: define a YY_NULLPTR appropriate for the current
475*cda5da8dSAndroid Build Coastguard Worker# language (C, C++98, or C++11).
476*cda5da8dSAndroid Build Coastguard Worker#
477*cda5da8dSAndroid Build Coastguard Worker# In C++ pre C++11 it is standard practice to use 0 (not NULL) for the
478*cda5da8dSAndroid Build Coastguard Worker# null pointer.  In C, prefer ((void*)0) to avoid having to include stdlib.h.
479*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_null_define],
480*cda5da8dSAndroid Build Coastguard Worker[# ifndef YY_NULLPTR
481*cda5da8dSAndroid Build Coastguard Worker#  if defined __cplusplus
482*cda5da8dSAndroid Build Coastguard Worker#   if 201103L <= __cplusplus
483*cda5da8dSAndroid Build Coastguard Worker#    define YY_NULLPTR nullptr
484*cda5da8dSAndroid Build Coastguard Worker#   else
485*cda5da8dSAndroid Build Coastguard Worker#    define YY_NULLPTR 0
486*cda5da8dSAndroid Build Coastguard Worker#   endif
487*cda5da8dSAndroid Build Coastguard Worker#  else
488*cda5da8dSAndroid Build Coastguard Worker#   define YY_NULLPTR ((void*)0)
489*cda5da8dSAndroid Build Coastguard Worker#  endif
490*cda5da8dSAndroid Build Coastguard Worker# endif[]dnl
491*cda5da8dSAndroid Build Coastguard Worker])
492*cda5da8dSAndroid Build Coastguard Worker
493*cda5da8dSAndroid Build Coastguard Worker
494*cda5da8dSAndroid Build Coastguard Worker# b4_null
495*cda5da8dSAndroid Build Coastguard Worker# -------
496*cda5da8dSAndroid Build Coastguard Worker# Return a null pointer constant.
497*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_null], [YY_NULLPTR])
498*cda5da8dSAndroid Build Coastguard Worker
499*cda5da8dSAndroid Build Coastguard Worker
500*cda5da8dSAndroid Build Coastguard Worker
501*cda5da8dSAndroid Build Coastguard Worker## ---------##
502*cda5da8dSAndroid Build Coastguard Worker## Values.  ##
503*cda5da8dSAndroid Build Coastguard Worker## ---------##
504*cda5da8dSAndroid Build Coastguard Worker
505*cda5da8dSAndroid Build Coastguard Worker# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
506*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------------------------
507*cda5da8dSAndroid Build Coastguard Worker# Define "yy<TABLE-NAME>" whose contents is CONTENT.
508*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_integral_parser_table_define],
509*cda5da8dSAndroid Build Coastguard Worker[m4_ifvaln([$3], [b4_comment([$3])])dnl
510*cda5da8dSAndroid Build Coastguard Workerstatic const b4_int_type_for([$2]) yy$1[[]] =
511*cda5da8dSAndroid Build Coastguard Worker{
512*cda5da8dSAndroid Build Coastguard Worker  $2
513*cda5da8dSAndroid Build Coastguard Worker};dnl
514*cda5da8dSAndroid Build Coastguard Worker])
515*cda5da8dSAndroid Build Coastguard Worker
516*cda5da8dSAndroid Build Coastguard Worker
517*cda5da8dSAndroid Build Coastguard Worker## ------------- ##
518*cda5da8dSAndroid Build Coastguard Worker## Token kinds.  ##
519*cda5da8dSAndroid Build Coastguard Worker## ------------- ##
520*cda5da8dSAndroid Build Coastguard Worker
521*cda5da8dSAndroid Build Coastguard Worker# Because C enums are not scoped, because tokens are exposed in the
522*cda5da8dSAndroid Build Coastguard Worker# header, and because these tokens are common to all the parsers, we
523*cda5da8dSAndroid Build Coastguard Worker# need to make sure their names don't collide: use the api.prefix.
524*cda5da8dSAndroid Build Coastguard Worker# YYEOF is special, since the user may give it a different name.
525*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol(-2, id)],  [b4_api_PREFIX[][EMPTY]])
526*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol(-2, tag)], [[No symbol.]])
527*cda5da8dSAndroid Build Coastguard Worker
528*cda5da8dSAndroid Build Coastguard Workerm4_if(b4_symbol(eof, id), [YYEOF],
529*cda5da8dSAndroid Build Coastguard Worker     [m4_define([b4_symbol(0, id)],  [b4_api_PREFIX[][EOF]])])
530*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol(1, id)],  [b4_api_PREFIX[][error]])
531*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol(2, id)],  [b4_api_PREFIX[][UNDEF]])
532*cda5da8dSAndroid Build Coastguard Worker
533*cda5da8dSAndroid Build Coastguard Worker
534*cda5da8dSAndroid Build Coastguard Worker# b4_token_define(TOKEN-NUM)
535*cda5da8dSAndroid Build Coastguard Worker# --------------------------
536*cda5da8dSAndroid Build Coastguard Worker# Output the definition of this token as #define.
537*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_define],
538*cda5da8dSAndroid Build Coastguard Worker[b4_token_format([#define %s %s], [$1])])
539*cda5da8dSAndroid Build Coastguard Worker
540*cda5da8dSAndroid Build Coastguard Worker# b4_token_defines
541*cda5da8dSAndroid Build Coastguard Worker# ----------------
542*cda5da8dSAndroid Build Coastguard Worker# Output the definition of the tokens.
543*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_defines],
544*cda5da8dSAndroid Build Coastguard Worker[[/* Token kinds.  */
545*cda5da8dSAndroid Build Coastguard Worker#define ]b4_symbol(empty, [id])[ -2
546*cda5da8dSAndroid Build Coastguard Worker]m4_join([
547*cda5da8dSAndroid Build Coastguard Worker], b4_symbol_map([b4_token_define]))
548*cda5da8dSAndroid Build Coastguard Worker])
549*cda5da8dSAndroid Build Coastguard Worker
550*cda5da8dSAndroid Build Coastguard Worker
551*cda5da8dSAndroid Build Coastguard Worker# b4_token_enum(TOKEN-NUM)
552*cda5da8dSAndroid Build Coastguard Worker# ------------------------
553*cda5da8dSAndroid Build Coastguard Worker# Output the definition of this token as an enum.
554*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_enum],
555*cda5da8dSAndroid Build Coastguard Worker[b4_token_visible_if([$1],
556*cda5da8dSAndroid Build Coastguard Worker    [m4_format([    %-30s %s],
557*cda5da8dSAndroid Build Coastguard Worker               m4_format([[%s = %s%s%s]],
558*cda5da8dSAndroid Build Coastguard Worker                         b4_symbol([$1], [id]),
559*cda5da8dSAndroid Build Coastguard Worker                         b4_symbol([$1], b4_api_token_raw_if([[number]], [[code]])),
560*cda5da8dSAndroid Build Coastguard Worker                         m4_if([$1], b4_last_enum_token, [], [[,]])),
561*cda5da8dSAndroid Build Coastguard Worker               [b4_symbol_tag_comment([$1])])])])
562*cda5da8dSAndroid Build Coastguard Worker
563*cda5da8dSAndroid Build Coastguard Worker
564*cda5da8dSAndroid Build Coastguard Worker# b4_token_enums
565*cda5da8dSAndroid Build Coastguard Worker# --------------
566*cda5da8dSAndroid Build Coastguard Worker# The definition of the token kinds.
567*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_enums],
568*cda5da8dSAndroid Build Coastguard Worker[b4_any_token_visible_if([[/* Token kinds.  */
569*cda5da8dSAndroid Build Coastguard Worker#ifndef ]b4_api_PREFIX[TOKENTYPE
570*cda5da8dSAndroid Build Coastguard Worker# define ]b4_api_PREFIX[TOKENTYPE
571*cda5da8dSAndroid Build Coastguard Worker  enum ]b4_api_prefix[tokentype
572*cda5da8dSAndroid Build Coastguard Worker  {
573*cda5da8dSAndroid Build Coastguard Worker    ]b4_symbol(empty, [id])[ = -2,
574*cda5da8dSAndroid Build Coastguard Worker]b4_symbol_foreach([b4_token_enum])dnl
575*cda5da8dSAndroid Build Coastguard Worker[  };
576*cda5da8dSAndroid Build Coastguard Worker  typedef enum ]b4_api_prefix[tokentype ]b4_api_prefix[token_kind_t;
577*cda5da8dSAndroid Build Coastguard Worker#endif
578*cda5da8dSAndroid Build Coastguard Worker]])])
579*cda5da8dSAndroid Build Coastguard Worker
580*cda5da8dSAndroid Build Coastguard Worker
581*cda5da8dSAndroid Build Coastguard Worker# b4_token_enums_defines
582*cda5da8dSAndroid Build Coastguard Worker# ----------------------
583*cda5da8dSAndroid Build Coastguard Worker# The definition of the tokens (if there are any) as enums and,
584*cda5da8dSAndroid Build Coastguard Worker# if POSIX Yacc is enabled, as #defines.
585*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_enums_defines],
586*cda5da8dSAndroid Build Coastguard Worker[b4_token_enums[]b4_yacc_if([b4_token_defines])])
587*cda5da8dSAndroid Build Coastguard Worker
588*cda5da8dSAndroid Build Coastguard Worker
589*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_translate(STRING)
590*cda5da8dSAndroid Build Coastguard Worker# ---------------------------
591*cda5da8dSAndroid Build Coastguard Worker# Used by "bison" in the array of symbol names to mark those that
592*cda5da8dSAndroid Build Coastguard Worker# require translation.
593*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_translate],
594*cda5da8dSAndroid Build Coastguard Worker[[N_($1)]])
595*cda5da8dSAndroid Build Coastguard Worker
596*cda5da8dSAndroid Build Coastguard Worker
597*cda5da8dSAndroid Build Coastguard Worker
598*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
599*cda5da8dSAndroid Build Coastguard Worker## Symbol kinds.  ##
600*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
601*cda5da8dSAndroid Build Coastguard Worker
602*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_enum(SYMBOL-NUM)
603*cda5da8dSAndroid Build Coastguard Worker# --------------------------
604*cda5da8dSAndroid Build Coastguard Worker# Output the definition of this symbol as an enum.
605*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_enum],
606*cda5da8dSAndroid Build Coastguard Worker[m4_format([  %-40s %s],
607*cda5da8dSAndroid Build Coastguard Worker           m4_format([[%s = %s%s%s]],
608*cda5da8dSAndroid Build Coastguard Worker                     b4_symbol([$1], [kind_base]),
609*cda5da8dSAndroid Build Coastguard Worker                     [$1],
610*cda5da8dSAndroid Build Coastguard Worker                     m4_if([$1], b4_last_symbol, [], [[,]])),
611*cda5da8dSAndroid Build Coastguard Worker           [b4_symbol_tag_comment([$1])])])
612*cda5da8dSAndroid Build Coastguard Worker
613*cda5da8dSAndroid Build Coastguard Worker
614*cda5da8dSAndroid Build Coastguard Worker# b4_declare_symbol_enum
615*cda5da8dSAndroid Build Coastguard Worker# ----------------------
616*cda5da8dSAndroid Build Coastguard Worker# The definition of the symbol internal numbers as an enum.
617*cda5da8dSAndroid Build Coastguard Worker# Defining YYEMPTY here is important: it forces the compiler
618*cda5da8dSAndroid Build Coastguard Worker# to use a signed type, which matters for yytoken.
619*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_declare_symbol_enum],
620*cda5da8dSAndroid Build Coastguard Worker[[/* Symbol kind.  */
621*cda5da8dSAndroid Build Coastguard Workerenum yysymbol_kind_t
622*cda5da8dSAndroid Build Coastguard Worker{
623*cda5da8dSAndroid Build Coastguard Worker  ]b4_symbol(empty, [kind_base])[ = -2,
624*cda5da8dSAndroid Build Coastguard Worker]b4_symbol_foreach([b4_symbol_enum])dnl
625*cda5da8dSAndroid Build Coastguard Worker[};
626*cda5da8dSAndroid Build Coastguard Workertypedef enum yysymbol_kind_t yysymbol_kind_t;
627*cda5da8dSAndroid Build Coastguard Worker]])])
628*cda5da8dSAndroid Build Coastguard Worker
629*cda5da8dSAndroid Build Coastguard Worker
630*cda5da8dSAndroid Build Coastguard Worker## ----------------- ##
631*cda5da8dSAndroid Build Coastguard Worker## Semantic Values.  ##
632*cda5da8dSAndroid Build Coastguard Worker## ----------------- ##
633*cda5da8dSAndroid Build Coastguard Worker
634*cda5da8dSAndroid Build Coastguard Worker
635*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
636*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------
637*cda5da8dSAndroid Build Coastguard Worker# See README.
638*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_value],
639*cda5da8dSAndroid Build Coastguard Worker[m4_ifval([$3],
640*cda5da8dSAndroid Build Coastguard Worker          [($1.$3)],
641*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval([$2],
642*cda5da8dSAndroid Build Coastguard Worker                    [b4_symbol_if([$2], [has_type],
643*cda5da8dSAndroid Build Coastguard Worker                                  [($1.b4_symbol([$2], [type]))],
644*cda5da8dSAndroid Build Coastguard Worker                                  [$1])],
645*cda5da8dSAndroid Build Coastguard Worker                    [$1])])])
646*cda5da8dSAndroid Build Coastguard Worker
647*cda5da8dSAndroid Build Coastguard Worker
648*cda5da8dSAndroid Build Coastguard Worker## ---------------------- ##
649*cda5da8dSAndroid Build Coastguard Worker## Defining C functions.  ##
650*cda5da8dSAndroid Build Coastguard Worker## ---------------------- ##
651*cda5da8dSAndroid Build Coastguard Worker
652*cda5da8dSAndroid Build Coastguard Worker
653*cda5da8dSAndroid Build Coastguard Worker# b4_formals([DECL1, NAME1], ...)
654*cda5da8dSAndroid Build Coastguard Worker# -------------------------------
655*cda5da8dSAndroid Build Coastguard Worker# The formal arguments of a C function definition.
656*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_formals],
657*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [void],
658*cda5da8dSAndroid Build Coastguard Worker       [$#$1], [1], [void],
659*cda5da8dSAndroid Build Coastguard Worker               [m4_map_sep([b4_formal], [, ], [$@])])])
660*cda5da8dSAndroid Build Coastguard Worker
661*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_formal],
662*cda5da8dSAndroid Build Coastguard Worker[$1])
663*cda5da8dSAndroid Build Coastguard Worker
664*cda5da8dSAndroid Build Coastguard Worker
665*cda5da8dSAndroid Build Coastguard Worker# b4_function_declare(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
666*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------------
667*cda5da8dSAndroid Build Coastguard Worker# Declare the function NAME.
668*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_function_declare],
669*cda5da8dSAndroid Build Coastguard Worker[$2 $1 (b4_formals(m4_shift2($@)));[]dnl
670*cda5da8dSAndroid Build Coastguard Worker])
671*cda5da8dSAndroid Build Coastguard Worker
672*cda5da8dSAndroid Build Coastguard Worker
673*cda5da8dSAndroid Build Coastguard Worker
674*cda5da8dSAndroid Build Coastguard Worker## --------------------- ##
675*cda5da8dSAndroid Build Coastguard Worker## Calling C functions.  ##
676*cda5da8dSAndroid Build Coastguard Worker## --------------------- ##
677*cda5da8dSAndroid Build Coastguard Worker
678*cda5da8dSAndroid Build Coastguard Worker
679*cda5da8dSAndroid Build Coastguard Worker# b4_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
680*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------------------------------
681*cda5da8dSAndroid Build Coastguard Worker# Call the function NAME with arguments NAME1, NAME2 etc.
682*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_function_call],
683*cda5da8dSAndroid Build Coastguard Worker[$1 (b4_args(m4_shift2($@)))[]dnl
684*cda5da8dSAndroid Build Coastguard Worker])
685*cda5da8dSAndroid Build Coastguard Worker
686*cda5da8dSAndroid Build Coastguard Worker
687*cda5da8dSAndroid Build Coastguard Worker# b4_args([DECL1, NAME1], ...)
688*cda5da8dSAndroid Build Coastguard Worker# ----------------------------
689*cda5da8dSAndroid Build Coastguard Worker# Output the arguments NAME1, NAME2...
690*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_args],
691*cda5da8dSAndroid Build Coastguard Worker[m4_map_sep([b4_arg], [, ], [$@])])
692*cda5da8dSAndroid Build Coastguard Worker
693*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_arg],
694*cda5da8dSAndroid Build Coastguard Worker[$2])
695*cda5da8dSAndroid Build Coastguard Worker
696*cda5da8dSAndroid Build Coastguard Worker
697*cda5da8dSAndroid Build Coastguard Worker## ----------- ##
698*cda5da8dSAndroid Build Coastguard Worker## Synclines.  ##
699*cda5da8dSAndroid Build Coastguard Worker## ----------- ##
700*cda5da8dSAndroid Build Coastguard Worker
701*cda5da8dSAndroid Build Coastguard Worker# b4_sync_start(LINE, FILE)
702*cda5da8dSAndroid Build Coastguard Worker# -------------------------
703*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_sync_start], [[#]line $1 $2])
704*cda5da8dSAndroid Build Coastguard Worker
705*cda5da8dSAndroid Build Coastguard Worker
706*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
707*cda5da8dSAndroid Build Coastguard Worker## User actions.  ##
708*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
709*cda5da8dSAndroid Build Coastguard Worker
710*cda5da8dSAndroid Build Coastguard Worker# b4_case(LABEL, STATEMENTS, [COMMENTS])
711*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------
712*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_case],
713*cda5da8dSAndroid Build Coastguard Worker[  case $1:m4_ifval([$3], [ b4_comment([$3])])
714*cda5da8dSAndroid Build Coastguard Worker$2
715*cda5da8dSAndroid Build Coastguard Workerb4_syncline([@oline@], [@ofile@])dnl
716*cda5da8dSAndroid Build Coastguard Worker    break;])
717*cda5da8dSAndroid Build Coastguard Worker
718*cda5da8dSAndroid Build Coastguard Worker
719*cda5da8dSAndroid Build Coastguard Worker# b4_predicate_case(LABEL, CONDITIONS)
720*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
721*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_predicate_case],
722*cda5da8dSAndroid Build Coastguard Worker[  case $1:
723*cda5da8dSAndroid Build Coastguard Worker    if (! (
724*cda5da8dSAndroid Build Coastguard Worker$2)) YYERROR;
725*cda5da8dSAndroid Build Coastguard Workerb4_syncline([@oline@], [@ofile@])dnl
726*cda5da8dSAndroid Build Coastguard Worker    break;])
727*cda5da8dSAndroid Build Coastguard Worker
728*cda5da8dSAndroid Build Coastguard Worker
729*cda5da8dSAndroid Build Coastguard Worker# b4_yydestruct_define
730*cda5da8dSAndroid Build Coastguard Worker# --------------------
731*cda5da8dSAndroid Build Coastguard Worker# Define the "yydestruct" function.
732*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_yydestruct_define],
733*cda5da8dSAndroid Build Coastguard Worker[[/*-----------------------------------------------.
734*cda5da8dSAndroid Build Coastguard Worker| Release the memory associated to this symbol.  |
735*cda5da8dSAndroid Build Coastguard Worker`-----------------------------------------------*/
736*cda5da8dSAndroid Build Coastguard Worker
737*cda5da8dSAndroid Build Coastguard Workerstatic void
738*cda5da8dSAndroid Build Coastguard Workeryydestruct (const char *yymsg,
739*cda5da8dSAndroid Build Coastguard Worker            yysymbol_kind_t yykind, YYSTYPE *yyvaluep]b4_locations_if(dnl
740*cda5da8dSAndroid Build Coastguard Worker[[, YYLTYPE *yylocationp]])[]b4_user_formals[)
741*cda5da8dSAndroid Build Coastguard Worker{
742*cda5da8dSAndroid Build Coastguard Worker]b4_parse_param_use([yyvaluep], [yylocationp])dnl
743*cda5da8dSAndroid Build Coastguard Worker[  if (!yymsg)
744*cda5da8dSAndroid Build Coastguard Worker    yymsg = "Deleting";
745*cda5da8dSAndroid Build Coastguard Worker  YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
746*cda5da8dSAndroid Build Coastguard Worker
747*cda5da8dSAndroid Build Coastguard Worker  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
748*cda5da8dSAndroid Build Coastguard Worker  ]b4_symbol_actions([destructor])[
749*cda5da8dSAndroid Build Coastguard Worker  YY_IGNORE_MAYBE_UNINITIALIZED_END
750*cda5da8dSAndroid Build Coastguard Worker}]dnl
751*cda5da8dSAndroid Build Coastguard Worker])
752*cda5da8dSAndroid Build Coastguard Worker
753*cda5da8dSAndroid Build Coastguard Worker
754*cda5da8dSAndroid Build Coastguard Worker# b4_yy_symbol_print_define
755*cda5da8dSAndroid Build Coastguard Worker# -------------------------
756*cda5da8dSAndroid Build Coastguard Worker# Define the "yy_symbol_print" function.
757*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_yy_symbol_print_define],
758*cda5da8dSAndroid Build Coastguard Worker[[
759*cda5da8dSAndroid Build Coastguard Worker/*-----------------------------------.
760*cda5da8dSAndroid Build Coastguard Worker| Print this symbol's value on YYO.  |
761*cda5da8dSAndroid Build Coastguard Worker`-----------------------------------*/
762*cda5da8dSAndroid Build Coastguard Worker
763*cda5da8dSAndroid Build Coastguard Workerstatic void
764*cda5da8dSAndroid Build Coastguard Workeryy_symbol_value_print (FILE *yyo,
765*cda5da8dSAndroid Build Coastguard Worker                       yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep]b4_locations_if(dnl
766*cda5da8dSAndroid Build Coastguard Worker[[, YYLTYPE const * const yylocationp]])[]b4_user_formals[)
767*cda5da8dSAndroid Build Coastguard Worker{
768*cda5da8dSAndroid Build Coastguard Worker  FILE *yyoutput = yyo;
769*cda5da8dSAndroid Build Coastguard Worker]b4_parse_param_use([yyoutput], [yylocationp])dnl
770*cda5da8dSAndroid Build Coastguard Worker[  if (!yyvaluep)
771*cda5da8dSAndroid Build Coastguard Worker    return;]
772*cda5da8dSAndroid Build Coastguard Workerb4_percent_code_get([[pre-printer]])dnl
773*cda5da8dSAndroid Build Coastguard Worker  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
774*cda5da8dSAndroid Build Coastguard Worker  b4_symbol_actions([printer])
775*cda5da8dSAndroid Build Coastguard Worker  YY_IGNORE_MAYBE_UNINITIALIZED_END
776*cda5da8dSAndroid Build Coastguard Workerb4_percent_code_get([[post-printer]])dnl
777*cda5da8dSAndroid Build Coastguard Worker[}
778*cda5da8dSAndroid Build Coastguard Worker
779*cda5da8dSAndroid Build Coastguard Worker
780*cda5da8dSAndroid Build Coastguard Worker/*---------------------------.
781*cda5da8dSAndroid Build Coastguard Worker| Print this symbol on YYO.  |
782*cda5da8dSAndroid Build Coastguard Worker`---------------------------*/
783*cda5da8dSAndroid Build Coastguard Worker
784*cda5da8dSAndroid Build Coastguard Workerstatic void
785*cda5da8dSAndroid Build Coastguard Workeryy_symbol_print (FILE *yyo,
786*cda5da8dSAndroid Build Coastguard Worker                 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep]b4_locations_if(dnl
787*cda5da8dSAndroid Build Coastguard Worker[[, YYLTYPE const * const yylocationp]])[]b4_user_formals[)
788*cda5da8dSAndroid Build Coastguard Worker{
789*cda5da8dSAndroid Build Coastguard Worker  YYFPRINTF (yyo, "%s %s (",
790*cda5da8dSAndroid Build Coastguard Worker             yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
791*cda5da8dSAndroid Build Coastguard Worker
792*cda5da8dSAndroid Build Coastguard Worker]b4_locations_if([  YYLOCATION_PRINT (yyo, yylocationp);
793*cda5da8dSAndroid Build Coastguard Worker  YYFPRINTF (yyo, ": ");
794*cda5da8dSAndroid Build Coastguard Worker])dnl
795*cda5da8dSAndroid Build Coastguard Worker[  yy_symbol_value_print (yyo, yykind, yyvaluep]dnl
796*cda5da8dSAndroid Build Coastguard Workerb4_locations_if([, yylocationp])[]b4_user_args[);
797*cda5da8dSAndroid Build Coastguard Worker  YYFPRINTF (yyo, ")");
798*cda5da8dSAndroid Build Coastguard Worker}]dnl
799*cda5da8dSAndroid Build Coastguard Worker])
800*cda5da8dSAndroid Build Coastguard Worker
801*cda5da8dSAndroid Build Coastguard Worker
802*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
803*cda5da8dSAndroid Build Coastguard Worker## api.value.type.  ##
804*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
805*cda5da8dSAndroid Build Coastguard Worker
806*cda5da8dSAndroid Build Coastguard Worker
807*cda5da8dSAndroid Build Coastguard Worker# ---------------------- #
808*cda5da8dSAndroid Build Coastguard Worker# api.value.type=union.  #
809*cda5da8dSAndroid Build Coastguard Worker# ---------------------- #
810*cda5da8dSAndroid Build Coastguard Worker
811*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_type_register(SYMBOL-NUM)
812*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------
813*cda5da8dSAndroid Build Coastguard Worker# Symbol SYMBOL-NUM has a type (for variant) instead of a type-tag.
814*cda5da8dSAndroid Build Coastguard Worker# Extend the definition of %union's body (b4_union_members) with a
815*cda5da8dSAndroid Build Coastguard Worker# field of that type, and extend the symbol's "type" field to point to
816*cda5da8dSAndroid Build Coastguard Worker# the field name, instead of the type name.
817*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_type_register],
818*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_symbol($1, type_tag)],
819*cda5da8dSAndroid Build Coastguard Worker           [b4_symbol_if([$1], [has_id],
820*cda5da8dSAndroid Build Coastguard Worker                         [b4_symbol([$1], [id])],
821*cda5da8dSAndroid Build Coastguard Worker                         [yykind_[]b4_symbol([$1], [number])])])dnl
822*cda5da8dSAndroid Build Coastguard Workerm4_append([b4_union_members],
823*cda5da8dSAndroid Build Coastguard Workerm4_expand([m4_format([  %-40s %s],
824*cda5da8dSAndroid Build Coastguard Worker                     m4_expand([b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]),
825*cda5da8dSAndroid Build Coastguard Worker                     [b4_symbol_tag_comment([$1])])]))
826*cda5da8dSAndroid Build Coastguard Worker])
827*cda5da8dSAndroid Build Coastguard Worker
828*cda5da8dSAndroid Build Coastguard Worker
829*cda5da8dSAndroid Build Coastguard Worker# b4_type_define_tag(SYMBOL1-NUM, ...)
830*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
831*cda5da8dSAndroid Build Coastguard Worker# For the batch of symbols SYMBOL1-NUM... (which all have the same
832*cda5da8dSAndroid Build Coastguard Worker# type), enhance the %union definition for each of them, and set
833*cda5da8dSAndroid Build Coastguard Worker# there "type" field to the field tag name, instead of the type name.
834*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_type_define_tag],
835*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_if([$1], [has_type],
836*cda5da8dSAndroid Build Coastguard Worker              [m4_map([b4_symbol_type_register], [$@])])
837*cda5da8dSAndroid Build Coastguard Worker])
838*cda5da8dSAndroid Build Coastguard Worker
839*cda5da8dSAndroid Build Coastguard Worker
840*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_value_union(VAL, SYMBOL-NUM, [TYPE])
841*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------
842*cda5da8dSAndroid Build Coastguard Worker# Same of b4_symbol_value, but when api.value.type=union.
843*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_value_union],
844*cda5da8dSAndroid Build Coastguard Worker[m4_ifval([$3],
845*cda5da8dSAndroid Build Coastguard Worker          [(*($3*)(&$1))],
846*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval([$2],
847*cda5da8dSAndroid Build Coastguard Worker                    [b4_symbol_if([$2], [has_type],
848*cda5da8dSAndroid Build Coastguard Worker                                  [($1.b4_symbol([$2], [type_tag]))],
849*cda5da8dSAndroid Build Coastguard Worker                                  [$1])],
850*cda5da8dSAndroid Build Coastguard Worker                    [$1])])])
851*cda5da8dSAndroid Build Coastguard Worker
852*cda5da8dSAndroid Build Coastguard Worker
853*cda5da8dSAndroid Build Coastguard Worker# b4_value_type_setup_union
854*cda5da8dSAndroid Build Coastguard Worker# -------------------------
855*cda5da8dSAndroid Build Coastguard Worker# Setup support for api.value.type=union.  Symbols are defined with a
856*cda5da8dSAndroid Build Coastguard Worker# type instead of a union member name: build the corresponding union,
857*cda5da8dSAndroid Build Coastguard Worker# and give the symbols their tag.
858*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_value_type_setup_union],
859*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_union_members])
860*cda5da8dSAndroid Build Coastguard Workerb4_type_foreach([b4_type_define_tag])
861*cda5da8dSAndroid Build Coastguard Workerm4_copy_force([b4_symbol_value_union], [b4_symbol_value])
862*cda5da8dSAndroid Build Coastguard Worker])
863*cda5da8dSAndroid Build Coastguard Worker
864*cda5da8dSAndroid Build Coastguard Worker
865*cda5da8dSAndroid Build Coastguard Worker# -------------------------- #
866*cda5da8dSAndroid Build Coastguard Worker# api.value.type = variant.  #
867*cda5da8dSAndroid Build Coastguard Worker# -------------------------- #
868*cda5da8dSAndroid Build Coastguard Worker
869*cda5da8dSAndroid Build Coastguard Worker# b4_value_type_setup_variant
870*cda5da8dSAndroid Build Coastguard Worker# ---------------------------
871*cda5da8dSAndroid Build Coastguard Worker# Setup support for api.value.type=variant.  By default, fail, specialized
872*cda5da8dSAndroid Build Coastguard Worker# by other skeletons.
873*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_value_type_setup_variant],
874*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([[api.value.type]]),
875*cda5da8dSAndroid Build Coastguard Worker                [['%s' does not support '%s']],
876*cda5da8dSAndroid Build Coastguard Worker                [b4_skeleton],
877*cda5da8dSAndroid Build Coastguard Worker                [%define api.value.type variant])])
878*cda5da8dSAndroid Build Coastguard Worker
879*cda5da8dSAndroid Build Coastguard Worker
880*cda5da8dSAndroid Build Coastguard Worker# _b4_value_type_setup_keyword
881*cda5da8dSAndroid Build Coastguard Worker# ----------------------------
882*cda5da8dSAndroid Build Coastguard Worker# api.value.type is defined with a keyword/string syntax.  Check if
883*cda5da8dSAndroid Build Coastguard Worker# that is properly defined, and prepare its use.
884*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_value_type_setup_keyword],
885*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_check_values([[[[api.value.type]],
886*cda5da8dSAndroid Build Coastguard Worker                                  [[none]],
887*cda5da8dSAndroid Build Coastguard Worker                                  [[union]],
888*cda5da8dSAndroid Build Coastguard Worker                                  [[union-directive]],
889*cda5da8dSAndroid Build Coastguard Worker                                  [[variant]],
890*cda5da8dSAndroid Build Coastguard Worker                                  [[yystype]]]])dnl
891*cda5da8dSAndroid Build Coastguard Workerm4_case(b4_percent_define_get([[api.value.type]]),
892*cda5da8dSAndroid Build Coastguard Worker        [union],   [b4_value_type_setup_union],
893*cda5da8dSAndroid Build Coastguard Worker        [variant], [b4_value_type_setup_variant])])
894*cda5da8dSAndroid Build Coastguard Worker
895*cda5da8dSAndroid Build Coastguard Worker
896*cda5da8dSAndroid Build Coastguard Worker# b4_value_type_setup
897*cda5da8dSAndroid Build Coastguard Worker# -------------------
898*cda5da8dSAndroid Build Coastguard Worker# Check if api.value.type is properly defined, and possibly prepare
899*cda5da8dSAndroid Build Coastguard Worker# its use.
900*cda5da8dSAndroid Build Coastguard Workerb4_define_silent([b4_value_type_setup],
901*cda5da8dSAndroid Build Coastguard Worker[# Define default value.
902*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_ifdef([[api.value.type]], [],
903*cda5da8dSAndroid Build Coastguard Worker[# %union => api.value.type=union-directive
904*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([b4_union_members],
905*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_percent_define_kind(api.value.type)], [keyword])
906*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define(api.value.type)], [union-directive])],
907*cda5da8dSAndroid Build Coastguard Worker[# no tag seen => api.value.type={int}
908*cda5da8dSAndroid Build Coastguard Workerm4_if(b4_tag_seen_flag, 0,
909*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_percent_define_kind(api.value.type)], [code])
910*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define(api.value.type)], [int])],
911*cda5da8dSAndroid Build Coastguard Worker[# otherwise api.value.type=yystype
912*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_kind(api.value.type)], [keyword])
913*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define(api.value.type)], [yystype])])])])
914*cda5da8dSAndroid Build Coastguard Worker
915*cda5da8dSAndroid Build Coastguard Worker# Set up.
916*cda5da8dSAndroid Build Coastguard Workerm4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
917*cda5da8dSAndroid Build Coastguard Worker   [keyword\|string], [_b4_value_type_setup_keyword])
918*cda5da8dSAndroid Build Coastguard Worker])
919*cda5da8dSAndroid Build Coastguard Worker
920*cda5da8dSAndroid Build Coastguard Worker
921*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
922*cda5da8dSAndroid Build Coastguard Worker## Declarations.  ##
923*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
924*cda5da8dSAndroid Build Coastguard Worker
925*cda5da8dSAndroid Build Coastguard Worker
926*cda5da8dSAndroid Build Coastguard Worker# b4_value_type_define
927*cda5da8dSAndroid Build Coastguard Worker# --------------------
928*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_value_type_define],
929*cda5da8dSAndroid Build Coastguard Worker[b4_value_type_setup[]dnl
930*cda5da8dSAndroid Build Coastguard Worker/* Value type.  */
931*cda5da8dSAndroid Build Coastguard Workerm4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
932*cda5da8dSAndroid Build Coastguard Worker[code],
933*cda5da8dSAndroid Build Coastguard Worker[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
934*cda5da8dSAndroid Build Coastguard Workertypedef ]b4_percent_define_get([[api.value.type]])[ ]b4_api_PREFIX[STYPE;
935*cda5da8dSAndroid Build Coastguard Worker# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
936*cda5da8dSAndroid Build Coastguard Worker# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
937*cda5da8dSAndroid Build Coastguard Worker#endif
938*cda5da8dSAndroid Build Coastguard Worker]],
939*cda5da8dSAndroid Build Coastguard Worker[m4_bmatch(b4_percent_define_get([[api.value.type]]),
940*cda5da8dSAndroid Build Coastguard Worker[union\|union-directive],
941*cda5da8dSAndroid Build Coastguard Worker[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
942*cda5da8dSAndroid Build Coastguard Worker]b4_percent_define_get_syncline([[api.value.union.name]])dnl
943*cda5da8dSAndroid Build Coastguard Worker[union ]b4_percent_define_get([[api.value.union.name]])[
944*cda5da8dSAndroid Build Coastguard Worker{
945*cda5da8dSAndroid Build Coastguard Worker]b4_user_union_members[
946*cda5da8dSAndroid Build Coastguard Worker};
947*cda5da8dSAndroid Build Coastguard Worker]b4_percent_define_get_syncline([[api.value.union.name]])dnl
948*cda5da8dSAndroid Build Coastguard Worker[typedef union ]b4_percent_define_get([[api.value.union.name]])[ ]b4_api_PREFIX[STYPE;
949*cda5da8dSAndroid Build Coastguard Worker# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
950*cda5da8dSAndroid Build Coastguard Worker# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
951*cda5da8dSAndroid Build Coastguard Worker#endif
952*cda5da8dSAndroid Build Coastguard Worker]])])])
953*cda5da8dSAndroid Build Coastguard Worker
954*cda5da8dSAndroid Build Coastguard Worker
955*cda5da8dSAndroid Build Coastguard Worker# b4_location_type_define
956*cda5da8dSAndroid Build Coastguard Worker# -----------------------
957*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_location_type_define],
958*cda5da8dSAndroid Build Coastguard Worker[[/* Location type.  */
959*cda5da8dSAndroid Build Coastguard Worker]b4_percent_define_ifdef([[api.location.type]],
960*cda5da8dSAndroid Build Coastguard Worker[[typedef ]b4_percent_define_get([[api.location.type]])[ ]b4_api_PREFIX[LTYPE;
961*cda5da8dSAndroid Build Coastguard Worker]],
962*cda5da8dSAndroid Build Coastguard Worker[[#if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED
963*cda5da8dSAndroid Build Coastguard Workertypedef struct ]b4_api_PREFIX[LTYPE ]b4_api_PREFIX[LTYPE;
964*cda5da8dSAndroid Build Coastguard Workerstruct ]b4_api_PREFIX[LTYPE
965*cda5da8dSAndroid Build Coastguard Worker{
966*cda5da8dSAndroid Build Coastguard Worker  int first_line;
967*cda5da8dSAndroid Build Coastguard Worker  int first_column;
968*cda5da8dSAndroid Build Coastguard Worker  int last_line;
969*cda5da8dSAndroid Build Coastguard Worker  int last_column;
970*cda5da8dSAndroid Build Coastguard Worker};
971*cda5da8dSAndroid Build Coastguard Worker# define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
972*cda5da8dSAndroid Build Coastguard Worker# define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
973*cda5da8dSAndroid Build Coastguard Worker#endif
974*cda5da8dSAndroid Build Coastguard Worker]])])
975*cda5da8dSAndroid Build Coastguard Worker
976*cda5da8dSAndroid Build Coastguard Worker
977*cda5da8dSAndroid Build Coastguard Worker# b4_declare_yylstype
978*cda5da8dSAndroid Build Coastguard Worker# -------------------
979*cda5da8dSAndroid Build Coastguard Worker# Declarations that might either go into the header (if --header) or
980*cda5da8dSAndroid Build Coastguard Worker# in the parser body.  Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
981*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_declare_yylstype],
982*cda5da8dSAndroid Build Coastguard Worker[b4_value_type_define[]b4_locations_if([
983*cda5da8dSAndroid Build Coastguard Workerb4_location_type_define])
984*cda5da8dSAndroid Build Coastguard Worker
985*cda5da8dSAndroid Build Coastguard Workerb4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval;
986*cda5da8dSAndroid Build Coastguard Worker]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl
987*cda5da8dSAndroid Build Coastguard Worker])
988*cda5da8dSAndroid Build Coastguard Worker
989*cda5da8dSAndroid Build Coastguard Worker
990*cda5da8dSAndroid Build Coastguard Worker# b4_YYDEBUG_define
991*cda5da8dSAndroid Build Coastguard Worker# -----------------
992*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_YYDEBUG_define],
993*cda5da8dSAndroid Build Coastguard Worker[[/* Debug traces.  */
994*cda5da8dSAndroid Build Coastguard Worker]m4_if(b4_api_prefix, [yy],
995*cda5da8dSAndroid Build Coastguard Worker[[#ifndef YYDEBUG
996*cda5da8dSAndroid Build Coastguard Worker# define YYDEBUG ]b4_parse_trace_if([1], [0])[
997*cda5da8dSAndroid Build Coastguard Worker#endif]],
998*cda5da8dSAndroid Build Coastguard Worker[[#ifndef ]b4_api_PREFIX[DEBUG
999*cda5da8dSAndroid Build Coastguard Worker# if defined YYDEBUG
1000*cda5da8dSAndroid Build Coastguard Worker#if YYDEBUG
1001*cda5da8dSAndroid Build Coastguard Worker#   define ]b4_api_PREFIX[DEBUG 1
1002*cda5da8dSAndroid Build Coastguard Worker#  else
1003*cda5da8dSAndroid Build Coastguard Worker#   define ]b4_api_PREFIX[DEBUG 0
1004*cda5da8dSAndroid Build Coastguard Worker#  endif
1005*cda5da8dSAndroid Build Coastguard Worker# else /* ! defined YYDEBUG */
1006*cda5da8dSAndroid Build Coastguard Worker#  define ]b4_api_PREFIX[DEBUG ]b4_parse_trace_if([1], [0])[
1007*cda5da8dSAndroid Build Coastguard Worker# endif /* ! defined YYDEBUG */
1008*cda5da8dSAndroid Build Coastguard Worker#endif  /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
1009*cda5da8dSAndroid Build Coastguard Worker])
1010*cda5da8dSAndroid Build Coastguard Worker
1011*cda5da8dSAndroid Build Coastguard Worker# b4_declare_yydebug
1012*cda5da8dSAndroid Build Coastguard Worker# ------------------
1013*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_declare_yydebug],
1014*cda5da8dSAndroid Build Coastguard Worker[b4_YYDEBUG_define[
1015*cda5da8dSAndroid Build Coastguard Worker#if ]b4_api_PREFIX[DEBUG
1016*cda5da8dSAndroid Build Coastguard Workerextern int ]b4_prefix[debug;
1017*cda5da8dSAndroid Build Coastguard Worker#endif][]dnl
1018*cda5da8dSAndroid Build Coastguard Worker])
1019*cda5da8dSAndroid Build Coastguard Worker
1020*cda5da8dSAndroid Build Coastguard Worker# b4_yylloc_default_define
1021*cda5da8dSAndroid Build Coastguard Worker# ------------------------
1022*cda5da8dSAndroid Build Coastguard Worker# Define YYLLOC_DEFAULT.
1023*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yylloc_default_define],
1024*cda5da8dSAndroid Build Coastguard Worker[[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
1025*cda5da8dSAndroid Build Coastguard Worker   If N is 0, then set CURRENT to the empty location which ends
1026*cda5da8dSAndroid Build Coastguard Worker   the previous symbol: RHS[0] (always defined).  */
1027*cda5da8dSAndroid Build Coastguard Worker
1028*cda5da8dSAndroid Build Coastguard Worker#ifndef YYLLOC_DEFAULT
1029*cda5da8dSAndroid Build Coastguard Worker# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
1030*cda5da8dSAndroid Build Coastguard Worker    do                                                                  \
1031*cda5da8dSAndroid Build Coastguard Worker      if (N)                                                            \
1032*cda5da8dSAndroid Build Coastguard Worker        {                                                               \
1033*cda5da8dSAndroid Build Coastguard Worker          (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
1034*cda5da8dSAndroid Build Coastguard Worker          (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
1035*cda5da8dSAndroid Build Coastguard Worker          (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
1036*cda5da8dSAndroid Build Coastguard Worker          (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
1037*cda5da8dSAndroid Build Coastguard Worker        }                                                               \
1038*cda5da8dSAndroid Build Coastguard Worker      else                                                              \
1039*cda5da8dSAndroid Build Coastguard Worker        {                                                               \
1040*cda5da8dSAndroid Build Coastguard Worker          (Current).first_line   = (Current).last_line   =              \
1041*cda5da8dSAndroid Build Coastguard Worker            YYRHSLOC (Rhs, 0).last_line;                                \
1042*cda5da8dSAndroid Build Coastguard Worker          (Current).first_column = (Current).last_column =              \
1043*cda5da8dSAndroid Build Coastguard Worker            YYRHSLOC (Rhs, 0).last_column;                              \
1044*cda5da8dSAndroid Build Coastguard Worker        }                                                               \
1045*cda5da8dSAndroid Build Coastguard Worker    while (0)
1046*cda5da8dSAndroid Build Coastguard Worker#endif
1047*cda5da8dSAndroid Build Coastguard Worker]])
1048*cda5da8dSAndroid Build Coastguard Worker
1049*cda5da8dSAndroid Build Coastguard Worker# b4_yylocation_print_define
1050*cda5da8dSAndroid Build Coastguard Worker# --------------------------
1051*cda5da8dSAndroid Build Coastguard Worker# Define YYLOCATION_PRINT.
1052*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yylocation_print_define],
1053*cda5da8dSAndroid Build Coastguard Worker[b4_locations_if([[
1054*cda5da8dSAndroid Build Coastguard Worker/* YYLOCATION_PRINT -- Print the location on the stream.
1055*cda5da8dSAndroid Build Coastguard Worker   This macro was not mandated originally: define only if we know
1056*cda5da8dSAndroid Build Coastguard Worker   we won't break user code: when these are the locations we know.  */
1057*cda5da8dSAndroid Build Coastguard Worker
1058*cda5da8dSAndroid Build Coastguard Worker# ifndef YYLOCATION_PRINT
1059*cda5da8dSAndroid Build Coastguard Worker
1060*cda5da8dSAndroid Build Coastguard Worker#  if defined YY_LOCATION_PRINT
1061*cda5da8dSAndroid Build Coastguard Worker
1062*cda5da8dSAndroid Build Coastguard Worker   /* Temporary convenience wrapper in case some people defined the
1063*cda5da8dSAndroid Build Coastguard Worker      undocumented and private YY_LOCATION_PRINT macros.  */
1064*cda5da8dSAndroid Build Coastguard Worker#   define YYLOCATION_PRINT(File, Loc)  YY_LOCATION_PRINT(File, *(Loc))
1065*cda5da8dSAndroid Build Coastguard Worker
1066*cda5da8dSAndroid Build Coastguard Worker#  elif defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
1067*cda5da8dSAndroid Build Coastguard Worker
1068*cda5da8dSAndroid Build Coastguard Worker/* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
1069*cda5da8dSAndroid Build Coastguard Worker
1070*cda5da8dSAndroid Build Coastguard WorkerYY_ATTRIBUTE_UNUSED
1071*cda5da8dSAndroid Build Coastguard Workerstatic int
1072*cda5da8dSAndroid Build Coastguard Workeryy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp)
1073*cda5da8dSAndroid Build Coastguard Worker{
1074*cda5da8dSAndroid Build Coastguard Worker  int res = 0;
1075*cda5da8dSAndroid Build Coastguard Worker  int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
1076*cda5da8dSAndroid Build Coastguard Worker  if (0 <= yylocp->first_line)
1077*cda5da8dSAndroid Build Coastguard Worker    {
1078*cda5da8dSAndroid Build Coastguard Worker      res += YYFPRINTF (yyo, "%d", yylocp->first_line);
1079*cda5da8dSAndroid Build Coastguard Worker      if (0 <= yylocp->first_column)
1080*cda5da8dSAndroid Build Coastguard Worker        res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
1081*cda5da8dSAndroid Build Coastguard Worker    }
1082*cda5da8dSAndroid Build Coastguard Worker  if (0 <= yylocp->last_line)
1083*cda5da8dSAndroid Build Coastguard Worker    {
1084*cda5da8dSAndroid Build Coastguard Worker      if (yylocp->first_line < yylocp->last_line)
1085*cda5da8dSAndroid Build Coastguard Worker        {
1086*cda5da8dSAndroid Build Coastguard Worker          res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
1087*cda5da8dSAndroid Build Coastguard Worker          if (0 <= end_col)
1088*cda5da8dSAndroid Build Coastguard Worker            res += YYFPRINTF (yyo, ".%d", end_col);
1089*cda5da8dSAndroid Build Coastguard Worker        }
1090*cda5da8dSAndroid Build Coastguard Worker      else if (0 <= end_col && yylocp->first_column < end_col)
1091*cda5da8dSAndroid Build Coastguard Worker        res += YYFPRINTF (yyo, "-%d", end_col);
1092*cda5da8dSAndroid Build Coastguard Worker    }
1093*cda5da8dSAndroid Build Coastguard Worker  return res;
1094*cda5da8dSAndroid Build Coastguard Worker}
1095*cda5da8dSAndroid Build Coastguard Worker
1096*cda5da8dSAndroid Build Coastguard Worker#   define YYLOCATION_PRINT  yy_location_print_
1097*cda5da8dSAndroid Build Coastguard Worker
1098*cda5da8dSAndroid Build Coastguard Worker    /* Temporary convenience wrapper in case some people defined the
1099*cda5da8dSAndroid Build Coastguard Worker       undocumented and private YY_LOCATION_PRINT macros.  */
1100*cda5da8dSAndroid Build Coastguard Worker#   define YY_LOCATION_PRINT(File, Loc)  YYLOCATION_PRINT(File, &(Loc))
1101*cda5da8dSAndroid Build Coastguard Worker
1102*cda5da8dSAndroid Build Coastguard Worker#  else
1103*cda5da8dSAndroid Build Coastguard Worker
1104*cda5da8dSAndroid Build Coastguard Worker#   define YYLOCATION_PRINT(File, Loc) ((void) 0)
1105*cda5da8dSAndroid Build Coastguard Worker    /* Temporary convenience wrapper in case some people defined the
1106*cda5da8dSAndroid Build Coastguard Worker       undocumented and private YY_LOCATION_PRINT macros.  */
1107*cda5da8dSAndroid Build Coastguard Worker#   define YY_LOCATION_PRINT  YYLOCATION_PRINT
1108*cda5da8dSAndroid Build Coastguard Worker
1109*cda5da8dSAndroid Build Coastguard Worker#  endif
1110*cda5da8dSAndroid Build Coastguard Worker# endif /* !defined YYLOCATION_PRINT */]])
1111*cda5da8dSAndroid Build Coastguard Worker])
1112*cda5da8dSAndroid Build Coastguard Worker
1113*cda5da8dSAndroid Build Coastguard Worker# b4_yyloc_default
1114*cda5da8dSAndroid Build Coastguard Worker# ----------------
1115*cda5da8dSAndroid Build Coastguard Worker# Expand to a possible default value for yylloc.
1116*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yyloc_default],
1117*cda5da8dSAndroid Build Coastguard Worker[[
1118*cda5da8dSAndroid Build Coastguard Worker# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
1119*cda5da8dSAndroid Build Coastguard Worker  = { ]m4_join([, ],
1120*cda5da8dSAndroid Build Coastguard Worker               m4_defn([b4_location_initial_line]),
1121*cda5da8dSAndroid Build Coastguard Worker               m4_defn([b4_location_initial_column]),
1122*cda5da8dSAndroid Build Coastguard Worker               m4_defn([b4_location_initial_line]),
1123*cda5da8dSAndroid Build Coastguard Worker               m4_defn([b4_location_initial_column]))[ }
1124*cda5da8dSAndroid Build Coastguard Worker# endif
1125*cda5da8dSAndroid Build Coastguard Worker]])
1126