xref: /aosp_15_r20/prebuilts/build-tools/common/bison/skeletons/bison.m4 (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker                                                            -*- Autoconf -*-
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Worker# Language-independent 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 Worker
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker# m4_gsub(STRING, RE1, SUBST1, RE2, SUBST2, ...)
24*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------
25*cda5da8dSAndroid Build Coastguard Worker# m4 equivalent of
26*cda5da8dSAndroid Build Coastguard Worker#
27*cda5da8dSAndroid Build Coastguard Worker#   $_ = STRING;
28*cda5da8dSAndroid Build Coastguard Worker#   s/RE1/SUBST1/g;
29*cda5da8dSAndroid Build Coastguard Worker#   s/RE2/SUBST2/g;
30*cda5da8dSAndroid Build Coastguard Worker#   ...
31*cda5da8dSAndroid Build Coastguard Worker#
32*cda5da8dSAndroid Build Coastguard Worker# Really similar to m4_bpatsubsts, but behaves properly with quotes.
33*cda5da8dSAndroid Build Coastguard Worker# See m4.at's "Generating Comments".  Super inelegant, but so far, I
34*cda5da8dSAndroid Build Coastguard Worker# did not find any better solution.
35*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_gsub],
36*cda5da8dSAndroid Build Coastguard Worker[m4_bpatsubst(m4_bpatsubst(m4_bpatsubst([[[[$1]]]],
37*cda5da8dSAndroid Build Coastguard Worker                                        [$2], [$3]),
38*cda5da8dSAndroid Build Coastguard Worker                           [$4], [$5]),
39*cda5da8dSAndroid Build Coastguard Worker              [$6], [$7])])
40*cda5da8dSAndroid Build Coastguard Worker
41*cda5da8dSAndroid Build Coastguard Worker# m4_shift2 and m4_shift3 are provided by m4sugar.
42*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_shift4], [m4_shift(m4_shift(m4_shift(m4_shift($@))))])
43*cda5da8dSAndroid Build Coastguard Worker
44*cda5da8dSAndroid Build Coastguard Worker
45*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
46*cda5da8dSAndroid Build Coastguard Worker## Identification.  ##
47*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
48*cda5da8dSAndroid Build Coastguard Worker
49*cda5da8dSAndroid Build Coastguard Worker# b4_generated_by
50*cda5da8dSAndroid Build Coastguard Worker# ---------------
51*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_generated_by],
52*cda5da8dSAndroid Build Coastguard Worker[b4_comment([A Bison parser, made by GNU Bison b4_version_string.])
53*cda5da8dSAndroid Build Coastguard Worker])
54*cda5da8dSAndroid Build Coastguard Worker
55*cda5da8dSAndroid Build Coastguard Worker# b4_copyright(TITLE, [YEARS])
56*cda5da8dSAndroid Build Coastguard Worker# ----------------------------
57*cda5da8dSAndroid Build Coastguard Worker# If YEARS are not defined, use b4_copyright_years.
58*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_copyright],
59*cda5da8dSAndroid Build Coastguard Worker[b4_generated_by
60*cda5da8dSAndroid Build Coastguard Workerb4_comment([$1
61*cda5da8dSAndroid Build Coastguard Worker
62*cda5da8dSAndroid Build Coastguard Worker]m4_dquote(m4_text_wrap([Copyright (C)
63*cda5da8dSAndroid Build Coastguard Worker]m4_ifval([$2], [[$2]], [m4_defn([b4_copyright_years])])[
64*cda5da8dSAndroid Build Coastguard WorkerFree Software Foundation, Inc.]))[
65*cda5da8dSAndroid Build Coastguard Worker
66*cda5da8dSAndroid Build Coastguard WorkerThis program is free software: you can redistribute it and/or modify
67*cda5da8dSAndroid Build Coastguard Workerit under the terms of the GNU General Public License as published by
68*cda5da8dSAndroid Build Coastguard Workerthe Free Software Foundation, either version 3 of the License, or
69*cda5da8dSAndroid Build Coastguard Worker(at your option) any later version.
70*cda5da8dSAndroid Build Coastguard Worker
71*cda5da8dSAndroid Build Coastguard WorkerThis program is distributed in the hope that it will be useful,
72*cda5da8dSAndroid Build Coastguard Workerbut WITHOUT ANY WARRANTY; without even the implied warranty of
73*cda5da8dSAndroid Build Coastguard WorkerMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
74*cda5da8dSAndroid Build Coastguard WorkerGNU General Public License for more details.
75*cda5da8dSAndroid Build Coastguard Worker
76*cda5da8dSAndroid Build Coastguard WorkerYou should have received a copy of the GNU General Public License
77*cda5da8dSAndroid Build Coastguard Workeralong with this program.  If not, see <https://www.gnu.org/licenses/>.])
78*cda5da8dSAndroid Build Coastguard Worker
79*cda5da8dSAndroid Build Coastguard Workerb4_comment([As a special exception, you may create a larger work that contains
80*cda5da8dSAndroid Build Coastguard Workerpart or all of the Bison parser skeleton and distribute that work
81*cda5da8dSAndroid Build Coastguard Workerunder terms of your choice, so long as that work isn't itself a
82*cda5da8dSAndroid Build Coastguard Workerparser generator using the skeleton or a modified version thereof
83*cda5da8dSAndroid Build Coastguard Workeras a parser skeleton.  Alternatively, if you modify or redistribute
84*cda5da8dSAndroid Build Coastguard Workerthe parser skeleton itself, you may (at your option) remove this
85*cda5da8dSAndroid Build Coastguard Workerspecial exception, which will cause the skeleton and the resulting
86*cda5da8dSAndroid Build Coastguard WorkerBison output files to be licensed under the GNU General Public
87*cda5da8dSAndroid Build Coastguard WorkerLicense without this special exception.
88*cda5da8dSAndroid Build Coastguard Worker
89*cda5da8dSAndroid Build Coastguard WorkerThis special exception was added by the Free Software Foundation in
90*cda5da8dSAndroid Build Coastguard Workerversion 2.2 of Bison.])
91*cda5da8dSAndroid Build Coastguard Worker])
92*cda5da8dSAndroid Build Coastguard Worker
93*cda5da8dSAndroid Build Coastguard Worker
94*cda5da8dSAndroid Build Coastguard Worker# b4_disclaimer
95*cda5da8dSAndroid Build Coastguard Worker# -------------
96*cda5da8dSAndroid Build Coastguard Worker# Issue a warning about private implementation details.
97*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_disclaimer],
98*cda5da8dSAndroid Build Coastguard Worker[b4_comment([DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
99*cda5da8dSAndroid Build Coastguard Workerespecially those whose name start with YY_ or yy_.  They are
100*cda5da8dSAndroid Build Coastguard Workerprivate implementation details that can be changed or removed.])
101*cda5da8dSAndroid Build Coastguard Worker])
102*cda5da8dSAndroid Build Coastguard Worker
103*cda5da8dSAndroid Build Coastguard Worker
104*cda5da8dSAndroid Build Coastguard Worker
105*cda5da8dSAndroid Build Coastguard Worker# b4_required_version_if(VERSION, IF_NEWER, IF_OLDER)
106*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------------
107*cda5da8dSAndroid Build Coastguard Worker# If the version %require'd by the user is VERSION (or newer) expand
108*cda5da8dSAndroid Build Coastguard Worker# IF_NEWER, otherwise IF_OLDER.  VERSION should be an integer, e.g.,
109*cda5da8dSAndroid Build Coastguard Worker# 302 for 3.2.
110*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_required_version_if],
111*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_eval($1 <= b4_required_version),
112*cda5da8dSAndroid Build Coastguard Worker              [1], [$2], [$3])])
113*cda5da8dSAndroid Build Coastguard Worker
114*cda5da8dSAndroid Build Coastguard Worker
115*cda5da8dSAndroid Build Coastguard Worker## -------- ##
116*cda5da8dSAndroid Build Coastguard Worker## Output.  ##
117*cda5da8dSAndroid Build Coastguard Worker## -------- ##
118*cda5da8dSAndroid Build Coastguard Worker
119*cda5da8dSAndroid Build Coastguard Worker# b4_output_begin(FILE1, FILE2)
120*cda5da8dSAndroid Build Coastguard Worker# -----------------------------
121*cda5da8dSAndroid Build Coastguard Worker# Enable output, i.e., send to diversion 0, expand after "#", and
122*cda5da8dSAndroid Build Coastguard Worker# generate the tag to output into FILE.  Must be followed by EOL.
123*cda5da8dSAndroid Build Coastguard Worker# FILE is FILE1 concatenated to FILE2.  FILE2 can be empty, or be
124*cda5da8dSAndroid Build Coastguard Worker# absolute: do the right thing.
125*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_output_begin],
126*cda5da8dSAndroid Build Coastguard Worker[m4_changecom()
127*cda5da8dSAndroid Build Coastguard Workerm4_divert_push(0)dnl
128*cda5da8dSAndroid Build Coastguard Worker@output(m4_unquote([$1])@,m4_unquote([$2])@)@dnl
129*cda5da8dSAndroid Build Coastguard Worker])
130*cda5da8dSAndroid Build Coastguard Worker
131*cda5da8dSAndroid Build Coastguard Worker
132*cda5da8dSAndroid Build Coastguard Worker# b4_output_end
133*cda5da8dSAndroid Build Coastguard Worker# -------------
134*cda5da8dSAndroid Build Coastguard Worker# Output nothing, restore # as comment character (no expansions after #).
135*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_output_end],
136*cda5da8dSAndroid Build Coastguard Worker[m4_divert_pop(0)
137*cda5da8dSAndroid Build Coastguard Workerm4_changecom([#])
138*cda5da8dSAndroid Build Coastguard Worker])
139*cda5da8dSAndroid Build Coastguard Worker
140*cda5da8dSAndroid Build Coastguard Worker
141*cda5da8dSAndroid Build Coastguard Worker# b4_divert_kill(CODE)
142*cda5da8dSAndroid Build Coastguard Worker# --------------------
143*cda5da8dSAndroid Build Coastguard Worker# Expand CODE for its side effects, discard its output.
144*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_divert_kill],
145*cda5da8dSAndroid Build Coastguard Worker[m4_divert_text([KILL], [$1])])
146*cda5da8dSAndroid Build Coastguard Worker
147*cda5da8dSAndroid Build Coastguard Worker
148*cda5da8dSAndroid Build Coastguard Worker# b4_define_silent(MACRO, CODE)
149*cda5da8dSAndroid Build Coastguard Worker# -----------------------------
150*cda5da8dSAndroid Build Coastguard Worker# Same as m4_define, but throw away the expansion of CODE.
151*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_define_silent],
152*cda5da8dSAndroid Build Coastguard Worker[m4_define([$1], [b4_divert_kill([$2])])])
153*cda5da8dSAndroid Build Coastguard Worker
154*cda5da8dSAndroid Build Coastguard Worker
155*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
156*cda5da8dSAndroid Build Coastguard Worker## Error handling.  ##
157*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
158*cda5da8dSAndroid Build Coastguard Worker
159*cda5da8dSAndroid Build Coastguard Worker# The following error handling macros print error directives that should not
160*cda5da8dSAndroid Build Coastguard Worker# become arguments of other macro invocations since they would likely then be
161*cda5da8dSAndroid Build Coastguard Worker# mangled.  Thus, they print to stdout directly.
162*cda5da8dSAndroid Build Coastguard Worker
163*cda5da8dSAndroid Build Coastguard Worker# b4_cat(TEXT)
164*cda5da8dSAndroid Build Coastguard Worker# ------------
165*cda5da8dSAndroid Build Coastguard Worker# Write TEXT to stdout.  Precede the final newline with an @ so that it's
166*cda5da8dSAndroid Build Coastguard Worker# escaped.  For example:
167*cda5da8dSAndroid Build Coastguard Worker#
168*cda5da8dSAndroid Build Coastguard Worker#   b4_cat([[@complain(invalid input@)]])
169*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cat],
170*cda5da8dSAndroid Build Coastguard Worker[m4_syscmd([cat <<'_m4eof'
171*cda5da8dSAndroid Build Coastguard Worker]m4_bpatsubst(m4_dquote($1), [_m4eof], [_m4@`eof])[@
172*cda5da8dSAndroid Build Coastguard Worker_m4eof
173*cda5da8dSAndroid Build Coastguard Worker])dnl
174*cda5da8dSAndroid Build Coastguard Workerm4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])])
175*cda5da8dSAndroid Build Coastguard Worker
176*cda5da8dSAndroid Build Coastguard Worker# b4_error(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
177*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------------------
178*cda5da8dSAndroid Build Coastguard Worker# Write @KIND(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
179*cda5da8dSAndroid Build Coastguard Worker#
180*cda5da8dSAndroid Build Coastguard Worker# For example:
181*cda5da8dSAndroid Build Coastguard Worker#
182*cda5da8dSAndroid Build Coastguard Worker#   b4_error([[complain]], [[input.y:2.3]], [[input.y:5.4]],
183*cda5da8dSAndroid Build Coastguard Worker#            [[invalid %s]], [[foo]])
184*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_error],
185*cda5da8dSAndroid Build Coastguard Worker[b4_cat([[@complain][(]$1[@,]$2[@,]$3[@,]$4[]]dnl
186*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [4], [],
187*cda5da8dSAndroid Build Coastguard Worker       [m4_foreach([b4_arg],
188*cda5da8dSAndroid Build Coastguard Worker                   m4_dquote(m4_shift4($@)),
189*cda5da8dSAndroid Build Coastguard Worker                   [[@,]b4_arg])])[@)]])])
190*cda5da8dSAndroid Build Coastguard Worker
191*cda5da8dSAndroid Build Coastguard Worker# b4_warn(FORMAT, [ARG1], [ARG2], ...)
192*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
193*cda5da8dSAndroid Build Coastguard Worker# Write @warn(FORMAT@,ARG1@,ARG2@,...@) to stdout.
194*cda5da8dSAndroid Build Coastguard Worker#
195*cda5da8dSAndroid Build Coastguard Worker# For example:
196*cda5da8dSAndroid Build Coastguard Worker#
197*cda5da8dSAndroid Build Coastguard Worker#   b4_warn([[invalid value for '%s': %s]], [[foo]], [[3]])
198*cda5da8dSAndroid Build Coastguard Worker#
199*cda5da8dSAndroid Build Coastguard Worker# As a simple test suite, this:
200*cda5da8dSAndroid Build Coastguard Worker#
201*cda5da8dSAndroid Build Coastguard Worker#   m4_divert(-1)
202*cda5da8dSAndroid Build Coastguard Worker#   m4_define([asdf], [ASDF])
203*cda5da8dSAndroid Build Coastguard Worker#   m4_define([fsa], [FSA])
204*cda5da8dSAndroid Build Coastguard Worker#   m4_define([fdsa], [FDSA])
205*cda5da8dSAndroid Build Coastguard Worker#   b4_warn_at([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
206*cda5da8dSAndroid Build Coastguard Worker#   b4_warn_at([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
207*cda5da8dSAndroid Build Coastguard Worker#   b4_warn_at()
208*cda5da8dSAndroid Build Coastguard Worker#   b4_warn_at(1)
209*cda5da8dSAndroid Build Coastguard Worker#   b4_warn_at(1, 2)
210*cda5da8dSAndroid Build Coastguard Worker#
211*cda5da8dSAndroid Build Coastguard Worker# Should produce this without newlines:
212*cda5da8dSAndroid Build Coastguard Worker#
213*cda5da8dSAndroid Build Coastguard Worker#   @warn_at([asdf), asdf]@,@,@,[fsa), fsa]@,[fdsa), fdsa]@)
214*cda5da8dSAndroid Build Coastguard Worker#   @warn(asdf), asdf@,@,@,fsa), fsa@,fdsa), fdsa@)
215*cda5da8dSAndroid Build Coastguard Worker#   @warn(@)
216*cda5da8dSAndroid Build Coastguard Worker#   @warn(1@)
217*cda5da8dSAndroid Build Coastguard Worker#   @warn(1@,2@)
218*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_warn],
219*cda5da8dSAndroid Build Coastguard Worker[b4_warn_at([], [], $@)])
220*cda5da8dSAndroid Build Coastguard Worker
221*cda5da8dSAndroid Build Coastguard Worker# b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...)
222*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------------
223*cda5da8dSAndroid Build Coastguard Worker# Write @warn(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
224*cda5da8dSAndroid Build Coastguard Worker#
225*cda5da8dSAndroid Build Coastguard Worker# For example:
226*cda5da8dSAndroid Build Coastguard Worker#
227*cda5da8dSAndroid Build Coastguard Worker#   b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]])
228*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_warn_at],
229*cda5da8dSAndroid Build Coastguard Worker[b4_error([[warn]], $@)])
230*cda5da8dSAndroid Build Coastguard Worker
231*cda5da8dSAndroid Build Coastguard Worker# b4_complain(FORMAT, [ARG1], [ARG2], ...)
232*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------
233*cda5da8dSAndroid Build Coastguard Worker# Bounce to b4_complain_at.
234*cda5da8dSAndroid Build Coastguard Worker#
235*cda5da8dSAndroid Build Coastguard Worker# See b4_warn example.
236*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_complain],
237*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at([], [], $@)])
238*cda5da8dSAndroid Build Coastguard Worker
239*cda5da8dSAndroid Build Coastguard Worker# b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...)
240*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------------------
241*cda5da8dSAndroid Build Coastguard Worker# Write @complain(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
242*cda5da8dSAndroid Build Coastguard Worker#
243*cda5da8dSAndroid Build Coastguard Worker# See b4_warn_at example.
244*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_complain_at],
245*cda5da8dSAndroid Build Coastguard Worker[b4_error([[complain]], $@)])
246*cda5da8dSAndroid Build Coastguard Worker
247*cda5da8dSAndroid Build Coastguard Worker# b4_fatal(FORMAT, [ARG1], [ARG2], ...)
248*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------
249*cda5da8dSAndroid Build Coastguard Worker# Bounce to b4_fatal_at.
250*cda5da8dSAndroid Build Coastguard Worker#
251*cda5da8dSAndroid Build Coastguard Worker# See b4_warn example.
252*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_fatal],
253*cda5da8dSAndroid Build Coastguard Worker[b4_fatal_at([], [], $@)])
254*cda5da8dSAndroid Build Coastguard Worker
255*cda5da8dSAndroid Build Coastguard Worker# b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...)
256*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------
257*cda5da8dSAndroid Build Coastguard Worker# Write @fatal(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
258*cda5da8dSAndroid Build Coastguard Worker#
259*cda5da8dSAndroid Build Coastguard Worker# See b4_warn_at example.
260*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_fatal_at],
261*cda5da8dSAndroid Build Coastguard Worker[b4_error([[fatal]], $@)dnl
262*cda5da8dSAndroid Build Coastguard Workerm4_exit(1)])
263*cda5da8dSAndroid Build Coastguard Worker
264*cda5da8dSAndroid Build Coastguard Worker# b4_canary(MSG)
265*cda5da8dSAndroid Build Coastguard Worker# --------------
266*cda5da8dSAndroid Build Coastguard Worker# Issue a warning on stderr and in the output.  Used in the test suite
267*cda5da8dSAndroid Build Coastguard Worker# to catch spurious m4 evaluations.
268*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_canary],
269*cda5da8dSAndroid Build Coastguard Worker[m4_errprintn([dead canary: $1])DEAD CANARY($1)])
270*cda5da8dSAndroid Build Coastguard Worker
271*cda5da8dSAndroid Build Coastguard Worker
272*cda5da8dSAndroid Build Coastguard Worker## ------------ ##
273*cda5da8dSAndroid Build Coastguard Worker## Data Types.  ##
274*cda5da8dSAndroid Build Coastguard Worker## ------------ ##
275*cda5da8dSAndroid Build Coastguard Worker
276*cda5da8dSAndroid Build Coastguard Worker# b4_ints_in(INT1, INT2, LOW, HIGH)
277*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------
278*cda5da8dSAndroid Build Coastguard Worker# Return 1 iff both INT1 and INT2 are in [LOW, HIGH], 0 otherwise.
279*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_ints_in],
280*cda5da8dSAndroid Build Coastguard Worker[m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])])
281*cda5da8dSAndroid Build Coastguard Worker
282*cda5da8dSAndroid Build Coastguard Worker
283*cda5da8dSAndroid Build Coastguard Worker# b4_subtract(LHS, RHS)
284*cda5da8dSAndroid Build Coastguard Worker# ---------------------
285*cda5da8dSAndroid Build Coastguard Worker# Evaluate LHS - RHS if they are integer literals, otherwise expand
286*cda5da8dSAndroid Build Coastguard Worker# to (LHS) - (RHS).
287*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_subtract],
288*cda5da8dSAndroid Build Coastguard Worker[m4_bmatch([$1$2], [^[0123456789]*$],
289*cda5da8dSAndroid Build Coastguard Worker           [m4_eval([$1 - $2])],
290*cda5da8dSAndroid Build Coastguard Worker           [($1) - ($2)])])
291*cda5da8dSAndroid Build Coastguard Worker
292*cda5da8dSAndroid Build Coastguard Worker# b4_join(ARG1, ...)
293*cda5da8dSAndroid Build Coastguard Worker# _b4_join(ARG1, ...)
294*cda5da8dSAndroid Build Coastguard Worker# -------------------
295*cda5da8dSAndroid Build Coastguard Worker# Join with comma, skipping empty arguments.
296*cda5da8dSAndroid Build Coastguard Worker# b4_join calls itself recursively until it sees the first non-empty
297*cda5da8dSAndroid Build Coastguard Worker# argument, then calls _b4_join (i.e., `_$0`) which prepends each
298*cda5da8dSAndroid Build Coastguard Worker# non-empty argument with a comma.
299*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_join],
300*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#$1],
301*cda5da8dSAndroid Build Coastguard Worker       [1], [],
302*cda5da8dSAndroid Build Coastguard Worker       [m4_ifval([$1],
303*cda5da8dSAndroid Build Coastguard Worker                 [$1[]_$0(m4_shift($@))],
304*cda5da8dSAndroid Build Coastguard Worker                 [$0(m4_shift($@))])])])
305*cda5da8dSAndroid Build Coastguard Worker
306*cda5da8dSAndroid Build Coastguard Worker# _b4_join(ARGS1, ...)
307*cda5da8dSAndroid Build Coastguard Worker# --------------------
308*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_join],
309*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#$1],
310*cda5da8dSAndroid Build Coastguard Worker       [1], [],
311*cda5da8dSAndroid Build Coastguard Worker       [m4_ifval([$1], [, $1])[]$0(m4_shift($@))])])
312*cda5da8dSAndroid Build Coastguard Worker
313*cda5da8dSAndroid Build Coastguard Worker
314*cda5da8dSAndroid Build Coastguard Worker
315*cda5da8dSAndroid Build Coastguard Worker
316*cda5da8dSAndroid Build Coastguard Worker# b4_integral_parser_tables_map(MACRO)
317*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------
318*cda5da8dSAndroid Build Coastguard Worker# Map MACRO on all the integral tables.  MACRO is expected to have
319*cda5da8dSAndroid Build Coastguard Worker# the signature MACRO(TABLE-NAME, CONTENT, COMMENT).
320*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_integral_parser_tables_map],
321*cda5da8dSAndroid Build Coastguard Worker[$1([pact], [b4_pact],
322*cda5da8dSAndroid Build Coastguard Worker    [[YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
323*cda5da8dSAndroid Build Coastguard WorkerSTATE-NUM.]])
324*cda5da8dSAndroid Build Coastguard Worker
325*cda5da8dSAndroid Build Coastguard Worker$1([defact], [b4_defact],
326*cda5da8dSAndroid Build Coastguard Worker   [[YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
327*cda5da8dSAndroid Build Coastguard WorkerPerformed when YYTABLE does not specify something else to do.  Zero
328*cda5da8dSAndroid Build Coastguard Workermeans the default is an error.]])
329*cda5da8dSAndroid Build Coastguard Worker
330*cda5da8dSAndroid Build Coastguard Worker$1([pgoto], [b4_pgoto], [[YYPGOTO[NTERM-NUM].]])
331*cda5da8dSAndroid Build Coastguard Worker
332*cda5da8dSAndroid Build Coastguard Worker$1([defgoto], [b4_defgoto], [[YYDEFGOTO[NTERM-NUM].]])
333*cda5da8dSAndroid Build Coastguard Worker
334*cda5da8dSAndroid Build Coastguard Worker$1([table], [b4_table],
335*cda5da8dSAndroid Build Coastguard Worker   [[YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
336*cda5da8dSAndroid Build Coastguard Workerpositive, shift that token.  If negative, reduce the rule whose
337*cda5da8dSAndroid Build Coastguard Workernumber is the opposite.  If YYTABLE_NINF, syntax error.]])
338*cda5da8dSAndroid Build Coastguard Worker
339*cda5da8dSAndroid Build Coastguard Worker$1([check], [b4_check])
340*cda5da8dSAndroid Build Coastguard Worker
341*cda5da8dSAndroid Build Coastguard Worker$1([stos], [b4_stos],
342*cda5da8dSAndroid Build Coastguard Worker   [[YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
343*cda5da8dSAndroid Build Coastguard Workerstate STATE-NUM.]])
344*cda5da8dSAndroid Build Coastguard Worker
345*cda5da8dSAndroid Build Coastguard Worker$1([r1], [b4_r1],
346*cda5da8dSAndroid Build Coastguard Worker   [[YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.]])
347*cda5da8dSAndroid Build Coastguard Worker
348*cda5da8dSAndroid Build Coastguard Worker$1([r2], [b4_r2],
349*cda5da8dSAndroid Build Coastguard Worker   [[YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.]])
350*cda5da8dSAndroid Build Coastguard Worker])
351*cda5da8dSAndroid Build Coastguard Worker
352*cda5da8dSAndroid Build Coastguard Worker
353*cda5da8dSAndroid Build Coastguard Worker# b4_parser_tables_declare
354*cda5da8dSAndroid Build Coastguard Worker# b4_parser_tables_define
355*cda5da8dSAndroid Build Coastguard Worker# ------------------------
356*cda5da8dSAndroid Build Coastguard Worker# Define/declare the (deterministic) parser tables.
357*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parser_tables_declare],
358*cda5da8dSAndroid Build Coastguard Worker[b4_integral_parser_tables_map([b4_integral_parser_table_declare])])
359*cda5da8dSAndroid Build Coastguard Worker
360*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parser_tables_define],
361*cda5da8dSAndroid Build Coastguard Worker[b4_integral_parser_tables_map([b4_integral_parser_table_define])])
362*cda5da8dSAndroid Build Coastguard Worker
363*cda5da8dSAndroid Build Coastguard Worker
364*cda5da8dSAndroid Build Coastguard Worker
365*cda5da8dSAndroid Build Coastguard Worker## ------------------ ##
366*cda5da8dSAndroid Build Coastguard Worker## Decoding options.  ##
367*cda5da8dSAndroid Build Coastguard Worker## ------------------ ##
368*cda5da8dSAndroid Build Coastguard Worker
369*cda5da8dSAndroid Build Coastguard Worker# b4_flag_if(FLAG, IF-TRUE, IF-FALSE)
370*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------
371*cda5da8dSAndroid Build Coastguard Worker# Run IF-TRUE if b4_FLAG_flag is 1, IF-FALSE if FLAG is 0, otherwise fail.
372*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_flag_if],
373*cda5da8dSAndroid Build Coastguard Worker[m4_case(b4_$1_flag,
374*cda5da8dSAndroid Build Coastguard Worker         [0], [$3],
375*cda5da8dSAndroid Build Coastguard Worker         [1], [$2],
376*cda5da8dSAndroid Build Coastguard Worker         [m4_fatal([invalid $1 value: ]b4_$1_flag)])])
377*cda5da8dSAndroid Build Coastguard Worker
378*cda5da8dSAndroid Build Coastguard Worker
379*cda5da8dSAndroid Build Coastguard Worker# b4_define_flag_if(FLAG)
380*cda5da8dSAndroid Build Coastguard Worker# -----------------------
381*cda5da8dSAndroid Build Coastguard Worker# Define "b4_FLAG_if(IF-TRUE, IF-FALSE)" that depends on the
382*cda5da8dSAndroid Build Coastguard Worker# value of the Boolean FLAG.
383*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_define_flag_if],
384*cda5da8dSAndroid Build Coastguard Worker[_b4_define_flag_if($[1], $[2], [$1])])
385*cda5da8dSAndroid Build Coastguard Worker
386*cda5da8dSAndroid Build Coastguard Worker# _b4_define_flag_if($1, $2, FLAG)
387*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
388*cda5da8dSAndroid Build Coastguard Worker# Work around the impossibility to define macros inside macros,
389*cda5da8dSAndroid Build Coastguard Worker# because issuing '[$1]' is not possible in M4.  GNU M4 should provide
390*cda5da8dSAndroid Build Coastguard Worker# $$1 a la M5/TeX.
391*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_define_flag_if],
392*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1$2], $[1]$[2], [],
393*cda5da8dSAndroid Build Coastguard Worker       [m4_fatal([$0: Invalid arguments: $@])])dnl
394*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_$3_if],
395*cda5da8dSAndroid Build Coastguard Worker          [b4_flag_if([$3], [$1], [$2])])])
396*cda5da8dSAndroid Build Coastguard Worker
397*cda5da8dSAndroid Build Coastguard Worker
398*cda5da8dSAndroid Build Coastguard Worker# b4_FLAG_if(IF-TRUE, IF-FALSE)
399*cda5da8dSAndroid Build Coastguard Worker# -----------------------------
400*cda5da8dSAndroid Build Coastguard Worker# Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise.
401*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([glr])                # Whether a GLR parser is requested.
402*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([has_translations])   # Whether some tokens are internationalized.
403*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([header])             # Whether a header is requested.
404*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([nondeterministic])   # Whether conflicts should be handled.
405*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([token_table])        # Whether yytoken_table is demanded.
406*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([yacc])               # Whether POSIX Yacc is emulated.
407*cda5da8dSAndroid Build Coastguard Worker
408*cda5da8dSAndroid Build Coastguard Worker
409*cda5da8dSAndroid Build Coastguard Worker# b4_glr_cc_if([IF-TRUE], [IF-FALSE])
410*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------
411*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_glr_cc_if],
412*cda5da8dSAndroid Build Coastguard Worker          [m4_if(b4_skeleton, ["glr.cc"], $@)])
413*cda5da8dSAndroid Build Coastguard Worker
414*cda5da8dSAndroid Build Coastguard Worker# b4_glr2_cc_if([IF-TRUE], [IF-FALSE])
415*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
416*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_glr2_cc_if],
417*cda5da8dSAndroid Build Coastguard Worker          [m4_if(b4_skeleton, ["glr2.cc"], $@)])
418*cda5da8dSAndroid Build Coastguard Worker
419*cda5da8dSAndroid Build Coastguard Worker## --------- ##
420*cda5da8dSAndroid Build Coastguard Worker## Symbols.  ##
421*cda5da8dSAndroid Build Coastguard Worker## --------- ##
422*cda5da8dSAndroid Build Coastguard Worker
423*cda5da8dSAndroid Build Coastguard Worker# For a description of the Symbol handling, see README.md.
424*cda5da8dSAndroid Build Coastguard Worker#
425*cda5da8dSAndroid Build Coastguard Worker# The following macros provide access to symbol related values.
426*cda5da8dSAndroid Build Coastguard Worker
427*cda5da8dSAndroid Build Coastguard Worker# __b4_symbol(NUM, FIELD)
428*cda5da8dSAndroid Build Coastguard Worker# -----------------------
429*cda5da8dSAndroid Build Coastguard Worker# Fetch FIELD of symbol #NUM.  Fail if undefined.
430*cda5da8dSAndroid Build Coastguard Workerm4_define([__b4_symbol],
431*cda5da8dSAndroid Build Coastguard Worker[m4_indir([b4_symbol($1, $2)])])
432*cda5da8dSAndroid Build Coastguard Worker
433*cda5da8dSAndroid Build Coastguard Worker
434*cda5da8dSAndroid Build Coastguard Worker# _b4_symbol(NUM, FIELD)
435*cda5da8dSAndroid Build Coastguard Worker# ----------------------
436*cda5da8dSAndroid Build Coastguard Worker# Fetch FIELD of symbol #NUM (or "orig NUM", see README.md).
437*cda5da8dSAndroid Build Coastguard Worker# Fail if undefined.
438*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_symbol],
439*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_symbol($1, number)],
440*cda5da8dSAndroid Build Coastguard Worker          [__b4_symbol(m4_indir([b4_symbol($1, number)]), $2)],
441*cda5da8dSAndroid Build Coastguard Worker          [__b4_symbol([$1], [$2])])])
442*cda5da8dSAndroid Build Coastguard Worker
443*cda5da8dSAndroid Build Coastguard Worker
444*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_token_kind(NUM)
445*cda5da8dSAndroid Build Coastguard Worker# -------------------------
446*cda5da8dSAndroid Build Coastguard Worker# The token kind of this symbol.
447*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_token_kind],
448*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_get([api.token.prefix])dnl
449*cda5da8dSAndroid Build Coastguard Worker_b4_symbol([$1], [id])])
450*cda5da8dSAndroid Build Coastguard Worker
451*cda5da8dSAndroid Build Coastguard Worker
452*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_kind_base(NUM)
453*cda5da8dSAndroid Build Coastguard Worker# ------------------------
454*cda5da8dSAndroid Build Coastguard Worker# Build the name of the kind of this symbol.  It must always exist,
455*cda5da8dSAndroid Build Coastguard Worker# otherwise some symbols might not be represented in the enum, which
456*cda5da8dSAndroid Build Coastguard Worker# might be compiled into too small a type to contain all the symbol
457*cda5da8dSAndroid Build Coastguard Worker# numbers.
458*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_prefix], [b4_percent_define_get([api.symbol.prefix])])
459*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_kind_base],
460*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_get([api.symbol.prefix])dnl
461*cda5da8dSAndroid Build Coastguard Workerm4_case([$1],
462*cda5da8dSAndroid Build Coastguard Worker  [-2],                             [[YYEMPTY]],
463*cda5da8dSAndroid Build Coastguard Worker  [0],                              [[YYEOF]],
464*cda5da8dSAndroid Build Coastguard Worker  [1],                              [[YYerror]],
465*cda5da8dSAndroid Build Coastguard Worker  [2],                              [[YYUNDEF]],
466*cda5da8dSAndroid Build Coastguard Worker  [m4_case(b4_symbol([$1], [tag]),
467*cda5da8dSAndroid Build Coastguard Worker      [$accept],                    [[YYACCEPT]],
468*cda5da8dSAndroid Build Coastguard Worker      [b4_symbol_if([$1], [has_id], _b4_symbol([$1], [id]),
469*cda5da8dSAndroid Build Coastguard Worker                                    [m4_bpatsubst([$1-][]_b4_symbol([$1], [tag]), [[^a-zA-Z_0-9]+], [_])])])])])
470*cda5da8dSAndroid Build Coastguard Worker
471*cda5da8dSAndroid Build Coastguard Worker
472*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_kind(NUM)
473*cda5da8dSAndroid Build Coastguard Worker# -------------------
474*cda5da8dSAndroid Build Coastguard Worker# Same as b4_symbol_kind, but possibly with a prefix in some
475*cda5da8dSAndroid Build Coastguard Worker# languages.  E.g., EOF's kind_base and kind are YYSYMBOL_YYEOF in C,
476*cda5da8dSAndroid Build Coastguard Worker# but are S_YYEMPTY and symbol_kind::S_YYEMPTY in C++.
477*cda5da8dSAndroid Build Coastguard Workerm4_copy([b4_symbol_kind_base], [b4_symbol_kind])
478*cda5da8dSAndroid Build Coastguard Worker
479*cda5da8dSAndroid Build Coastguard Worker
480*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_slot(NUM)
481*cda5da8dSAndroid Build Coastguard Worker# -------------------
482*cda5da8dSAndroid Build Coastguard Worker# The name of union member that contains the value of these symbols.
483*cda5da8dSAndroid Build Coastguard Worker# Currently, we are messy, this should actually be type_tag, but type_tag
484*cda5da8dSAndroid Build Coastguard Worker# has several meanings.
485*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_slot],
486*cda5da8dSAndroid Build Coastguard Worker[m4_case(b4_percent_define_get([[api.value.type]]),
487*cda5da8dSAndroid Build Coastguard Worker         [union],   [b4_symbol([$1], [type_tag])],
488*cda5da8dSAndroid Build Coastguard Worker         [variant], [b4_symbol([$1], [type_tag])],
489*cda5da8dSAndroid Build Coastguard Worker         [b4_symbol([$1], [type])])])
490*cda5da8dSAndroid Build Coastguard Worker
491*cda5da8dSAndroid Build Coastguard Worker
492*cda5da8dSAndroid Build Coastguard Worker# b4_symbol(NUM, FIELD)
493*cda5da8dSAndroid Build Coastguard Worker# ---------------------
494*cda5da8dSAndroid Build Coastguard Worker# Fetch FIELD of symbol #NUM (or "orig NUM", or "empty").  Fail if undefined.
495*cda5da8dSAndroid Build Coastguard Worker#
496*cda5da8dSAndroid Build Coastguard Worker# If FIELD = id, prepend the token prefix.
497*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol],
498*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [empty], [b4_symbol([-2], [$2])],
499*cda5da8dSAndroid Build Coastguard Worker       [$1], [eof],   [b4_symbol([0], [$2])],
500*cda5da8dSAndroid Build Coastguard Worker       [$1], [error], [b4_symbol([1], [$2])],
501*cda5da8dSAndroid Build Coastguard Worker       [$1], [undef], [b4_symbol([2], [$2])],
502*cda5da8dSAndroid Build Coastguard Worker       [m4_case([$2],
503*cda5da8dSAndroid Build Coastguard Worker                [id],        [b4_symbol_token_kind([$1])],
504*cda5da8dSAndroid Build Coastguard Worker                [kind_base], [b4_symbol_kind_base([$1])],
505*cda5da8dSAndroid Build Coastguard Worker                [kind],      [b4_symbol_kind([$1])],
506*cda5da8dSAndroid Build Coastguard Worker                [slot],      [b4_symbol_slot([$1])],
507*cda5da8dSAndroid Build Coastguard Worker                [_b4_symbol($@)])])])
508*cda5da8dSAndroid Build Coastguard Worker
509*cda5da8dSAndroid Build Coastguard Worker
510*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
511*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------
512*cda5da8dSAndroid Build Coastguard Worker# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE.
513*cda5da8dSAndroid Build Coastguard Worker# Otherwise an error.
514*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_if],
515*cda5da8dSAndroid Build Coastguard Worker[m4_case(b4_symbol([$1], [$2]),
516*cda5da8dSAndroid Build Coastguard Worker         [1], [$3],
517*cda5da8dSAndroid Build Coastguard Worker         [0], [$4],
518*cda5da8dSAndroid Build Coastguard Worker         [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
519*cda5da8dSAndroid Build Coastguard Worker
520*cda5da8dSAndroid Build Coastguard Worker
521*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_tag_comment(SYMBOL-NUM)
522*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------
523*cda5da8dSAndroid Build Coastguard Worker# Issue a comment giving the tag of symbol NUM.
524*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_tag_comment],
525*cda5da8dSAndroid Build Coastguard Worker[b4_comment([b4_symbol([$1], [tag])])
526*cda5da8dSAndroid Build Coastguard Worker])
527*cda5da8dSAndroid Build Coastguard Worker
528*cda5da8dSAndroid Build Coastguard Worker
529*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_action(SYMBOL-NUM, ACTION)
530*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
531*cda5da8dSAndroid Build Coastguard Worker# Run the action ACTION ("destructor" or "printer") for SYMBOL-NUM.
532*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_action],
533*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_if([$1], [has_$2],
534*cda5da8dSAndroid Build Coastguard Worker[b4_dollar_pushdef([(*yyvaluep)],
535*cda5da8dSAndroid Build Coastguard Worker                   [$1],
536*cda5da8dSAndroid Build Coastguard Worker                   [],
537*cda5da8dSAndroid Build Coastguard Worker                   [(*yylocationp)])dnl
538*cda5da8dSAndroid Build Coastguard Worker    _b4_symbol_case([$1])[]dnl
539*cda5da8dSAndroid Build Coastguard Workerb4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])dnl
540*cda5da8dSAndroid Build Coastguard Workerb4_symbol([$1], [$2])
541*cda5da8dSAndroid Build Coastguard Workerb4_syncline([@oline@], [@ofile@])dnl
542*cda5da8dSAndroid Build Coastguard Worker        break;
543*cda5da8dSAndroid Build Coastguard Worker
544*cda5da8dSAndroid Build Coastguard Workerb4_dollar_popdef[]dnl
545*cda5da8dSAndroid Build Coastguard Worker])])
546*cda5da8dSAndroid Build Coastguard Worker
547*cda5da8dSAndroid Build Coastguard Worker
548*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_destructor(SYMBOL-NUM)
549*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_printer(SYMBOL-NUM)
550*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
551*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])])
552*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_printer],    [b4_symbol_action([$1], [printer])])
553*cda5da8dSAndroid Build Coastguard Worker
554*cda5da8dSAndroid Build Coastguard Worker
555*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_actions(ACTION, [KIND = yykind])
556*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------
557*cda5da8dSAndroid Build Coastguard Worker# Emit the symbol actions for ACTION ("destructor" or "printer").
558*cda5da8dSAndroid Build Coastguard Worker# Dispatch on KIND.
559*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_actions],
560*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([b4_actions_], m4_expand([b4_symbol_foreach([b4_symbol_$1])]))dnl
561*cda5da8dSAndroid Build Coastguard Workerm4_ifval(m4_defn([b4_actions_]),
562*cda5da8dSAndroid Build Coastguard Worker[switch (m4_default([$2], [yykind]))
563*cda5da8dSAndroid Build Coastguard Worker    {
564*cda5da8dSAndroid Build Coastguard Workerm4_defn([b4_actions_])[]dnl
565*cda5da8dSAndroid Build Coastguard Worker      default:
566*cda5da8dSAndroid Build Coastguard Worker        break;
567*cda5da8dSAndroid Build Coastguard Worker    }dnl
568*cda5da8dSAndroid Build Coastguard Worker],
569*cda5da8dSAndroid Build Coastguard Worker[b4_use(m4_default([$2], [yykind]));])dnl
570*cda5da8dSAndroid Build Coastguard Workerm4_popdef([b4_actions_])dnl
571*cda5da8dSAndroid Build Coastguard Worker])
572*cda5da8dSAndroid Build Coastguard Worker
573*cda5da8dSAndroid Build Coastguard Worker# _b4_symbol_case(SYMBOL-NUM)
574*cda5da8dSAndroid Build Coastguard Worker# ---------------------------
575*cda5da8dSAndroid Build Coastguard Worker# Issue a "case NUM" for SYMBOL-NUM.  Ends with its EOL to make it
576*cda5da8dSAndroid Build Coastguard Worker# easier to use with m4_map, but then, use []dnl to suppress the last
577*cda5da8dSAndroid Build Coastguard Worker# one.
578*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_symbol_case],
579*cda5da8dSAndroid Build Coastguard Worker[case b4_symbol([$1], [kind]): b4_symbol_tag_comment([$1])])
580*cda5da8dSAndroid Build Coastguard Worker])
581*cda5da8dSAndroid Build Coastguard Worker
582*cda5da8dSAndroid Build Coastguard Worker
583*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_foreach(MACRO)
584*cda5da8dSAndroid Build Coastguard Worker# ------------------------
585*cda5da8dSAndroid Build Coastguard Worker# Invoke MACRO(SYMBOL-NUM) for each SYMBOL-NUM.
586*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_foreach],
587*cda5da8dSAndroid Build Coastguard Worker          [m4_map([$1], m4_defn([b4_symbol_numbers]))])
588*cda5da8dSAndroid Build Coastguard Worker
589*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_map(MACRO)
590*cda5da8dSAndroid Build Coastguard Worker# --------------------
591*cda5da8dSAndroid Build Coastguard Worker# Return a list (possibly empty elements) of MACRO invoked for each
592*cda5da8dSAndroid Build Coastguard Worker# SYMBOL-NUM.
593*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_map],
594*cda5da8dSAndroid Build Coastguard Worker[m4_map_args_sep([$1(], [)], [,], b4_symbol_numbers)])
595*cda5da8dSAndroid Build Coastguard Worker
596*cda5da8dSAndroid Build Coastguard Worker
597*cda5da8dSAndroid Build Coastguard Worker# b4_token_visible_if(NUM, IF-TRUE, IF-FALSE)
598*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------
599*cda5da8dSAndroid Build Coastguard Worker# Whether NUM denotes a token kind that has an exported definition
600*cda5da8dSAndroid Build Coastguard Worker# (i.e., shows in enum yytokentype).
601*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_visible_if],
602*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_if([$1], [is_token],
603*cda5da8dSAndroid Build Coastguard Worker              [b4_symbol_if([$1], [has_id], [$2], [$3])],
604*cda5da8dSAndroid Build Coastguard Worker              [$3])])
605*cda5da8dSAndroid Build Coastguard Worker
606*cda5da8dSAndroid Build Coastguard Worker
607*cda5da8dSAndroid Build Coastguard Worker# b4_token_has_definition(NUM)
608*cda5da8dSAndroid Build Coastguard Worker# ----------------------------
609*cda5da8dSAndroid Build Coastguard Worker# 1 if NUM is visible, nothing otherwise.
610*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_has_definition],
611*cda5da8dSAndroid Build Coastguard Worker[b4_token_visible_if([$1], [1])])
612*cda5da8dSAndroid Build Coastguard Worker
613*cda5da8dSAndroid Build Coastguard Worker# b4_any_token_visible_if([IF-TRUE], [IF-FALSE])
614*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------
615*cda5da8dSAndroid Build Coastguard Worker# Whether there is a token that needs to be defined.
616*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_any_token_visible_if],
617*cda5da8dSAndroid Build Coastguard Worker[m4_ifval(b4_symbol_foreach([b4_token_has_definition]),
618*cda5da8dSAndroid Build Coastguard Worker          [$1], [$2])])
619*cda5da8dSAndroid Build Coastguard Worker
620*cda5da8dSAndroid Build Coastguard Worker
621*cda5da8dSAndroid Build Coastguard Worker# b4_token_format(FORMAT, NUM)
622*cda5da8dSAndroid Build Coastguard Worker# ----------------------------
623*cda5da8dSAndroid Build Coastguard Worker# If token NUM has a visible ID, format FORMAT with ID, USER_NUMBER.
624*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_format],
625*cda5da8dSAndroid Build Coastguard Worker[b4_token_visible_if([$2],
626*cda5da8dSAndroid Build Coastguard Worker[m4_format([[$1]],
627*cda5da8dSAndroid Build Coastguard Worker           b4_symbol([$2], [id]),
628*cda5da8dSAndroid Build Coastguard Worker           b4_symbol([$2], b4_api_token_raw_if([[number]], [[code]])))])])
629*cda5da8dSAndroid Build Coastguard Worker
630*cda5da8dSAndroid Build Coastguard Worker
631*cda5da8dSAndroid Build Coastguard Worker# b4_last_enum_token
632*cda5da8dSAndroid Build Coastguard Worker# ------------------
633*cda5da8dSAndroid Build Coastguard Worker# The code of the last token visible token.
634*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_last_enum_token],
635*cda5da8dSAndroid Build Coastguard Worker[b4_token_visible_if([$1],
636*cda5da8dSAndroid Build Coastguard Worker   [m4_define([b4_last_enum_token], [$1])])])
637*cda5da8dSAndroid Build Coastguard Workerb4_symbol_foreach([_b4_last_enum_token])
638*cda5da8dSAndroid Build Coastguard Worker
639*cda5da8dSAndroid Build Coastguard Worker# b4_last_symbol
640*cda5da8dSAndroid Build Coastguard Worker# --------------
641*cda5da8dSAndroid Build Coastguard Worker# The code of the last symbol.
642*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_last_symbol], m4_eval(b4_tokens_number + b4_nterms_number - 1))
643*cda5da8dSAndroid Build Coastguard Worker
644*cda5da8dSAndroid Build Coastguard Worker## ------- ##
645*cda5da8dSAndroid Build Coastguard Worker## Types.  ##
646*cda5da8dSAndroid Build Coastguard Worker## ------- ##
647*cda5da8dSAndroid Build Coastguard Worker
648*cda5da8dSAndroid Build Coastguard Worker# _b4_type_action(NUMS)
649*cda5da8dSAndroid Build Coastguard Worker# ---------------------
650*cda5da8dSAndroid Build Coastguard Worker# Run actions for the symbol NUMS that all have the same type-name.
651*cda5da8dSAndroid Build Coastguard Worker# Skip NUMS that have no type-name.
652*cda5da8dSAndroid Build Coastguard Worker#
653*cda5da8dSAndroid Build Coastguard Worker# To specify the action to run, define b4_dollar_dollar(SYMBOL-NUM,
654*cda5da8dSAndroid Build Coastguard Worker# TAG, TYPE).
655*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_type_action],
656*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_if([$1], [has_type],
657*cda5da8dSAndroid Build Coastguard Worker[m4_map([      _b4_symbol_case], [$@])[]dnl
658*cda5da8dSAndroid Build Coastguard Worker        b4_dollar_dollar([b4_symbol([$1], [number])],
659*cda5da8dSAndroid Build Coastguard Worker                         [b4_symbol([$1], [tag])],
660*cda5da8dSAndroid Build Coastguard Worker                         [b4_symbol([$1], [type])]);
661*cda5da8dSAndroid Build Coastguard Worker        break;
662*cda5da8dSAndroid Build Coastguard Worker
663*cda5da8dSAndroid Build Coastguard Worker])])
664*cda5da8dSAndroid Build Coastguard Worker
665*cda5da8dSAndroid Build Coastguard Worker# b4_type_foreach(MACRO, [SEP])
666*cda5da8dSAndroid Build Coastguard Worker# -----------------------------
667*cda5da8dSAndroid Build Coastguard Worker# Invoke MACRO(SYMBOL-NUMS) for each set of SYMBOL-NUMS for each type set.
668*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_type_foreach],
669*cda5da8dSAndroid Build Coastguard Worker          [m4_map_sep([$1], [$2], m4_defn([b4_type_names]))])
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## Synclines.  ##
675*cda5da8dSAndroid Build Coastguard Worker## ----------- ##
676*cda5da8dSAndroid Build Coastguard Worker
677*cda5da8dSAndroid Build Coastguard Worker# b4_basename(NAME)
678*cda5da8dSAndroid Build Coastguard Worker# -----------------
679*cda5da8dSAndroid Build Coastguard Worker# Similar to POSIX basename; the differences don't matter here.
680*cda5da8dSAndroid Build Coastguard Worker# Beware that NAME is not evaluated.
681*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_basename],
682*cda5da8dSAndroid Build Coastguard Worker[m4_bpatsubst([$1], [^.*/\([^/]+\)/*$], [\1])])
683*cda5da8dSAndroid Build Coastguard Worker
684*cda5da8dSAndroid Build Coastguard Worker
685*cda5da8dSAndroid Build Coastguard Worker# b4_syncline(LINE, FILE)dnl
686*cda5da8dSAndroid Build Coastguard Worker# --------------------------
687*cda5da8dSAndroid Build Coastguard Worker# Should always be following by a dnl.
688*cda5da8dSAndroid Build Coastguard Worker#
689*cda5da8dSAndroid Build Coastguard Worker# Emit "#line LINE FILE /* __LINE__ __FILE__ */".
690*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_syncline],
691*cda5da8dSAndroid Build Coastguard Worker[b4_flag_if([synclines],
692*cda5da8dSAndroid Build Coastguard Worker[b4_sync_start([$1], [$2])[]dnl
693*cda5da8dSAndroid Build Coastguard Workerb4_sync_end([__line__], [b4_basename(m4_quote(__file__))])
694*cda5da8dSAndroid Build Coastguard Worker])])
695*cda5da8dSAndroid Build Coastguard Worker
696*cda5da8dSAndroid Build Coastguard Worker# b4_sync_start(LINE, FILE)
697*cda5da8dSAndroid Build Coastguard Worker# -----------------------
698*cda5da8dSAndroid Build Coastguard Worker# Syncline for the new place.  Typically a directive for the compiler.
699*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_sync_start], [b4_comment([$2:$1])])
700*cda5da8dSAndroid Build Coastguard Worker
701*cda5da8dSAndroid Build Coastguard Worker# b4_sync_end(LINE, FILE)
702*cda5da8dSAndroid Build Coastguard Worker# -----------------------
703*cda5da8dSAndroid Build Coastguard Worker# Syncline for the current place, which ends.  Typically a comment
704*cda5da8dSAndroid Build Coastguard Worker# left for the reader.
705*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_sync_end],   [ b4_comment([$2:$1])]
706*cda5da8dSAndroid Build Coastguard Worker)
707*cda5da8dSAndroid Build Coastguard Worker# This generates dependencies on the Bison skeletons hence lots of
708*cda5da8dSAndroid Build Coastguard Worker# useless 'git diff'.  This location is useless for the regular
709*cda5da8dSAndroid Build Coastguard Worker# user (who does not care about the skeletons) and is actually not
710*cda5da8dSAndroid Build Coastguard Worker# useful for Bison developers too (I, Akim, never used this to locate
711*cda5da8dSAndroid Build Coastguard Worker# the code in skeletons that generated output).  So disable it
712*cda5da8dSAndroid Build Coastguard Worker# completely.  If someone thinks this was actually useful, a %define
713*cda5da8dSAndroid Build Coastguard Worker# variable should be provided to control the level of verbosity of
714*cda5da8dSAndroid Build Coastguard Worker# '#line', in replacement of --no-lines.
715*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_sync_end])
716*cda5da8dSAndroid Build Coastguard Worker
717*cda5da8dSAndroid Build Coastguard Worker
718*cda5da8dSAndroid Build Coastguard Worker# b4_user_code(USER-CODE)
719*cda5da8dSAndroid Build Coastguard Worker# -----------------------
720*cda5da8dSAndroid Build Coastguard Worker# Emit code from the user, ending it with synclines.
721*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_user_code],
722*cda5da8dSAndroid Build Coastguard Worker[$1
723*cda5da8dSAndroid Build Coastguard Workerb4_syncline([@oline@], [@ofile@])])
724*cda5da8dSAndroid Build Coastguard Worker
725*cda5da8dSAndroid Build Coastguard Worker
726*cda5da8dSAndroid Build Coastguard Worker# b4_define_user_code(MACRO, COMMENT)
727*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------
728*cda5da8dSAndroid Build Coastguard Worker# From b4_MACRO, if defined, build b4_user_MACRO that includes the synclines.
729*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_define_user_code],
730*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_user_$1],
731*cda5da8dSAndroid Build Coastguard Worker           [m4_ifdef([b4_$1],
732*cda5da8dSAndroid Build Coastguard Worker                     [m4_ifval([$2],
733*cda5da8dSAndroid Build Coastguard Worker                               [b4_comment([$2])
734*cda5da8dSAndroid Build Coastguard Worker])b4_user_code([b4_$1])])])])
735*cda5da8dSAndroid Build Coastguard Worker
736*cda5da8dSAndroid Build Coastguard Worker# b4_user_actions
737*cda5da8dSAndroid Build Coastguard Worker# b4_user_initial_action
738*cda5da8dSAndroid Build Coastguard Worker# b4_user_post_prologue
739*cda5da8dSAndroid Build Coastguard Worker# b4_user_pre_prologue
740*cda5da8dSAndroid Build Coastguard Worker# b4_user_union_members
741*cda5da8dSAndroid Build Coastguard Worker# ----------------------
742*cda5da8dSAndroid Build Coastguard Worker# Macros that issue user code, ending with synclines.
743*cda5da8dSAndroid Build Coastguard Workerb4_define_user_code([actions])
744*cda5da8dSAndroid Build Coastguard Workerb4_define_user_code([initial_action], [User initialization code.])
745*cda5da8dSAndroid Build Coastguard Workerb4_define_user_code([post_prologue], [Second part of user prologue.])
746*cda5da8dSAndroid Build Coastguard Workerb4_define_user_code([pre_prologue], [First part of user prologue.])
747*cda5da8dSAndroid Build Coastguard Workerb4_define_user_code([union_members])
748*cda5da8dSAndroid Build Coastguard Worker
749*cda5da8dSAndroid Build Coastguard Worker
750*cda5da8dSAndroid Build Coastguard Worker# b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE)
751*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------------------------
752*cda5da8dSAndroid Build Coastguard Worker# Complain if any name of type WHAT is used by the user (as recorded in
753*cda5da8dSAndroid Build Coastguard Worker# USER-LIST) but is not used by Bison (as recorded by macros in the
754*cda5da8dSAndroid Build Coastguard Worker# namespace BISON-NAMESPACE).
755*cda5da8dSAndroid Build Coastguard Worker#
756*cda5da8dSAndroid Build Coastguard Worker# USER-LIST must expand to a list specifying all user occurrences of all names
757*cda5da8dSAndroid Build Coastguard Worker# of type WHAT.   Each item in the list must be a triplet specifying one
758*cda5da8dSAndroid Build Coastguard Worker# occurrence: name, start boundary, and end boundary.  Empty string names are
759*cda5da8dSAndroid Build Coastguard Worker# fine.  An empty list is fine.
760*cda5da8dSAndroid Build Coastguard Worker#
761*cda5da8dSAndroid Build Coastguard Worker# For example, to define b4_foo_user_names to be used for USER-LIST with three
762*cda5da8dSAndroid Build Coastguard Worker# name occurrences and with correct quoting:
763*cda5da8dSAndroid Build Coastguard Worker#
764*cda5da8dSAndroid Build Coastguard Worker#   m4_define([b4_foo_user_names],
765*cda5da8dSAndroid Build Coastguard Worker#             [[[[[[bar]], [[parser.y:1.7]], [[parser.y:1.16]]]],
766*cda5da8dSAndroid Build Coastguard Worker#               [[[[bar]], [[parser.y:5.7]], [[parser.y:5.16]]]],
767*cda5da8dSAndroid Build Coastguard Worker#               [[[[baz]], [[parser.y:8.7]], [[parser.y:8.16]]]]]])
768*cda5da8dSAndroid Build Coastguard Worker#
769*cda5da8dSAndroid Build Coastguard Worker# The macro BISON-NAMESPACE(bar) must be defined iff the name bar of type WHAT
770*cda5da8dSAndroid Build Coastguard Worker# is used by Bison (in the front-end or in the skeleton).  Empty string names
771*cda5da8dSAndroid Build Coastguard Worker# are fine, but it would be ugly for Bison to actually use one.
772*cda5da8dSAndroid Build Coastguard Worker#
773*cda5da8dSAndroid Build Coastguard Worker# For example, to use b4_foo_bison_names for BISON-NAMESPACE and define that
774*cda5da8dSAndroid Build Coastguard Worker# the names bar and baz are used by Bison:
775*cda5da8dSAndroid Build Coastguard Worker#
776*cda5da8dSAndroid Build Coastguard Worker#   m4_define([b4_foo_bison_names(bar)])
777*cda5da8dSAndroid Build Coastguard Worker#   m4_define([b4_foo_bison_names(baz)])
778*cda5da8dSAndroid Build Coastguard Worker#
779*cda5da8dSAndroid Build Coastguard Worker# To invoke b4_check_user_names with TYPE foo, with USER-LIST
780*cda5da8dSAndroid Build Coastguard Worker# b4_foo_user_names, with BISON-NAMESPACE b4_foo_bison_names, and with correct
781*cda5da8dSAndroid Build Coastguard Worker# quoting:
782*cda5da8dSAndroid Build Coastguard Worker#
783*cda5da8dSAndroid Build Coastguard Worker#   b4_check_user_names([[foo]], [b4_foo_user_names],
784*cda5da8dSAndroid Build Coastguard Worker#                       [[b4_foo_bison_names]])
785*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_check_user_names],
786*cda5da8dSAndroid Build Coastguard Worker[m4_foreach([b4_occurrence], $2,
787*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([b4_occurrence], b4_occurrence)dnl
788*cda5da8dSAndroid Build Coastguard Workerm4_pushdef([b4_user_name], m4_car(b4_occurrence))dnl
789*cda5da8dSAndroid Build Coastguard Workerm4_pushdef([b4_start], m4_car(m4_shift(b4_occurrence)))dnl
790*cda5da8dSAndroid Build Coastguard Workerm4_pushdef([b4_end], m4_shift2(b4_occurrence))dnl
791*cda5da8dSAndroid Build Coastguard Workerm4_ifndef($3[(]m4_quote(b4_user_name)[)],
792*cda5da8dSAndroid Build Coastguard Worker          [b4_complain_at([b4_start], [b4_end],
793*cda5da8dSAndroid Build Coastguard Worker                          [[%s '%s' is not used]],
794*cda5da8dSAndroid Build Coastguard Worker                          [$1], [b4_user_name])])[]dnl
795*cda5da8dSAndroid Build Coastguard Workerm4_popdef([b4_occurrence])dnl
796*cda5da8dSAndroid Build Coastguard Workerm4_popdef([b4_user_name])dnl
797*cda5da8dSAndroid Build Coastguard Workerm4_popdef([b4_start])dnl
798*cda5da8dSAndroid Build Coastguard Workerm4_popdef([b4_end])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## --------------------- ##
804*cda5da8dSAndroid Build Coastguard Worker## b4_percent_define_*.  ##
805*cda5da8dSAndroid Build Coastguard Worker## --------------------- ##
806*cda5da8dSAndroid Build Coastguard Worker
807*cda5da8dSAndroid Build Coastguard Worker
808*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_use(VARIABLE)
809*cda5da8dSAndroid Build Coastguard Worker# -------------------------------
810*cda5da8dSAndroid Build Coastguard Worker# Declare that VARIABLE was used.
811*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_use],
812*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_percent_define_bison_variables(]$1[)])dnl
813*cda5da8dSAndroid Build Coastguard Worker])
814*cda5da8dSAndroid Build Coastguard Worker
815*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_get(VARIABLE, [DEFAULT])
816*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------
817*cda5da8dSAndroid Build Coastguard Worker# Mimic muscle_percent_define_get in ../src/muscle-tab.h.  That is, if
818*cda5da8dSAndroid Build Coastguard Worker# the %define variable VARIABLE is defined, emit its value.  Contrary
819*cda5da8dSAndroid Build Coastguard Worker# to its C counterpart, return DEFAULT otherwise.  Also, record
820*cda5da8dSAndroid Build Coastguard Worker# Bison's usage of VARIABLE by defining
821*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_bison_variables(VARIABLE).
822*cda5da8dSAndroid Build Coastguard Worker#
823*cda5da8dSAndroid Build Coastguard Worker# For example:
824*cda5da8dSAndroid Build Coastguard Worker#
825*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_define_get([[foo]])
826*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_get],
827*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_use([$1])dnl
828*cda5da8dSAndroid Build Coastguard Worker_b4_percent_define_ifdef([$1],
829*cda5da8dSAndroid Build Coastguard Worker                         [m4_indir([b4_percent_define(]$1[)])],
830*cda5da8dSAndroid Build Coastguard Worker                         [$2])])
831*cda5da8dSAndroid Build Coastguard Worker
832*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_get_loc(VARIABLE)
833*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------
834*cda5da8dSAndroid Build Coastguard Worker# Mimic muscle_percent_define_get_loc in ../src/muscle-tab.h exactly.  That is,
835*cda5da8dSAndroid Build Coastguard Worker# if the %define variable VARIABLE is undefined, complain fatally since that's
836*cda5da8dSAndroid Build Coastguard Worker# a Bison or skeleton error.  Otherwise, return its definition location in a
837*cda5da8dSAndroid Build Coastguard Worker# form appropriate for the first two arguments of b4_warn_at, b4_complain_at, or
838*cda5da8dSAndroid Build Coastguard Worker# b4_fatal_at.  Don't record this as a Bison usage of VARIABLE as there's no
839*cda5da8dSAndroid Build Coastguard Worker# reason to suspect that the user-supplied value has yet influenced the output.
840*cda5da8dSAndroid Build Coastguard Worker#
841*cda5da8dSAndroid Build Coastguard Worker# For example:
842*cda5da8dSAndroid Build Coastguard Worker#
843*cda5da8dSAndroid Build Coastguard Worker#   b4_complain_at(b4_percent_define_get_loc([[foo]]), [[invalid foo]])
844*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_get_loc],
845*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_percent_define_loc(]$1[)],
846*cda5da8dSAndroid Build Coastguard Worker          [m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl
847*cda5da8dSAndroid Build Coastguard Workerb4_loc[]dnl
848*cda5da8dSAndroid Build Coastguard Workerm4_popdef([b4_loc])],
849*cda5da8dSAndroid Build Coastguard Worker          [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
850*cda5da8dSAndroid Build Coastguard Worker
851*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_get_kind(VARIABLE)
852*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
853*cda5da8dSAndroid Build Coastguard Worker# Get the kind (code, keyword, string) of VARIABLE, i.e., how its
854*cda5da8dSAndroid Build Coastguard Worker# value was defined (braces, not delimiters, quotes).
855*cda5da8dSAndroid Build Coastguard Worker#
856*cda5da8dSAndroid Build Coastguard Worker# If the %define variable VARIABLE is undefined, complain fatally
857*cda5da8dSAndroid Build Coastguard Worker# since that's a Bison or skeleton error.  Don't record this as a
858*cda5da8dSAndroid Build Coastguard Worker# Bison usage of VARIABLE as there's no reason to suspect that the
859*cda5da8dSAndroid Build Coastguard Worker# user-supplied value has yet influenced the output.
860*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_get_kind],
861*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_percent_define_kind(]$1[)],
862*cda5da8dSAndroid Build Coastguard Worker          [m4_indir([b4_percent_define_kind(]$1[)])],
863*cda5da8dSAndroid Build Coastguard Worker          [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
864*cda5da8dSAndroid Build Coastguard Worker
865*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_get_syncline(VARIABLE)dnl
866*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------
867*cda5da8dSAndroid Build Coastguard Worker# Should always be following by a dnl.
868*cda5da8dSAndroid Build Coastguard Worker#
869*cda5da8dSAndroid Build Coastguard Worker# Mimic muscle_percent_define_get_syncline in ../src/muscle-tab.h exactly.
870*cda5da8dSAndroid Build Coastguard Worker# That is, if the %define variable VARIABLE is undefined, complain fatally
871*cda5da8dSAndroid Build Coastguard Worker# since that's a Bison or skeleton error.  Otherwise, return its definition
872*cda5da8dSAndroid Build Coastguard Worker# location as a b4_syncline invocation.  Don't record this as a Bison usage of
873*cda5da8dSAndroid Build Coastguard Worker# VARIABLE as there's no reason to suspect that the user-supplied value has yet
874*cda5da8dSAndroid Build Coastguard Worker# influenced the output.
875*cda5da8dSAndroid Build Coastguard Worker#
876*cda5da8dSAndroid Build Coastguard Worker# For example:
877*cda5da8dSAndroid Build Coastguard Worker#
878*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_define_get_syncline([[foo]])
879*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_get_syncline],
880*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_percent_define_syncline(]$1[)],
881*cda5da8dSAndroid Build Coastguard Worker          [m4_indir([b4_percent_define_syncline(]$1[)])],
882*cda5da8dSAndroid Build Coastguard Worker          [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
883*cda5da8dSAndroid Build Coastguard Worker
884*cda5da8dSAndroid Build Coastguard Worker# _b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
885*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------
886*cda5da8dSAndroid Build Coastguard Worker# If the %define variable VARIABLE is defined, expand IF-TRUE, else expand
887*cda5da8dSAndroid Build Coastguard Worker# IF-FALSE.  Don't record usage of VARIABLE.
888*cda5da8dSAndroid Build Coastguard Worker#
889*cda5da8dSAndroid Build Coastguard Worker# For example:
890*cda5da8dSAndroid Build Coastguard Worker#
891*cda5da8dSAndroid Build Coastguard Worker#   _b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
892*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_percent_define_ifdef],
893*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_percent_define(]$1[)],
894*cda5da8dSAndroid Build Coastguard Worker          [$2],
895*cda5da8dSAndroid Build Coastguard Worker          [$3])])
896*cda5da8dSAndroid Build Coastguard Worker
897*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
898*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------
899*cda5da8dSAndroid Build Coastguard Worker# Mimic muscle_percent_define_ifdef in ../src/muscle-tab.h exactly.  That is,
900*cda5da8dSAndroid Build Coastguard Worker# if the %define variable VARIABLE is defined, expand IF-TRUE, else expand
901*cda5da8dSAndroid Build Coastguard Worker# IF-FALSE.  Also, record Bison's usage of VARIABLE by defining
902*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_bison_variables(VARIABLE).
903*cda5da8dSAndroid Build Coastguard Worker#
904*cda5da8dSAndroid Build Coastguard Worker# For example:
905*cda5da8dSAndroid Build Coastguard Worker#
906*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
907*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_ifdef],
908*cda5da8dSAndroid Build Coastguard Worker[_b4_percent_define_ifdef([$1],
909*cda5da8dSAndroid Build Coastguard Worker                         [b4_percent_define_use([$1])$2],
910*cda5da8dSAndroid Build Coastguard Worker                         [$3])])
911*cda5da8dSAndroid Build Coastguard Worker
912*cda5da8dSAndroid Build Coastguard Worker
913*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_check_file_complain(VARIABLE)
914*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------------------
915*cda5da8dSAndroid Build Coastguard Worker# Warn about %define variable VARIABLE having an incorrect
916*cda5da8dSAndroid Build Coastguard Worker# value.
917*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_check_file_complain],
918*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([$1]),
919*cda5da8dSAndroid Build Coastguard Worker                [[%%define variable '%s' requires 'none' or '"..."' values]],
920*cda5da8dSAndroid Build Coastguard Worker                [$1])])
921*cda5da8dSAndroid Build Coastguard Worker
922*cda5da8dSAndroid Build Coastguard Worker
923*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_check_file(MACRO, VARIABLE, DEFAULT)
924*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------
925*cda5da8dSAndroid Build Coastguard Worker# If the %define variable VARIABLE:
926*cda5da8dSAndroid Build Coastguard Worker# - is undefined, then if DEFAULT is non-empty, define MACRO to DEFAULT
927*cda5da8dSAndroid Build Coastguard Worker# - is a string, define MACRO to its value
928*cda5da8dSAndroid Build Coastguard Worker# - is the keyword 'none', do nothing
929*cda5da8dSAndroid Build Coastguard Worker# - otherwise, warn about the incorrect value.
930*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_check_file],
931*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_ifdef([$2],
932*cda5da8dSAndroid Build Coastguard Worker  [m4_case(b4_percent_define_get_kind([$2]),
933*cda5da8dSAndroid Build Coastguard Worker    [string],
934*cda5da8dSAndroid Build Coastguard Worker         [m4_define([$1], b4_percent_define_get([$2]))],
935*cda5da8dSAndroid Build Coastguard Worker    [keyword],
936*cda5da8dSAndroid Build Coastguard Worker         [m4_if(b4_percent_define_get([$2]), [none], [],
937*cda5da8dSAndroid Build Coastguard Worker                [b4_percent_define_check_file_complain([$2])])],
938*cda5da8dSAndroid Build Coastguard Worker    [b4_percent_define_check_file_complain([$2])])
939*cda5da8dSAndroid Build Coastguard Worker   ],
940*cda5da8dSAndroid Build Coastguard Worker   [m4_ifval([$3],
941*cda5da8dSAndroid Build Coastguard Worker             [m4_define([$1], [$3])])])
942*cda5da8dSAndroid Build Coastguard Worker])
943*cda5da8dSAndroid Build Coastguard Worker
944*cda5da8dSAndroid Build Coastguard Worker
945*cda5da8dSAndroid Build Coastguard Worker
946*cda5da8dSAndroid Build Coastguard Worker## --------- ##
947*cda5da8dSAndroid Build Coastguard Worker## Options.  ##
948*cda5da8dSAndroid Build Coastguard Worker## --------- ##
949*cda5da8dSAndroid Build Coastguard Worker
950*cda5da8dSAndroid Build Coastguard Worker
951*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE])
952*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------------------
953*cda5da8dSAndroid Build Coastguard Worker# Mimic muscle_percent_define_flag_if in ../src/muscle-tab.h exactly.  That is,
954*cda5da8dSAndroid Build Coastguard Worker# if the %define variable VARIABLE is defined to "" or "true", expand IF-TRUE.
955*cda5da8dSAndroid Build Coastguard Worker# If it is defined to "false", expand IF-FALSE.  Complain if it is undefined
956*cda5da8dSAndroid Build Coastguard Worker# (a Bison or skeleton error since the default value should have been set
957*cda5da8dSAndroid Build Coastguard Worker# already) or defined to any other value (possibly a user error).  Also, record
958*cda5da8dSAndroid Build Coastguard Worker# Bison's usage of VARIABLE by defining
959*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_bison_variables(VARIABLE).
960*cda5da8dSAndroid Build Coastguard Worker#
961*cda5da8dSAndroid Build Coastguard Worker# For example:
962*cda5da8dSAndroid Build Coastguard Worker#
963*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_define_flag_if([[foo]], [[it's true]], [[it's false]])
964*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_flag_if],
965*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_ifdef([$1],
966*cda5da8dSAndroid Build Coastguard Worker  [m4_case(b4_percent_define_get([$1]),
967*cda5da8dSAndroid Build Coastguard Worker           [], [$2], [true], [$2], [false], [$3],
968*cda5da8dSAndroid Build Coastguard Worker           [m4_expand_once([b4_complain_at(b4_percent_define_get_loc([$1]),
969*cda5da8dSAndroid Build Coastguard Worker                                           [[invalid value for %%define Boolean variable '%s']],
970*cda5da8dSAndroid Build Coastguard Worker                                           [$1])],
971*cda5da8dSAndroid Build Coastguard Worker                           [[b4_percent_define_flag_if($1)]])])],
972*cda5da8dSAndroid Build Coastguard Worker  [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
973*cda5da8dSAndroid Build Coastguard Worker
974*cda5da8dSAndroid Build Coastguard Worker
975*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_default(VARIABLE, DEFAULT, [KIND = keyword])
976*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------------------------
977*cda5da8dSAndroid Build Coastguard Worker# Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly.  That is,
978*cda5da8dSAndroid Build Coastguard Worker# if the %define variable VARIABLE is undefined, set its value to DEFAULT.
979*cda5da8dSAndroid Build Coastguard Worker# Don't record this as a Bison usage of VARIABLE as there's no reason to
980*cda5da8dSAndroid Build Coastguard Worker# suspect that the value has yet influenced the output.
981*cda5da8dSAndroid Build Coastguard Worker#
982*cda5da8dSAndroid Build Coastguard Worker# For example:
983*cda5da8dSAndroid Build Coastguard Worker#
984*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_define_default([[foo]], [[default value]])
985*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_percent_define_define],
986*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_percent_define(]$1[)], [$2])dnl
987*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_kind(]$1[)],
988*cda5da8dSAndroid Build Coastguard Worker          [m4_default([$3], [keyword])])dnl
989*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_loc(]$1[)],
990*cda5da8dSAndroid Build Coastguard Worker          [[[[<skeleton default value>:-1.-1]],
991*cda5da8dSAndroid Build Coastguard Worker            [[<skeleton default value>:-1.-1]]]])dnl
992*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_syncline(]$1[)], [[]])])
993*cda5da8dSAndroid Build Coastguard Worker
994*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_default],
995*cda5da8dSAndroid Build Coastguard Worker[_b4_percent_define_ifdef([$1], [],
996*cda5da8dSAndroid Build Coastguard Worker                          [_b4_percent_define_define($@)])])
997*cda5da8dSAndroid Build Coastguard Worker
998*cda5da8dSAndroid Build Coastguard Worker
999*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_if_define(NAME, [VARIABLE = NAME])
1000*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------
1001*cda5da8dSAndroid Build Coastguard Worker# Define b4_NAME_if that executes its $1 or $2 depending whether
1002*cda5da8dSAndroid Build Coastguard Worker# VARIABLE was %defined.  The characters '.' and `-' in VARIABLE are mapped
1003*cda5da8dSAndroid Build Coastguard Worker# to '_'.
1004*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_percent_define_if_define],
1005*cda5da8dSAndroid Build Coastguard Worker[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]),
1006*cda5da8dSAndroid Build Coastguard Worker           [b4_percent_define_default([m4_default([$2], [$1])], [[false]])dnl
1007*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_flag_if(m4_default([$2], [$1]),
1008*cda5da8dSAndroid Build Coastguard Worker                                     [$3], [$4])])])
1009*cda5da8dSAndroid Build Coastguard Worker
1010*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_if_define],
1011*cda5da8dSAndroid Build Coastguard Worker[_b4_percent_define_if_define([$1], [$2], $[1], $[2])])
1012*cda5da8dSAndroid Build Coastguard Worker
1013*cda5da8dSAndroid Build Coastguard Worker
1014*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_check_kind(VARIABLE, KIND, [DIAGNOSTIC = complain])
1015*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------------------------------
1016*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_check_kind],
1017*cda5da8dSAndroid Build Coastguard Worker[_b4_percent_define_ifdef([$1],
1018*cda5da8dSAndroid Build Coastguard Worker  [m4_if(b4_percent_define_get_kind([$1]), [$2], [],
1019*cda5da8dSAndroid Build Coastguard Worker    [b4_error([m4_default([$3], [complain])],
1020*cda5da8dSAndroid Build Coastguard Worker              b4_percent_define_get_loc([$1]),
1021*cda5da8dSAndroid Build Coastguard Worker              [m4_case([$2],
1022*cda5da8dSAndroid Build Coastguard Worker                 [code],    [[%%define variable '%s' requires '{...}' values]],
1023*cda5da8dSAndroid Build Coastguard Worker                 [keyword], [[%%define variable '%s' requires keyword values]],
1024*cda5da8dSAndroid Build Coastguard Worker                 [string],  [[%%define variable '%s' requires '"..."' values]])],
1025*cda5da8dSAndroid Build Coastguard Worker              [$1])])])dnl
1026*cda5da8dSAndroid Build Coastguard Worker])
1027*cda5da8dSAndroid Build Coastguard Worker
1028*cda5da8dSAndroid Build Coastguard Worker
1029*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_check_values(VALUES)
1030*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------
1031*cda5da8dSAndroid Build Coastguard Worker# Mimic muscle_percent_define_check_values in ../src/muscle-tab.h exactly
1032*cda5da8dSAndroid Build Coastguard Worker# except that the VALUES structure is more appropriate for M4.  That is, VALUES
1033*cda5da8dSAndroid Build Coastguard Worker# is a list of sublists of strings.  For each sublist, the first string is the
1034*cda5da8dSAndroid Build Coastguard Worker# name of a %define variable, and all remaining strings in that sublist are the
1035*cda5da8dSAndroid Build Coastguard Worker# valid values for that variable.  Complain if such a variable is undefined (a
1036*cda5da8dSAndroid Build Coastguard Worker# Bison error since the default value should have been set already) or defined
1037*cda5da8dSAndroid Build Coastguard Worker# to any other value (possibly a user error).  Don't record this as a Bison
1038*cda5da8dSAndroid Build Coastguard Worker# usage of the variable as there's no reason to suspect that the value has yet
1039*cda5da8dSAndroid Build Coastguard Worker# influenced the output.
1040*cda5da8dSAndroid Build Coastguard Worker#
1041*cda5da8dSAndroid Build Coastguard Worker# For example:
1042*cda5da8dSAndroid Build Coastguard Worker#
1043*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_define_check_values([[[[foo]], [[foo-value1]], [[foo-value2]]]],
1044*cda5da8dSAndroid Build Coastguard Worker#                                  [[[[bar]], [[bar-value1]]]])
1045*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_check_values],
1046*cda5da8dSAndroid Build Coastguard Worker[m4_foreach([b4_sublist], m4_quote($@),
1047*cda5da8dSAndroid Build Coastguard Worker            [_b4_percent_define_check_values(b4_sublist)])])
1048*cda5da8dSAndroid Build Coastguard Worker
1049*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_percent_define_check_values],
1050*cda5da8dSAndroid Build Coastguard Worker[_b4_percent_define_ifdef([$1],
1051*cda5da8dSAndroid Build Coastguard Worker  [b4_percent_define_check_kind(]$1[, [keyword], [deprecated])dnl
1052*cda5da8dSAndroid Build Coastguard Worker   m4_pushdef([b4_good_value], [0])dnl
1053*cda5da8dSAndroid Build Coastguard Worker   m4_if($#, 1, [],
1054*cda5da8dSAndroid Build Coastguard Worker         [m4_foreach([b4_value], m4_dquote(m4_shift($@)),
1055*cda5da8dSAndroid Build Coastguard Worker                     [m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value,
1056*cda5da8dSAndroid Build Coastguard Worker                            [m4_define([b4_good_value], [1])])])])dnl
1057*cda5da8dSAndroid Build Coastguard Worker   m4_if(b4_good_value, [0],
1058*cda5da8dSAndroid Build Coastguard Worker         [b4_complain_at(b4_percent_define_get_loc([$1]),
1059*cda5da8dSAndroid Build Coastguard Worker                         [[invalid value for %%define variable '%s': '%s']],
1060*cda5da8dSAndroid Build Coastguard Worker                         [$1],
1061*cda5da8dSAndroid Build Coastguard Worker                         m4_dquote(m4_indir([b4_percent_define(]$1[)])))
1062*cda5da8dSAndroid Build Coastguard Worker          m4_foreach([b4_value], m4_dquote(m4_shift($@)),
1063*cda5da8dSAndroid Build Coastguard Worker                     [b4_error([[note]], b4_percent_define_get_loc([$1]), []
1064*cda5da8dSAndroid Build Coastguard Worker                                     [[accepted value: '%s']],
1065*cda5da8dSAndroid Build Coastguard Worker                                     m4_dquote(b4_value))])])dnl
1066*cda5da8dSAndroid Build Coastguard Worker   m4_popdef([b4_good_value])],
1067*cda5da8dSAndroid Build Coastguard Worker  [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
1068*cda5da8dSAndroid Build Coastguard Worker
1069*cda5da8dSAndroid Build Coastguard Worker# b4_percent_code_get([QUALIFIER])
1070*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
1071*cda5da8dSAndroid Build Coastguard Worker# If any %code blocks for QUALIFIER are defined, emit them beginning with a
1072*cda5da8dSAndroid Build Coastguard Worker# comment and ending with synclines and a newline.  If QUALIFIER is not
1073*cda5da8dSAndroid Build Coastguard Worker# specified or empty, do this for the unqualified %code blocks.  Also, record
1074*cda5da8dSAndroid Build Coastguard Worker# Bison's usage of QUALIFIER (if specified) by defining
1075*cda5da8dSAndroid Build Coastguard Worker# b4_percent_code_bison_qualifiers(QUALIFIER).
1076*cda5da8dSAndroid Build Coastguard Worker#
1077*cda5da8dSAndroid Build Coastguard Worker# For example, to emit any unqualified %code blocks followed by any %code
1078*cda5da8dSAndroid Build Coastguard Worker# blocks for the qualifier foo:
1079*cda5da8dSAndroid Build Coastguard Worker#
1080*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_code_get
1081*cda5da8dSAndroid Build Coastguard Worker#   b4_percent_code_get([[foo]])
1082*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_code_get],
1083*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([b4_macro_name], [[b4_percent_code(]$1[)]])dnl
1084*cda5da8dSAndroid Build Coastguard Workerm4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])dnl
1085*cda5da8dSAndroid Build Coastguard Workerm4_ifdef(b4_macro_name,
1086*cda5da8dSAndroid Build Coastguard Worker[b4_comment(m4_if([$#], [0], [[[Unqualified %code blocks.]]],
1087*cda5da8dSAndroid Build Coastguard Worker                  [[["%code ]$1[" blocks.]]]))
1088*cda5da8dSAndroid Build Coastguard Workerb4_user_code([m4_indir(b4_macro_name)])])dnl
1089*cda5da8dSAndroid Build Coastguard Workerm4_popdef([b4_macro_name])])
1090*cda5da8dSAndroid Build Coastguard Worker
1091*cda5da8dSAndroid Build Coastguard Worker# b4_percent_code_ifdef(QUALIFIER, IF-TRUE, [IF-FALSE])
1092*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------------------------
1093*cda5da8dSAndroid Build Coastguard Worker# If any %code blocks for QUALIFIER (or unqualified %code blocks if
1094*cda5da8dSAndroid Build Coastguard Worker# QUALIFIER is empty) are defined, expand IF-TRUE, else expand IF-FALSE.
1095*cda5da8dSAndroid Build Coastguard Worker# Also, record Bison's usage of QUALIFIER (if specified) by defining
1096*cda5da8dSAndroid Build Coastguard Worker# b4_percent_code_bison_qualifiers(QUALIFIER).
1097*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_code_ifdef],
1098*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_percent_code(]$1[)],
1099*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2],
1100*cda5da8dSAndroid Build Coastguard Worker          [$3])])
1101*cda5da8dSAndroid Build Coastguard Worker
1102*cda5da8dSAndroid Build Coastguard Worker
1103*cda5da8dSAndroid Build Coastguard Worker## ------------------ ##
1104*cda5da8dSAndroid Build Coastguard Worker## Common variables.  ##
1105*cda5da8dSAndroid Build Coastguard Worker## ------------------ ##
1106*cda5da8dSAndroid Build Coastguard Worker
1107*cda5da8dSAndroid Build Coastguard Worker
1108*cda5da8dSAndroid Build Coastguard Worker# b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT])
1109*cda5da8dSAndroid Build Coastguard Worker# b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT])
1110*cda5da8dSAndroid Build Coastguard Worker# b4_token_ctor_if([IF-YYLEX-RETURNS-A-TOKEN], [IF-NOT])
1111*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------------
1112*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_if_define([api.token.raw])
1113*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_if_define([token_ctor], [api.token.constructor])
1114*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_if_define([locations])     # Whether locations are tracked.
1115*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_if_define([parse.assert])
1116*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_if_define([parse.trace])
1117*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_if_define([posix])
1118*cda5da8dSAndroid Build Coastguard Worker
1119*cda5da8dSAndroid Build Coastguard Worker
1120*cda5da8dSAndroid Build Coastguard Worker# b4_bison_locations_if([IF-TRUE])
1121*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
1122*cda5da8dSAndroid Build Coastguard Worker# Expand IF-TRUE if using locations, and using the default location
1123*cda5da8dSAndroid Build Coastguard Worker# type.
1124*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_bison_locations_if],
1125*cda5da8dSAndroid Build Coastguard Worker[b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [], [$1])])])
1126*cda5da8dSAndroid Build Coastguard Worker
1127*cda5da8dSAndroid Build Coastguard Worker
1128*cda5da8dSAndroid Build Coastguard Worker
1129*cda5da8dSAndroid Build Coastguard Worker# %define parse.error "(custom|detailed|simple|verbose)"
1130*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------
1131*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[parse.error]], [[simple]])
1132*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_values([[[[parse.error]],
1133*cda5da8dSAndroid Build Coastguard Worker                                 [[custom]], [[detailed]], [[simple]], [[verbose]]]])
1134*cda5da8dSAndroid Build Coastguard Worker
1135*cda5da8dSAndroid Build Coastguard Worker# b4_parse_error_case(CASE1, THEN1, CASE2, THEN2, ..., ELSE)
1136*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------------
1137*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_error_case],
1138*cda5da8dSAndroid Build Coastguard Worker[m4_case(b4_percent_define_get([[parse.error]]), $@)])
1139*cda5da8dSAndroid Build Coastguard Worker
1140*cda5da8dSAndroid Build Coastguard Worker# b4_parse_error_bmatch(PATTERN1, THEN1, PATTERN2, THEN2, ..., ELSE)
1141*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------------------
1142*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_error_bmatch],
1143*cda5da8dSAndroid Build Coastguard Worker[m4_bmatch(b4_percent_define_get([[parse.error]]), $@)])
1144*cda5da8dSAndroid Build Coastguard Worker
1145*cda5da8dSAndroid Build Coastguard Worker
1146*cda5da8dSAndroid Build Coastguard Worker
1147*cda5da8dSAndroid Build Coastguard Worker# b4_union_if([IF-UNION-ARE-USED], [IF-NOT])
1148*cda5da8dSAndroid Build Coastguard Worker# b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
1149*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------
1150*cda5da8dSAndroid Build Coastguard Worker# Depend on whether api.value.type is union, or variant.
1151*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_union_flag],   [[0]])
1152*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_variant_flag], [[0]])
1153*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_ifdef([[api.value.type]],
1154*cda5da8dSAndroid Build Coastguard Worker   [m4_case(b4_percent_define_get_kind([[api.value.type]]), [keyword],
1155*cda5da8dSAndroid Build Coastguard Worker            [m4_case(b4_percent_define_get([[api.value.type]]),
1156*cda5da8dSAndroid Build Coastguard Worker                     [union],   [m4_define([b4_union_flag],   [[1]])],
1157*cda5da8dSAndroid Build Coastguard Worker                     [variant], [m4_define([b4_variant_flag], [[1]])])])])
1158*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([union])
1159*cda5da8dSAndroid Build Coastguard Workerb4_define_flag_if([variant])
1160*cda5da8dSAndroid Build Coastguard Worker
1161*cda5da8dSAndroid Build Coastguard Worker
1162*cda5da8dSAndroid Build Coastguard Worker## ----------------------------------------------------------- ##
1163*cda5da8dSAndroid Build Coastguard Worker## After processing the skeletons, check that all the user's   ##
1164*cda5da8dSAndroid Build Coastguard Worker## %define variables and %code qualifiers were used by Bison.  ##
1165*cda5da8dSAndroid Build Coastguard Worker## ----------------------------------------------------------- ##
1166*cda5da8dSAndroid Build Coastguard Worker
1167*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_check_user_names_wrap],
1168*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_percent_]$1[_user_]$2[s],
1169*cda5da8dSAndroid Build Coastguard Worker          [b4_check_user_names([[%]$1 $2],
1170*cda5da8dSAndroid Build Coastguard Worker                               [b4_percent_]$1[_user_]$2[s],
1171*cda5da8dSAndroid Build Coastguard Worker                               [[b4_percent_]$1[_bison_]$2[s]])])])
1172*cda5da8dSAndroid Build Coastguard Worker
1173*cda5da8dSAndroid Build Coastguard Workerm4_wrap_lifo([
1174*cda5da8dSAndroid Build Coastguard Workerb4_check_user_names_wrap([[define]], [[variable]])
1175*cda5da8dSAndroid Build Coastguard Workerb4_check_user_names_wrap([[code]], [[qualifier]])
1176*cda5da8dSAndroid Build Coastguard Worker])
1177*cda5da8dSAndroid Build Coastguard Worker
1178*cda5da8dSAndroid Build Coastguard Worker
1179*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
1180*cda5da8dSAndroid Build Coastguard Worker## Default values.  ##
1181*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
1182*cda5da8dSAndroid Build Coastguard Worker
1183*cda5da8dSAndroid Build Coastguard Worker# m4_define_default([b4_lex_param], [])   dnl breaks other skeletons
1184*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_epilogue], [])
1185*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_parse_param], [])
1186*cda5da8dSAndroid Build Coastguard Worker
1187*cda5da8dSAndroid Build Coastguard Worker# The initial column and line.
1188*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_location_initial_column], [1])
1189*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_location_initial_line],   [1])
1190*cda5da8dSAndroid Build Coastguard Worker
1191*cda5da8dSAndroid Build Coastguard Worker
1192*cda5da8dSAndroid Build Coastguard Worker## --------------- ##
1193*cda5da8dSAndroid Build Coastguard Worker## Sanity checks.  ##
1194*cda5da8dSAndroid Build Coastguard Worker## --------------- ##
1195*cda5da8dSAndroid Build Coastguard Worker
1196*cda5da8dSAndroid Build Coastguard Worker# api.location.type={...} (C, C++ and Java).
1197*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_kind([api.location.type], [code], [deprecated])
1198*cda5da8dSAndroid Build Coastguard Worker
1199*cda5da8dSAndroid Build Coastguard Worker# api.position.type={...} (Java).
1200*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_kind([api.position.type], [code], [deprecated])
1201*cda5da8dSAndroid Build Coastguard Worker
1202*cda5da8dSAndroid Build Coastguard Worker# api.prefix >< %name-prefix.
1203*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_kind([api.prefix], [code], [deprecated])
1204*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_ifdef([api.prefix],
1205*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_prefix],
1206*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([api.prefix]),
1207*cda5da8dSAndroid Build Coastguard Worker                [['%s' and '%s' cannot be used together]],
1208*cda5da8dSAndroid Build Coastguard Worker                [%name-prefix],
1209*cda5da8dSAndroid Build Coastguard Worker                [%define api.prefix])])])
1210*cda5da8dSAndroid Build Coastguard Worker
1211*cda5da8dSAndroid Build Coastguard Worker# api.token.prefix={...}
1212*cda5da8dSAndroid Build Coastguard Worker# Make it a warning for those who used betas of Bison 3.0.
1213*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_kind([api.token.prefix], [code], [deprecated])
1214*cda5da8dSAndroid Build Coastguard Worker
1215*cda5da8dSAndroid Build Coastguard Worker# api.value.type >< %union.
1216*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_ifdef([api.value.type],
1217*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([b4_union_members],
1218*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([api.value.type]),
1219*cda5da8dSAndroid Build Coastguard Worker                [['%s' and '%s' cannot be used together]],
1220*cda5da8dSAndroid Build Coastguard Worker                [%union],
1221*cda5da8dSAndroid Build Coastguard Worker                [%define api.value.type])])])
1222*cda5da8dSAndroid Build Coastguard Worker
1223*cda5da8dSAndroid Build Coastguard Worker# api.value.type=union >< %yacc.
1224*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_ifdef([api.value.type],
1225*cda5da8dSAndroid Build Coastguard Worker[m4_if(b4_percent_define_get([api.value.type]), [union],
1226*cda5da8dSAndroid Build Coastguard Worker[b4_yacc_if(dnl
1227*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([api.value.type]),
1228*cda5da8dSAndroid Build Coastguard Worker                [['%s' and '%s' cannot be used together]],
1229*cda5da8dSAndroid Build Coastguard Worker                [%yacc],
1230*cda5da8dSAndroid Build Coastguard Worker                [%define api.value.type "union"])])])])
1231*cda5da8dSAndroid Build Coastguard Worker
1232*cda5da8dSAndroid Build Coastguard Worker# api.value.union.name.
1233*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_kind([api.value.union.name], [keyword])
1234*cda5da8dSAndroid Build Coastguard Worker
1235*cda5da8dSAndroid Build Coastguard Worker# parse.error (custom|detailed) >< token-table.
1236*cda5da8dSAndroid Build Coastguard Workerb4_token_table_if(
1237*cda5da8dSAndroid Build Coastguard Worker[b4_parse_error_bmatch([custom\|detailed],
1238*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([parse.error]),
1239*cda5da8dSAndroid Build Coastguard Worker                [['%s' and '%s' cannot be used together]],
1240*cda5da8dSAndroid Build Coastguard Worker                [%token-table],
1241*cda5da8dSAndroid Build Coastguard Worker                [%define parse.error (custom|detailed)])])])
1242