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