1*cda5da8dSAndroid Build Coastguard Workerdivert(-1)# -*- Autoconf -*- 2*cda5da8dSAndroid Build Coastguard Worker# This file is part of Autoconf. 3*cda5da8dSAndroid Build Coastguard Worker# Base M4 layer. 4*cda5da8dSAndroid Build Coastguard Worker# Requires GNU M4. 5*cda5da8dSAndroid Build Coastguard Worker# 6*cda5da8dSAndroid Build Coastguard Worker# Copyright (C) 1999-2017, 2020 Free Software Foundation, Inc. 7*cda5da8dSAndroid Build Coastguard Worker 8*cda5da8dSAndroid Build Coastguard Worker# This file is part of Autoconf. This program is free 9*cda5da8dSAndroid Build Coastguard Worker# software; you can redistribute it and/or modify it under the 10*cda5da8dSAndroid Build Coastguard Worker# terms of the GNU General Public License as published by the 11*cda5da8dSAndroid Build Coastguard Worker# Free Software Foundation, either version 3 of the License, or 12*cda5da8dSAndroid Build Coastguard Worker# (at your option) any later version. 13*cda5da8dSAndroid Build Coastguard Worker# 14*cda5da8dSAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful, 15*cda5da8dSAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of 16*cda5da8dSAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*cda5da8dSAndroid Build Coastguard Worker# GNU General Public License for more details. 18*cda5da8dSAndroid Build Coastguard Worker# 19*cda5da8dSAndroid Build Coastguard Worker# Under Section 7 of GPL version 3, you are granted additional 20*cda5da8dSAndroid Build Coastguard Worker# permissions described in the Autoconf Configure Script Exception, 21*cda5da8dSAndroid Build Coastguard Worker# version 3.0, as published by the Free Software Foundation. 22*cda5da8dSAndroid Build Coastguard Worker# 23*cda5da8dSAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License 24*cda5da8dSAndroid Build Coastguard Worker# and a copy of the Autoconf Configure Script Exception along with 25*cda5da8dSAndroid Build Coastguard Worker# this program; see the files COPYINGv3 and COPYING.EXCEPTION 26*cda5da8dSAndroid Build Coastguard Worker# respectively. If not, see <https://www.gnu.org/licenses/>. 27*cda5da8dSAndroid Build Coastguard Worker 28*cda5da8dSAndroid Build Coastguard Worker# Written by Akim Demaille. 29*cda5da8dSAndroid Build Coastguard Worker 30*cda5da8dSAndroid Build Coastguard Worker# Set the quotes, whatever the current quoting system. 31*cda5da8dSAndroid Build Coastguard Workerchangequote() 32*cda5da8dSAndroid Build Coastguard Workerchangequote([, ]) 33*cda5da8dSAndroid Build Coastguard Worker 34*cda5da8dSAndroid Build Coastguard Worker# Some old m4's don't support m4exit. But they provide 35*cda5da8dSAndroid Build Coastguard Worker# equivalent functionality by core dumping because of the 36*cda5da8dSAndroid Build Coastguard Worker# long macros we define. 37*cda5da8dSAndroid Build Coastguard Workerifdef([__gnu__], , 38*cda5da8dSAndroid Build Coastguard Worker[errprint(M4sugar requires GNU M4. Install it before installing M4sugar or 39*cda5da8dSAndroid Build Coastguard Workerset the M4 environment variable to its absolute file name.) 40*cda5da8dSAndroid Build Coastguard Workerm4exit(2)]) 41*cda5da8dSAndroid Build Coastguard Worker 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Worker## ------------------------------- ## 44*cda5da8dSAndroid Build Coastguard Worker## 1. Simulate --prefix-builtins. ## 45*cda5da8dSAndroid Build Coastguard Worker## ------------------------------- ## 46*cda5da8dSAndroid Build Coastguard Worker 47*cda5da8dSAndroid Build Coastguard Worker# m4_define 48*cda5da8dSAndroid Build Coastguard Worker# m4_defn 49*cda5da8dSAndroid Build Coastguard Worker# m4_undefine 50*cda5da8dSAndroid Build Coastguard Workerdefine([m4_define], defn([define])) 51*cda5da8dSAndroid Build Coastguard Workerdefine([m4_defn], defn([defn])) 52*cda5da8dSAndroid Build Coastguard Workerdefine([m4_undefine], defn([undefine])) 53*cda5da8dSAndroid Build Coastguard Worker 54*cda5da8dSAndroid Build Coastguard Workerm4_undefine([define]) 55*cda5da8dSAndroid Build Coastguard Workerm4_undefine([defn]) 56*cda5da8dSAndroid Build Coastguard Workerm4_undefine([undefine]) 57*cda5da8dSAndroid Build Coastguard Worker 58*cda5da8dSAndroid Build Coastguard Worker 59*cda5da8dSAndroid Build Coastguard Worker# m4_copy(SRC, DST) 60*cda5da8dSAndroid Build Coastguard Worker# ----------------- 61*cda5da8dSAndroid Build Coastguard Worker# Define DST as the definition of SRC. 62*cda5da8dSAndroid Build Coastguard Worker# What's the difference between: 63*cda5da8dSAndroid Build Coastguard Worker# 1. m4_copy([from], [to]) 64*cda5da8dSAndroid Build Coastguard Worker# 2. m4_define([to], [from($@)]) 65*cda5da8dSAndroid Build Coastguard Worker# Well, obviously 1 is more expensive in space. Maybe 2 is more expensive 66*cda5da8dSAndroid Build Coastguard Worker# in time, but because of the space cost of 1, it's not that obvious. 67*cda5da8dSAndroid Build Coastguard Worker# Nevertheless, one huge difference is the handling of `$0'. If `from' 68*cda5da8dSAndroid Build Coastguard Worker# uses `$0', then with 1, `to''s `$0' is `to', while it is `from' in 2. 69*cda5da8dSAndroid Build Coastguard Worker# The user would certainly prefer to see `to'. 70*cda5da8dSAndroid Build Coastguard Worker# 71*cda5da8dSAndroid Build Coastguard Worker# This definition is in effect during m4sugar initialization, when 72*cda5da8dSAndroid Build Coastguard Worker# there are no pushdef stacks; later on, we redefine it to something 73*cda5da8dSAndroid Build Coastguard Worker# more powerful for all other clients to use. 74*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_copy], 75*cda5da8dSAndroid Build Coastguard Worker[m4_define([$2], m4_defn([$1]))]) 76*cda5da8dSAndroid Build Coastguard Worker 77*cda5da8dSAndroid Build Coastguard Worker 78*cda5da8dSAndroid Build Coastguard Worker# m4_rename(SRC, DST) 79*cda5da8dSAndroid Build Coastguard Worker# ------------------- 80*cda5da8dSAndroid Build Coastguard Worker# Rename the macro SRC to DST. 81*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_rename], 82*cda5da8dSAndroid Build Coastguard Worker[m4_copy([$1], [$2])m4_undefine([$1])]) 83*cda5da8dSAndroid Build Coastguard Worker 84*cda5da8dSAndroid Build Coastguard Worker 85*cda5da8dSAndroid Build Coastguard Worker# m4_rename_m4(MACRO-NAME) 86*cda5da8dSAndroid Build Coastguard Worker# ------------------------ 87*cda5da8dSAndroid Build Coastguard Worker# Rename MACRO-NAME to m4_MACRO-NAME. 88*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_rename_m4], 89*cda5da8dSAndroid Build Coastguard Worker[m4_rename([$1], [m4_$1])]) 90*cda5da8dSAndroid Build Coastguard Worker 91*cda5da8dSAndroid Build Coastguard Worker 92*cda5da8dSAndroid Build Coastguard Worker# m4_copy_unm4(m4_MACRO-NAME) 93*cda5da8dSAndroid Build Coastguard Worker# --------------------------- 94*cda5da8dSAndroid Build Coastguard Worker# Copy m4_MACRO-NAME to MACRO-NAME. 95*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_copy_unm4], 96*cda5da8dSAndroid Build Coastguard Worker[m4_copy([$1], m4_bpatsubst([$1], [^m4_\(.*\)], [[\1]]))]) 97*cda5da8dSAndroid Build Coastguard Worker 98*cda5da8dSAndroid Build Coastguard Worker 99*cda5da8dSAndroid Build Coastguard Worker# Some m4 internals have names colliding with tokens we might use. 100*cda5da8dSAndroid Build Coastguard Worker# Rename them a` la `m4 --prefix-builtins'. Conditionals first, since 101*cda5da8dSAndroid Build Coastguard Worker# some subsequent renames are conditional. 102*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([ifdef]) 103*cda5da8dSAndroid Build Coastguard Workerm4_rename([ifelse], [m4_if]) 104*cda5da8dSAndroid Build Coastguard Worker 105*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([builtin]) 106*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([changecom]) 107*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([changequote]) 108*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([changeword],dnl conditionally available in 1.4.x 109*cda5da8dSAndroid Build Coastguard Worker[m4_undefine([changeword])]) 110*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([debugfile]) 111*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([debugmode]) 112*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([decr]) 113*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([divnum]) 114*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([dumpdef]) 115*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([errprint]) 116*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([esyscmd]) 117*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([eval]) 118*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([format]) 119*cda5da8dSAndroid Build Coastguard Workerm4_undefine([include]) 120*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([incr]) 121*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([index]) 122*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([indir]) 123*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([len]) 124*cda5da8dSAndroid Build Coastguard Workerm4_rename([m4exit], [m4_exit]) 125*cda5da8dSAndroid Build Coastguard Workerm4_undefine([m4wrap]) 126*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([mkstemp],dnl added in M4 1.4.8 127*cda5da8dSAndroid Build Coastguard Worker[m4_rename_m4([mkstemp]) 128*cda5da8dSAndroid Build Coastguard Workerm4_copy([m4_mkstemp], [m4_maketemp]) 129*cda5da8dSAndroid Build Coastguard Workerm4_undefine([maketemp])], 130*cda5da8dSAndroid Build Coastguard Worker[m4_rename_m4([maketemp]) 131*cda5da8dSAndroid Build Coastguard Workerm4_copy([m4_maketemp], [m4_mkstemp])]) 132*cda5da8dSAndroid Build Coastguard Workerm4_rename([patsubst], [m4_bpatsubst]) 133*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([popdef]) 134*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([pushdef]) 135*cda5da8dSAndroid Build Coastguard Workerm4_rename([regexp], [m4_bregexp]) 136*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([shift]) 137*cda5da8dSAndroid Build Coastguard Workerm4_undefine([sinclude]) 138*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([substr]) 139*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([symbols],dnl present only in alpha-quality 1.4o 140*cda5da8dSAndroid Build Coastguard Worker[m4_rename_m4([symbols])]) 141*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([syscmd]) 142*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([sysval]) 143*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([traceoff]) 144*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([traceon]) 145*cda5da8dSAndroid Build Coastguard Workerm4_rename_m4([translit]) 146*cda5da8dSAndroid Build Coastguard Worker 147*cda5da8dSAndroid Build Coastguard Worker# _m4_defn(ARG) 148*cda5da8dSAndroid Build Coastguard Worker# ------------- 149*cda5da8dSAndroid Build Coastguard Worker# _m4_defn is for internal use only - it bypasses the wrapper, so it 150*cda5da8dSAndroid Build Coastguard Worker# must only be used on one argument at a time, and only on macros 151*cda5da8dSAndroid Build Coastguard Worker# known to be defined. Make sure this still works if the user renames 152*cda5da8dSAndroid Build Coastguard Worker# m4_defn but not _m4_defn. 153*cda5da8dSAndroid Build Coastguard Workerm4_copy([m4_defn], [_m4_defn]) 154*cda5da8dSAndroid Build Coastguard Worker 155*cda5da8dSAndroid Build Coastguard Worker# _m4_divert_raw(NUM) 156*cda5da8dSAndroid Build Coastguard Worker# ------------------- 157*cda5da8dSAndroid Build Coastguard Worker# _m4_divert_raw is for internal use only. Use this instead of 158*cda5da8dSAndroid Build Coastguard Worker# m4_builtin([divert], NUM), so that tracing diversion flow is easier. 159*cda5da8dSAndroid Build Coastguard Workerm4_rename([divert], [_m4_divert_raw]) 160*cda5da8dSAndroid Build Coastguard Worker 161*cda5da8dSAndroid Build Coastguard Worker# _m4_popdef(ARG...) 162*cda5da8dSAndroid Build Coastguard Worker# ------------------ 163*cda5da8dSAndroid Build Coastguard Worker# _m4_popdef is for internal use only - it bypasses the wrapper, so it 164*cda5da8dSAndroid Build Coastguard Worker# must only be used on macros known to be defined. Make sure this 165*cda5da8dSAndroid Build Coastguard Worker# still works if the user renames m4_popdef but not _m4_popdef. 166*cda5da8dSAndroid Build Coastguard Workerm4_copy([m4_popdef], [_m4_popdef]) 167*cda5da8dSAndroid Build Coastguard Worker 168*cda5da8dSAndroid Build Coastguard Worker# _m4_undefine(ARG...) 169*cda5da8dSAndroid Build Coastguard Worker# -------------------- 170*cda5da8dSAndroid Build Coastguard Worker# _m4_undefine is for internal use only - it bypasses the wrapper, so 171*cda5da8dSAndroid Build Coastguard Worker# it must only be used on macros known to be defined. Make sure this 172*cda5da8dSAndroid Build Coastguard Worker# still works if the user renames m4_undefine but not _m4_undefine. 173*cda5da8dSAndroid Build Coastguard Workerm4_copy([m4_undefine], [_m4_undefine]) 174*cda5da8dSAndroid Build Coastguard Worker 175*cda5da8dSAndroid Build Coastguard Worker# _m4_undivert(NUM...) 176*cda5da8dSAndroid Build Coastguard Worker# -------------------- 177*cda5da8dSAndroid Build Coastguard Worker# _m4_undivert is for internal use only, and should always be given 178*cda5da8dSAndroid Build Coastguard Worker# arguments. Use this instead of m4_builtin([undivert], NUM...), so 179*cda5da8dSAndroid Build Coastguard Worker# that tracing diversion flow is easier. 180*cda5da8dSAndroid Build Coastguard Workerm4_rename([undivert], [_m4_undivert]) 181*cda5da8dSAndroid Build Coastguard Worker 182*cda5da8dSAndroid Build Coastguard Worker 183*cda5da8dSAndroid Build Coastguard Worker## ------------------- ## 184*cda5da8dSAndroid Build Coastguard Worker## 2. Error messages. ## 185*cda5da8dSAndroid Build Coastguard Worker## ------------------- ## 186*cda5da8dSAndroid Build Coastguard Worker 187*cda5da8dSAndroid Build Coastguard Worker 188*cda5da8dSAndroid Build Coastguard Worker# m4_location 189*cda5da8dSAndroid Build Coastguard Worker# ----------- 190*cda5da8dSAndroid Build Coastguard Worker# Output the current file, colon, and the current line number. 191*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_location], 192*cda5da8dSAndroid Build Coastguard Worker[__file__:__line__]) 193*cda5da8dSAndroid Build Coastguard Worker 194*cda5da8dSAndroid Build Coastguard Worker 195*cda5da8dSAndroid Build Coastguard Worker# m4_errprintn(MSG) 196*cda5da8dSAndroid Build Coastguard Worker# ----------------- 197*cda5da8dSAndroid Build Coastguard Worker# Same as `errprint', but with the missing end of line. 198*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_errprintn], 199*cda5da8dSAndroid Build Coastguard Worker[m4_errprint([$1 200*cda5da8dSAndroid Build Coastguard Worker])]) 201*cda5da8dSAndroid Build Coastguard Worker 202*cda5da8dSAndroid Build Coastguard Worker 203*cda5da8dSAndroid Build Coastguard Worker# m4_warning(MSG) 204*cda5da8dSAndroid Build Coastguard Worker# --------------- 205*cda5da8dSAndroid Build Coastguard Worker# Warn the user. 206*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_warning], 207*cda5da8dSAndroid Build Coastguard Worker[m4_errprintn(m4_location[: warning: $1])]) 208*cda5da8dSAndroid Build Coastguard Worker 209*cda5da8dSAndroid Build Coastguard Worker 210*cda5da8dSAndroid Build Coastguard Worker# m4_fatal(MSG, [EXIT-STATUS]) 211*cda5da8dSAndroid Build Coastguard Worker# ---------------------------- 212*cda5da8dSAndroid Build Coastguard Worker# Fatal the user. :) 213*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_fatal], 214*cda5da8dSAndroid Build Coastguard Worker[m4_errprintn(m4_location[: error: $1] 215*cda5da8dSAndroid Build Coastguard Workerm4_expansion_stack)m4_exit(m4_if([$2],, 1, [$2]))]) 216*cda5da8dSAndroid Build Coastguard Worker 217*cda5da8dSAndroid Build Coastguard Worker 218*cda5da8dSAndroid Build Coastguard Worker# m4_assert(EXPRESSION, [EXIT-STATUS = 1]) 219*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------- 220*cda5da8dSAndroid Build Coastguard Worker# This macro ensures that EXPRESSION evaluates to true, and exits if 221*cda5da8dSAndroid Build Coastguard Worker# EXPRESSION evaluates to false. 222*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_assert], 223*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_eval([$1]), 0, 224*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([assert failed: $1], [$2])])]) 225*cda5da8dSAndroid Build Coastguard Worker 226*cda5da8dSAndroid Build Coastguard Worker 227*cda5da8dSAndroid Build Coastguard Worker 228*cda5da8dSAndroid Build Coastguard Worker## ------------- ## 229*cda5da8dSAndroid Build Coastguard Worker## 3. Warnings. ## 230*cda5da8dSAndroid Build Coastguard Worker## ------------- ## 231*cda5da8dSAndroid Build Coastguard Worker 232*cda5da8dSAndroid Build Coastguard Worker 233*cda5da8dSAndroid Build Coastguard Worker# _m4_warn(CATEGORY, MESSAGE, [STACK-TRACE]) 234*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------ 235*cda5da8dSAndroid Build Coastguard Worker# Report a MESSAGE to the user if the CATEGORY of warnings is enabled. 236*cda5da8dSAndroid Build Coastguard Worker# This is for traces only. 237*cda5da8dSAndroid Build Coastguard Worker# If present, STACK-TRACE is a \n-separated list of "LOCATION: MESSAGE", 238*cda5da8dSAndroid Build Coastguard Worker# where the last line (and no other) ends with "the top level". 239*cda5da8dSAndroid Build Coastguard Worker# 240*cda5da8dSAndroid Build Coastguard Worker# Within m4, the macro is a no-op. This macro really matters 241*cda5da8dSAndroid Build Coastguard Worker# when autom4te post-processes the trace output. 242*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_warn], []) 243*cda5da8dSAndroid Build Coastguard Worker 244*cda5da8dSAndroid Build Coastguard Worker 245*cda5da8dSAndroid Build Coastguard Worker# m4_warn(CATEGORY, MESSAGE) 246*cda5da8dSAndroid Build Coastguard Worker# -------------------------- 247*cda5da8dSAndroid Build Coastguard Worker# Report a MESSAGE to the user if the CATEGORY of warnings is enabled. 248*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_warn], 249*cda5da8dSAndroid Build Coastguard Worker[_m4_warn([$1], [$2], 250*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([_m4_expansion_stack], [m4_expansion_stack]))]) 251*cda5da8dSAndroid Build Coastguard Worker 252*cda5da8dSAndroid Build Coastguard Worker 253*cda5da8dSAndroid Build Coastguard Worker 254*cda5da8dSAndroid Build Coastguard Worker## ------------------- ## 255*cda5da8dSAndroid Build Coastguard Worker## 4. File inclusion. ## 256*cda5da8dSAndroid Build Coastguard Worker## ------------------- ## 257*cda5da8dSAndroid Build Coastguard Worker 258*cda5da8dSAndroid Build Coastguard Worker 259*cda5da8dSAndroid Build Coastguard Worker# We also want to neutralize include (and sinclude for symmetry), 260*cda5da8dSAndroid Build Coastguard Worker# but we want to extend them slightly: warn when a file is included 261*cda5da8dSAndroid Build Coastguard Worker# several times. This is, in general, a dangerous operation, because 262*cda5da8dSAndroid Build Coastguard Worker# too many people forget to quote the first argument of m4_define. 263*cda5da8dSAndroid Build Coastguard Worker# 264*cda5da8dSAndroid Build Coastguard Worker# For instance in the following case: 265*cda5da8dSAndroid Build Coastguard Worker# m4_define(foo, [bar]) 266*cda5da8dSAndroid Build Coastguard Worker# then a second reading will turn into 267*cda5da8dSAndroid Build Coastguard Worker# m4_define(bar, [bar]) 268*cda5da8dSAndroid Build Coastguard Worker# which is certainly not what was meant. 269*cda5da8dSAndroid Build Coastguard Worker 270*cda5da8dSAndroid Build Coastguard Worker# m4_include_unique(FILE) 271*cda5da8dSAndroid Build Coastguard Worker# ----------------------- 272*cda5da8dSAndroid Build Coastguard Worker# Declare that the FILE was loading; and warn if it has already 273*cda5da8dSAndroid Build Coastguard Worker# been included. 274*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_include_unique], 275*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([m4_include($1)], 276*cda5da8dSAndroid Build Coastguard Worker [m4_warn([syntax], [file `$1' included several times])])dnl 277*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_include($1)])]) 278*cda5da8dSAndroid Build Coastguard Worker 279*cda5da8dSAndroid Build Coastguard Worker 280*cda5da8dSAndroid Build Coastguard Worker# m4_include(FILE) 281*cda5da8dSAndroid Build Coastguard Worker# ---------------- 282*cda5da8dSAndroid Build Coastguard Worker# Like the builtin include, but warns against multiple inclusions. 283*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_include], 284*cda5da8dSAndroid Build Coastguard Worker[m4_include_unique([$1])dnl 285*cda5da8dSAndroid Build Coastguard Workerm4_builtin([include], [$1])]) 286*cda5da8dSAndroid Build Coastguard Worker 287*cda5da8dSAndroid Build Coastguard Worker 288*cda5da8dSAndroid Build Coastguard Worker# m4_sinclude(FILE) 289*cda5da8dSAndroid Build Coastguard Worker# ----------------- 290*cda5da8dSAndroid Build Coastguard Worker# Like the builtin sinclude, but warns against multiple inclusions. 291*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_sinclude], 292*cda5da8dSAndroid Build Coastguard Worker[m4_include_unique([$1])dnl 293*cda5da8dSAndroid Build Coastguard Workerm4_builtin([sinclude], [$1])]) 294*cda5da8dSAndroid Build Coastguard Worker 295*cda5da8dSAndroid Build Coastguard Worker 296*cda5da8dSAndroid Build Coastguard Worker 297*cda5da8dSAndroid Build Coastguard Worker## ------------------------------------ ## 298*cda5da8dSAndroid Build Coastguard Worker## 5. Additional branching constructs. ## 299*cda5da8dSAndroid Build Coastguard Worker## ------------------------------------ ## 300*cda5da8dSAndroid Build Coastguard Worker 301*cda5da8dSAndroid Build Coastguard Worker# Both `m4_ifval' and `m4_ifset' tests against the empty string. The 302*cda5da8dSAndroid Build Coastguard Worker# difference is that `m4_ifset' is specialized on macros. 303*cda5da8dSAndroid Build Coastguard Worker# 304*cda5da8dSAndroid Build Coastguard Worker# In case of arguments of macros, eg. $1, it makes little difference. 305*cda5da8dSAndroid Build Coastguard Worker# In the case of a macro `FOO', you don't want to check `m4_ifval(FOO, 306*cda5da8dSAndroid Build Coastguard Worker# TRUE)', because if `FOO' expands with commas, there is a shifting of 307*cda5da8dSAndroid Build Coastguard Worker# the arguments. So you want to run `m4_ifval([FOO])', but then you just 308*cda5da8dSAndroid Build Coastguard Worker# compare the *string* `FOO' against `', which, of course fails. 309*cda5da8dSAndroid Build Coastguard Worker# 310*cda5da8dSAndroid Build Coastguard Worker# So you want the variation `m4_ifset' that expects a macro name as $1. 311*cda5da8dSAndroid Build Coastguard Worker# If this macro is both defined and defined to a non empty value, then 312*cda5da8dSAndroid Build Coastguard Worker# it runs TRUE, etc. 313*cda5da8dSAndroid Build Coastguard Worker 314*cda5da8dSAndroid Build Coastguard Worker 315*cda5da8dSAndroid Build Coastguard Worker# m4_ifblank(COND, [IF-BLANK], [IF-TEXT]) 316*cda5da8dSAndroid Build Coastguard Worker# m4_ifnblank(COND, [IF-TEXT], [IF-BLANK]) 317*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------- 318*cda5da8dSAndroid Build Coastguard Worker# If COND is empty, or consists only of blanks (space, tab, newline), 319*cda5da8dSAndroid Build Coastguard Worker# then expand IF-BLANK, otherwise expand IF-TEXT. This differs from 320*cda5da8dSAndroid Build Coastguard Worker# m4_ifval only if COND has just whitespace, but it helps optimize in 321*cda5da8dSAndroid Build Coastguard Worker# spite of users who mistakenly leave trailing space after what they 322*cda5da8dSAndroid Build Coastguard Worker# thought was an empty argument: 323*cda5da8dSAndroid Build Coastguard Worker# macro( 324*cda5da8dSAndroid Build Coastguard Worker# [] 325*cda5da8dSAndroid Build Coastguard Worker# ) 326*cda5da8dSAndroid Build Coastguard Worker# 327*cda5da8dSAndroid Build Coastguard Worker# Writing one macro in terms of the other causes extra overhead, so 328*cda5da8dSAndroid Build Coastguard Worker# we inline both definitions. 329*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_ifblank], 330*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_translit([[$1]], [ ][ ][ 331*cda5da8dSAndroid Build Coastguard Worker]), [], [$2], [$3])]) 332*cda5da8dSAndroid Build Coastguard Worker 333*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_ifnblank], 334*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_translit([[$1]], [ ][ ][ 335*cda5da8dSAndroid Build Coastguard Worker]), [], [$3], [$2])]) 336*cda5da8dSAndroid Build Coastguard Worker 337*cda5da8dSAndroid Build Coastguard Worker 338*cda5da8dSAndroid Build Coastguard Worker# m4_ifval(COND, [IF-TRUE], [IF-FALSE]) 339*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------- 340*cda5da8dSAndroid Build Coastguard Worker# If COND is not the empty string, expand IF-TRUE, otherwise IF-FALSE. 341*cda5da8dSAndroid Build Coastguard Worker# Comparable to m4_ifdef. 342*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_ifval], 343*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [], [$3], [$2])]) 344*cda5da8dSAndroid Build Coastguard Worker 345*cda5da8dSAndroid Build Coastguard Worker 346*cda5da8dSAndroid Build Coastguard Worker# m4_n(TEXT) 347*cda5da8dSAndroid Build Coastguard Worker# ---------- 348*cda5da8dSAndroid Build Coastguard Worker# If TEXT is not empty, return TEXT and a new line, otherwise nothing. 349*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_n], 350*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], 351*cda5da8dSAndroid Build Coastguard Worker [], [], 352*cda5da8dSAndroid Build Coastguard Worker [$1 353*cda5da8dSAndroid Build Coastguard Worker])]) 354*cda5da8dSAndroid Build Coastguard Worker 355*cda5da8dSAndroid Build Coastguard Worker 356*cda5da8dSAndroid Build Coastguard Worker# m4_ifvaln(COND, [IF-TRUE], [IF-FALSE]) 357*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------- 358*cda5da8dSAndroid Build Coastguard Worker# Same as `m4_ifval', but add an extra newline to IF-TRUE or IF-FALSE 359*cda5da8dSAndroid Build Coastguard Worker# unless that argument is empty. 360*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_ifvaln], 361*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], 362*cda5da8dSAndroid Build Coastguard Worker [], [m4_n([$3])], 363*cda5da8dSAndroid Build Coastguard Worker [m4_n([$2])])]) 364*cda5da8dSAndroid Build Coastguard Worker 365*cda5da8dSAndroid Build Coastguard Worker 366*cda5da8dSAndroid Build Coastguard Worker# m4_ifset(MACRO, [IF-TRUE], [IF-FALSE]) 367*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------- 368*cda5da8dSAndroid Build Coastguard Worker# If MACRO has no definition, or of its definition is the empty string, 369*cda5da8dSAndroid Build Coastguard Worker# expand IF-FALSE, otherwise IF-TRUE. 370*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_ifset], 371*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$1], 372*cda5da8dSAndroid Build Coastguard Worker [m4_ifval(_m4_defn([$1]), [$2], [$3])], 373*cda5da8dSAndroid Build Coastguard Worker [$3])]) 374*cda5da8dSAndroid Build Coastguard Worker 375*cda5da8dSAndroid Build Coastguard Worker 376*cda5da8dSAndroid Build Coastguard Worker# m4_ifndef(NAME, [IF-NOT-DEFINED], [IF-DEFINED]) 377*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------- 378*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_ifndef], 379*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$1], [$3], [$2])]) 380*cda5da8dSAndroid Build Coastguard Worker 381*cda5da8dSAndroid Build Coastguard Worker 382*cda5da8dSAndroid Build Coastguard Worker# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT) 383*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------------- 384*cda5da8dSAndroid Build Coastguard Worker# m4 equivalent of 385*cda5da8dSAndroid Build Coastguard Worker# switch (SWITCH) 386*cda5da8dSAndroid Build Coastguard Worker# { 387*cda5da8dSAndroid Build Coastguard Worker# case VAL1: 388*cda5da8dSAndroid Build Coastguard Worker# IF-VAL1; 389*cda5da8dSAndroid Build Coastguard Worker# break; 390*cda5da8dSAndroid Build Coastguard Worker# case VAL2: 391*cda5da8dSAndroid Build Coastguard Worker# IF-VAL2; 392*cda5da8dSAndroid Build Coastguard Worker# break; 393*cda5da8dSAndroid Build Coastguard Worker# ... 394*cda5da8dSAndroid Build Coastguard Worker# default: 395*cda5da8dSAndroid Build Coastguard Worker# DEFAULT; 396*cda5da8dSAndroid Build Coastguard Worker# break; 397*cda5da8dSAndroid Build Coastguard Worker# }. 398*cda5da8dSAndroid Build Coastguard Worker# All the values are optional, and the macro is robust to active 399*cda5da8dSAndroid Build Coastguard Worker# symbols properly quoted. 400*cda5da8dSAndroid Build Coastguard Worker# 401*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 402*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_case], 403*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], 0, [], 404*cda5da8dSAndroid Build Coastguard Worker [$#], 1, [], 405*cda5da8dSAndroid Build Coastguard Worker [$#], 2, [$2], 406*cda5da8dSAndroid Build Coastguard Worker [$1], [$2], [$3], 407*cda5da8dSAndroid Build Coastguard Worker [$0([$1], m4_shift3($@))])]) 408*cda5da8dSAndroid Build Coastguard Worker 409*cda5da8dSAndroid Build Coastguard Worker 410*cda5da8dSAndroid Build Coastguard Worker# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT) 411*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------- 412*cda5da8dSAndroid Build Coastguard Worker# m4 equivalent of 413*cda5da8dSAndroid Build Coastguard Worker# 414*cda5da8dSAndroid Build Coastguard Worker# if (SWITCH =~ RE1) 415*cda5da8dSAndroid Build Coastguard Worker# VAL1; 416*cda5da8dSAndroid Build Coastguard Worker# elif (SWITCH =~ RE2) 417*cda5da8dSAndroid Build Coastguard Worker# VAL2; 418*cda5da8dSAndroid Build Coastguard Worker# elif ... 419*cda5da8dSAndroid Build Coastguard Worker# ... 420*cda5da8dSAndroid Build Coastguard Worker# else 421*cda5da8dSAndroid Build Coastguard Worker# DEFAULT 422*cda5da8dSAndroid Build Coastguard Worker# 423*cda5da8dSAndroid Build Coastguard Worker# All the values are optional, and the macro is robust to active symbols 424*cda5da8dSAndroid Build Coastguard Worker# properly quoted. 425*cda5da8dSAndroid Build Coastguard Worker# 426*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 427*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_bmatch], 428*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], 429*cda5da8dSAndroid Build Coastguard Worker [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])], 430*cda5da8dSAndroid Build Coastguard Worker [$#], 2, [$2], 431*cda5da8dSAndroid Build Coastguard Worker [m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shift3($@))], 432*cda5da8dSAndroid Build Coastguard Worker [$3])])]) 433*cda5da8dSAndroid Build Coastguard Worker 434*cda5da8dSAndroid Build Coastguard Worker# m4_argn(N, ARGS...) 435*cda5da8dSAndroid Build Coastguard Worker# ------------------- 436*cda5da8dSAndroid Build Coastguard Worker# Extract argument N (greater than 0) from ARGS. Example: 437*cda5da8dSAndroid Build Coastguard Worker# m4_define([b], [B]) 438*cda5da8dSAndroid Build Coastguard Worker# m4_argn([2], [a], [b], [c]) => b 439*cda5da8dSAndroid Build Coastguard Worker# 440*cda5da8dSAndroid Build Coastguard Worker# Rather than using m4_car(m4_shiftn([$1], $@)), we exploit the fact that 441*cda5da8dSAndroid Build Coastguard Worker# GNU m4 can directly reference any argument, through an indirect macro. 442*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_argn], 443*cda5da8dSAndroid Build Coastguard Worker[m4_assert([0 < $1])]dnl 444*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_$0], [_m4_popdef([_$0])]m4_dquote([$]m4_incr([$1])))_$0($@)]) 445*cda5da8dSAndroid Build Coastguard Worker 446*cda5da8dSAndroid Build Coastguard Worker 447*cda5da8dSAndroid Build Coastguard Worker# m4_car(ARGS...) 448*cda5da8dSAndroid Build Coastguard Worker# m4_cdr(ARGS...) 449*cda5da8dSAndroid Build Coastguard Worker# --------------- 450*cda5da8dSAndroid Build Coastguard Worker# Manipulate m4 lists. m4_car returns the first argument. m4_cdr 451*cda5da8dSAndroid Build Coastguard Worker# bundles all but the first argument into a quoted list. These two 452*cda5da8dSAndroid Build Coastguard Worker# macros are generally used with list arguments, with quoting removed 453*cda5da8dSAndroid Build Coastguard Worker# to break the list into multiple m4 ARGS. 454*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_car], [[$1]]) 455*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cdr], 456*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], 457*cda5da8dSAndroid Build Coastguard Worker [$#], 1, [], 458*cda5da8dSAndroid Build Coastguard Worker [m4_dquote(m4_shift($@))])]) 459*cda5da8dSAndroid Build Coastguard Worker 460*cda5da8dSAndroid Build Coastguard Worker# _m4_cdr(ARGS...) 461*cda5da8dSAndroid Build Coastguard Worker# ---------------- 462*cda5da8dSAndroid Build Coastguard Worker# Like m4_cdr, except include a leading comma unless only one argument 463*cda5da8dSAndroid Build Coastguard Worker# remains. Why? Because comparing a large list against [] is more 464*cda5da8dSAndroid Build Coastguard Worker# expensive in expansion time than comparing the number of arguments; so 465*cda5da8dSAndroid Build Coastguard Worker# _m4_cdr can be used to reduce the number of arguments when it is time 466*cda5da8dSAndroid Build Coastguard Worker# to end recursion. 467*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_cdr], 468*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], 1, [], 469*cda5da8dSAndroid Build Coastguard Worker [, m4_dquote(m4_shift($@))])]) 470*cda5da8dSAndroid Build Coastguard Worker 471*cda5da8dSAndroid Build Coastguard Worker 472*cda5da8dSAndroid Build Coastguard Worker 473*cda5da8dSAndroid Build Coastguard Worker# m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT]) 474*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------------------- 475*cda5da8dSAndroid Build Coastguard Worker# Similar to m4_if, except that each TEST is expanded when encountered. 476*cda5da8dSAndroid Build Coastguard Worker# If the expansion of TESTn matches the string VALn, the result is IF-VALn. 477*cda5da8dSAndroid Build Coastguard Worker# The result is DEFAULT if no tests passed. This macro allows 478*cda5da8dSAndroid Build Coastguard Worker# short-circuiting of expensive tests, where it pays to arrange quick 479*cda5da8dSAndroid Build Coastguard Worker# filter tests to run first. 480*cda5da8dSAndroid Build Coastguard Worker# 481*cda5da8dSAndroid Build Coastguard Worker# For an example, consider a previous implementation of _AS_QUOTE_IFELSE: 482*cda5da8dSAndroid Build Coastguard Worker# 483*cda5da8dSAndroid Build Coastguard Worker# m4_if(m4_index([$1], [\]), [-1], [$2], 484*cda5da8dSAndroid Build Coastguard Worker# m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2], 485*cda5da8dSAndroid Build Coastguard Worker# m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2], 486*cda5da8dSAndroid Build Coastguard Worker# m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3], 487*cda5da8dSAndroid Build Coastguard Worker# m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3], 488*cda5da8dSAndroid Build Coastguard Worker# [$2]) 489*cda5da8dSAndroid Build Coastguard Worker# 490*cda5da8dSAndroid Build Coastguard Worker# Here, m4_index is computed 5 times, and m4_eval 4, even if $1 contains 491*cda5da8dSAndroid Build Coastguard Worker# no backslash. It is more efficient to do: 492*cda5da8dSAndroid Build Coastguard Worker# 493*cda5da8dSAndroid Build Coastguard Worker# m4_cond([m4_index([$1], [\])], [-1], [$2], 494*cda5da8dSAndroid Build Coastguard Worker# [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2], 495*cda5da8dSAndroid Build Coastguard Worker# [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2], 496*cda5da8dSAndroid Build Coastguard Worker# [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3], 497*cda5da8dSAndroid Build Coastguard Worker# [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3], 498*cda5da8dSAndroid Build Coastguard Worker# [$2]) 499*cda5da8dSAndroid Build Coastguard Worker# 500*cda5da8dSAndroid Build Coastguard Worker# In the common case of $1 with no backslash, only one m4_index expansion 501*cda5da8dSAndroid Build Coastguard Worker# occurs, and m4_eval is avoided altogether. 502*cda5da8dSAndroid Build Coastguard Worker# 503*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 504*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cond], 505*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: cannot be called without arguments])], 506*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [$1], 507*cda5da8dSAndroid Build Coastguard Worker m4_eval([$# % 3]), [2], [m4_fatal([$0: missing an argument])], 508*cda5da8dSAndroid Build Coastguard Worker [_$0($@)])]) 509*cda5da8dSAndroid Build Coastguard Worker 510*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_cond], 511*cda5da8dSAndroid Build Coastguard Worker[m4_if(($1), [($2)], [$3], 512*cda5da8dSAndroid Build Coastguard Worker [$#], [3], [], 513*cda5da8dSAndroid Build Coastguard Worker [$#], [4], [$4], 514*cda5da8dSAndroid Build Coastguard Worker [$0(m4_shift3($@))])]) 515*cda5da8dSAndroid Build Coastguard Worker 516*cda5da8dSAndroid Build Coastguard Worker 517*cda5da8dSAndroid Build Coastguard Worker## ---------------------------------------- ## 518*cda5da8dSAndroid Build Coastguard Worker## 6. Enhanced version of some primitives. ## 519*cda5da8dSAndroid Build Coastguard Worker## ---------------------------------------- ## 520*cda5da8dSAndroid Build Coastguard Worker 521*cda5da8dSAndroid Build Coastguard Worker# m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...) 522*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------------- 523*cda5da8dSAndroid Build Coastguard Worker# m4 equivalent of 524*cda5da8dSAndroid Build Coastguard Worker# 525*cda5da8dSAndroid Build Coastguard Worker# $_ = STRING; 526*cda5da8dSAndroid Build Coastguard Worker# s/RE1/SUBST1/g; 527*cda5da8dSAndroid Build Coastguard Worker# s/RE2/SUBST2/g; 528*cda5da8dSAndroid Build Coastguard Worker# ... 529*cda5da8dSAndroid Build Coastguard Worker# 530*cda5da8dSAndroid Build Coastguard Worker# All the values are optional, and the macro is robust to active symbols 531*cda5da8dSAndroid Build Coastguard Worker# properly quoted. 532*cda5da8dSAndroid Build Coastguard Worker# 533*cda5da8dSAndroid Build Coastguard Worker# I would have liked to name this macro `m4_bpatsubst', unfortunately, 534*cda5da8dSAndroid Build Coastguard Worker# due to quotation problems, I need to double quote $1 below, therefore 535*cda5da8dSAndroid Build Coastguard Worker# the anchors are broken :( I can't let users be trapped by that. 536*cda5da8dSAndroid Build Coastguard Worker# 537*cda5da8dSAndroid Build Coastguard Worker# Recall that m4_shift3 always results in an argument. Hence, we need 538*cda5da8dSAndroid Build Coastguard Worker# to distinguish between a final deletion vs. ending recursion. 539*cda5da8dSAndroid Build Coastguard Worker# 540*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 541*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_bpatsubsts], 542*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], 543*cda5da8dSAndroid Build Coastguard Worker [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])], 544*cda5da8dSAndroid Build Coastguard Worker [$#], 2, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2]))], 545*cda5da8dSAndroid Build Coastguard Worker [$#], 3, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2], [$3]))], 546*cda5da8dSAndroid Build Coastguard Worker [_$0($@m4_if(m4_eval($# & 1), 0, [,]))])]) 547*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_bpatsubsts], 548*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], 2, [$1], 549*cda5da8dSAndroid Build Coastguard Worker [$0(m4_builtin([patsubst], [[$1]], [$2], [$3]), 550*cda5da8dSAndroid Build Coastguard Worker m4_shift3($@))])]) 551*cda5da8dSAndroid Build Coastguard Worker 552*cda5da8dSAndroid Build Coastguard Worker 553*cda5da8dSAndroid Build Coastguard Worker# m4_copy(SRC, DST) 554*cda5da8dSAndroid Build Coastguard Worker# ----------------- 555*cda5da8dSAndroid Build Coastguard Worker# Define the pushdef stack DST as a copy of the pushdef stack SRC; 556*cda5da8dSAndroid Build Coastguard Worker# give an error if DST is already defined. This is particularly nice 557*cda5da8dSAndroid Build Coastguard Worker# for copying self-modifying pushdef stacks, where the top definition 558*cda5da8dSAndroid Build Coastguard Worker# includes one-shot initialization that is later popped to the normal 559*cda5da8dSAndroid Build Coastguard Worker# definition. This version intentionally does nothing if SRC is 560*cda5da8dSAndroid Build Coastguard Worker# undefined. 561*cda5da8dSAndroid Build Coastguard Worker# 562*cda5da8dSAndroid Build Coastguard Worker# Some macros simply can't be renamed with this method: namely, anything 563*cda5da8dSAndroid Build Coastguard Worker# involved in the implementation of m4_stack_foreach_sep. 564*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_copy], 565*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$2], [m4_fatal([$0: won't overwrite defined macro: $2])], 566*cda5da8dSAndroid Build Coastguard Worker [m4_stack_foreach_sep([$1], [m4_pushdef([$2],], [)])])]dnl 567*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([m4_location($1)], [m4_define([m4_location($2)], m4_location)])]) 568*cda5da8dSAndroid Build Coastguard Worker 569*cda5da8dSAndroid Build Coastguard Worker 570*cda5da8dSAndroid Build Coastguard Worker# m4_copy_force(SRC, DST) 571*cda5da8dSAndroid Build Coastguard Worker# m4_rename_force(SRC, DST) 572*cda5da8dSAndroid Build Coastguard Worker# ------------------------- 573*cda5da8dSAndroid Build Coastguard Worker# Like m4_copy/m4_rename, except blindly overwrite any existing DST. 574*cda5da8dSAndroid Build Coastguard Worker# Note that m4_copy_force tolerates undefined SRC, while m4_rename_force 575*cda5da8dSAndroid Build Coastguard Worker# does not. 576*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_copy_force], 577*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$2], [_m4_undefine([$2])])m4_copy($@)]) 578*cda5da8dSAndroid Build Coastguard Worker 579*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_rename_force], 580*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$2], [_m4_undefine([$2])])m4_rename($@)]) 581*cda5da8dSAndroid Build Coastguard Worker 582*cda5da8dSAndroid Build Coastguard Worker 583*cda5da8dSAndroid Build Coastguard Worker# m4_define_default(MACRO, VALUE) 584*cda5da8dSAndroid Build Coastguard Worker# ------------------------------- 585*cda5da8dSAndroid Build Coastguard Worker# If MACRO is undefined, set it to VALUE. 586*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_define_default], 587*cda5da8dSAndroid Build Coastguard Worker[m4_ifndef([$1], [m4_define($@)])]) 588*cda5da8dSAndroid Build Coastguard Worker 589*cda5da8dSAndroid Build Coastguard Worker 590*cda5da8dSAndroid Build Coastguard Worker# m4_default(EXP1, EXP2) 591*cda5da8dSAndroid Build Coastguard Worker# m4_default_nblank(EXP1, EXP2) 592*cda5da8dSAndroid Build Coastguard Worker# ----------------------------- 593*cda5da8dSAndroid Build Coastguard Worker# Returns EXP1 if not empty/blank, otherwise EXP2. Expand the result. 594*cda5da8dSAndroid Build Coastguard Worker# 595*cda5da8dSAndroid Build Coastguard Worker# m4_default is called on hot paths, so inline the contents of m4_ifval, 596*cda5da8dSAndroid Build Coastguard Worker# for one less round of expansion. 597*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_default], 598*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [], [$2], [$1])]) 599*cda5da8dSAndroid Build Coastguard Worker 600*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_default_nblank], 601*cda5da8dSAndroid Build Coastguard Worker[m4_ifblank([$1], [$2], [$1])]) 602*cda5da8dSAndroid Build Coastguard Worker 603*cda5da8dSAndroid Build Coastguard Worker 604*cda5da8dSAndroid Build Coastguard Worker# m4_default_quoted(EXP1, EXP2) 605*cda5da8dSAndroid Build Coastguard Worker# m4_default_nblank_quoted(EXP1, EXP2) 606*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------ 607*cda5da8dSAndroid Build Coastguard Worker# Returns EXP1 if non empty/blank, otherwise EXP2. Leave the result quoted. 608*cda5da8dSAndroid Build Coastguard Worker# 609*cda5da8dSAndroid Build Coastguard Worker# For comparison: 610*cda5da8dSAndroid Build Coastguard Worker# m4_define([active], [ACTIVE]) 611*cda5da8dSAndroid Build Coastguard Worker# m4_default([active], [default]) => ACTIVE 612*cda5da8dSAndroid Build Coastguard Worker# m4_default([], [active]) => ACTIVE 613*cda5da8dSAndroid Build Coastguard Worker# -m4_default([ ], [active])- => - - 614*cda5da8dSAndroid Build Coastguard Worker# -m4_default_nblank([ ], [active])- => -ACTIVE- 615*cda5da8dSAndroid Build Coastguard Worker# m4_default_quoted([active], [default]) => active 616*cda5da8dSAndroid Build Coastguard Worker# m4_default_quoted([], [active]) => active 617*cda5da8dSAndroid Build Coastguard Worker# -m4_default_quoted([ ], [active])- => - - 618*cda5da8dSAndroid Build Coastguard Worker# -m4_default_nblank_quoted([ ], [active])- => -active- 619*cda5da8dSAndroid Build Coastguard Worker# 620*cda5da8dSAndroid Build Coastguard Worker# m4_default macro is called on hot paths, so inline the contents of m4_ifval, 621*cda5da8dSAndroid Build Coastguard Worker# for one less round of expansion. 622*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_default_quoted], 623*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [], [[$2]], [[$1]])]) 624*cda5da8dSAndroid Build Coastguard Worker 625*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_default_nblank_quoted], 626*cda5da8dSAndroid Build Coastguard Worker[m4_ifblank([$1], [[$2]], [[$1]])]) 627*cda5da8dSAndroid Build Coastguard Worker 628*cda5da8dSAndroid Build Coastguard Worker 629*cda5da8dSAndroid Build Coastguard Worker# m4_defn(NAME) 630*cda5da8dSAndroid Build Coastguard Worker# ------------- 631*cda5da8dSAndroid Build Coastguard Worker# Like the original, except guarantee a warning when using something which is 632*cda5da8dSAndroid Build Coastguard Worker# undefined (unlike M4 1.4.x). This replacement is not a full-featured 633*cda5da8dSAndroid Build Coastguard Worker# replacement: if any of the defined macros contain unbalanced quoting, but 634*cda5da8dSAndroid Build Coastguard Worker# when pasted together result in a well-quoted string, then only native m4 635*cda5da8dSAndroid Build Coastguard Worker# support is able to get it correct. But that's where quadrigraphs come in 636*cda5da8dSAndroid Build Coastguard Worker# handy, if you really need unbalanced quotes inside your macros. 637*cda5da8dSAndroid Build Coastguard Worker# 638*cda5da8dSAndroid Build Coastguard Worker# This macro is called frequently, so minimize the amount of additional 639*cda5da8dSAndroid Build Coastguard Worker# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, 640*cda5da8dSAndroid Build Coastguard Worker# (added in M4 1.6), then let m4 do the job for us (see m4_init). 641*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_defn], 642*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [[$0]], 643*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_ifdef([$1], [_m4_defn([$1])], 644*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0: undefined macro: $1])])], 645*cda5da8dSAndroid Build Coastguard Worker [m4_map_args([$0], $@)])]) 646*cda5da8dSAndroid Build Coastguard Worker 647*cda5da8dSAndroid Build Coastguard Worker 648*cda5da8dSAndroid Build Coastguard Worker# m4_dumpdef(NAME...) 649*cda5da8dSAndroid Build Coastguard Worker# ------------------- 650*cda5da8dSAndroid Build Coastguard Worker# In m4 1.4.x, dumpdef writes to the current debugfile, rather than 651*cda5da8dSAndroid Build Coastguard Worker# stderr. This in turn royally confuses autom4te; so we follow the 652*cda5da8dSAndroid Build Coastguard Worker# lead of newer m4 and always dump to stderr. Unlike the original, 653*cda5da8dSAndroid Build Coastguard Worker# this version requires an argument, since there is no convenient way 654*cda5da8dSAndroid Build Coastguard Worker# in m4 1.4.x to grab the names of all defined macros. Newer m4 655*cda5da8dSAndroid Build Coastguard Worker# always dumps to stderr, regardless of the current debugfile; it also 656*cda5da8dSAndroid Build Coastguard Worker# provides m4symbols as a way to grab all current macro names. But 657*cda5da8dSAndroid Build Coastguard Worker# dumpdefs is not frequently called, so we don't need to worry about 658*cda5da8dSAndroid Build Coastguard Worker# conditionally using these newer features. Also, this version 659*cda5da8dSAndroid Build Coastguard Worker# doesn't sort multiple arguments. 660*cda5da8dSAndroid Build Coastguard Worker# 661*cda5da8dSAndroid Build Coastguard Worker# If we detect m4 1.6 or newer, then provide an alternate definition, 662*cda5da8dSAndroid Build Coastguard Worker# installed during m4_init, that allows builtins through. 663*cda5da8dSAndroid Build Coastguard Worker# Unfortunately, there is no nice way in m4 1.4.x to dump builtins. 664*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_dumpdef], 665*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: missing argument])], 666*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_ifdef([$1], [m4_errprintn( 667*cda5da8dSAndroid Build Coastguard Worker [$1: ]m4_dquote(_m4_defn([$1])))], [m4_fatal([$0: undefined macro: $1])])], 668*cda5da8dSAndroid Build Coastguard Worker [m4_map_args([$0], $@)])]) 669*cda5da8dSAndroid Build Coastguard Worker 670*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_dumpdef], 671*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: missing argument])], 672*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_builtin([dumpdef], [$1])], 673*cda5da8dSAndroid Build Coastguard Worker [m4_map_args_sep([m4_builtin([dumpdef],], [)], [], $@)])]) 674*cda5da8dSAndroid Build Coastguard Worker 675*cda5da8dSAndroid Build Coastguard Worker 676*cda5da8dSAndroid Build Coastguard Worker# m4_dumpdefs(NAME...) 677*cda5da8dSAndroid Build Coastguard Worker# -------------------- 678*cda5da8dSAndroid Build Coastguard Worker# Similar to `m4_dumpdef(NAME)', but if NAME was m4_pushdef'ed, display its 679*cda5da8dSAndroid Build Coastguard Worker# value stack (most recent displayed first). Also, this version silently 680*cda5da8dSAndroid Build Coastguard Worker# ignores undefined macros, rather than erroring out. 681*cda5da8dSAndroid Build Coastguard Worker# 682*cda5da8dSAndroid Build Coastguard Worker# This macro cheats, because it relies on the current definition of NAME 683*cda5da8dSAndroid Build Coastguard Worker# while the second argument of m4_stack_foreach_lifo is evaluated (which 684*cda5da8dSAndroid Build Coastguard Worker# would be undefined according to the API). 685*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_dumpdefs], 686*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: missing argument])], 687*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_stack_foreach_lifo([$1], [m4_dumpdef([$1])m4_ignore])], 688*cda5da8dSAndroid Build Coastguard Worker [m4_map_args([$0], $@)])]) 689*cda5da8dSAndroid Build Coastguard Worker 690*cda5da8dSAndroid Build Coastguard Worker# m4_esyscmd_s(COMMAND) 691*cda5da8dSAndroid Build Coastguard Worker# --------------------- 692*cda5da8dSAndroid Build Coastguard Worker# Like m4_esyscmd, except strip any trailing newlines, thus behaving 693*cda5da8dSAndroid Build Coastguard Worker# more like shell command substitution. 694*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_esyscmd_s], 695*cda5da8dSAndroid Build Coastguard Worker[m4_chomp_all(m4_esyscmd([$1]))]) 696*cda5da8dSAndroid Build Coastguard Worker 697*cda5da8dSAndroid Build Coastguard Worker 698*cda5da8dSAndroid Build Coastguard Worker# m4_popdef(NAME) 699*cda5da8dSAndroid Build Coastguard Worker# --------------- 700*cda5da8dSAndroid Build Coastguard Worker# Like the original, except guarantee a warning when using something which is 701*cda5da8dSAndroid Build Coastguard Worker# undefined (unlike M4 1.4.x). 702*cda5da8dSAndroid Build Coastguard Worker# 703*cda5da8dSAndroid Build Coastguard Worker# This macro is called frequently, so minimize the amount of additional 704*cda5da8dSAndroid Build Coastguard Worker# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, 705*cda5da8dSAndroid Build Coastguard Worker# (added in M4 1.6), then let m4 do the job for us (see m4_init). 706*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_popdef], 707*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [[$0]], 708*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_ifdef([$1], [_m4_popdef([$1])], 709*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0: undefined macro: $1])])], 710*cda5da8dSAndroid Build Coastguard Worker [m4_map_args([$0], $@)])]) 711*cda5da8dSAndroid Build Coastguard Worker 712*cda5da8dSAndroid Build Coastguard Worker 713*cda5da8dSAndroid Build Coastguard Worker# m4_shiftn(N, ...) 714*cda5da8dSAndroid Build Coastguard Worker# ----------------- 715*cda5da8dSAndroid Build Coastguard Worker# Returns ... shifted N times. Useful for recursive "varargs" constructs. 716*cda5da8dSAndroid Build Coastguard Worker# 717*cda5da8dSAndroid Build Coastguard Worker# Autoconf does not use this macro, because it is inherently slower than 718*cda5da8dSAndroid Build Coastguard Worker# calling the common cases of m4_shift2 or m4_shift3 directly. But it 719*cda5da8dSAndroid Build Coastguard Worker# might as well be fast for other clients, such as Libtool. One way to 720*cda5da8dSAndroid Build Coastguard Worker# do this is to expand $@ only once in _m4_shiftn (otherwise, for long 721*cda5da8dSAndroid Build Coastguard Worker# lists, the expansion of m4_if takes twice as much memory as what the 722*cda5da8dSAndroid Build Coastguard Worker# list itself occupies, only to throw away the unused branch). The end 723*cda5da8dSAndroid Build Coastguard Worker# result is strictly equivalent to 724*cda5da8dSAndroid Build Coastguard Worker# m4_if([$1], 1, [m4_shift(,m4_shift(m4_shift($@)))], 725*cda5da8dSAndroid Build Coastguard Worker# [_m4_shiftn(m4_decr([$1]), m4_shift(m4_shift($@)))]) 726*cda5da8dSAndroid Build Coastguard Worker# but with the final `m4_shift(m4_shift($@)))' shared between the two 727*cda5da8dSAndroid Build Coastguard Worker# paths. The first leg uses a no-op m4_shift(,$@) to balance out the (). 728*cda5da8dSAndroid Build Coastguard Worker# 729*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 730*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_shiftn], 731*cda5da8dSAndroid Build Coastguard Worker[m4_assert(0 < $1 && $1 < $#)_$0($@)]) 732*cda5da8dSAndroid Build Coastguard Worker 733*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_shiftn], 734*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], 1, [m4_shift(], 735*cda5da8dSAndroid Build Coastguard Worker [$0(m4_decr([$1])]), m4_shift(m4_shift($@)))]) 736*cda5da8dSAndroid Build Coastguard Worker 737*cda5da8dSAndroid Build Coastguard Worker# m4_shift2(...) 738*cda5da8dSAndroid Build Coastguard Worker# m4_shift3(...) 739*cda5da8dSAndroid Build Coastguard Worker# -------------- 740*cda5da8dSAndroid Build Coastguard Worker# Returns ... shifted twice, and three times. Faster than m4_shiftn. 741*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_shift2], [m4_shift(m4_shift($@))]) 742*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_shift3], [m4_shift(m4_shift(m4_shift($@)))]) 743*cda5da8dSAndroid Build Coastguard Worker 744*cda5da8dSAndroid Build Coastguard Worker# _m4_shift2(...) 745*cda5da8dSAndroid Build Coastguard Worker# _m4_shift3(...) 746*cda5da8dSAndroid Build Coastguard Worker# --------------- 747*cda5da8dSAndroid Build Coastguard Worker# Like m4_shift2 or m4_shift3, except include a leading comma unless shifting 748*cda5da8dSAndroid Build Coastguard Worker# consumes all arguments. Why? Because in recursion, it is nice to 749*cda5da8dSAndroid Build Coastguard Worker# distinguish between 1 element left and 0 elements left, based on how many 750*cda5da8dSAndroid Build Coastguard Worker# arguments this shift expands to. 751*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_shift2], 752*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [2], [], 753*cda5da8dSAndroid Build Coastguard Worker [, m4_shift(m4_shift($@))])]) 754*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_shift3], 755*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [3], [], 756*cda5da8dSAndroid Build Coastguard Worker [, m4_shift(m4_shift(m4_shift($@)))])]) 757*cda5da8dSAndroid Build Coastguard Worker 758*cda5da8dSAndroid Build Coastguard Worker 759*cda5da8dSAndroid Build Coastguard Worker# m4_undefine(NAME) 760*cda5da8dSAndroid Build Coastguard Worker# ----------------- 761*cda5da8dSAndroid Build Coastguard Worker# Like the original, except guarantee a warning when using something which is 762*cda5da8dSAndroid Build Coastguard Worker# undefined (unlike M4 1.4.x). 763*cda5da8dSAndroid Build Coastguard Worker# 764*cda5da8dSAndroid Build Coastguard Worker# This macro is called frequently, so minimize the amount of additional 765*cda5da8dSAndroid Build Coastguard Worker# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, 766*cda5da8dSAndroid Build Coastguard Worker# (added in M4 1.6), then let m4 do the job for us (see m4_init). 767*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_undefine], 768*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [[$0]], 769*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_ifdef([$1], [_m4_undefine([$1])], 770*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0: undefined macro: $1])])], 771*cda5da8dSAndroid Build Coastguard Worker [m4_map_args([$0], $@)])]) 772*cda5da8dSAndroid Build Coastguard Worker 773*cda5da8dSAndroid Build Coastguard Worker# _m4_wrap(PRE, POST) 774*cda5da8dSAndroid Build Coastguard Worker# ------------------- 775*cda5da8dSAndroid Build Coastguard Worker# Helper macro for m4_wrap and m4_wrap_lifo. Allows nested calls to 776*cda5da8dSAndroid Build Coastguard Worker# m4_wrap within wrapped text. Use _m4_defn and _m4_popdef for speed. 777*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_wrap], 778*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$0_text], 779*cda5da8dSAndroid Build Coastguard Worker [m4_define([$0_text], [$1]_m4_defn([$0_text])[$2])], 780*cda5da8dSAndroid Build Coastguard Worker [m4_builtin([m4wrap], [m4_unquote( 781*cda5da8dSAndroid Build Coastguard Worker _m4_defn([$0_text])_m4_popdef([$0_text]))])m4_define([$0_text], [$1$2])])]) 782*cda5da8dSAndroid Build Coastguard Worker 783*cda5da8dSAndroid Build Coastguard Worker# m4_wrap(TEXT) 784*cda5da8dSAndroid Build Coastguard Worker# ------------- 785*cda5da8dSAndroid Build Coastguard Worker# Append TEXT to the list of hooks to be executed at the end of input. 786*cda5da8dSAndroid Build Coastguard Worker# Whereas the order of the original may be LIFO in the underlying m4, 787*cda5da8dSAndroid Build Coastguard Worker# this version is always FIFO. 788*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_wrap], 789*cda5da8dSAndroid Build Coastguard Worker[_m4_wrap([], [$1[]])]) 790*cda5da8dSAndroid Build Coastguard Worker 791*cda5da8dSAndroid Build Coastguard Worker# m4_wrap_lifo(TEXT) 792*cda5da8dSAndroid Build Coastguard Worker# ------------------ 793*cda5da8dSAndroid Build Coastguard Worker# Prepend TEXT to the list of hooks to be executed at the end of input. 794*cda5da8dSAndroid Build Coastguard Worker# Whereas the order of m4_wrap may be FIFO in the underlying m4, this 795*cda5da8dSAndroid Build Coastguard Worker# version is always LIFO. 796*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_wrap_lifo], 797*cda5da8dSAndroid Build Coastguard Worker[_m4_wrap([$1[]])]) 798*cda5da8dSAndroid Build Coastguard Worker 799*cda5da8dSAndroid Build Coastguard Worker## ------------------------- ## 800*cda5da8dSAndroid Build Coastguard Worker## 7. Quoting manipulation. ## 801*cda5da8dSAndroid Build Coastguard Worker## ------------------------- ## 802*cda5da8dSAndroid Build Coastguard Worker 803*cda5da8dSAndroid Build Coastguard Worker 804*cda5da8dSAndroid Build Coastguard Worker# m4_apply(MACRO, LIST) 805*cda5da8dSAndroid Build Coastguard Worker# --------------------- 806*cda5da8dSAndroid Build Coastguard Worker# Invoke MACRO, with arguments provided from the quoted list of 807*cda5da8dSAndroid Build Coastguard Worker# comma-separated quoted arguments. If LIST is empty, invoke MACRO 808*cda5da8dSAndroid Build Coastguard Worker# without arguments. The expansion will not be concatenated with 809*cda5da8dSAndroid Build Coastguard Worker# subsequent text. 810*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_apply], 811*cda5da8dSAndroid Build Coastguard Worker[m4_if([$2], [], [$1], [$1($2)])[]]) 812*cda5da8dSAndroid Build Coastguard Worker 813*cda5da8dSAndroid Build Coastguard Worker# _m4_apply(MACRO, LIST) 814*cda5da8dSAndroid Build Coastguard Worker# ---------------------- 815*cda5da8dSAndroid Build Coastguard Worker# Like m4_apply, except do nothing if LIST is empty. 816*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_apply], 817*cda5da8dSAndroid Build Coastguard Worker[m4_if([$2], [], [], [$1($2)[]])]) 818*cda5da8dSAndroid Build Coastguard Worker 819*cda5da8dSAndroid Build Coastguard Worker 820*cda5da8dSAndroid Build Coastguard Worker# m4_count(ARGS) 821*cda5da8dSAndroid Build Coastguard Worker# -------------- 822*cda5da8dSAndroid Build Coastguard Worker# Return a count of how many ARGS are present. 823*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_count], [$#]) 824*cda5da8dSAndroid Build Coastguard Worker 825*cda5da8dSAndroid Build Coastguard Worker 826*cda5da8dSAndroid Build Coastguard Worker# m4_curry(MACRO, ARG...) 827*cda5da8dSAndroid Build Coastguard Worker# ----------------------- 828*cda5da8dSAndroid Build Coastguard Worker# Perform argument currying. The expansion of this macro is another 829*cda5da8dSAndroid Build Coastguard Worker# macro that takes exactly one argument, appends it to the end of the 830*cda5da8dSAndroid Build Coastguard Worker# original ARG list, then invokes MACRO. For example: 831*cda5da8dSAndroid Build Coastguard Worker# m4_curry([m4_curry], [m4_reverse], [1])([2])([3]) => 3, 2, 1 832*cda5da8dSAndroid Build Coastguard Worker# Not quite as practical as m4_incr, but you could also do: 833*cda5da8dSAndroid Build Coastguard Worker# m4_define([add], [m4_eval(([$1]) + ([$2]))]) 834*cda5da8dSAndroid Build Coastguard Worker# m4_define([add_one], [m4_curry([add], [1])]) 835*cda5da8dSAndroid Build Coastguard Worker# add_one()([2]) => 3 836*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_curry], [$1(m4_shift($@,)_$0]) 837*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_curry], [[$1])]) 838*cda5da8dSAndroid Build Coastguard Worker 839*cda5da8dSAndroid Build Coastguard Worker 840*cda5da8dSAndroid Build Coastguard Worker# m4_do(STRING, ...) 841*cda5da8dSAndroid Build Coastguard Worker# ------------------ 842*cda5da8dSAndroid Build Coastguard Worker# This macro invokes all its arguments (in sequence, of course). It is 843*cda5da8dSAndroid Build Coastguard Worker# useful for making your macros more structured and readable by dropping 844*cda5da8dSAndroid Build Coastguard Worker# unnecessary dnl's and have the macros indented properly. No concatenation 845*cda5da8dSAndroid Build Coastguard Worker# occurs after a STRING; use m4_unquote(m4_join(,STRING)) for that. 846*cda5da8dSAndroid Build Coastguard Worker# 847*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 848*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_do], 849*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], 0, [], 850*cda5da8dSAndroid Build Coastguard Worker [$#], 1, [$1[]], 851*cda5da8dSAndroid Build Coastguard Worker [$1[]$0(m4_shift($@))])]) 852*cda5da8dSAndroid Build Coastguard Worker 853*cda5da8dSAndroid Build Coastguard Worker 854*cda5da8dSAndroid Build Coastguard Worker# m4_dquote(ARGS) 855*cda5da8dSAndroid Build Coastguard Worker# --------------- 856*cda5da8dSAndroid Build Coastguard Worker# Return ARGS as a quoted list of quoted arguments. 857*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_dquote], [[$@]]) 858*cda5da8dSAndroid Build Coastguard Worker 859*cda5da8dSAndroid Build Coastguard Worker 860*cda5da8dSAndroid Build Coastguard Worker# m4_dquote_elt(ARGS) 861*cda5da8dSAndroid Build Coastguard Worker# ------------------- 862*cda5da8dSAndroid Build Coastguard Worker# Return ARGS as an unquoted list of double-quoted arguments. 863*cda5da8dSAndroid Build Coastguard Worker# 864*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 865*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_dquote_elt], 866*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [], 867*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [[[$1]]], 868*cda5da8dSAndroid Build Coastguard Worker [[[$1]],$0(m4_shift($@))])]) 869*cda5da8dSAndroid Build Coastguard Worker 870*cda5da8dSAndroid Build Coastguard Worker 871*cda5da8dSAndroid Build Coastguard Worker# m4_echo(ARGS) 872*cda5da8dSAndroid Build Coastguard Worker# ------------- 873*cda5da8dSAndroid Build Coastguard Worker# Return the ARGS, with the same level of quoting. Whitespace after 874*cda5da8dSAndroid Build Coastguard Worker# unquoted commas are consumed. 875*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_echo], [$@]) 876*cda5da8dSAndroid Build Coastguard Worker 877*cda5da8dSAndroid Build Coastguard Worker 878*cda5da8dSAndroid Build Coastguard Worker# m4_expand(ARG) 879*cda5da8dSAndroid Build Coastguard Worker# _m4_expand(ARG) 880*cda5da8dSAndroid Build Coastguard Worker# --------------- 881*cda5da8dSAndroid Build Coastguard Worker# Return the expansion of ARG as a single string. Unlike 882*cda5da8dSAndroid Build Coastguard Worker# m4_quote($1), this preserves whitespace following single-quoted 883*cda5da8dSAndroid Build Coastguard Worker# commas that appear within ARG. It also deals with shell case 884*cda5da8dSAndroid Build Coastguard Worker# statements. 885*cda5da8dSAndroid Build Coastguard Worker# 886*cda5da8dSAndroid Build Coastguard Worker# m4_define([active], [ACT, IVE]) 887*cda5da8dSAndroid Build Coastguard Worker# m4_define([active2], [[ACT, IVE]]) 888*cda5da8dSAndroid Build Coastguard Worker# m4_quote(active, active2) 889*cda5da8dSAndroid Build Coastguard Worker# => ACT,IVE,ACT, IVE 890*cda5da8dSAndroid Build Coastguard Worker# m4_expand([active, active2]) 891*cda5da8dSAndroid Build Coastguard Worker# => ACT, IVE, ACT, IVE 892*cda5da8dSAndroid Build Coastguard Worker# 893*cda5da8dSAndroid Build Coastguard Worker# Unfortunately, due to limitations in m4, ARG must expand to 894*cda5da8dSAndroid Build Coastguard Worker# something with balanced quotes (use quadrigraphs to get around 895*cda5da8dSAndroid Build Coastguard Worker# this), and should not contain the unlikely delimiters -=<{( or 896*cda5da8dSAndroid Build Coastguard Worker# )}>=-. It is possible to have unbalanced quoted `(' or `)', as well 897*cda5da8dSAndroid Build Coastguard Worker# as unbalanced unquoted `)'. m4_expand can handle unterminated 898*cda5da8dSAndroid Build Coastguard Worker# comments or dnl on the final line, at the expense of speed; it also 899*cda5da8dSAndroid Build Coastguard Worker# aids in detecting attempts to incorrectly change the current 900*cda5da8dSAndroid Build Coastguard Worker# diversion inside ARG. Meanwhile, _m4_expand is faster but must be 901*cda5da8dSAndroid Build Coastguard Worker# given a terminated expansion, and has no safety checks for 902*cda5da8dSAndroid Build Coastguard Worker# mis-diverted text. 903*cda5da8dSAndroid Build Coastguard Worker# 904*cda5da8dSAndroid Build Coastguard Worker# Exploit that extra unquoted () will group unquoted commas and the 905*cda5da8dSAndroid Build Coastguard Worker# following whitespace. m4_bpatsubst can't handle newlines inside $1, 906*cda5da8dSAndroid Build Coastguard Worker# and m4_substr strips quoting. So we (ab)use m4_changequote, using 907*cda5da8dSAndroid Build Coastguard Worker# temporary quotes to remove the delimiters that conveniently included 908*cda5da8dSAndroid Build Coastguard Worker# the unquoted () that were added prior to the changequote. 909*cda5da8dSAndroid Build Coastguard Worker# 910*cda5da8dSAndroid Build Coastguard Worker# Thanks to shell case statements, too many people are prone to pass 911*cda5da8dSAndroid Build Coastguard Worker# underquoted `)', so we try to detect that by passing a marker as a 912*cda5da8dSAndroid Build Coastguard Worker# fourth argument; if the marker is not present, then we assume that 913*cda5da8dSAndroid Build Coastguard Worker# we encountered an early `)', and re-expand the first argument, but 914*cda5da8dSAndroid Build Coastguard Worker# this time with one more `(' in the second argument and in the 915*cda5da8dSAndroid Build Coastguard Worker# open-quote delimiter. We must also ignore the slop from the 916*cda5da8dSAndroid Build Coastguard Worker# previous try. The final macro is thus half line-noise, half art. 917*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_expand], 918*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([m4_divert], _m4_defn([_m4_divert_unsafe]))]dnl 919*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([m4_divert_push], _m4_defn([_m4_divert_unsafe]))]dnl 920*cda5da8dSAndroid Build Coastguard Worker[m4_chomp(_$0([$1 921*cda5da8dSAndroid Build Coastguard Worker]))_m4_popdef([m4_divert], [m4_divert_push])]) 922*cda5da8dSAndroid Build Coastguard Worker 923*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_expand], [$0_([$1], [(], -=<{($1)}>=-, [}>=-])]) 924*cda5da8dSAndroid Build Coastguard Worker 925*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_expand_], 926*cda5da8dSAndroid Build Coastguard Worker[m4_if([$4], [}>=-], 927*cda5da8dSAndroid Build Coastguard Worker [m4_changequote([-=<{$2], [)}>=-])$3m4_changequote([, ])], 928*cda5da8dSAndroid Build Coastguard Worker [$0([$1], [($2], -=<{($2$1)}>=-, [}>=-])m4_ignore$2])]) 929*cda5da8dSAndroid Build Coastguard Worker 930*cda5da8dSAndroid Build Coastguard Worker 931*cda5da8dSAndroid Build Coastguard Worker# m4_ignore(ARGS) 932*cda5da8dSAndroid Build Coastguard Worker# --------------- 933*cda5da8dSAndroid Build Coastguard Worker# Expands to nothing. Useful for conditionally ignoring an arbitrary 934*cda5da8dSAndroid Build Coastguard Worker# number of arguments (see _m4_list_cmp for an example). 935*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_ignore]) 936*cda5da8dSAndroid Build Coastguard Worker 937*cda5da8dSAndroid Build Coastguard Worker 938*cda5da8dSAndroid Build Coastguard Worker# m4_make_list(ARGS) 939*cda5da8dSAndroid Build Coastguard Worker# ------------------ 940*cda5da8dSAndroid Build Coastguard Worker# Similar to m4_dquote, this creates a quoted list of quoted ARGS. This 941*cda5da8dSAndroid Build Coastguard Worker# version is less efficient than m4_dquote, but separates each argument 942*cda5da8dSAndroid Build Coastguard Worker# with a comma and newline, rather than just comma, for readability. 943*cda5da8dSAndroid Build Coastguard Worker# When developing an m4sugar algorithm, you could temporarily use 944*cda5da8dSAndroid Build Coastguard Worker# m4_pushdef([m4_dquote],m4_defn([m4_make_list])) 945*cda5da8dSAndroid Build Coastguard Worker# around your code to make debugging easier. 946*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_make_list], [m4_join([, 947*cda5da8dSAndroid Build Coastguard Worker], m4_dquote_elt($@))]) 948*cda5da8dSAndroid Build Coastguard Worker 949*cda5da8dSAndroid Build Coastguard Worker 950*cda5da8dSAndroid Build Coastguard Worker# m4_noquote(STRING) 951*cda5da8dSAndroid Build Coastguard Worker# ------------------ 952*cda5da8dSAndroid Build Coastguard Worker# Return the result of ignoring all quotes in STRING and invoking the 953*cda5da8dSAndroid Build Coastguard Worker# macros it contains. Among other things, this is useful for enabling 954*cda5da8dSAndroid Build Coastguard Worker# macro invocations inside strings with [] blocks (for instance regexps 955*cda5da8dSAndroid Build Coastguard Worker# and help-strings). On the other hand, since all quotes are disabled, 956*cda5da8dSAndroid Build Coastguard Worker# any macro expanded during this time that relies on nested [] quoting 957*cda5da8dSAndroid Build Coastguard Worker# will likely crash and burn. This macro is seldom useful; consider 958*cda5da8dSAndroid Build Coastguard Worker# m4_unquote or m4_expand instead. 959*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_noquote], 960*cda5da8dSAndroid Build Coastguard Worker[m4_changequote([-=<{(],[)}>=-])$1-=<{()}>=-m4_changequote([,])]) 961*cda5da8dSAndroid Build Coastguard Worker 962*cda5da8dSAndroid Build Coastguard Worker 963*cda5da8dSAndroid Build Coastguard Worker# m4_quote(ARGS) 964*cda5da8dSAndroid Build Coastguard Worker# -------------- 965*cda5da8dSAndroid Build Coastguard Worker# Return ARGS as a single argument. Any whitespace after unquoted commas 966*cda5da8dSAndroid Build Coastguard Worker# is stripped. There is always output, even when there were no arguments. 967*cda5da8dSAndroid Build Coastguard Worker# 968*cda5da8dSAndroid Build Coastguard Worker# It is important to realize the difference between `m4_quote(exp)' and 969*cda5da8dSAndroid Build Coastguard Worker# `[exp]': in the first case you obtain the quoted *result* of the 970*cda5da8dSAndroid Build Coastguard Worker# expansion of EXP, while in the latter you just obtain the string 971*cda5da8dSAndroid Build Coastguard Worker# `exp'. 972*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_quote], [[$*]]) 973*cda5da8dSAndroid Build Coastguard Worker 974*cda5da8dSAndroid Build Coastguard Worker 975*cda5da8dSAndroid Build Coastguard Worker# _m4_quote(ARGS) 976*cda5da8dSAndroid Build Coastguard Worker# --------------- 977*cda5da8dSAndroid Build Coastguard Worker# Like m4_quote, except that when there are no arguments, there is no 978*cda5da8dSAndroid Build Coastguard Worker# output. For conditional scenarios (such as passing _m4_quote as the 979*cda5da8dSAndroid Build Coastguard Worker# macro name in m4_mapall), this feature can be used to distinguish between 980*cda5da8dSAndroid Build Coastguard Worker# one argument of the empty string vs. no arguments. However, in the 981*cda5da8dSAndroid Build Coastguard Worker# normal case with arguments present, this is less efficient than m4_quote. 982*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_quote], 983*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [], [[$*]])]) 984*cda5da8dSAndroid Build Coastguard Worker 985*cda5da8dSAndroid Build Coastguard Worker 986*cda5da8dSAndroid Build Coastguard Worker# m4_reverse(ARGS) 987*cda5da8dSAndroid Build Coastguard Worker# ---------------- 988*cda5da8dSAndroid Build Coastguard Worker# Output ARGS in reverse order. 989*cda5da8dSAndroid Build Coastguard Worker# 990*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 991*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_reverse], 992*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [], [$#], [1], [[$1]], 993*cda5da8dSAndroid Build Coastguard Worker [$0(m4_shift($@)), [$1]])]) 994*cda5da8dSAndroid Build Coastguard Worker 995*cda5da8dSAndroid Build Coastguard Worker 996*cda5da8dSAndroid Build Coastguard Worker# m4_unquote(ARGS) 997*cda5da8dSAndroid Build Coastguard Worker# ---------------- 998*cda5da8dSAndroid Build Coastguard Worker# Remove one layer of quotes from each ARG, performing one level of 999*cda5da8dSAndroid Build Coastguard Worker# expansion. For one argument, m4_unquote([arg]) is more efficient than 1000*cda5da8dSAndroid Build Coastguard Worker# m4_do([arg]), but for multiple arguments, the difference is that 1001*cda5da8dSAndroid Build Coastguard Worker# m4_unquote separates arguments with commas while m4_do concatenates. 1002*cda5da8dSAndroid Build Coastguard Worker# Follow this macro with [] if concatenation with subsequent text is 1003*cda5da8dSAndroid Build Coastguard Worker# undesired. 1004*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_unquote], [$*]) 1005*cda5da8dSAndroid Build Coastguard Worker 1006*cda5da8dSAndroid Build Coastguard Worker 1007*cda5da8dSAndroid Build Coastguard Worker## -------------------------- ## 1008*cda5da8dSAndroid Build Coastguard Worker## 8. Implementing m4 loops. ## 1009*cda5da8dSAndroid Build Coastguard Worker## -------------------------- ## 1010*cda5da8dSAndroid Build Coastguard Worker 1011*cda5da8dSAndroid Build Coastguard Worker 1012*cda5da8dSAndroid Build Coastguard Worker# m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION) 1013*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------------------- 1014*cda5da8dSAndroid Build Coastguard Worker# Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO with 1015*cda5da8dSAndroid Build Coastguard Worker# increments of STEP. Both limits are included, and bounds are 1016*cda5da8dSAndroid Build Coastguard Worker# checked for consistency. The algorithm is robust to indirect 1017*cda5da8dSAndroid Build Coastguard Worker# VARIABLE names. Changing VARIABLE inside EXPRESSION will not impact 1018*cda5da8dSAndroid Build Coastguard Worker# the number of iterations. 1019*cda5da8dSAndroid Build Coastguard Worker# 1020*cda5da8dSAndroid Build Coastguard Worker# Uses _m4_defn for speed, and avoid dnl in the macro body. Factor 1021*cda5da8dSAndroid Build Coastguard Worker# the _m4_for call so that EXPRESSION is only parsed once. 1022*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_for], 1023*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([$1], m4_eval([$2]))]dnl 1024*cda5da8dSAndroid Build Coastguard Worker[m4_cond([m4_eval(([$3]) > ([$2]))], 1, 1025*cda5da8dSAndroid Build Coastguard Worker [m4_pushdef([_m4_step], m4_eval(m4_default_quoted([$4], 1026*cda5da8dSAndroid Build Coastguard Worker 1)))m4_assert(_m4_step > 0)_$0(_m4_defn([$1]), 1027*cda5da8dSAndroid Build Coastguard Worker m4_eval((([$3]) - ([$2])) / _m4_step * _m4_step + ([$2])), _m4_step,], 1028*cda5da8dSAndroid Build Coastguard Worker [m4_eval(([$3]) < ([$2]))], 1, 1029*cda5da8dSAndroid Build Coastguard Worker [m4_pushdef([_m4_step], m4_eval(m4_default_quoted([$4], 1030*cda5da8dSAndroid Build Coastguard Worker -1)))m4_assert(_m4_step < 0)_$0(_m4_defn([$1]), 1031*cda5da8dSAndroid Build Coastguard Worker m4_eval((([$2]) - ([$3])) / -(_m4_step) * _m4_step + ([$2])), _m4_step,], 1032*cda5da8dSAndroid Build Coastguard Worker [m4_pushdef([_m4_step])_$0(_m4_defn([$1]), _m4_defn([$1]), 0,])]dnl 1033*cda5da8dSAndroid Build Coastguard Worker[[m4_define([$1],], [)$5])m4_popdef([_m4_step], [$1])]) 1034*cda5da8dSAndroid Build Coastguard Worker 1035*cda5da8dSAndroid Build Coastguard Worker# _m4_for(COUNT, LAST, STEP, PRE, POST) 1036*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------- 1037*cda5da8dSAndroid Build Coastguard Worker# Core of the loop, no consistency checks, all arguments are plain 1038*cda5da8dSAndroid Build Coastguard Worker# numbers. Expand PRE[COUNT]POST, then alter COUNT by STEP and 1039*cda5da8dSAndroid Build Coastguard Worker# iterate if COUNT is not LAST. 1040*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_for], 1041*cda5da8dSAndroid Build Coastguard Worker[$4[$1]$5[]m4_if([$1], [$2], [], 1042*cda5da8dSAndroid Build Coastguard Worker [$0(m4_eval([$1 + $3]), [$2], [$3], [$4], [$5])])]) 1043*cda5da8dSAndroid Build Coastguard Worker 1044*cda5da8dSAndroid Build Coastguard Worker 1045*cda5da8dSAndroid Build Coastguard Worker# Implementing `foreach' loops in m4 is much more tricky than it may 1046*cda5da8dSAndroid Build Coastguard Worker# seem. For example, the old M4 1.4.4 manual had an incorrect example, 1047*cda5da8dSAndroid Build Coastguard Worker# which looked like this (when translated to m4sugar): 1048*cda5da8dSAndroid Build Coastguard Worker# 1049*cda5da8dSAndroid Build Coastguard Worker# | # foreach(VAR, (LIST), STMT) 1050*cda5da8dSAndroid Build Coastguard Worker# | m4_define([foreach], 1051*cda5da8dSAndroid Build Coastguard Worker# | [m4_pushdef([$1])_foreach([$1], [$2], [$3])m4_popdef([$1])]) 1052*cda5da8dSAndroid Build Coastguard Worker# | m4_define([_arg1], [$1]) 1053*cda5da8dSAndroid Build Coastguard Worker# | m4_define([_foreach], 1054*cda5da8dSAndroid Build Coastguard Worker# | [m4_if([$2], [()], , 1055*cda5da8dSAndroid Build Coastguard Worker# | [m4_define([$1], _arg1$2)$3[]_foreach([$1], (m4_shift$2), [$3])])]) 1056*cda5da8dSAndroid Build Coastguard Worker# 1057*cda5da8dSAndroid Build Coastguard Worker# But then if you run 1058*cda5da8dSAndroid Build Coastguard Worker# 1059*cda5da8dSAndroid Build Coastguard Worker# | m4_define(a, 1) 1060*cda5da8dSAndroid Build Coastguard Worker# | m4_define(b, 2) 1061*cda5da8dSAndroid Build Coastguard Worker# | m4_define(c, 3) 1062*cda5da8dSAndroid Build Coastguard Worker# | foreach([f], [([a], [(b], [c)])], [echo f 1063*cda5da8dSAndroid Build Coastguard Worker# | ]) 1064*cda5da8dSAndroid Build Coastguard Worker# 1065*cda5da8dSAndroid Build Coastguard Worker# it gives 1066*cda5da8dSAndroid Build Coastguard Worker# 1067*cda5da8dSAndroid Build Coastguard Worker# => echo 1 1068*cda5da8dSAndroid Build Coastguard Worker# => echo (2,3) 1069*cda5da8dSAndroid Build Coastguard Worker# 1070*cda5da8dSAndroid Build Coastguard Worker# which is not what is expected. 1071*cda5da8dSAndroid Build Coastguard Worker# 1072*cda5da8dSAndroid Build Coastguard Worker# Of course the problem is that many quotes are missing. So you add 1073*cda5da8dSAndroid Build Coastguard Worker# plenty of quotes at random places, until you reach the expected 1074*cda5da8dSAndroid Build Coastguard Worker# result. Alternatively, if you are a quoting wizard, you directly 1075*cda5da8dSAndroid Build Coastguard Worker# reach the following implementation (but if you really did, then 1076*cda5da8dSAndroid Build Coastguard Worker# apply to the maintenance of m4sugar!). 1077*cda5da8dSAndroid Build Coastguard Worker# 1078*cda5da8dSAndroid Build Coastguard Worker# | # foreach(VAR, (LIST), STMT) 1079*cda5da8dSAndroid Build Coastguard Worker# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])]) 1080*cda5da8dSAndroid Build Coastguard Worker# | m4_define([_arg1], [[$1]]) 1081*cda5da8dSAndroid Build Coastguard Worker# | m4_define([_foreach], 1082*cda5da8dSAndroid Build Coastguard Worker# | [m4_if($2, [()], , 1083*cda5da8dSAndroid Build Coastguard Worker# | [m4_define([$1], [_arg1$2])$3[]_foreach([$1], [(m4_shift$2)], [$3])])]) 1084*cda5da8dSAndroid Build Coastguard Worker# 1085*cda5da8dSAndroid Build Coastguard Worker# which this time answers 1086*cda5da8dSAndroid Build Coastguard Worker# 1087*cda5da8dSAndroid Build Coastguard Worker# => echo a 1088*cda5da8dSAndroid Build Coastguard Worker# => echo (b 1089*cda5da8dSAndroid Build Coastguard Worker# => echo c) 1090*cda5da8dSAndroid Build Coastguard Worker# 1091*cda5da8dSAndroid Build Coastguard Worker# Bingo! 1092*cda5da8dSAndroid Build Coastguard Worker# 1093*cda5da8dSAndroid Build Coastguard Worker# Well, not quite. 1094*cda5da8dSAndroid Build Coastguard Worker# 1095*cda5da8dSAndroid Build Coastguard Worker# With a better look, you realize that the parens are more a pain than 1096*cda5da8dSAndroid Build Coastguard Worker# a help: since anyway you need to quote properly the list, you end up 1097*cda5da8dSAndroid Build Coastguard Worker# with always using an outermost pair of parens and an outermost pair 1098*cda5da8dSAndroid Build Coastguard Worker# of quotes. Rejecting the parens both eases the implementation, and 1099*cda5da8dSAndroid Build Coastguard Worker# simplifies the use: 1100*cda5da8dSAndroid Build Coastguard Worker# 1101*cda5da8dSAndroid Build Coastguard Worker# | # foreach(VAR, (LIST), STMT) 1102*cda5da8dSAndroid Build Coastguard Worker# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])]) 1103*cda5da8dSAndroid Build Coastguard Worker# | m4_define([_arg1], [$1]) 1104*cda5da8dSAndroid Build Coastguard Worker# | m4_define([_foreach], 1105*cda5da8dSAndroid Build Coastguard Worker# | [m4_if($2, [], , 1106*cda5da8dSAndroid Build Coastguard Worker# | [m4_define([$1], [_arg1($2)])$3[]_foreach([$1], [m4_shift($2)], [$3])])]) 1107*cda5da8dSAndroid Build Coastguard Worker# 1108*cda5da8dSAndroid Build Coastguard Worker# 1109*cda5da8dSAndroid Build Coastguard Worker# Now, just replace the `$2' with `m4_quote($2)' in the outer `m4_if' 1110*cda5da8dSAndroid Build Coastguard Worker# to improve robustness, and you come up with a nice implementation 1111*cda5da8dSAndroid Build Coastguard Worker# that doesn't require extra parentheses in the user's LIST. 1112*cda5da8dSAndroid Build Coastguard Worker# 1113*cda5da8dSAndroid Build Coastguard Worker# But wait - now the algorithm is quadratic, because every recursion of 1114*cda5da8dSAndroid Build Coastguard Worker# the algorithm keeps the entire LIST and merely adds another m4_shift to 1115*cda5da8dSAndroid Build Coastguard Worker# the quoted text. If the user has a lot of elements in LIST, you can 1116*cda5da8dSAndroid Build Coastguard Worker# bring the system to its knees with the memory m4 then requires, or trip 1117*cda5da8dSAndroid Build Coastguard Worker# the m4 --nesting-limit recursion factor. The only way to avoid 1118*cda5da8dSAndroid Build Coastguard Worker# quadratic growth is ensure m4_shift is expanded prior to the recursion. 1119*cda5da8dSAndroid Build Coastguard Worker# Hence the design below. 1120*cda5da8dSAndroid Build Coastguard Worker# 1121*cda5da8dSAndroid Build Coastguard Worker# The M4 manual now includes a chapter devoted to this issue, with 1122*cda5da8dSAndroid Build Coastguard Worker# the lessons learned from m4sugar. And still, this design is only 1123*cda5da8dSAndroid Build Coastguard Worker# optimal for M4 1.6; see foreach.m4 for yet more comments on why 1124*cda5da8dSAndroid Build Coastguard Worker# M4 1.4.x uses yet another implementation. 1125*cda5da8dSAndroid Build Coastguard Worker 1126*cda5da8dSAndroid Build Coastguard Worker 1127*cda5da8dSAndroid Build Coastguard Worker# m4_foreach(VARIABLE, LIST, EXPRESSION) 1128*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------- 1129*cda5da8dSAndroid Build Coastguard Worker# 1130*cda5da8dSAndroid Build Coastguard Worker# Expand EXPRESSION assigning each value of the LIST to VARIABLE. 1131*cda5da8dSAndroid Build Coastguard Worker# LIST should have the form `item_1, item_2, ..., item_n', i.e. the 1132*cda5da8dSAndroid Build Coastguard Worker# whole list must *quoted*. Quote members too if you don't want them 1133*cda5da8dSAndroid Build Coastguard Worker# to be expanded. 1134*cda5da8dSAndroid Build Coastguard Worker# 1135*cda5da8dSAndroid Build Coastguard Worker# This macro is robust to active symbols: 1136*cda5da8dSAndroid Build Coastguard Worker# | m4_define(active, [ACT, IVE]) 1137*cda5da8dSAndroid Build Coastguard Worker# | m4_foreach(Var, [active, active], [-Var-]) 1138*cda5da8dSAndroid Build Coastguard Worker# => -ACT--IVE--ACT--IVE- 1139*cda5da8dSAndroid Build Coastguard Worker# 1140*cda5da8dSAndroid Build Coastguard Worker# | m4_foreach(Var, [[active], [active]], [-Var-]) 1141*cda5da8dSAndroid Build Coastguard Worker# => -ACT, IVE--ACT, IVE- 1142*cda5da8dSAndroid Build Coastguard Worker# 1143*cda5da8dSAndroid Build Coastguard Worker# | m4_foreach(Var, [[[active]], [[active]]], [-Var-]) 1144*cda5da8dSAndroid Build Coastguard Worker# => -active--active- 1145*cda5da8dSAndroid Build Coastguard Worker# 1146*cda5da8dSAndroid Build Coastguard Worker# This macro is called frequently, so avoid extra expansions such as 1147*cda5da8dSAndroid Build Coastguard Worker# m4_ifval and dnl. Also, since $2 might be quite large, try to use it 1148*cda5da8dSAndroid Build Coastguard Worker# as little as possible in _m4_foreach; each extra use requires that much 1149*cda5da8dSAndroid Build Coastguard Worker# more memory for expansion. So, rather than directly compare $2 against 1150*cda5da8dSAndroid Build Coastguard Worker# [] and use m4_car/m4_cdr for recursion, we instead unbox the list (which 1151*cda5da8dSAndroid Build Coastguard Worker# requires swapping the argument order in the helper), insert an ignored 1152*cda5da8dSAndroid Build Coastguard Worker# third argument, and use m4_shift3 to detect when recursion is complete, 1153*cda5da8dSAndroid Build Coastguard Worker# at which point this looks very much like m4_map_args. 1154*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_foreach], 1155*cda5da8dSAndroid Build Coastguard Worker[m4_if([$2], [], [], 1156*cda5da8dSAndroid Build Coastguard Worker [m4_pushdef([$1])_$0([m4_define([$1],], [)$3], [], 1157*cda5da8dSAndroid Build Coastguard Worker $2)m4_popdef([$1])])]) 1158*cda5da8dSAndroid Build Coastguard Worker 1159*cda5da8dSAndroid Build Coastguard Worker# _m4_foreach(PRE, POST, IGNORED, ARG...) 1160*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------- 1161*cda5da8dSAndroid Build Coastguard Worker# Form the common basis of the m4_foreach and m4_map macros. For each 1162*cda5da8dSAndroid Build Coastguard Worker# ARG, expand PRE[ARG]POST[]. The IGNORED argument makes recursion 1163*cda5da8dSAndroid Build Coastguard Worker# easier, and must be supplied rather than implicit. 1164*cda5da8dSAndroid Build Coastguard Worker# 1165*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 1166*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_foreach], 1167*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [3], [], 1168*cda5da8dSAndroid Build Coastguard Worker [$1[$4]$2[]$0([$1], [$2], m4_shift3($@))])]) 1169*cda5da8dSAndroid Build Coastguard Worker 1170*cda5da8dSAndroid Build Coastguard Worker 1171*cda5da8dSAndroid Build Coastguard Worker# m4_foreach_w(VARIABLE, LIST, EXPRESSION) 1172*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------- 1173*cda5da8dSAndroid Build Coastguard Worker# Like m4_foreach, but the list is whitespace separated. Depending on 1174*cda5da8dSAndroid Build Coastguard Worker# EXPRESSION, it may be more efficient to use m4_map_args_w. 1175*cda5da8dSAndroid Build Coastguard Worker# 1176*cda5da8dSAndroid Build Coastguard Worker# This macro is robust to active symbols: 1177*cda5da8dSAndroid Build Coastguard Worker# m4_foreach_w([Var], [ active 1178*cda5da8dSAndroid Build Coastguard Worker# b act\ 1179*cda5da8dSAndroid Build Coastguard Worker# ive ], [-Var-])end 1180*cda5da8dSAndroid Build Coastguard Worker# => -active--b--active-end 1181*cda5da8dSAndroid Build Coastguard Worker# 1182*cda5da8dSAndroid Build Coastguard Worker# This used to use a slower implementation based on m4_foreach: 1183*cda5da8dSAndroid Build Coastguard Worker# m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3]) 1184*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_foreach_w], 1185*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([$1])m4_map_args_w([$2], 1186*cda5da8dSAndroid Build Coastguard Worker [m4_define([$1],], [)$3])m4_popdef([$1])]) 1187*cda5da8dSAndroid Build Coastguard Worker 1188*cda5da8dSAndroid Build Coastguard Worker 1189*cda5da8dSAndroid Build Coastguard Worker# m4_map(MACRO, LIST) 1190*cda5da8dSAndroid Build Coastguard Worker# m4_mapall(MACRO, LIST) 1191*cda5da8dSAndroid Build Coastguard Worker# ---------------------- 1192*cda5da8dSAndroid Build Coastguard Worker# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements of 1193*cda5da8dSAndroid Build Coastguard Worker# LIST. $1, $2... must in turn be lists, appropriate for m4_apply. 1194*cda5da8dSAndroid Build Coastguard Worker# If LIST contains an empty sublist, m4_map skips the expansion of 1195*cda5da8dSAndroid Build Coastguard Worker# MACRO, while m4_mapall expands MACRO with no arguments. 1196*cda5da8dSAndroid Build Coastguard Worker# 1197*cda5da8dSAndroid Build Coastguard Worker# Since LIST may be quite large, we want to minimize how often it 1198*cda5da8dSAndroid Build Coastguard Worker# appears in the expansion. Rather than use m4_car/m4_cdr iteration, 1199*cda5da8dSAndroid Build Coastguard Worker# we unbox the list, and use _m4_foreach for iteration. For m4_map, 1200*cda5da8dSAndroid Build Coastguard Worker# an empty list behaves like an empty sublist and gets ignored; for 1201*cda5da8dSAndroid Build Coastguard Worker# m4_mapall, we must special-case the empty list. 1202*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_map], 1203*cda5da8dSAndroid Build Coastguard Worker[_m4_foreach([_m4_apply([$1],], [)], [], $2)]) 1204*cda5da8dSAndroid Build Coastguard Worker 1205*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_mapall], 1206*cda5da8dSAndroid Build Coastguard Worker[m4_if([$2], [], [], 1207*cda5da8dSAndroid Build Coastguard Worker [_m4_foreach([m4_apply([$1],], [)], [], $2)])]) 1208*cda5da8dSAndroid Build Coastguard Worker 1209*cda5da8dSAndroid Build Coastguard Worker 1210*cda5da8dSAndroid Build Coastguard Worker# m4_map_sep(MACRO, [SEPARATOR], LIST) 1211*cda5da8dSAndroid Build Coastguard Worker# m4_mapall_sep(MACRO, [SEPARATOR], LIST) 1212*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------- 1213*cda5da8dSAndroid Build Coastguard Worker# Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1, 1214*cda5da8dSAndroid Build Coastguard Worker# $2... $N are the elements of LIST, and are in turn lists appropriate 1215*cda5da8dSAndroid Build Coastguard Worker# for m4_apply. SEPARATOR is expanded, in order to allow the creation 1216*cda5da8dSAndroid Build Coastguard Worker# of a list of arguments by using a single-quoted comma as the 1217*cda5da8dSAndroid Build Coastguard Worker# separator. For each empty sublist, m4_map_sep skips the expansion 1218*cda5da8dSAndroid Build Coastguard Worker# of MACRO and SEPARATOR, while m4_mapall_sep expands MACRO with no 1219*cda5da8dSAndroid Build Coastguard Worker# arguments. 1220*cda5da8dSAndroid Build Coastguard Worker# 1221*cda5da8dSAndroid Build Coastguard Worker# For m4_mapall_sep, merely expand the first iteration without the 1222*cda5da8dSAndroid Build Coastguard Worker# separator, then include separator as part of subsequent recursion; 1223*cda5da8dSAndroid Build Coastguard Worker# but avoid extra expansion of LIST's side-effects via a helper macro. 1224*cda5da8dSAndroid Build Coastguard Worker# For m4_map_sep, things are trickier - we don't know if the first 1225*cda5da8dSAndroid Build Coastguard Worker# list element is an empty sublist, so we must define a self-modifying 1226*cda5da8dSAndroid Build Coastguard Worker# helper macro and use that as the separator instead. 1227*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_map_sep], 1228*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([m4_Sep], [m4_define([m4_Sep], _m4_defn([m4_unquote]))])]dnl 1229*cda5da8dSAndroid Build Coastguard Worker[_m4_foreach([_m4_apply([m4_Sep([$2])[]$1],], [)], [], $3)m4_popdef([m4_Sep])]) 1230*cda5da8dSAndroid Build Coastguard Worker 1231*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_mapall_sep], 1232*cda5da8dSAndroid Build Coastguard Worker[m4_if([$3], [], [], [_$0([$1], [$2], $3)])]) 1233*cda5da8dSAndroid Build Coastguard Worker 1234*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_mapall_sep], 1235*cda5da8dSAndroid Build Coastguard Worker[m4_apply([$1], [$3])_m4_foreach([m4_apply([$2[]$1],], [)], m4_shift2($@))]) 1236*cda5da8dSAndroid Build Coastguard Worker 1237*cda5da8dSAndroid Build Coastguard Worker# m4_map_args(EXPRESSION, ARG...) 1238*cda5da8dSAndroid Build Coastguard Worker# ------------------------------- 1239*cda5da8dSAndroid Build Coastguard Worker# Expand EXPRESSION([ARG]) for each argument. More efficient than 1240*cda5da8dSAndroid Build Coastguard Worker# m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))]) 1241*cda5da8dSAndroid Build Coastguard Worker# Shorthand for m4_map_args_sep([EXPRESSION(], [)], [], ARG...). 1242*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_map_args], 1243*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])], 1244*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [], 1245*cda5da8dSAndroid Build Coastguard Worker [$#], [2], [$1([$2])[]], 1246*cda5da8dSAndroid Build Coastguard Worker [_m4_foreach([$1(], [)], $@)])]) 1247*cda5da8dSAndroid Build Coastguard Worker 1248*cda5da8dSAndroid Build Coastguard Worker 1249*cda5da8dSAndroid Build Coastguard Worker# m4_map_args_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...) 1250*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------------- 1251*cda5da8dSAndroid Build Coastguard Worker# Perform a pairwise grouping of consecutive ARGs, by expanding 1252*cda5da8dSAndroid Build Coastguard Worker# EXPRESSION([ARG1], [ARG2]). If there are an odd number of ARGs, the 1253*cda5da8dSAndroid Build Coastguard Worker# final argument is expanded with END-EXPR([ARGn]). 1254*cda5da8dSAndroid Build Coastguard Worker# 1255*cda5da8dSAndroid Build Coastguard Worker# For example: 1256*cda5da8dSAndroid Build Coastguard Worker# m4_define([show], [($*)m4_newline])dnl 1257*cda5da8dSAndroid Build Coastguard Worker# m4_map_args_pair([show], [], [a], [b], [c], [d], [e])dnl 1258*cda5da8dSAndroid Build Coastguard Worker# => (a,b) 1259*cda5da8dSAndroid Build Coastguard Worker# => (c,d) 1260*cda5da8dSAndroid Build Coastguard Worker# => (e) 1261*cda5da8dSAndroid Build Coastguard Worker# 1262*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 1263*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_map_args_pair], 1264*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])], 1265*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_fatal([$0: too few arguments: $#: $1])], 1266*cda5da8dSAndroid Build Coastguard Worker [$#], [2], [], 1267*cda5da8dSAndroid Build Coastguard Worker [$#], [3], [m4_default([$2], [$1])([$3])[]], 1268*cda5da8dSAndroid Build Coastguard Worker [$#], [4], [$1([$3], [$4])[]], 1269*cda5da8dSAndroid Build Coastguard Worker [$1([$3], [$4])[]$0([$1], [$2], m4_shift(m4_shift3($@)))])]) 1270*cda5da8dSAndroid Build Coastguard Worker 1271*cda5da8dSAndroid Build Coastguard Worker 1272*cda5da8dSAndroid Build Coastguard Worker# m4_map_args_sep([PRE], [POST], [SEP], ARG...) 1273*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------- 1274*cda5da8dSAndroid Build Coastguard Worker# Expand PRE[ARG]POST for each argument, with SEP between arguments. 1275*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_map_args_sep], 1276*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])], 1277*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [], 1278*cda5da8dSAndroid Build Coastguard Worker [$#], [2], [], 1279*cda5da8dSAndroid Build Coastguard Worker [$#], [3], [], 1280*cda5da8dSAndroid Build Coastguard Worker [$#], [4], [$1[$4]$2[]], 1281*cda5da8dSAndroid Build Coastguard Worker [$1[$4]$2[]_m4_foreach([$3[]$1], [$2], m4_shift3($@))])]) 1282*cda5da8dSAndroid Build Coastguard Worker 1283*cda5da8dSAndroid Build Coastguard Worker 1284*cda5da8dSAndroid Build Coastguard Worker# m4_map_args_w(STRING, [PRE], [POST], [SEP]) 1285*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------- 1286*cda5da8dSAndroid Build Coastguard Worker# Perform the expansion of PRE[word]POST[] for each word in STRING 1287*cda5da8dSAndroid Build Coastguard Worker# separated by whitespace. More efficient than: 1288*cda5da8dSAndroid Build Coastguard Worker# m4_foreach_w([var], [STRING], [PRE[]m4_defn([var])POST]) 1289*cda5da8dSAndroid Build Coastguard Worker# Additionally, expand SEP between words. 1290*cda5da8dSAndroid Build Coastguard Worker# 1291*cda5da8dSAndroid Build Coastguard Worker# As long as we have to use m4_bpatsubst to split the string, we might 1292*cda5da8dSAndroid Build Coastguard Worker# as well make it also apply PRE and POST; this avoids iteration 1293*cda5da8dSAndroid Build Coastguard Worker# altogether. But we must be careful of any \ in PRE or POST. 1294*cda5da8dSAndroid Build Coastguard Worker# _m4_strip returns a quoted string, but that's okay, since it also 1295*cda5da8dSAndroid Build Coastguard Worker# supplies an empty leading and trailing argument due to our 1296*cda5da8dSAndroid Build Coastguard Worker# intentional whitespace around STRING. We use m4_substr to strip the 1297*cda5da8dSAndroid Build Coastguard Worker# empty elements and remove the extra layer of quoting. 1298*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_map_args_w], 1299*cda5da8dSAndroid Build Coastguard Worker[_$0(_m4_split([ ]m4_flatten([$1])[ ], [[ ]+], 1300*cda5da8dSAndroid Build Coastguard Worker m4_if(m4_index([$2$3$4], [\]), [-1], [[$3[]$4[]$2]], 1301*cda5da8dSAndroid Build Coastguard Worker [m4_bpatsubst([[$3[]$4[]$2]], [\\], [\\\\])])), 1302*cda5da8dSAndroid Build Coastguard Worker m4_len([[]$3[]$4]), m4_len([$4[]$2[]]))]) 1303*cda5da8dSAndroid Build Coastguard Worker 1304*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_map_args_w], 1305*cda5da8dSAndroid Build Coastguard Worker[m4_substr([$1], [$2], m4_eval(m4_len([$1]) - [$2] - [$3]))]) 1306*cda5da8dSAndroid Build Coastguard Worker 1307*cda5da8dSAndroid Build Coastguard Worker 1308*cda5da8dSAndroid Build Coastguard Worker# m4_stack_foreach(MACRO, FUNC) 1309*cda5da8dSAndroid Build Coastguard Worker# m4_stack_foreach_lifo(MACRO, FUNC) 1310*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------- 1311*cda5da8dSAndroid Build Coastguard Worker# Pass each stacked definition of MACRO to the one-argument macro FUNC. 1312*cda5da8dSAndroid Build Coastguard Worker# m4_stack_foreach proceeds in FIFO order, while m4_stack_foreach_lifo 1313*cda5da8dSAndroid Build Coastguard Worker# processes the topmost definitions first. In addition, FUNC should 1314*cda5da8dSAndroid Build Coastguard Worker# not push or pop definitions of MACRO, and should not expect anything about 1315*cda5da8dSAndroid Build Coastguard Worker# the active definition of MACRO (it will not be the topmost, and may not 1316*cda5da8dSAndroid Build Coastguard Worker# be the one passed to FUNC either). 1317*cda5da8dSAndroid Build Coastguard Worker# 1318*cda5da8dSAndroid Build Coastguard Worker# Some macros simply can't be examined with this method: namely, 1319*cda5da8dSAndroid Build Coastguard Worker# anything involved in the implementation of _m4_stack_reverse. 1320*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_stack_foreach], 1321*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([$1], [m4_tmp-$1])]dnl 1322*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([m4_tmp-$1], [$1], [$2(_m4_defn([m4_tmp-$1]))])]) 1323*cda5da8dSAndroid Build Coastguard Worker 1324*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_stack_foreach_lifo], 1325*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([$1], [m4_tmp-$1], [$2(_m4_defn([m4_tmp-$1]))])]dnl 1326*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([m4_tmp-$1], [$1])]) 1327*cda5da8dSAndroid Build Coastguard Worker 1328*cda5da8dSAndroid Build Coastguard Worker# m4_stack_foreach_sep(MACRO, [PRE], [POST], [SEP]) 1329*cda5da8dSAndroid Build Coastguard Worker# m4_stack_foreach_sep_lifo(MACRO, [PRE], [POST], [SEP]) 1330*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------ 1331*cda5da8dSAndroid Build Coastguard Worker# Similar to m4_stack_foreach and m4_stack_foreach_lifo, in that every 1332*cda5da8dSAndroid Build Coastguard Worker# definition of a pushdef stack will be visited. But rather than 1333*cda5da8dSAndroid Build Coastguard Worker# passing the definition as a single argument to a macro, this variant 1334*cda5da8dSAndroid Build Coastguard Worker# expands the concatenation of PRE[]definition[]POST, and expands SEP 1335*cda5da8dSAndroid Build Coastguard Worker# between consecutive expansions. Note that m4_stack_foreach([a], [b]) 1336*cda5da8dSAndroid Build Coastguard Worker# is equivalent to m4_stack_foreach_sep([a], [b(], [)]). 1337*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_stack_foreach_sep], 1338*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([$1], [m4_tmp-$1])]dnl 1339*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([m4_tmp-$1], [$1], [$2[]_m4_defn([m4_tmp-$1])$3], [$4[]])]) 1340*cda5da8dSAndroid Build Coastguard Worker 1341*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_stack_foreach_sep_lifo], 1342*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([$1], [m4_tmp-$1], [$2[]_m4_defn([m4_tmp-$1])$3], [$4[]])]dnl 1343*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([m4_tmp-$1], [$1])]) 1344*cda5da8dSAndroid Build Coastguard Worker 1345*cda5da8dSAndroid Build Coastguard Worker 1346*cda5da8dSAndroid Build Coastguard Worker# _m4_stack_reverse(OLD, NEW, [ACTION], [SEP]) 1347*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------- 1348*cda5da8dSAndroid Build Coastguard Worker# A recursive worker for pushdef stack manipulation. Destructively 1349*cda5da8dSAndroid Build Coastguard Worker# copy the OLD stack into the NEW, and expanding ACTION for each 1350*cda5da8dSAndroid Build Coastguard Worker# iteration. After the first iteration, SEP is promoted to the front 1351*cda5da8dSAndroid Build Coastguard Worker# of ACTION (note that SEP should include a trailing [] if it is to 1352*cda5da8dSAndroid Build Coastguard Worker# avoid interfering with ACTION). The current definition is examined 1353*cda5da8dSAndroid Build Coastguard Worker# after the NEW has been pushed but before OLD has been popped; this 1354*cda5da8dSAndroid Build Coastguard Worker# order is important, as ACTION is permitted to operate on either 1355*cda5da8dSAndroid Build Coastguard Worker# _m4_defn([OLD]) or _m4_defn([NEW]). Since the operation is 1356*cda5da8dSAndroid Build Coastguard Worker# destructive, this macro is generally used twice, with a temporary 1357*cda5da8dSAndroid Build Coastguard Worker# macro name holding the swapped copy. 1358*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_stack_reverse], 1359*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$1], [m4_pushdef([$2], 1360*cda5da8dSAndroid Build Coastguard Worker _m4_defn([$1]))$3[]_m4_popdef([$1])$0([$1], [$2], [$4$3])])]) 1361*cda5da8dSAndroid Build Coastguard Worker 1362*cda5da8dSAndroid Build Coastguard Worker 1363*cda5da8dSAndroid Build Coastguard Worker 1364*cda5da8dSAndroid Build Coastguard Worker## --------------------------- ## 1365*cda5da8dSAndroid Build Coastguard Worker## 9. More diversion support. ## 1366*cda5da8dSAndroid Build Coastguard Worker## --------------------------- ## 1367*cda5da8dSAndroid Build Coastguard Worker 1368*cda5da8dSAndroid Build Coastguard Worker 1369*cda5da8dSAndroid Build Coastguard Worker# m4_cleardivert(DIVERSION-NAME...) 1370*cda5da8dSAndroid Build Coastguard Worker# --------------------------------- 1371*cda5da8dSAndroid Build Coastguard Worker# Discard any text in DIVERSION-NAME. 1372*cda5da8dSAndroid Build Coastguard Worker# 1373*cda5da8dSAndroid Build Coastguard Worker# This works even inside m4_expand. 1374*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cleardivert], 1375*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: missing argument])], 1376*cda5da8dSAndroid Build Coastguard Worker [_m4_divert_raw([-1])m4_undivert($@)_m4_divert_raw( 1377*cda5da8dSAndroid Build Coastguard Worker _m4_divert(_m4_defn([_m4_divert_diversion]), [-]))])]) 1378*cda5da8dSAndroid Build Coastguard Worker 1379*cda5da8dSAndroid Build Coastguard Worker 1380*cda5da8dSAndroid Build Coastguard Worker# _m4_divert(DIVERSION-NAME or NUMBER, [NOWARN]) 1381*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------- 1382*cda5da8dSAndroid Build Coastguard Worker# If DIVERSION-NAME is the name of a diversion, return its number, 1383*cda5da8dSAndroid Build Coastguard Worker# otherwise if it is a NUMBER return it. Issue a warning about 1384*cda5da8dSAndroid Build Coastguard Worker# the use of a number instead of a name, unless NOWARN is provided. 1385*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_divert], 1386*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_divert($1)], 1387*cda5da8dSAndroid Build Coastguard Worker [m4_indir([_m4_divert($1)])], 1388*cda5da8dSAndroid Build Coastguard Worker [m4_if([$2], [], [m4_warn([syntax], 1389*cda5da8dSAndroid Build Coastguard Worker [prefer named diversions])])$1])]) 1390*cda5da8dSAndroid Build Coastguard Worker 1391*cda5da8dSAndroid Build Coastguard Worker# KILL is only used to suppress output. 1392*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_divert(KILL)], -1) 1393*cda5da8dSAndroid Build Coastguard Worker 1394*cda5da8dSAndroid Build Coastguard Worker# The empty diversion name is a synonym for 0. 1395*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_divert()], 0) 1396*cda5da8dSAndroid Build Coastguard Worker 1397*cda5da8dSAndroid Build Coastguard Worker 1398*cda5da8dSAndroid Build Coastguard Worker# m4_divert_stack 1399*cda5da8dSAndroid Build Coastguard Worker# --------------- 1400*cda5da8dSAndroid Build Coastguard Worker# Print the diversion stack, if it's nonempty. The caller is 1401*cda5da8dSAndroid Build Coastguard Worker# responsible for any leading or trailing newline. 1402*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert_stack], 1403*cda5da8dSAndroid Build Coastguard Worker[m4_stack_foreach_sep_lifo([_m4_divert_stack], [], [], [ 1404*cda5da8dSAndroid Build Coastguard Worker])]) 1405*cda5da8dSAndroid Build Coastguard Worker 1406*cda5da8dSAndroid Build Coastguard Worker 1407*cda5da8dSAndroid Build Coastguard Worker# m4_divert_stack_push(MACRO-NAME, DIVERSION-NAME) 1408*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------ 1409*cda5da8dSAndroid Build Coastguard Worker# Form an entry of the diversion stack from caller MACRO-NAME and 1410*cda5da8dSAndroid Build Coastguard Worker# entering DIVERSION-NAME and push it. 1411*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert_stack_push], 1412*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_m4_divert_stack], m4_location[: $1: $2])]) 1413*cda5da8dSAndroid Build Coastguard Worker 1414*cda5da8dSAndroid Build Coastguard Worker 1415*cda5da8dSAndroid Build Coastguard Worker# m4_divert(DIVERSION-NAME) 1416*cda5da8dSAndroid Build Coastguard Worker# ------------------------- 1417*cda5da8dSAndroid Build Coastguard Worker# Change the diversion stream to DIVERSION-NAME. 1418*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert], 1419*cda5da8dSAndroid Build Coastguard Worker[m4_popdef([_m4_divert_stack])]dnl 1420*cda5da8dSAndroid Build Coastguard Worker[m4_define([_m4_divert_diversion], [$1])]dnl 1421*cda5da8dSAndroid Build Coastguard Worker[m4_divert_stack_push([$0], [$1])]dnl 1422*cda5da8dSAndroid Build Coastguard Worker[_m4_divert_raw(_m4_divert([$1]))]) 1423*cda5da8dSAndroid Build Coastguard Worker 1424*cda5da8dSAndroid Build Coastguard Worker 1425*cda5da8dSAndroid Build Coastguard Worker# m4_divert_push(DIVERSION-NAME, [NOWARN]) 1426*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------- 1427*cda5da8dSAndroid Build Coastguard Worker# Change the diversion stream to DIVERSION-NAME, while stacking old values. 1428*cda5da8dSAndroid Build Coastguard Worker# For internal use only: if NOWARN is not empty, DIVERSION-NAME can be a 1429*cda5da8dSAndroid Build Coastguard Worker# number instead of a name. 1430*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert_push], 1431*cda5da8dSAndroid Build Coastguard Worker[m4_divert_stack_push([$0], [$1])]dnl 1432*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_m4_divert_diversion], [$1])]dnl 1433*cda5da8dSAndroid Build Coastguard Worker[_m4_divert_raw(_m4_divert([$1], [$2]))]) 1434*cda5da8dSAndroid Build Coastguard Worker 1435*cda5da8dSAndroid Build Coastguard Worker 1436*cda5da8dSAndroid Build Coastguard Worker# m4_divert_pop([DIVERSION-NAME]) 1437*cda5da8dSAndroid Build Coastguard Worker# ------------------------------- 1438*cda5da8dSAndroid Build Coastguard Worker# Change the diversion stream to its previous value, unstacking it. 1439*cda5da8dSAndroid Build Coastguard Worker# If specified, verify we left DIVERSION-NAME. 1440*cda5da8dSAndroid Build Coastguard Worker# When we pop the last value from the stack, we divert to -1. 1441*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert_pop], 1442*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [], [], 1443*cda5da8dSAndroid Build Coastguard Worker [$1], _m4_defn([_m4_divert_diversion]), [], 1444*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0($1): diversion mismatch: 1445*cda5da8dSAndroid Build Coastguard Worker]m4_divert_stack)])]dnl 1446*cda5da8dSAndroid Build Coastguard Worker[_m4_popdef([_m4_divert_stack], [_m4_divert_diversion])]dnl 1447*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_divert_diversion], [], 1448*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([too many m4_divert_pop])])]dnl 1449*cda5da8dSAndroid Build Coastguard Worker[_m4_divert_raw(_m4_divert(_m4_defn([_m4_divert_diversion]), [-]))]) 1450*cda5da8dSAndroid Build Coastguard Worker 1451*cda5da8dSAndroid Build Coastguard Worker 1452*cda5da8dSAndroid Build Coastguard Worker# m4_divert_text(DIVERSION-NAME, CONTENT) 1453*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------- 1454*cda5da8dSAndroid Build Coastguard Worker# Output CONTENT into DIVERSION-NAME (which may be a number actually). 1455*cda5da8dSAndroid Build Coastguard Worker# An end of line is appended for free to CONTENT. 1456*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert_text], 1457*cda5da8dSAndroid Build Coastguard Worker[m4_divert_push([$1])$2 1458*cda5da8dSAndroid Build Coastguard Workerm4_divert_pop([$1])]) 1459*cda5da8dSAndroid Build Coastguard Worker 1460*cda5da8dSAndroid Build Coastguard Worker 1461*cda5da8dSAndroid Build Coastguard Worker# m4_divert_once(DIVERSION-NAME, CONTENT) 1462*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------- 1463*cda5da8dSAndroid Build Coastguard Worker# Output CONTENT into DIVERSION-NAME once, if not already there. 1464*cda5da8dSAndroid Build Coastguard Worker# An end of line is appended for free to CONTENT. 1465*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert_once], 1466*cda5da8dSAndroid Build Coastguard Worker[m4_expand_once([m4_divert_text([$1], [$2])])]) 1467*cda5da8dSAndroid Build Coastguard Worker 1468*cda5da8dSAndroid Build Coastguard Worker 1469*cda5da8dSAndroid Build Coastguard Worker# _m4_divert_unsafe(DIVERSION-NAME) 1470*cda5da8dSAndroid Build Coastguard Worker# --------------------------------- 1471*cda5da8dSAndroid Build Coastguard Worker# Issue a warning that the attempt to change the current diversion to 1472*cda5da8dSAndroid Build Coastguard Worker# DIVERSION-NAME is unsafe, because this macro is being expanded 1473*cda5da8dSAndroid Build Coastguard Worker# during argument collection of m4_expand. 1474*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_divert_unsafe], 1475*cda5da8dSAndroid Build Coastguard Worker[m4_fatal([$0: cannot change diversion to `$1' inside m4_expand])]) 1476*cda5da8dSAndroid Build Coastguard Worker 1477*cda5da8dSAndroid Build Coastguard Worker 1478*cda5da8dSAndroid Build Coastguard Worker# m4_undivert(DIVERSION-NAME...) 1479*cda5da8dSAndroid Build Coastguard Worker# ------------------------------ 1480*cda5da8dSAndroid Build Coastguard Worker# Undivert DIVERSION-NAME. Unlike the M4 version, this requires at 1481*cda5da8dSAndroid Build Coastguard Worker# least one DIVERSION-NAME; also, due to support for named diversions, 1482*cda5da8dSAndroid Build Coastguard Worker# this should not be used to undivert files. 1483*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_undivert], 1484*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([$0: missing argument])], 1485*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [_m4_undivert(_m4_divert([$1]))], 1486*cda5da8dSAndroid Build Coastguard Worker [m4_map_args([$0], $@)])]) 1487*cda5da8dSAndroid Build Coastguard Worker 1488*cda5da8dSAndroid Build Coastguard Worker 1489*cda5da8dSAndroid Build Coastguard Worker## --------------------------------------------- ## 1490*cda5da8dSAndroid Build Coastguard Worker## 10. Defining macros with bells and whistles. ## 1491*cda5da8dSAndroid Build Coastguard Worker## --------------------------------------------- ## 1492*cda5da8dSAndroid Build Coastguard Worker 1493*cda5da8dSAndroid Build Coastguard Worker# `m4_defun' is basically `m4_define' but it equips the macro with the 1494*cda5da8dSAndroid Build Coastguard Worker# needed machinery for `m4_require'. A macro must be m4_defun'd if 1495*cda5da8dSAndroid Build Coastguard Worker# either it is m4_require'd, or it m4_require's. 1496*cda5da8dSAndroid Build Coastguard Worker# 1497*cda5da8dSAndroid Build Coastguard Worker# Two things deserve attention and are detailed below: 1498*cda5da8dSAndroid Build Coastguard Worker# 1. Implementation of m4_require 1499*cda5da8dSAndroid Build Coastguard Worker# 2. Keeping track of the expansion stack 1500*cda5da8dSAndroid Build Coastguard Worker# 1501*cda5da8dSAndroid Build Coastguard Worker# 1. Implementation of m4_require 1502*cda5da8dSAndroid Build Coastguard Worker# =============================== 1503*cda5da8dSAndroid Build Coastguard Worker# 1504*cda5da8dSAndroid Build Coastguard Worker# Of course m4_defun calls m4_provide, so that a macro which has 1505*cda5da8dSAndroid Build Coastguard Worker# been expanded is not expanded again when m4_require'd, but the 1506*cda5da8dSAndroid Build Coastguard Worker# difficult part is the proper expansion of macros when they are 1507*cda5da8dSAndroid Build Coastguard Worker# m4_require'd. 1508*cda5da8dSAndroid Build Coastguard Worker# 1509*cda5da8dSAndroid Build Coastguard Worker# The implementation is based on three ideas, (i) using diversions to 1510*cda5da8dSAndroid Build Coastguard Worker# prepare the expansion of the macro and its dependencies (by Franc,ois 1511*cda5da8dSAndroid Build Coastguard Worker# Pinard), (ii) expand the most recently m4_require'd macros _after_ 1512*cda5da8dSAndroid Build Coastguard Worker# the previous macros (by Axel Thimm), and (iii) track instances of 1513*cda5da8dSAndroid Build Coastguard Worker# provide before require (by Eric Blake). 1514*cda5da8dSAndroid Build Coastguard Worker# 1515*cda5da8dSAndroid Build Coastguard Worker# 1516*cda5da8dSAndroid Build Coastguard Worker# The first idea: why use diversions? 1517*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------- 1518*cda5da8dSAndroid Build Coastguard Worker# 1519*cda5da8dSAndroid Build Coastguard Worker# When a macro requires another, the other macro is expanded in new 1520*cda5da8dSAndroid Build Coastguard Worker# diversion, GROW. When the outer macro is fully expanded, we first 1521*cda5da8dSAndroid Build Coastguard Worker# undivert the most nested diversions (GROW - 1...), and finally 1522*cda5da8dSAndroid Build Coastguard Worker# undivert GROW. To understand why we need several diversions, 1523*cda5da8dSAndroid Build Coastguard Worker# consider the following example: 1524*cda5da8dSAndroid Build Coastguard Worker# 1525*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST1], [Test...m4_require([TEST2])1]) 1526*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST2], [Test...m4_require([TEST3])2]) 1527*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST3], [Test...3]) 1528*cda5da8dSAndroid Build Coastguard Worker# 1529*cda5da8dSAndroid Build Coastguard Worker# Because m4_require is not required to be first in the outer macros, we 1530*cda5da8dSAndroid Build Coastguard Worker# must keep the expansions of the various levels of m4_require separated. 1531*cda5da8dSAndroid Build Coastguard Worker# Right before executing the epilogue of TEST1, we have: 1532*cda5da8dSAndroid Build Coastguard Worker# 1533*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: Test...3 1534*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: Test...2 1535*cda5da8dSAndroid Build Coastguard Worker# GROW: Test...1 1536*cda5da8dSAndroid Build Coastguard Worker# BODY: 1537*cda5da8dSAndroid Build Coastguard Worker# 1538*cda5da8dSAndroid Build Coastguard Worker# Finally the epilogue of TEST1 undiverts GROW - 2, GROW - 1, and 1539*cda5da8dSAndroid Build Coastguard Worker# GROW into the regular flow, BODY. 1540*cda5da8dSAndroid Build Coastguard Worker# 1541*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: 1542*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: 1543*cda5da8dSAndroid Build Coastguard Worker# GROW: 1544*cda5da8dSAndroid Build Coastguard Worker# BODY: Test...3; Test...2; Test...1 1545*cda5da8dSAndroid Build Coastguard Worker# 1546*cda5da8dSAndroid Build Coastguard Worker# (The semicolons are here for clarification, but of course are not 1547*cda5da8dSAndroid Build Coastguard Worker# emitted.) This is what Autoconf 2.0 (I think) to 2.13 (I'm sure) 1548*cda5da8dSAndroid Build Coastguard Worker# implement. 1549*cda5da8dSAndroid Build Coastguard Worker# 1550*cda5da8dSAndroid Build Coastguard Worker# 1551*cda5da8dSAndroid Build Coastguard Worker# The second idea: first required first out 1552*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------- 1553*cda5da8dSAndroid Build Coastguard Worker# 1554*cda5da8dSAndroid Build Coastguard Worker# The natural implementation of the idea above is buggy and produces 1555*cda5da8dSAndroid Build Coastguard Worker# very surprising results in some situations. Let's consider the 1556*cda5da8dSAndroid Build Coastguard Worker# following example to explain the bug: 1557*cda5da8dSAndroid Build Coastguard Worker# 1558*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST1], [m4_require([TEST2a])m4_require([TEST2b])]) 1559*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST2a], []) 1560*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST2b], [m4_require([TEST3])]) 1561*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST3], [m4_require([TEST2a])]) 1562*cda5da8dSAndroid Build Coastguard Worker# | 1563*cda5da8dSAndroid Build Coastguard Worker# | AC_INIT 1564*cda5da8dSAndroid Build Coastguard Worker# | TEST1 1565*cda5da8dSAndroid Build Coastguard Worker# 1566*cda5da8dSAndroid Build Coastguard Worker# The dependencies between the macros are: 1567*cda5da8dSAndroid Build Coastguard Worker# 1568*cda5da8dSAndroid Build Coastguard Worker# 3 --- 2b 1569*cda5da8dSAndroid Build Coastguard Worker# / \ is m4_require'd by 1570*cda5da8dSAndroid Build Coastguard Worker# / \ left -------------------- right 1571*cda5da8dSAndroid Build Coastguard Worker# 2a ------------ 1 1572*cda5da8dSAndroid Build Coastguard Worker# 1573*cda5da8dSAndroid Build Coastguard Worker# If you strictly apply the rules given in the previous section you get: 1574*cda5da8dSAndroid Build Coastguard Worker# 1575*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: TEST3 1576*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: TEST2a; TEST2b 1577*cda5da8dSAndroid Build Coastguard Worker# GROW: TEST1 1578*cda5da8dSAndroid Build Coastguard Worker# BODY: 1579*cda5da8dSAndroid Build Coastguard Worker# 1580*cda5da8dSAndroid Build Coastguard Worker# (TEST2a, although required by TEST3 is not expanded in GROW - 3 1581*cda5da8dSAndroid Build Coastguard Worker# because is has already been expanded before in GROW - 1, so it has 1582*cda5da8dSAndroid Build Coastguard Worker# been AC_PROVIDE'd, so it is not expanded again) so when you undivert 1583*cda5da8dSAndroid Build Coastguard Worker# the stack of diversions, you get: 1584*cda5da8dSAndroid Build Coastguard Worker# 1585*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: 1586*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: 1587*cda5da8dSAndroid Build Coastguard Worker# GROW: 1588*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST3; TEST2a; TEST2b; TEST1 1589*cda5da8dSAndroid Build Coastguard Worker# 1590*cda5da8dSAndroid Build Coastguard Worker# i.e., TEST2a is expanded after TEST3 although the latter required the 1591*cda5da8dSAndroid Build Coastguard Worker# former. 1592*cda5da8dSAndroid Build Coastguard Worker# 1593*cda5da8dSAndroid Build Coastguard Worker# Starting from 2.50, we use an implementation provided by Axel Thimm. 1594*cda5da8dSAndroid Build Coastguard Worker# The idea is simple: the order in which macros are emitted must be the 1595*cda5da8dSAndroid Build Coastguard Worker# same as the one in which macros are expanded. (The bug above can 1596*cda5da8dSAndroid Build Coastguard Worker# indeed be described as: a macro has been m4_provide'd before its 1597*cda5da8dSAndroid Build Coastguard Worker# dependent, but it is emitted after: the lack of correlation between 1598*cda5da8dSAndroid Build Coastguard Worker# emission and expansion order is guilty). 1599*cda5da8dSAndroid Build Coastguard Worker# 1600*cda5da8dSAndroid Build Coastguard Worker# How to do that? You keep the stack of diversions to elaborate the 1601*cda5da8dSAndroid Build Coastguard Worker# macros, but each time a macro is fully expanded, emit it immediately. 1602*cda5da8dSAndroid Build Coastguard Worker# 1603*cda5da8dSAndroid Build Coastguard Worker# In the example above, when TEST2a is expanded, but it's epilogue is 1604*cda5da8dSAndroid Build Coastguard Worker# not run yet, you have: 1605*cda5da8dSAndroid Build Coastguard Worker# 1606*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: 1607*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: TEST2a 1608*cda5da8dSAndroid Build Coastguard Worker# GROW: Elaboration of TEST1 1609*cda5da8dSAndroid Build Coastguard Worker# BODY: 1610*cda5da8dSAndroid Build Coastguard Worker# 1611*cda5da8dSAndroid Build Coastguard Worker# The epilogue of TEST2a emits it immediately: 1612*cda5da8dSAndroid Build Coastguard Worker# 1613*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: 1614*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: 1615*cda5da8dSAndroid Build Coastguard Worker# GROW: Elaboration of TEST1 1616*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a 1617*cda5da8dSAndroid Build Coastguard Worker# 1618*cda5da8dSAndroid Build Coastguard Worker# TEST2b then requires TEST3, so right before the epilogue of TEST3, you 1619*cda5da8dSAndroid Build Coastguard Worker# have: 1620*cda5da8dSAndroid Build Coastguard Worker# 1621*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: TEST3 1622*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: Elaboration of TEST2b 1623*cda5da8dSAndroid Build Coastguard Worker# GROW: Elaboration of TEST1 1624*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a 1625*cda5da8dSAndroid Build Coastguard Worker# 1626*cda5da8dSAndroid Build Coastguard Worker# The epilogue of TEST3 emits it: 1627*cda5da8dSAndroid Build Coastguard Worker# 1628*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: 1629*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: Elaboration of TEST2b 1630*cda5da8dSAndroid Build Coastguard Worker# GROW: Elaboration of TEST1 1631*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3 1632*cda5da8dSAndroid Build Coastguard Worker# 1633*cda5da8dSAndroid Build Coastguard Worker# TEST2b is now completely expanded, and emitted: 1634*cda5da8dSAndroid Build Coastguard Worker# 1635*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: 1636*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: 1637*cda5da8dSAndroid Build Coastguard Worker# GROW: Elaboration of TEST1 1638*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3; TEST2b 1639*cda5da8dSAndroid Build Coastguard Worker# 1640*cda5da8dSAndroid Build Coastguard Worker# and finally, TEST1 is finished and emitted: 1641*cda5da8dSAndroid Build Coastguard Worker# 1642*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: 1643*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: 1644*cda5da8dSAndroid Build Coastguard Worker# GROW: 1645*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3; TEST2b: TEST1 1646*cda5da8dSAndroid Build Coastguard Worker# 1647*cda5da8dSAndroid Build Coastguard Worker# The idea is simple, but the implementation is a bit involved. If 1648*cda5da8dSAndroid Build Coastguard Worker# you are like me, you will want to see the actual functioning of this 1649*cda5da8dSAndroid Build Coastguard Worker# implementation to be convinced. The next section gives the full 1650*cda5da8dSAndroid Build Coastguard Worker# details. 1651*cda5da8dSAndroid Build Coastguard Worker# 1652*cda5da8dSAndroid Build Coastguard Worker# 1653*cda5da8dSAndroid Build Coastguard Worker# The Axel Thimm implementation at work 1654*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------- 1655*cda5da8dSAndroid Build Coastguard Worker# 1656*cda5da8dSAndroid Build Coastguard Worker# We consider the macros above, and this configure.ac: 1657*cda5da8dSAndroid Build Coastguard Worker# 1658*cda5da8dSAndroid Build Coastguard Worker# AC_INIT 1659*cda5da8dSAndroid Build Coastguard Worker# TEST1 1660*cda5da8dSAndroid Build Coastguard Worker# 1661*cda5da8dSAndroid Build Coastguard Worker# You should keep the definitions of _m4_defun_pro, _m4_defun_epi, and 1662*cda5da8dSAndroid Build Coastguard Worker# m4_require at hand to follow the steps. 1663*cda5da8dSAndroid Build Coastguard Worker# 1664*cda5da8dSAndroid Build Coastguard Worker# This implementation tries not to assume that the current diversion is 1665*cda5da8dSAndroid Build Coastguard Worker# BODY, so as soon as a macro (m4_defun'd) is expanded, we first 1666*cda5da8dSAndroid Build Coastguard Worker# record the current diversion under the name _m4_divert_dump (denoted 1667*cda5da8dSAndroid Build Coastguard Worker# DUMP below for short). This introduces an important difference with 1668*cda5da8dSAndroid Build Coastguard Worker# the previous versions of Autoconf: you cannot use m4_require if you 1669*cda5da8dSAndroid Build Coastguard Worker# are not inside an m4_defun'd macro, and especially, you cannot 1670*cda5da8dSAndroid Build Coastguard Worker# m4_require directly from the top level. 1671*cda5da8dSAndroid Build Coastguard Worker# 1672*cda5da8dSAndroid Build Coastguard Worker# We have not tried to simulate the old behavior (better yet, we 1673*cda5da8dSAndroid Build Coastguard Worker# diagnose it), because it is too dangerous: a macro m4_require'd from 1674*cda5da8dSAndroid Build Coastguard Worker# the top level is expanded before the body of `configure', i.e., before 1675*cda5da8dSAndroid Build Coastguard Worker# any other test was run. I let you imagine the result of requiring 1676*cda5da8dSAndroid Build Coastguard Worker# AC_STDC_HEADERS for instance, before AC_PROG_CC was actually run.... 1677*cda5da8dSAndroid Build Coastguard Worker# 1678*cda5da8dSAndroid Build Coastguard Worker# After AC_INIT was run, the current diversion is BODY. 1679*cda5da8dSAndroid Build Coastguard Worker# * AC_INIT was run 1680*cda5da8dSAndroid Build Coastguard Worker# DUMP: undefined 1681*cda5da8dSAndroid Build Coastguard Worker# diversion stack: BODY |- 1682*cda5da8dSAndroid Build Coastguard Worker# 1683*cda5da8dSAndroid Build Coastguard Worker# * TEST1 is expanded 1684*cda5da8dSAndroid Build Coastguard Worker# The prologue of TEST1 sets _m4_divert_dump, which is the diversion 1685*cda5da8dSAndroid Build Coastguard Worker# where the current elaboration will be dumped, to the current 1686*cda5da8dSAndroid Build Coastguard Worker# diversion. It also m4_divert_push to GROW, where the full 1687*cda5da8dSAndroid Build Coastguard Worker# expansion of TEST1 and its dependencies will be elaborated. 1688*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1689*cda5da8dSAndroid Build Coastguard Worker# BODY: empty 1690*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW, BODY |- 1691*cda5da8dSAndroid Build Coastguard Worker# 1692*cda5da8dSAndroid Build Coastguard Worker# * TEST1 requires TEST2a 1693*cda5da8dSAndroid Build Coastguard Worker# _m4_require_call m4_divert_pushes another temporary diversion, 1694*cda5da8dSAndroid Build Coastguard Worker# GROW - 1, and expands TEST2a in there. 1695*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1696*cda5da8dSAndroid Build Coastguard Worker# BODY: empty 1697*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: TEST2a 1698*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW - 1, GROW, BODY |- 1699*cda5da8dSAndroid Build Coastguard Worker# Then the content of the temporary diversion is moved to DUMP and the 1700*cda5da8dSAndroid Build Coastguard Worker# temporary diversion is popped. 1701*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1702*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a 1703*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW, BODY |- 1704*cda5da8dSAndroid Build Coastguard Worker# 1705*cda5da8dSAndroid Build Coastguard Worker# * TEST1 requires TEST2b 1706*cda5da8dSAndroid Build Coastguard Worker# Again, _m4_require_call pushes GROW - 1 and heads to expand TEST2b. 1707*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1708*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a 1709*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW - 1, GROW, BODY |- 1710*cda5da8dSAndroid Build Coastguard Worker# 1711*cda5da8dSAndroid Build Coastguard Worker# * TEST2b requires TEST3 1712*cda5da8dSAndroid Build Coastguard Worker# _m4_require_call pushes GROW - 2 and expands TEST3 here. 1713*cda5da8dSAndroid Build Coastguard Worker# (TEST3 requires TEST2a, but TEST2a has already been m4_provide'd, so 1714*cda5da8dSAndroid Build Coastguard Worker# nothing happens.) 1715*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1716*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a 1717*cda5da8dSAndroid Build Coastguard Worker# GROW - 2: TEST3 1718*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW - 2, GROW - 1, GROW, BODY |- 1719*cda5da8dSAndroid Build Coastguard Worker# Then the diversion is appended to DUMP, and popped. 1720*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1721*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3 1722*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW - 1, GROW, BODY |- 1723*cda5da8dSAndroid Build Coastguard Worker# 1724*cda5da8dSAndroid Build Coastguard Worker# * TEST1 requires TEST2b (contd.) 1725*cda5da8dSAndroid Build Coastguard Worker# The content of TEST2b is expanded... 1726*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1727*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3 1728*cda5da8dSAndroid Build Coastguard Worker# GROW - 1: TEST2b, 1729*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW - 1, GROW, BODY |- 1730*cda5da8dSAndroid Build Coastguard Worker# ... and moved to DUMP. 1731*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1732*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3; TEST2b 1733*cda5da8dSAndroid Build Coastguard Worker# diversions: GROW, BODY |- 1734*cda5da8dSAndroid Build Coastguard Worker# 1735*cda5da8dSAndroid Build Coastguard Worker# * TEST1 is expanded: epilogue 1736*cda5da8dSAndroid Build Coastguard Worker# TEST1's own content is in GROW... 1737*cda5da8dSAndroid Build Coastguard Worker# DUMP: BODY 1738*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3; TEST2b 1739*cda5da8dSAndroid Build Coastguard Worker# GROW: TEST1 1740*cda5da8dSAndroid Build Coastguard Worker# diversions: BODY |- 1741*cda5da8dSAndroid Build Coastguard Worker# ... and it's epilogue moves it to DUMP and then undefines DUMP. 1742*cda5da8dSAndroid Build Coastguard Worker# DUMP: undefined 1743*cda5da8dSAndroid Build Coastguard Worker# BODY: TEST2a; TEST3; TEST2b; TEST1 1744*cda5da8dSAndroid Build Coastguard Worker# diversions: BODY |- 1745*cda5da8dSAndroid Build Coastguard Worker# 1746*cda5da8dSAndroid Build Coastguard Worker# 1747*cda5da8dSAndroid Build Coastguard Worker# The third idea: track macros provided before they were required 1748*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------------------------- 1749*cda5da8dSAndroid Build Coastguard Worker# 1750*cda5da8dSAndroid Build Coastguard Worker# Using just the first two ideas, Autoconf 2.50 through 2.63 still had 1751*cda5da8dSAndroid Build Coastguard Worker# a subtle bug for more than seven years. Let's consider the 1752*cda5da8dSAndroid Build Coastguard Worker# following example to explain the bug: 1753*cda5da8dSAndroid Build Coastguard Worker# 1754*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST1], [1]) 1755*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST2], [2[]m4_require([TEST1])]) 1756*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST3], [3 TEST1 m4_require([TEST2])]) 1757*cda5da8dSAndroid Build Coastguard Worker# | TEST3 1758*cda5da8dSAndroid Build Coastguard Worker# 1759*cda5da8dSAndroid Build Coastguard Worker# After the prologue of TEST3, we are collecting text in GROW with the 1760*cda5da8dSAndroid Build Coastguard Worker# intent of dumping it in BODY during the epilogue. Next, we 1761*cda5da8dSAndroid Build Coastguard Worker# encounter the direct invocation of TEST1, which provides the macro 1762*cda5da8dSAndroid Build Coastguard Worker# in place in GROW. From there, we encounter a requirement for TEST2, 1763*cda5da8dSAndroid Build Coastguard Worker# which must be collected in a new diversion. While expanding TEST2, 1764*cda5da8dSAndroid Build Coastguard Worker# we encounter a requirement for TEST1, but since it has already been 1765*cda5da8dSAndroid Build Coastguard Worker# expanded, the Axel Thimm algorithm states that we can treat it as a 1766*cda5da8dSAndroid Build Coastguard Worker# no-op. But that would lead to an end result of `2 3 1', meaning 1767*cda5da8dSAndroid Build Coastguard Worker# that we have once again output a macro (TEST2) prior to its 1768*cda5da8dSAndroid Build Coastguard Worker# requirements (TEST1). 1769*cda5da8dSAndroid Build Coastguard Worker# 1770*cda5da8dSAndroid Build Coastguard Worker# The problem can only occur if a single defun'd macro first provides, 1771*cda5da8dSAndroid Build Coastguard Worker# then later indirectly requires, the same macro. Note that directly 1772*cda5da8dSAndroid Build Coastguard Worker# expanding then requiring a macro is okay: because the dependency was 1773*cda5da8dSAndroid Build Coastguard Worker# met, the require phase can be a no-op. For that matter, the outer 1774*cda5da8dSAndroid Build Coastguard Worker# macro can even require two helpers, where the first helper expands 1775*cda5da8dSAndroid Build Coastguard Worker# the macro, and the second helper indirectly requires the macro. 1776*cda5da8dSAndroid Build Coastguard Worker# Out-of-order expansion is only present if the inner macro is 1777*cda5da8dSAndroid Build Coastguard Worker# required by something that will be hoisted in front of where the 1778*cda5da8dSAndroid Build Coastguard Worker# direct expansion occurred. In other words, we must be careful not 1779*cda5da8dSAndroid Build Coastguard Worker# to warn on: 1780*cda5da8dSAndroid Build Coastguard Worker# 1781*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST4], [4]) 1782*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST5], [5 TEST4 m4_require([TEST4])]) 1783*cda5da8dSAndroid Build Coastguard Worker# | TEST5 => 5 4 1784*cda5da8dSAndroid Build Coastguard Worker# 1785*cda5da8dSAndroid Build Coastguard Worker# or even the more complex: 1786*cda5da8dSAndroid Build Coastguard Worker# 1787*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST6], [6]) 1788*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST7], [7 TEST6]) 1789*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST8], [8 m4_require([TEST6])]) 1790*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST9], [9 m4_require([TEST8])]) 1791*cda5da8dSAndroid Build Coastguard Worker# | m4_defun([TEST10], [10 m4_require([TEST7]) m4_require([TEST9])]) 1792*cda5da8dSAndroid Build Coastguard Worker# | TEST10 => 7 6 8 9 10 1793*cda5da8dSAndroid Build Coastguard Worker# 1794*cda5da8dSAndroid Build Coastguard Worker# So, to detect whether a require was direct or indirect, m4_defun and 1795*cda5da8dSAndroid Build Coastguard Worker# m4_require track the name of the macro that caused a diversion to be 1796*cda5da8dSAndroid Build Coastguard Worker# created (using the stack _m4_diverting, coupled with an O(1) lookup 1797*cda5da8dSAndroid Build Coastguard Worker# _m4_diverting([NAME])), and m4_provide stores the name associated 1798*cda5da8dSAndroid Build Coastguard Worker# with the diversion at which a macro was provided. A require call is 1799*cda5da8dSAndroid Build Coastguard Worker# direct if it occurs within the same diversion where the macro was 1800*cda5da8dSAndroid Build Coastguard Worker# provided, or if the diversion associated with the providing context 1801*cda5da8dSAndroid Build Coastguard Worker# has been collected. 1802*cda5da8dSAndroid Build Coastguard Worker# 1803*cda5da8dSAndroid Build Coastguard Worker# The implementation of the warning involves tracking the set of 1804*cda5da8dSAndroid Build Coastguard Worker# macros which have been provided since the start of the outermost 1805*cda5da8dSAndroid Build Coastguard Worker# defun'd macro (the set is named _m4_provide). When starting an 1806*cda5da8dSAndroid Build Coastguard Worker# outermost macro, the set is emptied; when a macro is provided, it is 1807*cda5da8dSAndroid Build Coastguard Worker# added to the set; when require expands the body of a macro, it is 1808*cda5da8dSAndroid Build Coastguard Worker# removed from the set; and when a macro is indirectly required, the 1809*cda5da8dSAndroid Build Coastguard Worker# set is checked. If a macro is in the set, then it has been provided 1810*cda5da8dSAndroid Build Coastguard Worker# before it was required, and we satisfy dependencies by expanding the 1811*cda5da8dSAndroid Build Coastguard Worker# macro as if it had never been provided; in the example given above, 1812*cda5da8dSAndroid Build Coastguard Worker# this means we now output `1 2 3 1'. Meanwhile, a warning is issued 1813*cda5da8dSAndroid Build Coastguard Worker# to inform the user that her macros trigger the bug in older autoconf 1814*cda5da8dSAndroid Build Coastguard Worker# versions, and that her output file now contains redundant contents 1815*cda5da8dSAndroid Build Coastguard Worker# (and possibly new problems, if the repeated macro was not 1816*cda5da8dSAndroid Build Coastguard Worker# idempotent). Meanwhile, macros defined by m4_defun_once instead of 1817*cda5da8dSAndroid Build Coastguard Worker# m4_defun are idempotent, avoiding any warning or duplicate output. 1818*cda5da8dSAndroid Build Coastguard Worker# 1819*cda5da8dSAndroid Build Coastguard Worker# 1820*cda5da8dSAndroid Build Coastguard Worker# 2. Keeping track of the expansion stack 1821*cda5da8dSAndroid Build Coastguard Worker# ======================================= 1822*cda5da8dSAndroid Build Coastguard Worker# 1823*cda5da8dSAndroid Build Coastguard Worker# When M4 expansion goes wrong it is often extremely hard to find the 1824*cda5da8dSAndroid Build Coastguard Worker# path amongst macros that drove to the failure. What is needed is 1825*cda5da8dSAndroid Build Coastguard Worker# the stack of macro `calls'. One could imagine that GNU M4 would 1826*cda5da8dSAndroid Build Coastguard Worker# maintain a stack of macro expansions, unfortunately it doesn't, so 1827*cda5da8dSAndroid Build Coastguard Worker# we do it by hand. This is of course extremely costly, but the help 1828*cda5da8dSAndroid Build Coastguard Worker# this stack provides is worth it. Nevertheless to limit the 1829*cda5da8dSAndroid Build Coastguard Worker# performance penalty this is implemented only for m4_defun'd macros, 1830*cda5da8dSAndroid Build Coastguard Worker# not for define'd macros. 1831*cda5da8dSAndroid Build Coastguard Worker# 1832*cda5da8dSAndroid Build Coastguard Worker# Each time we enter an m4_defun'd macros, we add a definition in 1833*cda5da8dSAndroid Build Coastguard Worker# _m4_expansion_stack, and when we exit the macro, we remove it (thanks 1834*cda5da8dSAndroid Build Coastguard Worker# to pushdef/popdef). m4_stack_foreach is used to print the expansion 1835*cda5da8dSAndroid Build Coastguard Worker# stack in the rare cases when it's needed. 1836*cda5da8dSAndroid Build Coastguard Worker# 1837*cda5da8dSAndroid Build Coastguard Worker# In addition, we want to detect circular m4_require dependencies. 1838*cda5da8dSAndroid Build Coastguard Worker# Each time we expand a macro FOO we define _m4_expanding(FOO); and 1839*cda5da8dSAndroid Build Coastguard Worker# m4_require(BAR) simply checks whether _m4_expanding(BAR) is defined. 1840*cda5da8dSAndroid Build Coastguard Worker 1841*cda5da8dSAndroid Build Coastguard Worker 1842*cda5da8dSAndroid Build Coastguard Worker# m4_expansion_stack 1843*cda5da8dSAndroid Build Coastguard Worker# ------------------ 1844*cda5da8dSAndroid Build Coastguard Worker# Expands to the entire contents of the expansion stack. The caller 1845*cda5da8dSAndroid Build Coastguard Worker# must supply a trailing newline. This macro always prints a 1846*cda5da8dSAndroid Build Coastguard Worker# location; check whether _m4_expansion_stack is defined to filter out 1847*cda5da8dSAndroid Build Coastguard Worker# the case when no defun'd macro is in force. 1848*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_expansion_stack], 1849*cda5da8dSAndroid Build Coastguard Worker[m4_stack_foreach_sep_lifo([_$0], [_$0_entry(], [) 1850*cda5da8dSAndroid Build Coastguard Worker])m4_location[: the top level]]) 1851*cda5da8dSAndroid Build Coastguard Worker 1852*cda5da8dSAndroid Build Coastguard Worker# _m4_expansion_stack_entry(MACRO) 1853*cda5da8dSAndroid Build Coastguard Worker# -------------------------------- 1854*cda5da8dSAndroid Build Coastguard Worker# Format an entry for MACRO found on the expansion stack. 1855*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_expansion_stack_entry], 1856*cda5da8dSAndroid Build Coastguard Worker[_m4_defn([m4_location($1)])[: $1 is expanded from...]]) 1857*cda5da8dSAndroid Build Coastguard Worker 1858*cda5da8dSAndroid Build Coastguard Worker# m4_expansion_stack_push(MACRO) 1859*cda5da8dSAndroid Build Coastguard Worker# ------------------------------ 1860*cda5da8dSAndroid Build Coastguard Worker# Form an entry of the expansion stack on entry to MACRO and push it. 1861*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_expansion_stack_push], 1862*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_m4_expansion_stack], [$1])]) 1863*cda5da8dSAndroid Build Coastguard Worker 1864*cda5da8dSAndroid Build Coastguard Worker 1865*cda5da8dSAndroid Build Coastguard Worker# _m4_divert(GROW) 1866*cda5da8dSAndroid Build Coastguard Worker# ---------------- 1867*cda5da8dSAndroid Build Coastguard Worker# This diversion is used by the m4_defun/m4_require machinery. It is 1868*cda5da8dSAndroid Build Coastguard Worker# important to keep room before GROW because for each nested 1869*cda5da8dSAndroid Build Coastguard Worker# AC_REQUIRE we use an additional diversion (i.e., two m4_require's 1870*cda5da8dSAndroid Build Coastguard Worker# will use GROW - 2. More than 3 levels has never seemed to be 1871*cda5da8dSAndroid Build Coastguard Worker# needed.) 1872*cda5da8dSAndroid Build Coastguard Worker# 1873*cda5da8dSAndroid Build Coastguard Worker# ... 1874*cda5da8dSAndroid Build Coastguard Worker# - GROW - 2 1875*cda5da8dSAndroid Build Coastguard Worker# m4_require'd code, 2 level deep 1876*cda5da8dSAndroid Build Coastguard Worker# - GROW - 1 1877*cda5da8dSAndroid Build Coastguard Worker# m4_require'd code, 1 level deep 1878*cda5da8dSAndroid Build Coastguard Worker# - GROW 1879*cda5da8dSAndroid Build Coastguard Worker# m4_defun'd macros are elaborated here. 1880*cda5da8dSAndroid Build Coastguard Worker 1881*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_divert(GROW)], 10000) 1882*cda5da8dSAndroid Build Coastguard Worker 1883*cda5da8dSAndroid Build Coastguard Worker 1884*cda5da8dSAndroid Build Coastguard Worker# _m4_defun_pro(MACRO-NAME) 1885*cda5da8dSAndroid Build Coastguard Worker# ------------------------- 1886*cda5da8dSAndroid Build Coastguard Worker# The prologue for Autoconf macros. 1887*cda5da8dSAndroid Build Coastguard Worker# 1888*cda5da8dSAndroid Build Coastguard Worker# This is called frequently, so minimize the number of macro invocations 1889*cda5da8dSAndroid Build Coastguard Worker# by avoiding dnl and m4_defn overhead. 1890*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_defun_pro], 1891*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_pro_outer([$1])])]dnl 1892*cda5da8dSAndroid Build Coastguard Worker[m4_expansion_stack_push([$1])m4_pushdef([_m4_expanding($1)])]) 1893*cda5da8dSAndroid Build Coastguard Worker 1894*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_defun_pro_outer], 1895*cda5da8dSAndroid Build Coastguard Worker[m4_set_delete([_m4_provide])]dnl 1896*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl 1897*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_m4_divert_dump], m4_divnum)m4_divert_push([GROW])]) 1898*cda5da8dSAndroid Build Coastguard Worker 1899*cda5da8dSAndroid Build Coastguard Worker# _m4_defun_epi(MACRO-NAME) 1900*cda5da8dSAndroid Build Coastguard Worker# ------------------------- 1901*cda5da8dSAndroid Build Coastguard Worker# The Epilogue for Autoconf macros. MACRO-NAME only helps tracing 1902*cda5da8dSAndroid Build Coastguard Worker# the PRO/EPI pairs. 1903*cda5da8dSAndroid Build Coastguard Worker# 1904*cda5da8dSAndroid Build Coastguard Worker# This is called frequently, so minimize the number of macro invocations 1905*cda5da8dSAndroid Build Coastguard Worker# by avoiding dnl and m4_popdef overhead. 1906*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_defun_epi], 1907*cda5da8dSAndroid Build Coastguard Worker[_m4_popdef([_m4_expanding($1)], [_m4_expansion_stack])]dnl 1908*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_epi_outer([$1])])]dnl 1909*cda5da8dSAndroid Build Coastguard Worker[m4_provide([$1])]) 1910*cda5da8dSAndroid Build Coastguard Worker 1911*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_defun_epi_outer], 1912*cda5da8dSAndroid Build Coastguard Worker[_m4_popdef([_m4_divert_dump], [_m4_diverting([$1])], [_m4_diverting])]dnl 1913*cda5da8dSAndroid Build Coastguard Worker[m4_divert_pop([GROW])m4_undivert([GROW])]) 1914*cda5da8dSAndroid Build Coastguard Worker 1915*cda5da8dSAndroid Build Coastguard Worker 1916*cda5da8dSAndroid Build Coastguard Worker# _m4_divert_dump 1917*cda5da8dSAndroid Build Coastguard Worker# --------------- 1918*cda5da8dSAndroid Build Coastguard Worker# If blank, we are outside of any defun'd macro. Otherwise, expands 1919*cda5da8dSAndroid Build Coastguard Worker# to the diversion number (not name) where require'd macros should be 1920*cda5da8dSAndroid Build Coastguard Worker# moved once completed. 1921*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_divert_dump]) 1922*cda5da8dSAndroid Build Coastguard Worker 1923*cda5da8dSAndroid Build Coastguard Worker 1924*cda5da8dSAndroid Build Coastguard Worker# m4_divert_require(DIVERSION, NAME-TO-CHECK, [BODY-TO-EXPAND]) 1925*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------------- 1926*cda5da8dSAndroid Build Coastguard Worker# Same as m4_require, but BODY-TO-EXPAND goes into the named DIVERSION; 1927*cda5da8dSAndroid Build Coastguard Worker# requirements still go in the current diversion though. 1928*cda5da8dSAndroid Build Coastguard Worker# 1929*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_divert_require], 1930*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_expanding($2)], 1931*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0: circular dependency of $2])])]dnl 1932*cda5da8dSAndroid Build Coastguard Worker[m4_if(_m4_divert_dump, [], 1933*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0($2): cannot be used outside of an m4_defun'd macro])])]dnl 1934*cda5da8dSAndroid Build Coastguard Worker[m4_provide_if([$2], [], 1935*cda5da8dSAndroid Build Coastguard Worker [_m4_require_call([$2], [$3], _m4_divert([$1], [-]))])]) 1936*cda5da8dSAndroid Build Coastguard Worker 1937*cda5da8dSAndroid Build Coastguard Worker 1938*cda5da8dSAndroid Build Coastguard Worker# m4_defun(NAME, EXPANSION, [MACRO = m4_define]) 1939*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------- 1940*cda5da8dSAndroid Build Coastguard Worker# Define a macro NAME which automatically provides itself. Add 1941*cda5da8dSAndroid Build Coastguard Worker# machinery so the macro automatically switches expansion to the 1942*cda5da8dSAndroid Build Coastguard Worker# diversion stack if it is not already using it, prior to EXPANSION. 1943*cda5da8dSAndroid Build Coastguard Worker# In this case, once finished, it will bring back all the code 1944*cda5da8dSAndroid Build Coastguard Worker# accumulated in the diversion stack. This, combined with m4_require, 1945*cda5da8dSAndroid Build Coastguard Worker# achieves the topological ordering of macros. We don't use this 1946*cda5da8dSAndroid Build Coastguard Worker# macro to define some frequently called macros that are not involved 1947*cda5da8dSAndroid Build Coastguard Worker# in ordering constraints, to save m4 processing. 1948*cda5da8dSAndroid Build Coastguard Worker# 1949*cda5da8dSAndroid Build Coastguard Worker# MACRO is an undocumented argument; when set to m4_pushdef, and NAME 1950*cda5da8dSAndroid Build Coastguard Worker# is already defined, the new definition is added to the pushdef 1951*cda5da8dSAndroid Build Coastguard Worker# stack, rather than overwriting the current definition. It can thus 1952*cda5da8dSAndroid Build Coastguard Worker# be used to write self-modifying macros, which pop themselves to a 1953*cda5da8dSAndroid Build Coastguard Worker# previously m4_define'd definition so that subsequent use of the 1954*cda5da8dSAndroid Build Coastguard Worker# macro is faster. 1955*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_defun], 1956*cda5da8dSAndroid Build Coastguard Worker[m4_define([m4_location($1)], m4_location)]dnl 1957*cda5da8dSAndroid Build Coastguard Worker[m4_default([$3], [m4_define])([$1], 1958*cda5da8dSAndroid Build Coastguard Worker [_m4_defun_pro(]m4_dquote($[0])[)$2[]_m4_defun_epi(]m4_dquote($[0])[)])]) 1959*cda5da8dSAndroid Build Coastguard Worker 1960*cda5da8dSAndroid Build Coastguard Worker 1961*cda5da8dSAndroid Build Coastguard Worker# m4_defun_init(NAME, INIT, COMMON) 1962*cda5da8dSAndroid Build Coastguard Worker# --------------------------------- 1963*cda5da8dSAndroid Build Coastguard Worker# Like m4_defun, but split EXPANSION into two portions: INIT which is 1964*cda5da8dSAndroid Build Coastguard Worker# done only the first time NAME is invoked, and COMMON which is 1965*cda5da8dSAndroid Build Coastguard Worker# expanded every time. 1966*cda5da8dSAndroid Build Coastguard Worker# 1967*cda5da8dSAndroid Build Coastguard Worker# For now, the COMMON definition is always m4_define'd, giving an even 1968*cda5da8dSAndroid Build Coastguard Worker# lighter-weight definition. m4_defun allows self-providing, but once 1969*cda5da8dSAndroid Build Coastguard Worker# a macro is provided, m4_require no longer cares if it is m4_define'd 1970*cda5da8dSAndroid Build Coastguard Worker# or m4_defun'd. m4_defun also provides location tracking to identify 1971*cda5da8dSAndroid Build Coastguard Worker# dependency bugs, but once the INIT has been expanded, we know there 1972*cda5da8dSAndroid Build Coastguard Worker# are no dependency bugs. However, if a future use needs COMMON to be 1973*cda5da8dSAndroid Build Coastguard Worker# m4_defun'd, we can add a parameter, similar to the third parameter 1974*cda5da8dSAndroid Build Coastguard Worker# to m4_defun. 1975*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_defun_init], 1976*cda5da8dSAndroid Build Coastguard Worker[m4_define([$1], [$3[]])m4_defun([$1], 1977*cda5da8dSAndroid Build Coastguard Worker [$2[]_m4_popdef(]m4_dquote($[0])[)m4_indir(]m4_dquote($[0])dnl 1978*cda5da8dSAndroid Build Coastguard Worker[m4_if(]m4_dquote($[#])[, [0], [], ]m4_dquote([,$]@)[))], [m4_pushdef])]) 1979*cda5da8dSAndroid Build Coastguard Worker 1980*cda5da8dSAndroid Build Coastguard Worker 1981*cda5da8dSAndroid Build Coastguard Worker# m4_defun_once(NAME, EXPANSION) 1982*cda5da8dSAndroid Build Coastguard Worker# ------------------------------ 1983*cda5da8dSAndroid Build Coastguard Worker# Like m4_defun, but guarantee that EXPANSION only happens once 1984*cda5da8dSAndroid Build Coastguard Worker# (thereafter, using NAME is a no-op). 1985*cda5da8dSAndroid Build Coastguard Worker# 1986*cda5da8dSAndroid Build Coastguard Worker# If _m4_divert_dump is empty, we are called at the top level; 1987*cda5da8dSAndroid Build Coastguard Worker# otherwise, we must ensure that we are required in front of the 1988*cda5da8dSAndroid Build Coastguard Worker# current defun'd macro. Use a helper macro so that EXPANSION need 1989*cda5da8dSAndroid Build Coastguard Worker# only occur once in the definition of NAME, since it might be large. 1990*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_defun_once], 1991*cda5da8dSAndroid Build Coastguard Worker[m4_define([m4_location($1)], m4_location)]dnl 1992*cda5da8dSAndroid Build Coastguard Worker[m4_define([$1], [_m4_defun_once([$1], [$2], m4_if(_m4_divert_dump, [], 1993*cda5da8dSAndroid Build Coastguard Worker [[_m4_defun_pro([$1])m4_unquote(], [)_m4_defun_epi([$1])]], 1994*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([_m4_diverting([$1])], [-]), [-], [[m4_unquote(], [)]], 1995*cda5da8dSAndroid Build Coastguard Worker [[_m4_require_call([$1],], [, _m4_divert_dump)]]))])]) 1996*cda5da8dSAndroid Build Coastguard Worker 1997*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_defun_once], 1998*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([$1])$3[$2[]m4_provide([$1])]$4]) 1999*cda5da8dSAndroid Build Coastguard Worker 2000*cda5da8dSAndroid Build Coastguard Worker 2001*cda5da8dSAndroid Build Coastguard Worker# m4_pattern_forbid(ERE, [WHY]) 2002*cda5da8dSAndroid Build Coastguard Worker# ----------------------------- 2003*cda5da8dSAndroid Build Coastguard Worker# Declare that no token matching the forbidden perl extended regular 2004*cda5da8dSAndroid Build Coastguard Worker# expression ERE should be seen in the output unless... 2005*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_pattern_forbid], []) 2006*cda5da8dSAndroid Build Coastguard Worker 2007*cda5da8dSAndroid Build Coastguard Worker 2008*cda5da8dSAndroid Build Coastguard Worker# m4_pattern_allow(ERE) 2009*cda5da8dSAndroid Build Coastguard Worker# --------------------- 2010*cda5da8dSAndroid Build Coastguard Worker# ... that token also matches the allowed extended regular expression ERE. 2011*cda5da8dSAndroid Build Coastguard Worker# Both used via traces, by autom4te post-processing. 2012*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_pattern_allow], []) 2013*cda5da8dSAndroid Build Coastguard Worker 2014*cda5da8dSAndroid Build Coastguard Worker 2015*cda5da8dSAndroid Build Coastguard Worker## --------------------------------- ## 2016*cda5da8dSAndroid Build Coastguard Worker## 11. Dependencies between macros. ## 2017*cda5da8dSAndroid Build Coastguard Worker## --------------------------------- ## 2018*cda5da8dSAndroid Build Coastguard Worker 2019*cda5da8dSAndroid Build Coastguard Worker 2020*cda5da8dSAndroid Build Coastguard Worker# m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME) 2021*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------- 2022*cda5da8dSAndroid Build Coastguard Worker# Issue a warning if CALLED-MACRO-NAME was called before THIS-MACRO-NAME. 2023*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_before], 2024*cda5da8dSAndroid Build Coastguard Worker[m4_provide_if([$2], 2025*cda5da8dSAndroid Build Coastguard Worker [m4_warn([syntax], [$2 was called before $1])])]) 2026*cda5da8dSAndroid Build Coastguard Worker 2027*cda5da8dSAndroid Build Coastguard Worker 2028*cda5da8dSAndroid Build Coastguard Worker# m4_require(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK]) 2029*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------------- 2030*cda5da8dSAndroid Build Coastguard Worker# If NAME-TO-CHECK has never been expanded (actually, if it is not 2031*cda5da8dSAndroid Build Coastguard Worker# m4_provide'd), expand BODY-TO-EXPAND *before* the current macro 2032*cda5da8dSAndroid Build Coastguard Worker# expansion; follow the expansion with a newline. Once expanded, emit 2033*cda5da8dSAndroid Build Coastguard Worker# it in _m4_divert_dump. Keep track of the m4_require chain in 2034*cda5da8dSAndroid Build Coastguard Worker# _m4_expansion_stack. 2035*cda5da8dSAndroid Build Coastguard Worker# 2036*cda5da8dSAndroid Build Coastguard Worker# The normal cases are: 2037*cda5da8dSAndroid Build Coastguard Worker# 2038*cda5da8dSAndroid Build Coastguard Worker# - NAME-TO-CHECK == BODY-TO-EXPAND 2039*cda5da8dSAndroid Build Coastguard Worker# Which you can use for regular macros with or without arguments, e.g., 2040*cda5da8dSAndroid Build Coastguard Worker# m4_require([AC_PROG_CC], [AC_PROG_CC]) 2041*cda5da8dSAndroid Build Coastguard Worker# m4_require([AC_CHECK_HEADERS(threads.h)], [AC_CHECK_HEADERS(threads.h)]) 2042*cda5da8dSAndroid Build Coastguard Worker# which is just the same as 2043*cda5da8dSAndroid Build Coastguard Worker# m4_require([AC_PROG_CC]) 2044*cda5da8dSAndroid Build Coastguard Worker# m4_require([AC_CHECK_HEADERS(threads.h)]) 2045*cda5da8dSAndroid Build Coastguard Worker# 2046*cda5da8dSAndroid Build Coastguard Worker# - BODY-TO-EXPAND == m4_indir([NAME-TO-CHECK]) 2047*cda5da8dSAndroid Build Coastguard Worker# In the case of macros with irregular names. For instance: 2048*cda5da8dSAndroid Build Coastguard Worker# m4_require([AC_LANG_COMPILER(C)], [indir([AC_LANG_COMPILER(C)])]) 2049*cda5da8dSAndroid Build Coastguard Worker# which means `if the macro named `AC_LANG_COMPILER(C)' (the parens are 2050*cda5da8dSAndroid Build Coastguard Worker# part of the name, it is not an argument) has not been run, then 2051*cda5da8dSAndroid Build Coastguard Worker# call it.' 2052*cda5da8dSAndroid Build Coastguard Worker# Had you used 2053*cda5da8dSAndroid Build Coastguard Worker# m4_require([AC_LANG_COMPILER(C)], [AC_LANG_COMPILER(C)]) 2054*cda5da8dSAndroid Build Coastguard Worker# then m4_require would have tried to expand `AC_LANG_COMPILER(C)', i.e., 2055*cda5da8dSAndroid Build Coastguard Worker# call the macro `AC_LANG_COMPILER' with `C' as argument. 2056*cda5da8dSAndroid Build Coastguard Worker# 2057*cda5da8dSAndroid Build Coastguard Worker# You could argue that `AC_LANG_COMPILER', when it receives an argument 2058*cda5da8dSAndroid Build Coastguard Worker# such as `C' should dispatch the call to `AC_LANG_COMPILER(C)'. But this 2059*cda5da8dSAndroid Build Coastguard Worker# `extension' prevents `AC_LANG_COMPILER' from having actual arguments that 2060*cda5da8dSAndroid Build Coastguard Worker# it passes to `AC_LANG_COMPILER(C)'. 2061*cda5da8dSAndroid Build Coastguard Worker# 2062*cda5da8dSAndroid Build Coastguard Worker# This is called frequently, so minimize the number of macro invocations 2063*cda5da8dSAndroid Build Coastguard Worker# by avoiding dnl and other overhead on the common path. 2064*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_require], 2065*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_expanding($1)], 2066*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0: circular dependency of $1])])]dnl 2067*cda5da8dSAndroid Build Coastguard Worker[m4_if(_m4_divert_dump, [], 2068*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0($1): cannot be used outside of an ]dnl 2069*cda5da8dSAndroid Build Coastguard Workerm4_if([$0], [m4_require], [[m4_defun]], [[AC_DEFUN]])['d macro])])]dnl 2070*cda5da8dSAndroid Build Coastguard Worker[m4_provide_if([$1], [m4_set_contains([_m4_provide], [$1], 2071*cda5da8dSAndroid Build Coastguard Worker [_m4_require_check([$1], _m4_defn([m4_provide($1)]), [$0])], [m4_ignore])], 2072*cda5da8dSAndroid Build Coastguard Worker [_m4_require_call])([$1], [$2], _m4_divert_dump)]) 2073*cda5da8dSAndroid Build Coastguard Worker 2074*cda5da8dSAndroid Build Coastguard Worker 2075*cda5da8dSAndroid Build Coastguard Worker# _m4_require_call(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK], 2076*cda5da8dSAndroid Build Coastguard Worker# DIVERSION-NUMBER) 2077*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------------------- 2078*cda5da8dSAndroid Build Coastguard Worker# If m4_require decides to expand the body, it calls this macro. The 2079*cda5da8dSAndroid Build Coastguard Worker# expansion is placed in DIVERSION-NUMBER. 2080*cda5da8dSAndroid Build Coastguard Worker# 2081*cda5da8dSAndroid Build Coastguard Worker# This is called frequently, so minimize the number of macro invocations 2082*cda5da8dSAndroid Build Coastguard Worker# by avoiding dnl and other overhead on the common path. 2083*cda5da8dSAndroid Build Coastguard Worker# The use of a witness macro protecting the warning allows aclocal 2084*cda5da8dSAndroid Build Coastguard Worker# to silence any warnings when probing for what macros are required 2085*cda5da8dSAndroid Build Coastguard Worker# and must therefore be located, when using the Autoconf-without-aclocal-m4 2086*cda5da8dSAndroid Build Coastguard Worker# autom4te language. For more background, see: 2087*cda5da8dSAndroid Build Coastguard Worker# https://lists.gnu.org/archive/html/automake-patches/2012-11/msg00035.html 2088*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_require_call], 2089*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_m4_divert_grow], m4_decr(_m4_divert_grow))]dnl 2090*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl 2091*cda5da8dSAndroid Build Coastguard Worker[m4_divert_push(_m4_divert_grow, [-])]dnl 2092*cda5da8dSAndroid Build Coastguard Worker[m4_if([$2], [], [$1], [$2]) 2093*cda5da8dSAndroid Build Coastguard Workerm4_provide_if([$1], [m4_set_remove([_m4_provide], [$1])], 2094*cda5da8dSAndroid Build Coastguard Worker [m4_ifndef([m4_require_silent_probe], 2095*cda5da8dSAndroid Build Coastguard Worker [m4_warn([syntax], [$1 is m4_require'd but not m4_defun'd])])])]dnl 2096*cda5da8dSAndroid Build Coastguard Worker[_m4_divert_raw($3)_m4_undivert(_m4_divert_grow)]dnl 2097*cda5da8dSAndroid Build Coastguard Worker[m4_divert_pop(_m4_divert_grow)_m4_popdef([_m4_divert_grow], 2098*cda5da8dSAndroid Build Coastguard Worker[_m4_diverting([$1])], [_m4_diverting])]) 2099*cda5da8dSAndroid Build Coastguard Worker 2100*cda5da8dSAndroid Build Coastguard Worker 2101*cda5da8dSAndroid Build Coastguard Worker# _m4_require_check(NAME-TO-CHECK, OWNER, CALLER) 2102*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------- 2103*cda5da8dSAndroid Build Coastguard Worker# NAME-TO-CHECK has been identified as previously expanded in the 2104*cda5da8dSAndroid Build Coastguard Worker# diversion owned by OWNER. If this is a problem, warn on behalf of 2105*cda5da8dSAndroid Build Coastguard Worker# CALLER and return _m4_require_call; otherwise return m4_ignore. 2106*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_require_check], 2107*cda5da8dSAndroid Build Coastguard Worker[m4_if(_m4_defn([_m4_diverting]), [$2], [m4_ignore], 2108*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([_m4_diverting([$2])], [-]), [-], [m4_warn([syntax], 2109*cda5da8dSAndroid Build Coastguard Worker [$3: `$1' was expanded before it was required 2110*cda5da8dSAndroid Build Coastguard Workerhttps://www.gnu.org/software/autoconf/manual/autoconf.html#Expanded-Before-Required])_m4_require_call], 2111*cda5da8dSAndroid Build Coastguard Worker [m4_ignore])]) 2112*cda5da8dSAndroid Build Coastguard Worker 2113*cda5da8dSAndroid Build Coastguard Worker 2114*cda5da8dSAndroid Build Coastguard Worker# _m4_divert_grow 2115*cda5da8dSAndroid Build Coastguard Worker# --------------- 2116*cda5da8dSAndroid Build Coastguard Worker# The counter for _m4_require_call. 2117*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_divert_grow], _m4_divert([GROW])) 2118*cda5da8dSAndroid Build Coastguard Worker 2119*cda5da8dSAndroid Build Coastguard Worker 2120*cda5da8dSAndroid Build Coastguard Worker# m4_expand_once(TEXT, [WITNESS = TEXT]) 2121*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------- 2122*cda5da8dSAndroid Build Coastguard Worker# If TEXT has never been expanded, expand it *here*. Use WITNESS as 2123*cda5da8dSAndroid Build Coastguard Worker# as a memory that TEXT has already been expanded. 2124*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_expand_once], 2125*cda5da8dSAndroid Build Coastguard Worker[m4_provide_if(m4_default_quoted([$2], [$1]), 2126*cda5da8dSAndroid Build Coastguard Worker [], 2127*cda5da8dSAndroid Build Coastguard Worker [m4_provide(m4_default_quoted([$2], [$1]))[]$1])]) 2128*cda5da8dSAndroid Build Coastguard Worker 2129*cda5da8dSAndroid Build Coastguard Worker 2130*cda5da8dSAndroid Build Coastguard Worker# m4_provide(MACRO-NAME) 2131*cda5da8dSAndroid Build Coastguard Worker# ---------------------- 2132*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_provide], 2133*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([m4_provide($1)], [], 2134*cda5da8dSAndroid Build Coastguard Worker[m4_set_add([_m4_provide], [$1], [m4_define([m4_provide($1)], 2135*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([_m4_diverting], [_m4_defn([_m4_diverting])]))])])]) 2136*cda5da8dSAndroid Build Coastguard Worker 2137*cda5da8dSAndroid Build Coastguard Worker 2138*cda5da8dSAndroid Build Coastguard Worker# m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) 2139*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------- 2140*cda5da8dSAndroid Build Coastguard Worker# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED. 2141*cda5da8dSAndroid Build Coastguard Worker# The purpose of this macro is to provide the user with a means to 2142*cda5da8dSAndroid Build Coastguard Worker# check macros which are provided without letting her know how the 2143*cda5da8dSAndroid Build Coastguard Worker# information is coded. 2144*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_provide_if], 2145*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([m4_provide($1)], 2146*cda5da8dSAndroid Build Coastguard Worker [$2], [$3])]) 2147*cda5da8dSAndroid Build Coastguard Worker 2148*cda5da8dSAndroid Build Coastguard Worker 2149*cda5da8dSAndroid Build Coastguard Worker## --------------------- ## 2150*cda5da8dSAndroid Build Coastguard Worker## 12. Text processing. ## 2151*cda5da8dSAndroid Build Coastguard Worker## --------------------- ## 2152*cda5da8dSAndroid Build Coastguard Worker 2153*cda5da8dSAndroid Build Coastguard Worker 2154*cda5da8dSAndroid Build Coastguard Worker# m4_cr_letters 2155*cda5da8dSAndroid Build Coastguard Worker# m4_cr_LETTERS 2156*cda5da8dSAndroid Build Coastguard Worker# m4_cr_Letters 2157*cda5da8dSAndroid Build Coastguard Worker# ------------- 2158*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_letters], [abcdefghijklmnopqrstuvwxyz]) 2159*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_LETTERS], [ABCDEFGHIJKLMNOPQRSTUVWXYZ]) 2160*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_Letters], 2161*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_cr_letters])dnl 2162*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_cr_LETTERS])dnl 2163*cda5da8dSAndroid Build Coastguard Worker) 2164*cda5da8dSAndroid Build Coastguard Worker 2165*cda5da8dSAndroid Build Coastguard Worker 2166*cda5da8dSAndroid Build Coastguard Worker# m4_cr_digits 2167*cda5da8dSAndroid Build Coastguard Worker# ------------ 2168*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_digits], [0123456789]) 2169*cda5da8dSAndroid Build Coastguard Worker 2170*cda5da8dSAndroid Build Coastguard Worker 2171*cda5da8dSAndroid Build Coastguard Worker# m4_cr_alnum 2172*cda5da8dSAndroid Build Coastguard Worker# ----------- 2173*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_alnum], 2174*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_cr_Letters])dnl 2175*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_cr_digits])dnl 2176*cda5da8dSAndroid Build Coastguard Worker) 2177*cda5da8dSAndroid Build Coastguard Worker 2178*cda5da8dSAndroid Build Coastguard Worker 2179*cda5da8dSAndroid Build Coastguard Worker# m4_cr_symbols1 2180*cda5da8dSAndroid Build Coastguard Worker# m4_cr_symbols2 2181*cda5da8dSAndroid Build Coastguard Worker# -------------- 2182*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_symbols1], 2183*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_cr_Letters])dnl 2184*cda5da8dSAndroid Build Coastguard Worker_) 2185*cda5da8dSAndroid Build Coastguard Worker 2186*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_symbols2], 2187*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_cr_symbols1])dnl 2188*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_cr_digits])dnl 2189*cda5da8dSAndroid Build Coastguard Worker) 2190*cda5da8dSAndroid Build Coastguard Worker 2191*cda5da8dSAndroid Build Coastguard Worker# m4_cr_all 2192*cda5da8dSAndroid Build Coastguard Worker# --------- 2193*cda5da8dSAndroid Build Coastguard Worker# The character range representing everything, with `-' as the last 2194*cda5da8dSAndroid Build Coastguard Worker# character, since it is special to m4_translit. Use with care, because 2195*cda5da8dSAndroid Build Coastguard Worker# it contains characters special to M4 (fortunately, both ASCII and EBCDIC 2196*cda5da8dSAndroid Build Coastguard Worker# have [] in order, so m4_defn([m4_cr_all]) remains a valid string). It 2197*cda5da8dSAndroid Build Coastguard Worker# also contains characters special to terminals, so it should never be 2198*cda5da8dSAndroid Build Coastguard Worker# displayed in an error message. Also, attempts to map [ and ] to other 2199*cda5da8dSAndroid Build Coastguard Worker# characters via m4_translit must deal with the fact that m4_translit does 2200*cda5da8dSAndroid Build Coastguard Worker# not add quotes to the output. 2201*cda5da8dSAndroid Build Coastguard Worker# 2202*cda5da8dSAndroid Build Coastguard Worker# In EBCDIC, $ is immediately followed by *, which leads to problems 2203*cda5da8dSAndroid Build Coastguard Worker# if m4_cr_all is inlined into a macro definition; so swap them. 2204*cda5da8dSAndroid Build Coastguard Worker# 2205*cda5da8dSAndroid Build Coastguard Worker# It is mainly useful in generating inverted character range maps, for use 2206*cda5da8dSAndroid Build Coastguard Worker# in places where m4_translit is faster than an equivalent m4_bpatsubst; 2207*cda5da8dSAndroid Build Coastguard Worker# the regex `[^a-z]' is equivalent to: 2208*cda5da8dSAndroid Build Coastguard Worker# m4_translit(m4_dquote(m4_defn([m4_cr_all])), [a-z]) 2209*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cr_all], 2210*cda5da8dSAndroid Build Coastguard Workerm4_translit(m4_dquote(m4_format(m4_dquote(m4_for( 2211*cda5da8dSAndroid Build Coastguard Worker ,1,255,,[[%c]]))m4_for([i],1,255,,[,i]))), [$*-], [*$])-) 2212*cda5da8dSAndroid Build Coastguard Worker 2213*cda5da8dSAndroid Build Coastguard Worker 2214*cda5da8dSAndroid Build Coastguard Worker# _m4_define_cr_not(CATEGORY) 2215*cda5da8dSAndroid Build Coastguard Worker# --------------------------- 2216*cda5da8dSAndroid Build Coastguard Worker# Define m4_cr_not_CATEGORY as the inverse of m4_cr_CATEGORY. 2217*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_define_cr_not], 2218*cda5da8dSAndroid Build Coastguard Worker[m4_define([m4_cr_not_$1], 2219*cda5da8dSAndroid Build Coastguard Worker m4_translit(m4_dquote(m4_defn([m4_cr_all])), 2220*cda5da8dSAndroid Build Coastguard Worker m4_defn([m4_cr_$1])))]) 2221*cda5da8dSAndroid Build Coastguard Worker 2222*cda5da8dSAndroid Build Coastguard Worker 2223*cda5da8dSAndroid Build Coastguard Worker# m4_cr_not_letters 2224*cda5da8dSAndroid Build Coastguard Worker# m4_cr_not_LETTERS 2225*cda5da8dSAndroid Build Coastguard Worker# m4_cr_not_Letters 2226*cda5da8dSAndroid Build Coastguard Worker# m4_cr_not_digits 2227*cda5da8dSAndroid Build Coastguard Worker# m4_cr_not_alnum 2228*cda5da8dSAndroid Build Coastguard Worker# m4_cr_not_symbols1 2229*cda5da8dSAndroid Build Coastguard Worker# m4_cr_not_symbols2 2230*cda5da8dSAndroid Build Coastguard Worker# ------------------ 2231*cda5da8dSAndroid Build Coastguard Worker# Inverse character sets 2232*cda5da8dSAndroid Build Coastguard Worker_m4_define_cr_not([letters]) 2233*cda5da8dSAndroid Build Coastguard Worker_m4_define_cr_not([LETTERS]) 2234*cda5da8dSAndroid Build Coastguard Worker_m4_define_cr_not([Letters]) 2235*cda5da8dSAndroid Build Coastguard Worker_m4_define_cr_not([digits]) 2236*cda5da8dSAndroid Build Coastguard Worker_m4_define_cr_not([alnum]) 2237*cda5da8dSAndroid Build Coastguard Worker_m4_define_cr_not([symbols1]) 2238*cda5da8dSAndroid Build Coastguard Worker_m4_define_cr_not([symbols2]) 2239*cda5da8dSAndroid Build Coastguard Worker 2240*cda5da8dSAndroid Build Coastguard Worker 2241*cda5da8dSAndroid Build Coastguard Worker# m4_newline([STRING]) 2242*cda5da8dSAndroid Build Coastguard Worker# -------------------- 2243*cda5da8dSAndroid Build Coastguard Worker# Expands to a newline, possibly followed by STRING. Exists mostly for 2244*cda5da8dSAndroid Build Coastguard Worker# formatting reasons. 2245*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_newline], [ 2246*cda5da8dSAndroid Build Coastguard Worker$1]) 2247*cda5da8dSAndroid Build Coastguard Worker 2248*cda5da8dSAndroid Build Coastguard Worker 2249*cda5da8dSAndroid Build Coastguard Worker# m4_re_escape(STRING) 2250*cda5da8dSAndroid Build Coastguard Worker# -------------------- 2251*cda5da8dSAndroid Build Coastguard Worker# Escape RE active characters in STRING. 2252*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_re_escape], 2253*cda5da8dSAndroid Build Coastguard Worker[m4_bpatsubst([$1], 2254*cda5da8dSAndroid Build Coastguard Worker [[][*+.?\^$]], [\\\&])]) 2255*cda5da8dSAndroid Build Coastguard Worker 2256*cda5da8dSAndroid Build Coastguard Worker 2257*cda5da8dSAndroid Build Coastguard Worker# m4_re_string 2258*cda5da8dSAndroid Build Coastguard Worker# ------------ 2259*cda5da8dSAndroid Build Coastguard Worker# Regexp for `[a-zA-Z_0-9]*' 2260*cda5da8dSAndroid Build Coastguard Worker# m4_dquote provides literal [] for the character class. 2261*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_re_string], 2262*cda5da8dSAndroid Build Coastguard Workerm4_dquote(m4_defn([m4_cr_symbols2]))dnl 2263*cda5da8dSAndroid Build Coastguard Worker[*]dnl 2264*cda5da8dSAndroid Build Coastguard Worker) 2265*cda5da8dSAndroid Build Coastguard Worker 2266*cda5da8dSAndroid Build Coastguard Worker 2267*cda5da8dSAndroid Build Coastguard Worker# m4_re_word 2268*cda5da8dSAndroid Build Coastguard Worker# ---------- 2269*cda5da8dSAndroid Build Coastguard Worker# Regexp for `[a-zA-Z_][a-zA-Z_0-9]*' 2270*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_re_word], 2271*cda5da8dSAndroid Build Coastguard Workerm4_dquote(m4_defn([m4_cr_symbols1]))dnl 2272*cda5da8dSAndroid Build Coastguard Workerm4_defn([m4_re_string])dnl 2273*cda5da8dSAndroid Build Coastguard Worker) 2274*cda5da8dSAndroid Build Coastguard Worker 2275*cda5da8dSAndroid Build Coastguard Worker 2276*cda5da8dSAndroid Build Coastguard Worker# m4_tolower(STRING) 2277*cda5da8dSAndroid Build Coastguard Worker# m4_toupper(STRING) 2278*cda5da8dSAndroid Build Coastguard Worker# ------------------ 2279*cda5da8dSAndroid Build Coastguard Worker# These macros convert STRING to lowercase or uppercase. 2280*cda5da8dSAndroid Build Coastguard Worker# 2281*cda5da8dSAndroid Build Coastguard Worker# Rather than expand the m4_defn each time, we inline them up front. 2282*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_tolower], 2283*cda5da8dSAndroid Build Coastguard Worker[m4_translit([[$1]], ]m4_dquote(m4_defn([m4_cr_LETTERS]))[, 2284*cda5da8dSAndroid Build Coastguard Worker ]m4_dquote(m4_defn([m4_cr_letters]))[)]) 2285*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_toupper], 2286*cda5da8dSAndroid Build Coastguard Worker[m4_translit([[$1]], ]m4_dquote(m4_defn([m4_cr_letters]))[, 2287*cda5da8dSAndroid Build Coastguard Worker ]m4_dquote(m4_defn([m4_cr_LETTERS]))[)]) 2288*cda5da8dSAndroid Build Coastguard Worker 2289*cda5da8dSAndroid Build Coastguard Worker 2290*cda5da8dSAndroid Build Coastguard Worker# m4_split(STRING, [REGEXP]) 2291*cda5da8dSAndroid Build Coastguard Worker# -------------------------- 2292*cda5da8dSAndroid Build Coastguard Worker# Split STRING into an m4 list of quoted elements. The elements are 2293*cda5da8dSAndroid Build Coastguard Worker# quoted with [ and ]. Beginning spaces and end spaces *are kept*. 2294*cda5da8dSAndroid Build Coastguard Worker# Use m4_strip to remove them. 2295*cda5da8dSAndroid Build Coastguard Worker# 2296*cda5da8dSAndroid Build Coastguard Worker# REGEXP specifies where to split. Default is [\t ]+. 2297*cda5da8dSAndroid Build Coastguard Worker# 2298*cda5da8dSAndroid Build Coastguard Worker# If STRING is empty, the result is an empty list. 2299*cda5da8dSAndroid Build Coastguard Worker# 2300*cda5da8dSAndroid Build Coastguard Worker# Pay attention to the m4_changequotes. When m4 reads the definition of 2301*cda5da8dSAndroid Build Coastguard Worker# m4_split, it still has quotes set to [ and ]. Luckily, these are matched 2302*cda5da8dSAndroid Build Coastguard Worker# in the macro body, so the definition is stored correctly. Use the same 2303*cda5da8dSAndroid Build Coastguard Worker# alternate quotes as m4_noquote; it must be unlikely to appear in $1. 2304*cda5da8dSAndroid Build Coastguard Worker# 2305*cda5da8dSAndroid Build Coastguard Worker# Also, notice that $1 is quoted twice, since we want the result to 2306*cda5da8dSAndroid Build Coastguard Worker# be quoted. Then you should understand that the argument of 2307*cda5da8dSAndroid Build Coastguard Worker# patsubst is -=<{(STRING)}>=- (i.e., with additional -=<{( and )}>=-). 2308*cda5da8dSAndroid Build Coastguard Worker# 2309*cda5da8dSAndroid Build Coastguard Worker# This macro is safe on active symbols, i.e.: 2310*cda5da8dSAndroid Build Coastguard Worker# m4_define(active, ACTIVE) 2311*cda5da8dSAndroid Build Coastguard Worker# m4_split([active active ])end 2312*cda5da8dSAndroid Build Coastguard Worker# => [active], [active], []end 2313*cda5da8dSAndroid Build Coastguard Worker# 2314*cda5da8dSAndroid Build Coastguard Worker# Optimize on regex of ` ' (space), since m4_foreach_w already guarantees 2315*cda5da8dSAndroid Build Coastguard Worker# that the list contains single space separators, and a common case is 2316*cda5da8dSAndroid Build Coastguard Worker# splitting a single-element list. This macro is called frequently, 2317*cda5da8dSAndroid Build Coastguard Worker# so avoid unnecessary dnl inside the definition. 2318*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_split], 2319*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [], [], 2320*cda5da8dSAndroid Build Coastguard Worker [$2], [ ], [m4_if(m4_index([$1], [ ]), [-1], [[[$1]]], 2321*cda5da8dSAndroid Build Coastguard Worker [_$0([$1], [$2], [, ])])], 2322*cda5da8dSAndroid Build Coastguard Worker [$2], [], [_$0([$1], [[ ]+], [, ])], 2323*cda5da8dSAndroid Build Coastguard Worker [_$0([$1], [$2], [, ])])]) 2324*cda5da8dSAndroid Build Coastguard Worker 2325*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_split], 2326*cda5da8dSAndroid Build Coastguard Worker[m4_changequote([-=<{(],[)}>=-])]dnl 2327*cda5da8dSAndroid Build Coastguard Worker[[m4_bpatsubst(-=<{(-=<{($1)}>=-)}>=-, -=<{($2)}>=-, 2328*cda5da8dSAndroid Build Coastguard Worker -=<{(]$3[)}>=-)]m4_changequote([, ])]) 2329*cda5da8dSAndroid Build Coastguard Worker 2330*cda5da8dSAndroid Build Coastguard Worker 2331*cda5da8dSAndroid Build Coastguard Worker# m4_chomp(STRING) 2332*cda5da8dSAndroid Build Coastguard Worker# m4_chomp_all(STRING) 2333*cda5da8dSAndroid Build Coastguard Worker# -------------------- 2334*cda5da8dSAndroid Build Coastguard Worker# Return STRING quoted, but without a trailing newline. m4_chomp 2335*cda5da8dSAndroid Build Coastguard Worker# removes at most one newline, while m4_chomp_all removes all 2336*cda5da8dSAndroid Build Coastguard Worker# consecutive trailing newlines. Embedded newlines are not touched, 2337*cda5da8dSAndroid Build Coastguard Worker# and a trailing backslash-newline leaves just a trailing backslash. 2338*cda5da8dSAndroid Build Coastguard Worker# 2339*cda5da8dSAndroid Build Coastguard Worker# m4_bregexp is slower than m4_index, and we don't always want to 2340*cda5da8dSAndroid Build Coastguard Worker# remove all newlines; hence the two variants. We massage characters 2341*cda5da8dSAndroid Build Coastguard Worker# to give a nicer pattern to match, particularly since m4_bregexp is 2342*cda5da8dSAndroid Build Coastguard Worker# line-oriented. Both versions must guarantee a match, to avoid bugs 2343*cda5da8dSAndroid Build Coastguard Worker# with precision -1 in m4_format in older m4. 2344*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_chomp], 2345*cda5da8dSAndroid Build Coastguard Worker[m4_format([[%.*s]], m4_index(m4_translit([[$1]], [ 2346*cda5da8dSAndroid Build Coastguard Worker/.], [/ ])[./.], [/.]), [$1])]) 2347*cda5da8dSAndroid Build Coastguard Worker 2348*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_chomp_all], 2349*cda5da8dSAndroid Build Coastguard Worker[m4_format([[%.*s]], m4_bregexp(m4_translit([[$1]], [ 2350*cda5da8dSAndroid Build Coastguard Worker/], [/ ]), [/*$]), [$1])]) 2351*cda5da8dSAndroid Build Coastguard Worker 2352*cda5da8dSAndroid Build Coastguard Worker 2353*cda5da8dSAndroid Build Coastguard Worker# m4_flatten(STRING) 2354*cda5da8dSAndroid Build Coastguard Worker# ------------------ 2355*cda5da8dSAndroid Build Coastguard Worker# If STRING contains end of lines, replace them with spaces. If there 2356*cda5da8dSAndroid Build Coastguard Worker# are backslashed end of lines, remove them. This macro is safe with 2357*cda5da8dSAndroid Build Coastguard Worker# active symbols. 2358*cda5da8dSAndroid Build Coastguard Worker# m4_define(active, ACTIVE) 2359*cda5da8dSAndroid Build Coastguard Worker# m4_flatten([active 2360*cda5da8dSAndroid Build Coastguard Worker# act\ 2361*cda5da8dSAndroid Build Coastguard Worker# ive])end 2362*cda5da8dSAndroid Build Coastguard Worker# => active activeend 2363*cda5da8dSAndroid Build Coastguard Worker# 2364*cda5da8dSAndroid Build Coastguard Worker# In m4, m4_bpatsubst is expensive, so first check for a newline. 2365*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_flatten], 2366*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_index([$1], [ 2367*cda5da8dSAndroid Build Coastguard Worker]), [-1], [[$1]], 2368*cda5da8dSAndroid Build Coastguard Worker [m4_translit(m4_bpatsubst([[[$1]]], [\\ 2369*cda5da8dSAndroid Build Coastguard Worker]), [ 2370*cda5da8dSAndroid Build Coastguard Worker], [ ])])]) 2371*cda5da8dSAndroid Build Coastguard Worker 2372*cda5da8dSAndroid Build Coastguard Worker 2373*cda5da8dSAndroid Build Coastguard Worker# m4_strip(STRING) 2374*cda5da8dSAndroid Build Coastguard Worker# ---------------- 2375*cda5da8dSAndroid Build Coastguard Worker# Expands into STRING with tabs and spaces singled out into a single 2376*cda5da8dSAndroid Build Coastguard Worker# space, and removing leading and trailing spaces. 2377*cda5da8dSAndroid Build Coastguard Worker# 2378*cda5da8dSAndroid Build Coastguard Worker# This macro is robust to active symbols. 2379*cda5da8dSAndroid Build Coastguard Worker# m4_define(active, ACTIVE) 2380*cda5da8dSAndroid Build Coastguard Worker# m4_strip([ active <tab> <tab>active ])end 2381*cda5da8dSAndroid Build Coastguard Worker# => active activeend 2382*cda5da8dSAndroid Build Coastguard Worker# 2383*cda5da8dSAndroid Build Coastguard Worker# First, notice that we guarantee trailing space. Why? Because regular 2384*cda5da8dSAndroid Build Coastguard Worker# expressions are greedy, and `.* ?' would always group the space into the 2385*cda5da8dSAndroid Build Coastguard Worker# .* portion. The algorithm is simpler by avoiding `?' at the end. The 2386*cda5da8dSAndroid Build Coastguard Worker# algorithm correctly strips everything if STRING is just ` '. 2387*cda5da8dSAndroid Build Coastguard Worker# 2388*cda5da8dSAndroid Build Coastguard Worker# Then notice the second pattern: it is in charge of removing the 2389*cda5da8dSAndroid Build Coastguard Worker# leading/trailing spaces. Why not just `[^ ]'? Because they are 2390*cda5da8dSAndroid Build Coastguard Worker# applied to over-quoted strings, i.e. more or less [STRING], due 2391*cda5da8dSAndroid Build Coastguard Worker# to the limitations of m4_bpatsubsts. So the leading space in STRING 2392*cda5da8dSAndroid Build Coastguard Worker# is the *second* character; equally for the trailing space. 2393*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_strip], 2394*cda5da8dSAndroid Build Coastguard Worker[m4_bpatsubsts([$1 ], 2395*cda5da8dSAndroid Build Coastguard Worker [[ ]+], [ ], 2396*cda5da8dSAndroid Build Coastguard Worker [^. ?\(.*\) .$], [[[\1]]])]) 2397*cda5da8dSAndroid Build Coastguard Worker 2398*cda5da8dSAndroid Build Coastguard Worker 2399*cda5da8dSAndroid Build Coastguard Worker# m4_normalize(STRING) 2400*cda5da8dSAndroid Build Coastguard Worker# -------------------- 2401*cda5da8dSAndroid Build Coastguard Worker# Apply m4_flatten and m4_strip to STRING. 2402*cda5da8dSAndroid Build Coastguard Worker# 2403*cda5da8dSAndroid Build Coastguard Worker# The argument is quoted, so that the macro is robust to active symbols: 2404*cda5da8dSAndroid Build Coastguard Worker# 2405*cda5da8dSAndroid Build Coastguard Worker# m4_define(active, ACTIVE) 2406*cda5da8dSAndroid Build Coastguard Worker# m4_normalize([ act\ 2407*cda5da8dSAndroid Build Coastguard Worker# ive 2408*cda5da8dSAndroid Build Coastguard Worker# active ])end 2409*cda5da8dSAndroid Build Coastguard Worker# => active activeend 2410*cda5da8dSAndroid Build Coastguard Worker 2411*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_normalize], 2412*cda5da8dSAndroid Build Coastguard Worker[m4_strip(m4_flatten([$1]))]) 2413*cda5da8dSAndroid Build Coastguard Worker 2414*cda5da8dSAndroid Build Coastguard Worker 2415*cda5da8dSAndroid Build Coastguard Worker# m4_validate_w(STRING) 2416*cda5da8dSAndroid Build Coastguard Worker# --------------------- 2417*cda5da8dSAndroid Build Coastguard Worker# Expands into m4_normalize(m4_expand([STRING])), but if that is not 2418*cda5da8dSAndroid Build Coastguard Worker# the same as just m4_normalize([STRING]), issue a warning. 2419*cda5da8dSAndroid Build Coastguard Worker# 2420*cda5da8dSAndroid Build Coastguard Worker# This is used in several Autoconf macros that take a 2421*cda5da8dSAndroid Build Coastguard Worker# whitespace-separated list of symbols as an argument. Ideally that 2422*cda5da8dSAndroid Build Coastguard Worker# list would not be expanded before use, but several packages used 2423*cda5da8dSAndroid Build Coastguard Worker# `dnl' to put comments inside those lists, so they must be expanded 2424*cda5da8dSAndroid Build Coastguard Worker# for compatibility's sake. 2425*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_validate_w], 2426*cda5da8dSAndroid Build Coastguard Worker[_m4_validate_w(m4_normalize([$1]), m4_normalize(m4_expand([$1])))]) 2427*cda5da8dSAndroid Build Coastguard Worker 2428*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_validate_w], 2429*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [$2], [], 2430*cda5da8dSAndroid Build Coastguard Worker [m4_warn([obsolete], [whitespace-separated list contains macros; 2431*cda5da8dSAndroid Build Coastguard Workerin a future version of Autoconf they will not be expanded]dnl 2432*cda5da8dSAndroid Build Coastguard Workerm4_if(m4_bregexp([$1], [\bdn[l]\b]), -1, [], [ 2433*cda5da8dSAndroid Build Coastguard Workernote: `dn@&t@l' is a macro]))])dnl 2434*cda5da8dSAndroid Build Coastguard Worker[$2]]) 2435*cda5da8dSAndroid Build Coastguard Worker 2436*cda5da8dSAndroid Build Coastguard Worker 2437*cda5da8dSAndroid Build Coastguard Worker# m4_join(SEP, ARG1, ARG2...) 2438*cda5da8dSAndroid Build Coastguard Worker# --------------------------- 2439*cda5da8dSAndroid Build Coastguard Worker# Produce ARG1SEPARG2...SEPARGn. Avoid back-to-back SEP when a given ARG 2440*cda5da8dSAndroid Build Coastguard Worker# is the empty string. No expansion is performed on SEP or ARGs. 2441*cda5da8dSAndroid Build Coastguard Worker# 2442*cda5da8dSAndroid Build Coastguard Worker# Since the number of arguments to join can be arbitrarily long, we 2443*cda5da8dSAndroid Build Coastguard Worker# want to avoid having more than one $@ in the macro definition; 2444*cda5da8dSAndroid Build Coastguard Worker# otherwise, the expansion would require twice the memory of the already 2445*cda5da8dSAndroid Build Coastguard Worker# long list. Hence, m4_join merely looks for the first non-empty element, 2446*cda5da8dSAndroid Build Coastguard Worker# and outputs just that element; while _m4_join looks for all non-empty 2447*cda5da8dSAndroid Build Coastguard Worker# elements, and outputs them following a separator. The final trick to 2448*cda5da8dSAndroid Build Coastguard Worker# note is that we decide between recursing with $0 or _$0 based on the 2449*cda5da8dSAndroid Build Coastguard Worker# nested m4_if ending with `_'. 2450*cda5da8dSAndroid Build Coastguard Worker# 2451*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 2452*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_join], 2453*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [1], [], 2454*cda5da8dSAndroid Build Coastguard Worker [$#], [2], [[$2]], 2455*cda5da8dSAndroid Build Coastguard Worker [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift2($@))])]) 2456*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_join], 2457*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#$2], [2], [], 2458*cda5da8dSAndroid Build Coastguard Worker [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift2($@))])]) 2459*cda5da8dSAndroid Build Coastguard Worker 2460*cda5da8dSAndroid Build Coastguard Worker# m4_joinall(SEP, ARG1, ARG2...) 2461*cda5da8dSAndroid Build Coastguard Worker# ------------------------------ 2462*cda5da8dSAndroid Build Coastguard Worker# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP. 2463*cda5da8dSAndroid Build Coastguard Worker# No expansion is performed on SEP or ARGs. 2464*cda5da8dSAndroid Build Coastguard Worker# 2465*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 2466*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_joinall], [[$2]_$0([$1], m4_shift($@))]) 2467*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_joinall], 2468*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [2], [], [[$1$3]$0([$1], m4_shift2($@))])]) 2469*cda5da8dSAndroid Build Coastguard Worker 2470*cda5da8dSAndroid Build Coastguard Worker# m4_combine([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX...) 2471*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------------------- 2472*cda5da8dSAndroid Build Coastguard Worker# Produce the pairwise combination of every element in the quoted, 2473*cda5da8dSAndroid Build Coastguard Worker# comma-separated PREFIX-LIST with every element from the SUFFIX arguments. 2474*cda5da8dSAndroid Build Coastguard Worker# Each pair is joined with INFIX, and pairs are separated by SEPARATOR. 2475*cda5da8dSAndroid Build Coastguard Worker# No expansion occurs on SEPARATOR, INFIX, or elements of either list. 2476*cda5da8dSAndroid Build Coastguard Worker# 2477*cda5da8dSAndroid Build Coastguard Worker# For example: 2478*cda5da8dSAndroid Build Coastguard Worker# m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3]) 2479*cda5da8dSAndroid Build Coastguard Worker# => a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3 2480*cda5da8dSAndroid Build Coastguard Worker# 2481*cda5da8dSAndroid Build Coastguard Worker# This definition is a bit hairy; the thing to realize is that we want 2482*cda5da8dSAndroid Build Coastguard Worker# to construct m4_map_args_sep([[prefix$3]], [], [[$1]], m4_shift3($@)) 2483*cda5da8dSAndroid Build Coastguard Worker# as the inner loop, using each prefix generated by the outer loop, 2484*cda5da8dSAndroid Build Coastguard Worker# and without recalculating m4_shift3 every outer iteration. 2485*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_combine], 2486*cda5da8dSAndroid Build Coastguard Worker[m4_if([$2], [], [], m4_eval([$# > 3]), [1], 2487*cda5da8dSAndroid Build Coastguard Worker[m4_map_args_sep([m4_map_args_sep(m4_dquote(], [)[[$3]], [], [[$1]],]]]dnl 2488*cda5da8dSAndroid Build Coastguard Worker[m4_dquote(m4_dquote(m4_shift3($@)))[[)], [[$1]], $2)])]) 2489*cda5da8dSAndroid Build Coastguard Worker 2490*cda5da8dSAndroid Build Coastguard Worker 2491*cda5da8dSAndroid Build Coastguard Worker# m4_append(MACRO-NAME, STRING, [SEPARATOR]) 2492*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------ 2493*cda5da8dSAndroid Build Coastguard Worker# Redefine MACRO-NAME to hold its former content plus `SEPARATOR`'STRING' 2494*cda5da8dSAndroid Build Coastguard Worker# at the end. It is valid to use this macro with MACRO-NAME undefined, 2495*cda5da8dSAndroid Build Coastguard Worker# in which case no SEPARATOR is added. Be aware that the criterion is 2496*cda5da8dSAndroid Build Coastguard Worker# `not being defined', and not `not being empty'. 2497*cda5da8dSAndroid Build Coastguard Worker# 2498*cda5da8dSAndroid Build Coastguard Worker# Note that neither STRING nor SEPARATOR are expanded here; rather, when 2499*cda5da8dSAndroid Build Coastguard Worker# you expand MACRO-NAME, they will be expanded at that point in time. 2500*cda5da8dSAndroid Build Coastguard Worker# 2501*cda5da8dSAndroid Build Coastguard Worker# This macro is robust to active symbols. It can be used to grow 2502*cda5da8dSAndroid Build Coastguard Worker# strings. 2503*cda5da8dSAndroid Build Coastguard Worker# 2504*cda5da8dSAndroid Build Coastguard Worker# | m4_define(active, ACTIVE)dnl 2505*cda5da8dSAndroid Build Coastguard Worker# | m4_append([sentence], [This is an])dnl 2506*cda5da8dSAndroid Build Coastguard Worker# | m4_append([sentence], [ active ])dnl 2507*cda5da8dSAndroid Build Coastguard Worker# | m4_append([sentence], [symbol.])dnl 2508*cda5da8dSAndroid Build Coastguard Worker# | sentence 2509*cda5da8dSAndroid Build Coastguard Worker# | m4_undefine([active])dnl 2510*cda5da8dSAndroid Build Coastguard Worker# | sentence 2511*cda5da8dSAndroid Build Coastguard Worker# => This is an ACTIVE symbol. 2512*cda5da8dSAndroid Build Coastguard Worker# => This is an active symbol. 2513*cda5da8dSAndroid Build Coastguard Worker# 2514*cda5da8dSAndroid Build Coastguard Worker# It can be used to define hooks. 2515*cda5da8dSAndroid Build Coastguard Worker# 2516*cda5da8dSAndroid Build Coastguard Worker# | m4_define(active, ACTIVE)dnl 2517*cda5da8dSAndroid Build Coastguard Worker# | m4_append([hooks], [m4_define([act1], [act2])])dnl 2518*cda5da8dSAndroid Build Coastguard Worker# | m4_append([hooks], [m4_define([act2], [active])])dnl 2519*cda5da8dSAndroid Build Coastguard Worker# | m4_undefine([active])dnl 2520*cda5da8dSAndroid Build Coastguard Worker# | act1 2521*cda5da8dSAndroid Build Coastguard Worker# | hooks 2522*cda5da8dSAndroid Build Coastguard Worker# | act1 2523*cda5da8dSAndroid Build Coastguard Worker# => act1 2524*cda5da8dSAndroid Build Coastguard Worker# => 2525*cda5da8dSAndroid Build Coastguard Worker# => active 2526*cda5da8dSAndroid Build Coastguard Worker# 2527*cda5da8dSAndroid Build Coastguard Worker# It can also be used to create lists, although this particular usage was 2528*cda5da8dSAndroid Build Coastguard Worker# broken prior to autoconf 2.62. 2529*cda5da8dSAndroid Build Coastguard Worker# | m4_append([list], [one], [, ])dnl 2530*cda5da8dSAndroid Build Coastguard Worker# | m4_append([list], [two], [, ])dnl 2531*cda5da8dSAndroid Build Coastguard Worker# | m4_append([list], [three], [, ])dnl 2532*cda5da8dSAndroid Build Coastguard Worker# | list 2533*cda5da8dSAndroid Build Coastguard Worker# | m4_dquote(list) 2534*cda5da8dSAndroid Build Coastguard Worker# => one, two, three 2535*cda5da8dSAndroid Build Coastguard Worker# => [one],[two],[three] 2536*cda5da8dSAndroid Build Coastguard Worker# 2537*cda5da8dSAndroid Build Coastguard Worker# Note that m4_append can benefit from amortized O(n) m4 behavior, if 2538*cda5da8dSAndroid Build Coastguard Worker# the underlying m4 implementation is smart enough to avoid copying existing 2539*cda5da8dSAndroid Build Coastguard Worker# contents when enlarging a macro's definition into any pre-allocated storage 2540*cda5da8dSAndroid Build Coastguard Worker# (m4 1.4.x unfortunately does not implement this optimization). We do 2541*cda5da8dSAndroid Build Coastguard Worker# not implement m4_prepend, since it is inherently O(n^2) (pre-allocated 2542*cda5da8dSAndroid Build Coastguard Worker# storage only occurs at the end of a macro, so the existing contents must 2543*cda5da8dSAndroid Build Coastguard Worker# always be moved). 2544*cda5da8dSAndroid Build Coastguard Worker# 2545*cda5da8dSAndroid Build Coastguard Worker# Use _m4_defn for speed. 2546*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_append], 2547*cda5da8dSAndroid Build Coastguard Worker[m4_define([$1], m4_ifdef([$1], [_m4_defn([$1])[$3]])[$2])]) 2548*cda5da8dSAndroid Build Coastguard Worker 2549*cda5da8dSAndroid Build Coastguard Worker 2550*cda5da8dSAndroid Build Coastguard Worker# m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR], [IF-UNIQ], [IF-DUP]) 2551*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------------------------------- 2552*cda5da8dSAndroid Build Coastguard Worker# Like `m4_append', but append only if not yet present. Additionally, 2553*cda5da8dSAndroid Build Coastguard Worker# expand IF-UNIQ if STRING was appended, or IF-DUP if STRING was already 2554*cda5da8dSAndroid Build Coastguard Worker# present. Also, warn if SEPARATOR is not empty and occurs within STRING, 2555*cda5da8dSAndroid Build Coastguard Worker# as the algorithm no longer guarantees uniqueness. 2556*cda5da8dSAndroid Build Coastguard Worker# 2557*cda5da8dSAndroid Build Coastguard Worker# Note that while m4_append can be O(n) (depending on the quality of the 2558*cda5da8dSAndroid Build Coastguard Worker# underlying M4 implementation), m4_append_uniq is inherently O(n^2) 2559*cda5da8dSAndroid Build Coastguard Worker# because each append operation searches the entire string. 2560*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_append_uniq], 2561*cda5da8dSAndroid Build Coastguard Worker[m4_ifval([$3], [m4_if(m4_index([$2], [$3]), [-1], [], 2562*cda5da8dSAndroid Build Coastguard Worker [m4_warn([syntax], 2563*cda5da8dSAndroid Build Coastguard Worker [$0: `$2' contains `$3'])])])_$0($@)]) 2564*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_append_uniq], 2565*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$1], 2566*cda5da8dSAndroid Build Coastguard Worker [m4_if(m4_index([$3]_m4_defn([$1])[$3], [$3$2$3]), [-1], 2567*cda5da8dSAndroid Build Coastguard Worker [m4_append([$1], [$2], [$3])$4], [$5])], 2568*cda5da8dSAndroid Build Coastguard Worker [m4_define([$1], [$2])$4])]) 2569*cda5da8dSAndroid Build Coastguard Worker 2570*cda5da8dSAndroid Build Coastguard Worker# m4_append_uniq_w(MACRO-NAME, STRINGS) 2571*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------- 2572*cda5da8dSAndroid Build Coastguard Worker# For each of the words in the whitespace separated list STRINGS, append 2573*cda5da8dSAndroid Build Coastguard Worker# only the unique strings to the definition of MACRO-NAME. 2574*cda5da8dSAndroid Build Coastguard Worker# 2575*cda5da8dSAndroid Build Coastguard Worker# Use _m4_defn for speed. 2576*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_append_uniq_w], 2577*cda5da8dSAndroid Build Coastguard Worker[m4_map_args_w([$2], [_m4_append_uniq([$1],], [, [ ])])]) 2578*cda5da8dSAndroid Build Coastguard Worker 2579*cda5da8dSAndroid Build Coastguard Worker 2580*cda5da8dSAndroid Build Coastguard Worker# m4_escape(STRING) 2581*cda5da8dSAndroid Build Coastguard Worker# ----------------- 2582*cda5da8dSAndroid Build Coastguard Worker# Output quoted STRING, but with embedded #, $, [ and ] turned into 2583*cda5da8dSAndroid Build Coastguard Worker# quadrigraphs. 2584*cda5da8dSAndroid Build Coastguard Worker# 2585*cda5da8dSAndroid Build Coastguard Worker# It is faster to check if STRING is already good using m4_translit 2586*cda5da8dSAndroid Build Coastguard Worker# than to blindly perform four m4_bpatsubst. 2587*cda5da8dSAndroid Build Coastguard Worker# 2588*cda5da8dSAndroid Build Coastguard Worker# Because the translit is stripping quotes, it must also neutralize 2589*cda5da8dSAndroid Build Coastguard Worker# anything that might be in a macro name, as well as comments, commas, 2590*cda5da8dSAndroid Build Coastguard Worker# and parentheses. All the problem characters are unified so that a 2591*cda5da8dSAndroid Build Coastguard Worker# single m4_index can scan the result. 2592*cda5da8dSAndroid Build Coastguard Worker# 2593*cda5da8dSAndroid Build Coastguard Worker# Rather than expand m4_defn every time m4_escape is expanded, we 2594*cda5da8dSAndroid Build Coastguard Worker# inline its expansion up front. 2595*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_escape], 2596*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_index(m4_translit([$1], 2597*cda5da8dSAndroid Build Coastguard Worker [[]#,()]]m4_dquote(m4_defn([m4_cr_symbols2]))[, [$$$]), [$]), 2598*cda5da8dSAndroid Build Coastguard Worker [-1], [m4_echo], [_$0])([$1])]) 2599*cda5da8dSAndroid Build Coastguard Worker 2600*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_escape], 2601*cda5da8dSAndroid Build Coastguard Worker[m4_changequote([-=<{(],[)}>=-])]dnl 2602*cda5da8dSAndroid Build Coastguard Worker[m4_bpatsubst(m4_bpatsubst(m4_bpatsubst(m4_bpatsubst( 2603*cda5da8dSAndroid Build Coastguard Worker -=<{(-=<{(-=<{(-=<{(-=<{($1)}>=-)}>=-)}>=-)}>=-)}>=-, 2604*cda5da8dSAndroid Build Coastguard Worker -=<{(#)}>=-, -=<{(@%:@)}>=-), 2605*cda5da8dSAndroid Build Coastguard Worker -=<{(\[)}>=-, -=<{(@<:@)}>=-), 2606*cda5da8dSAndroid Build Coastguard Worker -=<{(\])}>=-, -=<{(@:>@)}>=-), 2607*cda5da8dSAndroid Build Coastguard Worker -=<{(\$)}>=-, -=<{(@S|@)}>=-)m4_changequote([,])]) 2608*cda5da8dSAndroid Build Coastguard Worker 2609*cda5da8dSAndroid Build Coastguard Worker 2610*cda5da8dSAndroid Build Coastguard Worker# m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH]) 2611*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------- 2612*cda5da8dSAndroid Build Coastguard Worker# Expands into STRING wrapped to hold in WIDTH columns (default = 79). 2613*cda5da8dSAndroid Build Coastguard Worker# If PREFIX is given, each line is prefixed with it. If FIRST-PREFIX is 2614*cda5da8dSAndroid Build Coastguard Worker# specified, then the first line is prefixed with it. As a special case, 2615*cda5da8dSAndroid Build Coastguard Worker# if the length of FIRST-PREFIX is greater than that of PREFIX, then 2616*cda5da8dSAndroid Build Coastguard Worker# FIRST-PREFIX will be left alone on the first line. 2617*cda5da8dSAndroid Build Coastguard Worker# 2618*cda5da8dSAndroid Build Coastguard Worker# No expansion occurs on the contents STRING, PREFIX, or FIRST-PREFIX, 2619*cda5da8dSAndroid Build Coastguard Worker# although quadrigraphs are correctly recognized. More precisely, 2620*cda5da8dSAndroid Build Coastguard Worker# you may redefine m4_qlen to recognize whatever escape sequences that 2621*cda5da8dSAndroid Build Coastguard Worker# you will post-process. 2622*cda5da8dSAndroid Build Coastguard Worker# 2623*cda5da8dSAndroid Build Coastguard Worker# Typical outputs are: 2624*cda5da8dSAndroid Build Coastguard Worker# 2625*cda5da8dSAndroid Build Coastguard Worker# m4_text_wrap([Short string */], [ ], [/* ], 20) 2626*cda5da8dSAndroid Build Coastguard Worker# => /* Short string */ 2627*cda5da8dSAndroid Build Coastguard Worker# 2628*cda5da8dSAndroid Build Coastguard Worker# m4_text_wrap([Much longer string */], [ ], [/* ], 20) 2629*cda5da8dSAndroid Build Coastguard Worker# => /* Much longer 2630*cda5da8dSAndroid Build Coastguard Worker# => string */ 2631*cda5da8dSAndroid Build Coastguard Worker# 2632*cda5da8dSAndroid Build Coastguard Worker# m4_text_wrap([Short doc.], [ ], [ --short ], 30) 2633*cda5da8dSAndroid Build Coastguard Worker# => --short Short doc. 2634*cda5da8dSAndroid Build Coastguard Worker# 2635*cda5da8dSAndroid Build Coastguard Worker# m4_text_wrap([Short doc.], [ ], [ --too-wide ], 30) 2636*cda5da8dSAndroid Build Coastguard Worker# => --too-wide 2637*cda5da8dSAndroid Build Coastguard Worker# => Short doc. 2638*cda5da8dSAndroid Build Coastguard Worker# 2639*cda5da8dSAndroid Build Coastguard Worker# m4_text_wrap([Super long documentation.], [ ], [ --too-wide ], 30) 2640*cda5da8dSAndroid Build Coastguard Worker# => --too-wide 2641*cda5da8dSAndroid Build Coastguard Worker# => Super long 2642*cda5da8dSAndroid Build Coastguard Worker# => documentation. 2643*cda5da8dSAndroid Build Coastguard Worker# 2644*cda5da8dSAndroid Build Coastguard Worker# FIXME: there is no checking of a longer PREFIX than WIDTH, but do 2645*cda5da8dSAndroid Build Coastguard Worker# we really want to bother with people trying each single corner 2646*cda5da8dSAndroid Build Coastguard Worker# of a software? 2647*cda5da8dSAndroid Build Coastguard Worker# 2648*cda5da8dSAndroid Build Coastguard Worker# This macro does not leave a trailing space behind the last word of a line, 2649*cda5da8dSAndroid Build Coastguard Worker# which complicates it a bit. The algorithm is otherwise stupid and simple: 2650*cda5da8dSAndroid Build Coastguard Worker# all the words are preceded by m4_Separator which is defined to empty for 2651*cda5da8dSAndroid Build Coastguard Worker# the first word, and then ` ' (single space) for all the others. 2652*cda5da8dSAndroid Build Coastguard Worker# 2653*cda5da8dSAndroid Build Coastguard Worker# The algorithm uses a helper that uses $2 through $4 directly, rather than 2654*cda5da8dSAndroid Build Coastguard Worker# using local variables, to avoid m4_defn overhead, or expansion swallowing 2655*cda5da8dSAndroid Build Coastguard Worker# any $. It also bypasses m4_popdef overhead with _m4_popdef since no user 2656*cda5da8dSAndroid Build Coastguard Worker# macro expansion occurs in the meantime. Also, the definition is written 2657*cda5da8dSAndroid Build Coastguard Worker# with m4_do, to avoid time wasted on dnl during expansion (since this is 2658*cda5da8dSAndroid Build Coastguard Worker# already a time-consuming macro). 2659*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_text_wrap], 2660*cda5da8dSAndroid Build Coastguard Worker[_$0(m4_escape([$1]), [$2], m4_default_quoted([$3], [$2]), 2661*cda5da8dSAndroid Build Coastguard Worker m4_default_quoted([$4], [79]))]) 2662*cda5da8dSAndroid Build Coastguard Worker 2663*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_text_wrap], 2664*cda5da8dSAndroid Build Coastguard Workerm4_do(dnl set up local variables, to avoid repeated calculations 2665*cda5da8dSAndroid Build Coastguard Worker[[m4_pushdef([m4_Indent], m4_qlen([$2]))]], 2666*cda5da8dSAndroid Build Coastguard Worker[[m4_pushdef([m4_Cursor], m4_qlen([$3]))]], 2667*cda5da8dSAndroid Build Coastguard Worker[[m4_pushdef([m4_Separator], [m4_define([m4_Separator], [ ])])]], 2668*cda5da8dSAndroid Build Coastguard Workerdnl expand the first prefix, then check its length vs. regular prefix 2669*cda5da8dSAndroid Build Coastguard Workerdnl same length: nothing special 2670*cda5da8dSAndroid Build Coastguard Workerdnl prefix1 longer: output on line by itself, and reset cursor 2671*cda5da8dSAndroid Build Coastguard Workerdnl prefix1 shorter: pad to length of prefix, and reset cursor 2672*cda5da8dSAndroid Build Coastguard Worker[[[$3]m4_cond([m4_Cursor], m4_Indent, [], 2673*cda5da8dSAndroid Build Coastguard Worker [m4_eval(m4_Cursor > m4_Indent)], [1], [ 2674*cda5da8dSAndroid Build Coastguard Worker[$2]m4_define([m4_Cursor], m4_Indent)], 2675*cda5da8dSAndroid Build Coastguard Worker [m4_format([%*s], m4_max([0], 2676*cda5da8dSAndroid Build Coastguard Worker m4_eval(m4_Indent - m4_Cursor)), [])m4_define([m4_Cursor], m4_Indent)])]], 2677*cda5da8dSAndroid Build Coastguard Workerdnl now, for each word, compute the cursor after the word is output, then 2678*cda5da8dSAndroid Build Coastguard Workerdnl check if the cursor would exceed the wrap column 2679*cda5da8dSAndroid Build Coastguard Workerdnl if so, reset cursor, and insert newline and prefix 2680*cda5da8dSAndroid Build Coastguard Workerdnl if not, insert the separator (usually a space) 2681*cda5da8dSAndroid Build Coastguard Workerdnl either way, insert the word 2682*cda5da8dSAndroid Build Coastguard Worker[[m4_map_args_w([$1], [$0_word(], [, [$2], [$4])])]], 2683*cda5da8dSAndroid Build Coastguard Workerdnl finally, clean up the local variables 2684*cda5da8dSAndroid Build Coastguard Worker[[_m4_popdef([m4_Separator], [m4_Cursor], [m4_Indent])]])) 2685*cda5da8dSAndroid Build Coastguard Worker 2686*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_text_wrap_word], 2687*cda5da8dSAndroid Build Coastguard Worker[m4_define([m4_Cursor], m4_eval(m4_Cursor + m4_qlen([$1]) + 1))]dnl 2688*cda5da8dSAndroid Build Coastguard Worker[m4_if(m4_eval(m4_Cursor > ([$3])), 2689*cda5da8dSAndroid Build Coastguard Worker [1], [m4_define([m4_Cursor], m4_eval(m4_Indent + m4_qlen([$1]) + 1)) 2690*cda5da8dSAndroid Build Coastguard Worker[$2]], 2691*cda5da8dSAndroid Build Coastguard Worker [m4_Separator[]])[$1]]) 2692*cda5da8dSAndroid Build Coastguard Worker 2693*cda5da8dSAndroid Build Coastguard Worker# m4_text_box(MESSAGE, [FRAME-CHARACTER = `-']) 2694*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------- 2695*cda5da8dSAndroid Build Coastguard Worker# Turn MESSAGE into: 2696*cda5da8dSAndroid Build Coastguard Worker# ## ------- ## 2697*cda5da8dSAndroid Build Coastguard Worker# ## MESSAGE ## 2698*cda5da8dSAndroid Build Coastguard Worker# ## ------- ## 2699*cda5da8dSAndroid Build Coastguard Worker# using FRAME-CHARACTER in the border. 2700*cda5da8dSAndroid Build Coastguard Worker# 2701*cda5da8dSAndroid Build Coastguard Worker# Quadrigraphs are correctly recognized. More precisely, you may 2702*cda5da8dSAndroid Build Coastguard Worker# redefine m4_qlen to recognize whatever escape sequences that you 2703*cda5da8dSAndroid Build Coastguard Worker# will post-process. 2704*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_text_box], 2705*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([m4_Border], 2706*cda5da8dSAndroid Build Coastguard Worker m4_translit(m4_format([[[%*s]]], m4_decr(m4_qlen(_m4_expand([$1 2707*cda5da8dSAndroid Build Coastguard Worker]))), []), [ ], m4_default_quoted([$2], [-])))]dnl 2708*cda5da8dSAndroid Build Coastguard Worker[[##] _m4_defn([m4_Border]) [##] 2709*cda5da8dSAndroid Build Coastguard Worker[##] $1 [##] 2710*cda5da8dSAndroid Build Coastguard Worker[##] _m4_defn([m4_Border]) [##]_m4_popdef([m4_Border])]) 2711*cda5da8dSAndroid Build Coastguard Worker 2712*cda5da8dSAndroid Build Coastguard Worker 2713*cda5da8dSAndroid Build Coastguard Worker# m4_qlen(STRING) 2714*cda5da8dSAndroid Build Coastguard Worker# --------------- 2715*cda5da8dSAndroid Build Coastguard Worker# Expands to the length of STRING after autom4te converts all quadrigraphs. 2716*cda5da8dSAndroid Build Coastguard Worker# 2717*cda5da8dSAndroid Build Coastguard Worker# If you use some other means of post-processing m4 output rather than 2718*cda5da8dSAndroid Build Coastguard Worker# autom4te, then you may redefine this macro to recognize whatever 2719*cda5da8dSAndroid Build Coastguard Worker# escape sequences your post-processor will handle. For that matter, 2720*cda5da8dSAndroid Build Coastguard Worker# m4_define([m4_qlen], m4_defn([m4_len])) is sufficient if you don't 2721*cda5da8dSAndroid Build Coastguard Worker# do any post-processing. 2722*cda5da8dSAndroid Build Coastguard Worker# 2723*cda5da8dSAndroid Build Coastguard Worker# Avoid bpatsubsts for the common case of no quadrigraphs. Cache 2724*cda5da8dSAndroid Build Coastguard Worker# results, as configure scripts tend to ask about lengths of common 2725*cda5da8dSAndroid Build Coastguard Worker# strings like `/*' and `*/' rather frequently. Minimize the number 2726*cda5da8dSAndroid Build Coastguard Worker# of times that $1 occurs in m4_qlen, so there is less text to parse 2727*cda5da8dSAndroid Build Coastguard Worker# on a cache hit. 2728*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_qlen], 2729*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([$0-$1], [_m4_defn([$0-]], [_$0(])[$1])]) 2730*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_qlen], 2731*cda5da8dSAndroid Build Coastguard Worker[m4_define([m4_qlen-$1], 2732*cda5da8dSAndroid Build Coastguard Workerm4_if(m4_index([$1], [@]), [-1], [m4_len([$1])], 2733*cda5da8dSAndroid Build Coastguard Worker [m4_len(m4_bpatsubst([[$1]], 2734*cda5da8dSAndroid Build Coastguard Worker [@\(\(<:\|:>\|S|\|%:\|\{:\|:\}\)\(@\)\|&t@\)], 2735*cda5da8dSAndroid Build Coastguard Worker [\3]))]))_m4_defn([m4_qlen-$1])]) 2736*cda5da8dSAndroid Build Coastguard Worker 2737*cda5da8dSAndroid Build Coastguard Worker# m4_copyright_condense(TEXT) 2738*cda5da8dSAndroid Build Coastguard Worker# --------------------------- 2739*cda5da8dSAndroid Build Coastguard Worker# Condense the copyright notice in TEXT to only display the final 2740*cda5da8dSAndroid Build Coastguard Worker# year, wrapping the results to fit in 80 columns. 2741*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_copyright_condense], 2742*cda5da8dSAndroid Build Coastguard Worker[m4_text_wrap(m4_bpatsubst(m4_flatten([[$1]]), 2743*cda5da8dSAndroid Build Coastguard Worker[(C)[- ,0-9]*\([1-9][0-9][0-9][0-9]\)], [(C) \1]))]) 2744*cda5da8dSAndroid Build Coastguard Worker 2745*cda5da8dSAndroid Build Coastguard Worker## ----------------------- ## 2746*cda5da8dSAndroid Build Coastguard Worker## 13. Number processing. ## 2747*cda5da8dSAndroid Build Coastguard Worker## ----------------------- ## 2748*cda5da8dSAndroid Build Coastguard Worker 2749*cda5da8dSAndroid Build Coastguard Worker# m4_cmp(A, B) 2750*cda5da8dSAndroid Build Coastguard Worker# ------------ 2751*cda5da8dSAndroid Build Coastguard Worker# Compare two integer expressions. 2752*cda5da8dSAndroid Build Coastguard Worker# A < B -> -1 2753*cda5da8dSAndroid Build Coastguard Worker# A = B -> 0 2754*cda5da8dSAndroid Build Coastguard Worker# A > B -> 1 2755*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_cmp], 2756*cda5da8dSAndroid Build Coastguard Worker[m4_eval((([$1]) > ([$2])) - (([$1]) < ([$2])))]) 2757*cda5da8dSAndroid Build Coastguard Worker 2758*cda5da8dSAndroid Build Coastguard Worker 2759*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp(A, B) 2760*cda5da8dSAndroid Build Coastguard Worker# ----------------- 2761*cda5da8dSAndroid Build Coastguard Worker# 2762*cda5da8dSAndroid Build Coastguard Worker# Compare the two lists of integer expressions A and B. For instance: 2763*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([1, 0], [1]) -> 0 2764*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([1, 0], [1, 0]) -> 0 2765*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([1, 2], [1, 0]) -> 1 2766*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([1, 2, 3], [1, 2]) -> 1 2767*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([1, 2, -3], [1, 2]) -> -1 2768*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([1, 0], [1, 2]) -> -1 2769*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([1], [1, 2]) -> -1 2770*cda5da8dSAndroid Build Coastguard Worker# m4_define([xa], [oops])dnl 2771*cda5da8dSAndroid Build Coastguard Worker# m4_list_cmp([[0xa]], [5+5]) -> 0 2772*cda5da8dSAndroid Build Coastguard Worker# 2773*cda5da8dSAndroid Build Coastguard Worker# Rather than face the overhead of m4_case, we use a helper function whose 2774*cda5da8dSAndroid Build Coastguard Worker# expansion includes the name of the macro to invoke on the tail, either 2775*cda5da8dSAndroid Build Coastguard Worker# m4_ignore or m4_unquote. This is particularly useful when comparing 2776*cda5da8dSAndroid Build Coastguard Worker# long lists, since less text is being expanded for deciding when to end 2777*cda5da8dSAndroid Build Coastguard Worker# recursion. The recursion is between a pair of macros that alternate 2778*cda5da8dSAndroid Build Coastguard Worker# which list is trimmed by one element; this is more efficient than 2779*cda5da8dSAndroid Build Coastguard Worker# calling m4_cdr on both lists from a single macro. Guarantee exactly 2780*cda5da8dSAndroid Build Coastguard Worker# one expansion of both lists' side effects. 2781*cda5da8dSAndroid Build Coastguard Worker# 2782*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 2783*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_list_cmp], 2784*cda5da8dSAndroid Build Coastguard Worker[_$0_raw(m4_dquote($1), m4_dquote($2))]) 2785*cda5da8dSAndroid Build Coastguard Worker 2786*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_list_cmp_raw], 2787*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [$2], [0], [_m4_list_cmp_1([$1], $2)])]) 2788*cda5da8dSAndroid Build Coastguard Worker 2789*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_list_cmp], 2790*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [], [0m4_ignore], [$2], [0], [m4_unquote], [$2m4_ignore])]) 2791*cda5da8dSAndroid Build Coastguard Worker 2792*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_list_cmp_1], 2793*cda5da8dSAndroid Build Coastguard Worker[_m4_list_cmp_2([$2], [m4_shift2($@)], $1)]) 2794*cda5da8dSAndroid Build Coastguard Worker 2795*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_list_cmp_2], 2796*cda5da8dSAndroid Build Coastguard Worker[_m4_list_cmp([$1$3], m4_cmp([$3+0], [$1+0]))( 2797*cda5da8dSAndroid Build Coastguard Worker [_m4_list_cmp_1(m4_dquote(m4_shift3($@)), $2)])]) 2798*cda5da8dSAndroid Build Coastguard Worker 2799*cda5da8dSAndroid Build Coastguard Worker# m4_max(EXPR, ...) 2800*cda5da8dSAndroid Build Coastguard Worker# m4_min(EXPR, ...) 2801*cda5da8dSAndroid Build Coastguard Worker# ----------------- 2802*cda5da8dSAndroid Build Coastguard Worker# Return the decimal value of the maximum (or minimum) in a series of 2803*cda5da8dSAndroid Build Coastguard Worker# integer expressions. 2804*cda5da8dSAndroid Build Coastguard Worker# 2805*cda5da8dSAndroid Build Coastguard Worker# M4 1.4.x doesn't provide ?:. Hence this huge m4_eval. Avoid m4_eval 2806*cda5da8dSAndroid Build Coastguard Worker# if both arguments are identical, but be aware of m4_max(0xa, 10) (hence 2807*cda5da8dSAndroid Build Coastguard Worker# the use of <=, not just <, in the second multiply). 2808*cda5da8dSAndroid Build Coastguard Worker# 2809*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 2810*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_max], 2811*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([too few arguments to $0])], 2812*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_eval([$1])], 2813*cda5da8dSAndroid Build Coastguard Worker [$#$1], [2$2], [m4_eval([$1])], 2814*cda5da8dSAndroid Build Coastguard Worker [$#], [2], [_$0($@)], 2815*cda5da8dSAndroid Build Coastguard Worker [_m4_minmax([_$0], $@)])]) 2816*cda5da8dSAndroid Build Coastguard Worker 2817*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_max], 2818*cda5da8dSAndroid Build Coastguard Worker[m4_eval((([$1]) > ([$2])) * ([$1]) + (([$1]) <= ([$2])) * ([$2]))]) 2819*cda5da8dSAndroid Build Coastguard Worker 2820*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_min], 2821*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [0], [m4_fatal([too few arguments to $0])], 2822*cda5da8dSAndroid Build Coastguard Worker [$#], [1], [m4_eval([$1])], 2823*cda5da8dSAndroid Build Coastguard Worker [$#$1], [2$2], [m4_eval([$1])], 2824*cda5da8dSAndroid Build Coastguard Worker [$#], [2], [_$0($@)], 2825*cda5da8dSAndroid Build Coastguard Worker [_m4_minmax([_$0], $@)])]) 2826*cda5da8dSAndroid Build Coastguard Worker 2827*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_min], 2828*cda5da8dSAndroid Build Coastguard Worker[m4_eval((([$1]) < ([$2])) * ([$1]) + (([$1]) >= ([$2])) * ([$2]))]) 2829*cda5da8dSAndroid Build Coastguard Worker 2830*cda5da8dSAndroid Build Coastguard Worker# _m4_minmax(METHOD, ARG1, ARG2...) 2831*cda5da8dSAndroid Build Coastguard Worker# --------------------------------- 2832*cda5da8dSAndroid Build Coastguard Worker# Common recursion code for m4_max and m4_min. METHOD must be _m4_max 2833*cda5da8dSAndroid Build Coastguard Worker# or _m4_min, and there must be at least two arguments to combine. 2834*cda5da8dSAndroid Build Coastguard Worker# 2835*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 2836*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_minmax], 2837*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [3], [$1([$2], [$3])], 2838*cda5da8dSAndroid Build Coastguard Worker [$0([$1], $1([$2], [$3]), m4_shift3($@))])]) 2839*cda5da8dSAndroid Build Coastguard Worker 2840*cda5da8dSAndroid Build Coastguard Worker 2841*cda5da8dSAndroid Build Coastguard Worker# m4_sign(A) 2842*cda5da8dSAndroid Build Coastguard Worker# ---------- 2843*cda5da8dSAndroid Build Coastguard Worker# The sign of the integer expression A. 2844*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_sign], 2845*cda5da8dSAndroid Build Coastguard Worker[m4_eval((([$1]) > 0) - (([$1]) < 0))]) 2846*cda5da8dSAndroid Build Coastguard Worker 2847*cda5da8dSAndroid Build Coastguard Worker 2848*cda5da8dSAndroid Build Coastguard Worker 2849*cda5da8dSAndroid Build Coastguard Worker## ------------------------ ## 2850*cda5da8dSAndroid Build Coastguard Worker## 14. Version processing. ## 2851*cda5da8dSAndroid Build Coastguard Worker## ------------------------ ## 2852*cda5da8dSAndroid Build Coastguard Worker 2853*cda5da8dSAndroid Build Coastguard Worker 2854*cda5da8dSAndroid Build Coastguard Worker# m4_version_unletter(VERSION) 2855*cda5da8dSAndroid Build Coastguard Worker# ---------------------------- 2856*cda5da8dSAndroid Build Coastguard Worker# Normalize beta version numbers with letters to numeric expressions, which 2857*cda5da8dSAndroid Build Coastguard Worker# can then be handed to m4_eval for the purpose of comparison. 2858*cda5da8dSAndroid Build Coastguard Worker# 2859*cda5da8dSAndroid Build Coastguard Worker# Nl -> (N+1).-1.(l#) 2860*cda5da8dSAndroid Build Coastguard Worker# 2861*cda5da8dSAndroid Build Coastguard Worker# for example: 2862*cda5da8dSAndroid Build Coastguard Worker# [2.14a] -> [0,2,14+1,-1,[0r36:a]] -> 2.15.-1.10 2863*cda5da8dSAndroid Build Coastguard Worker# [2.14b] -> [0,2,15+1,-1,[0r36:b]] -> 2.15.-1.11 2864*cda5da8dSAndroid Build Coastguard Worker# [2.61aa.b] -> [0,2.61,1,-1,[0r36:aa],+1,-1,[0r36:b]] -> 2.62.-1.370.1.-1.11 2865*cda5da8dSAndroid Build Coastguard Worker# [08] -> [0,[0r10:0]8] -> 8 2866*cda5da8dSAndroid Build Coastguard Worker# 2867*cda5da8dSAndroid Build Coastguard Worker# This macro expects reasonable version numbers, but can handle double 2868*cda5da8dSAndroid Build Coastguard Worker# letters and does not expand any macros. Original version strings can 2869*cda5da8dSAndroid Build Coastguard Worker# use both `.' and `-' separators. 2870*cda5da8dSAndroid Build Coastguard Worker# 2871*cda5da8dSAndroid Build Coastguard Worker# Inline constant expansions, to avoid m4_defn overhead. 2872*cda5da8dSAndroid Build Coastguard Worker# _m4_version_unletter is the real workhorse used by m4_version_compare, 2873*cda5da8dSAndroid Build Coastguard Worker# but since [0r36:a] and commas are less readable than 10 and dots, we 2874*cda5da8dSAndroid Build Coastguard Worker# provide a wrapper for human use. 2875*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_version_unletter], 2876*cda5da8dSAndroid Build Coastguard Worker[m4_substr(m4_map_args([.m4_eval], m4_unquote(_$0([$1]))), [3])]) 2877*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_version_unletter], 2878*cda5da8dSAndroid Build Coastguard Worker[m4_bpatsubst(m4_bpatsubst(m4_translit([[[[0,$1]]]], [.-], [,,]),]dnl 2879*cda5da8dSAndroid Build Coastguard Workerm4_dquote(m4_dquote(m4_defn([m4_cr_Letters])))[[+], 2880*cda5da8dSAndroid Build Coastguard Worker [+1,-1,[0r36:\&]]), [,0], [,[0r10:0]])]) 2881*cda5da8dSAndroid Build Coastguard Worker 2882*cda5da8dSAndroid Build Coastguard Worker 2883*cda5da8dSAndroid Build Coastguard Worker# m4_version_compare(VERSION-1, VERSION-2) 2884*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------- 2885*cda5da8dSAndroid Build Coastguard Worker# Compare the two version numbers and expand into 2886*cda5da8dSAndroid Build Coastguard Worker# -1 if VERSION-1 < VERSION-2 2887*cda5da8dSAndroid Build Coastguard Worker# 0 if = 2888*cda5da8dSAndroid Build Coastguard Worker# 1 if > 2889*cda5da8dSAndroid Build Coastguard Worker# 2890*cda5da8dSAndroid Build Coastguard Worker# Since _m4_version_unletter does not output side effects, we can 2891*cda5da8dSAndroid Build Coastguard Worker# safely bypass the overhead of m4_version_cmp. 2892*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_version_compare], 2893*cda5da8dSAndroid Build Coastguard Worker[_m4_list_cmp_raw(_m4_version_unletter([$1]), _m4_version_unletter([$2]))]) 2894*cda5da8dSAndroid Build Coastguard Worker 2895*cda5da8dSAndroid Build Coastguard Worker 2896*cda5da8dSAndroid Build Coastguard Worker# m4_PACKAGE_NAME 2897*cda5da8dSAndroid Build Coastguard Worker# m4_PACKAGE_TARNAME 2898*cda5da8dSAndroid Build Coastguard Worker# m4_PACKAGE_VERSION 2899*cda5da8dSAndroid Build Coastguard Worker# m4_PACKAGE_STRING 2900*cda5da8dSAndroid Build Coastguard Worker# m4_PACKAGE_BUGREPORT 2901*cda5da8dSAndroid Build Coastguard Worker# -------------------- 2902*cda5da8dSAndroid Build Coastguard Worker# If m4sugar/version.m4 is present, then define version strings. This 2903*cda5da8dSAndroid Build Coastguard Worker# file is optional, provided by Autoconf but absent in Bison. 2904*cda5da8dSAndroid Build Coastguard Workerm4_sinclude([m4sugar/version.m4]) 2905*cda5da8dSAndroid Build Coastguard Worker 2906*cda5da8dSAndroid Build Coastguard Worker 2907*cda5da8dSAndroid Build Coastguard Worker# m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL]) 2908*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------------- 2909*cda5da8dSAndroid Build Coastguard Worker# Check this Autoconf version against VERSION. 2910*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_version_prereq], 2911*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([m4_PACKAGE_VERSION], 2912*cda5da8dSAndroid Build Coastguard Worker[[m4_if(m4_version_compare(]m4_dquote(m4_defn([m4_PACKAGE_VERSION]))[, [$1]), 2913*cda5da8dSAndroid Build Coastguard Worker [-1], 2914*cda5da8dSAndroid Build Coastguard Worker [m4_default([$3], 2915*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([Autoconf version $1 or higher is required], 2916*cda5da8dSAndroid Build Coastguard Worker [63])])], 2917*cda5da8dSAndroid Build Coastguard Worker [$2])]], 2918*cda5da8dSAndroid Build Coastguard Worker[[m4_fatal([m4sugar/version.m4 not found])]])) 2919*cda5da8dSAndroid Build Coastguard Worker 2920*cda5da8dSAndroid Build Coastguard Worker 2921*cda5da8dSAndroid Build Coastguard Worker## ------------------ ## 2922*cda5da8dSAndroid Build Coastguard Worker## 15. Set handling. ## 2923*cda5da8dSAndroid Build Coastguard Worker## ------------------ ## 2924*cda5da8dSAndroid Build Coastguard Worker 2925*cda5da8dSAndroid Build Coastguard Worker# Autoconf likes to create arbitrarily large sets; for example, as of 2926*cda5da8dSAndroid Build Coastguard Worker# this writing, the configure.ac for coreutils tracks a set of more 2927*cda5da8dSAndroid Build Coastguard Worker# than 400 AC_SUBST. How do we track all of these set members, 2928*cda5da8dSAndroid Build Coastguard Worker# without introducing duplicates? We could use m4_append_uniq, with 2929*cda5da8dSAndroid Build Coastguard Worker# the set NAME residing in the contents of the macro NAME. 2930*cda5da8dSAndroid Build Coastguard Worker# Unfortunately, m4_append_uniq is quadratic for set creation, because 2931*cda5da8dSAndroid Build Coastguard Worker# it costs O(n) to search the string for each of O(n) insertions; not 2932*cda5da8dSAndroid Build Coastguard Worker# to mention that with m4 1.4.x, even using m4_append is slow, costing 2933*cda5da8dSAndroid Build Coastguard Worker# O(n) rather than O(1) per insertion. Other set operations, not used 2934*cda5da8dSAndroid Build Coastguard Worker# by Autoconf but still possible by manipulation of the definition 2935*cda5da8dSAndroid Build Coastguard Worker# tracked in macro NAME, include O(n) deletion of one element and O(n) 2936*cda5da8dSAndroid Build Coastguard Worker# computation of set size. Because the set is exposed to the user via 2937*cda5da8dSAndroid Build Coastguard Worker# the definition of a single macro, we cannot cache any data about the 2938*cda5da8dSAndroid Build Coastguard Worker# set without risking the cache being invalidated by the user 2939*cda5da8dSAndroid Build Coastguard Worker# redefining NAME. 2940*cda5da8dSAndroid Build Coastguard Worker# 2941*cda5da8dSAndroid Build Coastguard Worker# Can we do better? Yes, because m4 gives us an O(1) search function 2942*cda5da8dSAndroid Build Coastguard Worker# for free: ifdef. Additionally, even m4 1.4.x gives us an O(1) 2943*cda5da8dSAndroid Build Coastguard Worker# insert operation for free: pushdef. But to use these, we must 2944*cda5da8dSAndroid Build Coastguard Worker# represent the set via a group of macros; to keep the set consistent, 2945*cda5da8dSAndroid Build Coastguard Worker# we must hide the set so that the user can only manipulate it through 2946*cda5da8dSAndroid Build Coastguard Worker# accessor macros. The contents of the set are maintained through two 2947*cda5da8dSAndroid Build Coastguard Worker# access points; _m4_set([name]) is a pushdef stack of values in the 2948*cda5da8dSAndroid Build Coastguard Worker# set, useful for O(n) traversal of the set contents; while the 2949*cda5da8dSAndroid Build Coastguard Worker# existence of _m4_set([name],value) with no particular value is 2950*cda5da8dSAndroid Build Coastguard Worker# useful for O(1) querying of set membership. And since the user 2951*cda5da8dSAndroid Build Coastguard Worker# cannot externally manipulate the set, we are free to add additional 2952*cda5da8dSAndroid Build Coastguard Worker# caching macros for other performance improvements. Deletion can be 2953*cda5da8dSAndroid Build Coastguard Worker# O(1) per element rather than O(n), by reworking the definition of 2954*cda5da8dSAndroid Build Coastguard Worker# _m4_set([name],value) to be 0 or 1 based on current membership, and 2955*cda5da8dSAndroid Build Coastguard Worker# adding _m4_set_cleanup(name) to defer the O(n) cleanup of 2956*cda5da8dSAndroid Build Coastguard Worker# _m4_set([name]) until we have another reason to do an O(n) 2957*cda5da8dSAndroid Build Coastguard Worker# traversal. The existence of _m4_set_cleanup(name) can then be used 2958*cda5da8dSAndroid Build Coastguard Worker# elsewhere to determine if we must dereference _m4_set([name],value), 2959*cda5da8dSAndroid Build Coastguard Worker# or assume that definition implies set membership. Finally, size can 2960*cda5da8dSAndroid Build Coastguard Worker# be tracked in an O(1) fashion with _m4_set_size(name). 2961*cda5da8dSAndroid Build Coastguard Worker# 2962*cda5da8dSAndroid Build Coastguard Worker# The quoting in _m4_set([name],value) is chosen so that there is no 2963*cda5da8dSAndroid Build Coastguard Worker# ambiguity with a set whose name contains a comma, and so that we can 2964*cda5da8dSAndroid Build Coastguard Worker# supply the value via _m4_defn([_m4_set([name])]) without needing any 2965*cda5da8dSAndroid Build Coastguard Worker# quote manipulation. 2966*cda5da8dSAndroid Build Coastguard Worker 2967*cda5da8dSAndroid Build Coastguard Worker# m4_set_add(SET, VALUE, [IF-UNIQ], [IF-DUP]) 2968*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------- 2969*cda5da8dSAndroid Build Coastguard Worker# Add VALUE as an element of SET. Expand IF-UNIQ on the first 2970*cda5da8dSAndroid Build Coastguard Worker# addition, and IF-DUP if it is already in the set. Addition of one 2971*cda5da8dSAndroid Build Coastguard Worker# element is O(1), such that overall set creation is O(n). 2972*cda5da8dSAndroid Build Coastguard Worker# 2973*cda5da8dSAndroid Build Coastguard Worker# We do not want to add a duplicate for a previously deleted but 2974*cda5da8dSAndroid Build Coastguard Worker# unpruned element, but it is just as easy to check existence directly 2975*cda5da8dSAndroid Build Coastguard Worker# as it is to query _m4_set_cleanup($1). 2976*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_add], 2977*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set([$1],$2)], 2978*cda5da8dSAndroid Build Coastguard Worker [m4_if(m4_indir([_m4_set([$1],$2)]), [0], 2979*cda5da8dSAndroid Build Coastguard Worker [m4_define([_m4_set([$1],$2)], 2980*cda5da8dSAndroid Build Coastguard Worker [1])_m4_set_size([$1], [m4_incr])$3], [$4])], 2981*cda5da8dSAndroid Build Coastguard Worker [m4_define([_m4_set([$1],$2)], 2982*cda5da8dSAndroid Build Coastguard Worker [1])m4_pushdef([_m4_set([$1])], 2983*cda5da8dSAndroid Build Coastguard Worker [$2])_m4_set_size([$1], [m4_incr])$3])]) 2984*cda5da8dSAndroid Build Coastguard Worker 2985*cda5da8dSAndroid Build Coastguard Worker# m4_set_add_all(SET, VALUE...) 2986*cda5da8dSAndroid Build Coastguard Worker# ----------------------------- 2987*cda5da8dSAndroid Build Coastguard Worker# Add each VALUE into SET. This is O(n) in the number of VALUEs, and 2988*cda5da8dSAndroid Build Coastguard Worker# can be faster than calling m4_set_add for each VALUE. 2989*cda5da8dSAndroid Build Coastguard Worker# 2990*cda5da8dSAndroid Build Coastguard Worker# Implement two recursion helpers; the check variant is slower but 2991*cda5da8dSAndroid Build Coastguard Worker# handles the case where an element has previously been removed but 2992*cda5da8dSAndroid Build Coastguard Worker# not pruned. The recursion helpers ignore their second argument, so 2993*cda5da8dSAndroid Build Coastguard Worker# that we can use the faster m4_shift2 and 2 arguments, rather than 2994*cda5da8dSAndroid Build Coastguard Worker# _m4_shift2 and one argument, as the signal to end recursion. 2995*cda5da8dSAndroid Build Coastguard Worker# 2996*cda5da8dSAndroid Build Coastguard Worker# Please keep foreach.m4 in sync with any adjustments made here. 2997*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_add_all], 2998*cda5da8dSAndroid Build Coastguard Worker[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1]) 2999*cda5da8dSAndroid Build Coastguard Worker + m4_len(m4_ifdef([_m4_set_cleanup($1)], [_$0_check], [_$0])([$1], $@))))]) 3000*cda5da8dSAndroid Build Coastguard Worker 3001*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_add_all], 3002*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [2], [], 3003*cda5da8dSAndroid Build Coastguard Worker [m4_ifdef([_m4_set([$1],$3)], [], 3004*cda5da8dSAndroid Build Coastguard Worker [m4_define([_m4_set([$1],$3)], [1])m4_pushdef([_m4_set([$1])], 3005*cda5da8dSAndroid Build Coastguard Worker [$3])-])$0([$1], m4_shift2($@))])]) 3006*cda5da8dSAndroid Build Coastguard Worker 3007*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_add_all_check], 3008*cda5da8dSAndroid Build Coastguard Worker[m4_if([$#], [2], [], 3009*cda5da8dSAndroid Build Coastguard Worker [m4_set_add([$1], [$3])$0([$1], m4_shift2($@))])]) 3010*cda5da8dSAndroid Build Coastguard Worker 3011*cda5da8dSAndroid Build Coastguard Worker# m4_set_contains(SET, VALUE, [IF-PRESENT], [IF-ABSENT]) 3012*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------------------------ 3013*cda5da8dSAndroid Build Coastguard Worker# Expand IF-PRESENT if SET contains VALUE, otherwise expand IF-ABSENT. 3014*cda5da8dSAndroid Build Coastguard Worker# This is always O(1). 3015*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_contains], 3016*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set_cleanup($1)], 3017*cda5da8dSAndroid Build Coastguard Worker [m4_if(m4_ifdef([_m4_set([$1],$2)], 3018*cda5da8dSAndroid Build Coastguard Worker [m4_indir([_m4_set([$1],$2)])], [0]), [1], [$3], [$4])], 3019*cda5da8dSAndroid Build Coastguard Worker [m4_ifdef([_m4_set([$1],$2)], [$3], [$4])])]) 3020*cda5da8dSAndroid Build Coastguard Worker 3021*cda5da8dSAndroid Build Coastguard Worker# m4_set_contents(SET, [SEP]) 3022*cda5da8dSAndroid Build Coastguard Worker# --------------------------- 3023*cda5da8dSAndroid Build Coastguard Worker# Expand to a single string containing all the elements in SET, 3024*cda5da8dSAndroid Build Coastguard Worker# separated by SEP, without modifying SET. No provision is made for 3025*cda5da8dSAndroid Build Coastguard Worker# disambiguating set elements that contain non-empty SEP as a 3026*cda5da8dSAndroid Build Coastguard Worker# sub-string, or for recognizing a set that contains only the empty 3027*cda5da8dSAndroid Build Coastguard Worker# string. Order of the output is not guaranteed. If any elements 3028*cda5da8dSAndroid Build Coastguard Worker# have been previously removed from the set, this action will prune 3029*cda5da8dSAndroid Build Coastguard Worker# the unused memory. This is O(n) in the size of the set before 3030*cda5da8dSAndroid Build Coastguard Worker# pruning. 3031*cda5da8dSAndroid Build Coastguard Worker# 3032*cda5da8dSAndroid Build Coastguard Worker# Use _m4_popdef for speed. The existence of _m4_set_cleanup($1) 3033*cda5da8dSAndroid Build Coastguard Worker# determines which version of _1 helper we use. 3034*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_contents], 3035*cda5da8dSAndroid Build Coastguard Worker[m4_set_map_sep([$1], [], [], [[$2]])]) 3036*cda5da8dSAndroid Build Coastguard Worker 3037*cda5da8dSAndroid Build Coastguard Worker# _m4_set_contents_1(SET) 3038*cda5da8dSAndroid Build Coastguard Worker# _m4_set_contents_1c(SET) 3039*cda5da8dSAndroid Build Coastguard Worker# _m4_set_contents_2(SET, [PRE], [POST], [SEP]) 3040*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------- 3041*cda5da8dSAndroid Build Coastguard Worker# Expand to a list of quoted elements currently in the set, each 3042*cda5da8dSAndroid Build Coastguard Worker# surrounded by PRE and POST, and moving SEP in front of PRE on 3043*cda5da8dSAndroid Build Coastguard Worker# recursion. To avoid nesting limit restrictions, the algorithm must 3044*cda5da8dSAndroid Build Coastguard Worker# be broken into two parts; _1 destructively copies the stack in 3045*cda5da8dSAndroid Build Coastguard Worker# reverse into _m4_set_($1), producing no output; then _2 3046*cda5da8dSAndroid Build Coastguard Worker# destructively copies _m4_set_($1) back into the stack in reverse. 3047*cda5da8dSAndroid Build Coastguard Worker# If no elements were deleted, then this visits the set in the order 3048*cda5da8dSAndroid Build Coastguard Worker# that elements were inserted. Behavior is undefined if PRE/POST/SEP 3049*cda5da8dSAndroid Build Coastguard Worker# tries to recursively list or modify SET in any way other than 3050*cda5da8dSAndroid Build Coastguard Worker# calling m4_set_remove on the current element. Use _1 if all entries 3051*cda5da8dSAndroid Build Coastguard Worker# in the stack are guaranteed to be in the set, and _1c to prune 3052*cda5da8dSAndroid Build Coastguard Worker# removed entries. Uses _m4_defn and _m4_popdef for speed. 3053*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_contents_1], 3054*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([_m4_set([$1])], [_m4_set_($1)])]) 3055*cda5da8dSAndroid Build Coastguard Worker 3056*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_contents_1c], 3057*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set([$1])], 3058*cda5da8dSAndroid Build Coastguard Worker [m4_set_contains([$1], _m4_defn([_m4_set([$1])]), 3059*cda5da8dSAndroid Build Coastguard Worker [m4_pushdef([_m4_set_($1)], _m4_defn([_m4_set([$1])]))], 3060*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set([$1],]_m4_defn( 3061*cda5da8dSAndroid Build Coastguard Worker [_m4_set([$1])])[)])])_m4_popdef([_m4_set([$1])])$0([$1])], 3062*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set_cleanup($1)])])]) 3063*cda5da8dSAndroid Build Coastguard Worker 3064*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_contents_2], 3065*cda5da8dSAndroid Build Coastguard Worker[_m4_stack_reverse([_m4_set_($1)], [_m4_set([$1])], 3066*cda5da8dSAndroid Build Coastguard Worker [$2[]_m4_defn([_m4_set_($1)])$3], [$4[]])]) 3067*cda5da8dSAndroid Build Coastguard Worker 3068*cda5da8dSAndroid Build Coastguard Worker# m4_set_delete(SET) 3069*cda5da8dSAndroid Build Coastguard Worker# ------------------ 3070*cda5da8dSAndroid Build Coastguard Worker# Delete all elements in SET, and reclaim any memory occupied by the 3071*cda5da8dSAndroid Build Coastguard Worker# set. This is O(n) in the set size. 3072*cda5da8dSAndroid Build Coastguard Worker# 3073*cda5da8dSAndroid Build Coastguard Worker# Use _m4_defn and _m4_popdef for speed. 3074*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_delete], 3075*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set([$1])], 3076*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set([$1],]_m4_defn([_m4_set([$1])])[)], 3077*cda5da8dSAndroid Build Coastguard Worker [_m4_set([$1])])$0([$1])], 3078*cda5da8dSAndroid Build Coastguard Worker [m4_ifdef([_m4_set_cleanup($1)], 3079*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set_cleanup($1)])])m4_ifdef( 3080*cda5da8dSAndroid Build Coastguard Worker [_m4_set_size($1)], 3081*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set_size($1)])])])]) 3082*cda5da8dSAndroid Build Coastguard Worker 3083*cda5da8dSAndroid Build Coastguard Worker# m4_set_difference(SET1, SET2) 3084*cda5da8dSAndroid Build Coastguard Worker# ----------------------------- 3085*cda5da8dSAndroid Build Coastguard Worker# Produce a LIST of quoted elements that occur in SET1 but not SET2. 3086*cda5da8dSAndroid Build Coastguard Worker# Output a comma prior to any elements, to distinguish the empty 3087*cda5da8dSAndroid Build Coastguard Worker# string from no elements. This can be directly used as a series of 3088*cda5da8dSAndroid Build Coastguard Worker# arguments, such as for m4_join, or wrapped inside quotes for use in 3089*cda5da8dSAndroid Build Coastguard Worker# m4_foreach. Order of the output is not guaranteed. 3090*cda5da8dSAndroid Build Coastguard Worker# 3091*cda5da8dSAndroid Build Coastguard Worker# Short-circuit the idempotence relation. 3092*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_difference], 3093*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [$2], [], [m4_set_map_sep([$1], [_$0([$2],], [)])])]) 3094*cda5da8dSAndroid Build Coastguard Worker 3095*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_difference], 3096*cda5da8dSAndroid Build Coastguard Worker[m4_set_contains([$1], [$2], [], [,[$2]])]) 3097*cda5da8dSAndroid Build Coastguard Worker 3098*cda5da8dSAndroid Build Coastguard Worker# m4_set_dump(SET, [SEP]) 3099*cda5da8dSAndroid Build Coastguard Worker# ----------------------- 3100*cda5da8dSAndroid Build Coastguard Worker# Expand to a single string containing all the elements in SET, 3101*cda5da8dSAndroid Build Coastguard Worker# separated by SEP, then delete SET. In general, if you only need to 3102*cda5da8dSAndroid Build Coastguard Worker# list the contents once, this is faster than m4_set_contents. No 3103*cda5da8dSAndroid Build Coastguard Worker# provision is made for disambiguating set elements that contain 3104*cda5da8dSAndroid Build Coastguard Worker# non-empty SEP as a sub-string. Order of the output is not 3105*cda5da8dSAndroid Build Coastguard Worker# guaranteed. This is O(n) in the size of the set before pruning. 3106*cda5da8dSAndroid Build Coastguard Worker# 3107*cda5da8dSAndroid Build Coastguard Worker# Use _m4_popdef for speed. Use existence of _m4_set_cleanup($1) to 3108*cda5da8dSAndroid Build Coastguard Worker# decide if more expensive recursion is needed. 3109*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_dump], 3110*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set_size($1)], 3111*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set_size($1)])])m4_ifdef([_m4_set_cleanup($1)], 3112*cda5da8dSAndroid Build Coastguard Worker [_$0_check], [_$0])([$1], [], [$2])]) 3113*cda5da8dSAndroid Build Coastguard Worker 3114*cda5da8dSAndroid Build Coastguard Worker# _m4_set_dump(SET, [SEP], [PREP]) 3115*cda5da8dSAndroid Build Coastguard Worker# _m4_set_dump_check(SET, [SEP], [PREP]) 3116*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------- 3117*cda5da8dSAndroid Build Coastguard Worker# Print SEP and the current element, then delete the element and 3118*cda5da8dSAndroid Build Coastguard Worker# recurse with empty SEP changed to PREP. The check variant checks 3119*cda5da8dSAndroid Build Coastguard Worker# whether the element has been previously removed. Use _m4_defn and 3120*cda5da8dSAndroid Build Coastguard Worker# _m4_popdef for speed. 3121*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_dump], 3122*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set([$1])], 3123*cda5da8dSAndroid Build Coastguard Worker [[$2]_m4_defn([_m4_set([$1])])_m4_popdef([_m4_set([$1],]_m4_defn( 3124*cda5da8dSAndroid Build Coastguard Worker [_m4_set([$1])])[)], [_m4_set([$1])])$0([$1], [$2$3])])]) 3125*cda5da8dSAndroid Build Coastguard Worker 3126*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_dump_check], 3127*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set([$1])], 3128*cda5da8dSAndroid Build Coastguard Worker [m4_set_contains([$1], _m4_defn([_m4_set([$1])]), 3129*cda5da8dSAndroid Build Coastguard Worker [[$2]_m4_defn([_m4_set([$1])])])_m4_popdef( 3130*cda5da8dSAndroid Build Coastguard Worker [_m4_set([$1],]_m4_defn([_m4_set([$1])])[)], 3131*cda5da8dSAndroid Build Coastguard Worker [_m4_set([$1])])$0([$1], [$2$3])], 3132*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set_cleanup($1)])])]) 3133*cda5da8dSAndroid Build Coastguard Worker 3134*cda5da8dSAndroid Build Coastguard Worker# m4_set_empty(SET, [IF-EMPTY], [IF-ELEMENTS]) 3135*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------- 3136*cda5da8dSAndroid Build Coastguard Worker# Expand IF-EMPTY if SET has no elements, otherwise IF-ELEMENTS. 3137*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_empty], 3138*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set_size($1)], 3139*cda5da8dSAndroid Build Coastguard Worker [m4_if(m4_indir([_m4_set_size($1)]), [0], [$2], [$3])], [$2])]) 3140*cda5da8dSAndroid Build Coastguard Worker 3141*cda5da8dSAndroid Build Coastguard Worker# m4_set_foreach(SET, VAR, ACTION) 3142*cda5da8dSAndroid Build Coastguard Worker# -------------------------------- 3143*cda5da8dSAndroid Build Coastguard Worker# For each element of SET, define VAR to the element and expand 3144*cda5da8dSAndroid Build Coastguard Worker# ACTION. ACTION should not recursively list SET's contents, add 3145*cda5da8dSAndroid Build Coastguard Worker# elements to SET, nor delete any element from SET except the one 3146*cda5da8dSAndroid Build Coastguard Worker# currently in VAR. The order that the elements are visited in is not 3147*cda5da8dSAndroid Build Coastguard Worker# guaranteed. This is faster than the corresponding m4_foreach([VAR], 3148*cda5da8dSAndroid Build Coastguard Worker# m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION]) 3149*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_foreach], 3150*cda5da8dSAndroid Build Coastguard Worker[m4_pushdef([$2])m4_set_map_sep([$1], 3151*cda5da8dSAndroid Build Coastguard Worker[m4_define([$2],], [)$3])m4_popdef([$2])]) 3152*cda5da8dSAndroid Build Coastguard Worker 3153*cda5da8dSAndroid Build Coastguard Worker# m4_set_intersection(SET1, SET2) 3154*cda5da8dSAndroid Build Coastguard Worker# ------------------------------- 3155*cda5da8dSAndroid Build Coastguard Worker# Produce a LIST of quoted elements that occur in both SET1 or SET2. 3156*cda5da8dSAndroid Build Coastguard Worker# Output a comma prior to any elements, to distinguish the empty 3157*cda5da8dSAndroid Build Coastguard Worker# string from no elements. This can be directly used as a series of 3158*cda5da8dSAndroid Build Coastguard Worker# arguments, such as for m4_join, or wrapped inside quotes for use in 3159*cda5da8dSAndroid Build Coastguard Worker# m4_foreach. Order of the output is not guaranteed. 3160*cda5da8dSAndroid Build Coastguard Worker# 3161*cda5da8dSAndroid Build Coastguard Worker# Iterate over the smaller set, and short-circuit the idempotence 3162*cda5da8dSAndroid Build Coastguard Worker# relation. 3163*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_intersection], 3164*cda5da8dSAndroid Build Coastguard Worker[m4_if([$1], [$2], [m4_set_listc([$1])], 3165*cda5da8dSAndroid Build Coastguard Worker m4_eval(m4_set_size([$2]) < m4_set_size([$1])), [1], [$0([$2], [$1])], 3166*cda5da8dSAndroid Build Coastguard Worker [m4_set_map_sep([$1], [_$0([$2],], [)])])]) 3167*cda5da8dSAndroid Build Coastguard Worker 3168*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_intersection], 3169*cda5da8dSAndroid Build Coastguard Worker[m4_set_contains([$1], [$2], [,[$2]])]) 3170*cda5da8dSAndroid Build Coastguard Worker 3171*cda5da8dSAndroid Build Coastguard Worker# m4_set_list(SET) 3172*cda5da8dSAndroid Build Coastguard Worker# m4_set_listc(SET) 3173*cda5da8dSAndroid Build Coastguard Worker# ----------------- 3174*cda5da8dSAndroid Build Coastguard Worker# Produce a LIST of quoted elements of SET. This can be directly used 3175*cda5da8dSAndroid Build Coastguard Worker# as a series of arguments, such as for m4_join or m4_set_add_all, or 3176*cda5da8dSAndroid Build Coastguard Worker# wrapped inside quotes for use in m4_foreach or m4_map. With 3177*cda5da8dSAndroid Build Coastguard Worker# m4_set_list, there is no way to distinguish an empty set from a set 3178*cda5da8dSAndroid Build Coastguard Worker# containing only the empty string; with m4_set_listc, a leading comma 3179*cda5da8dSAndroid Build Coastguard Worker# is output if there are any elements. 3180*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_list], 3181*cda5da8dSAndroid Build Coastguard Worker[m4_set_map_sep([$1], [], [], [,])]) 3182*cda5da8dSAndroid Build Coastguard Worker 3183*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_listc], 3184*cda5da8dSAndroid Build Coastguard Worker[m4_set_map_sep([$1], [,])]) 3185*cda5da8dSAndroid Build Coastguard Worker 3186*cda5da8dSAndroid Build Coastguard Worker# m4_set_map(SET, ACTION) 3187*cda5da8dSAndroid Build Coastguard Worker# ----------------------- 3188*cda5da8dSAndroid Build Coastguard Worker# For each element of SET, expand ACTION with a single argument of the 3189*cda5da8dSAndroid Build Coastguard Worker# current element. ACTION should not recursively list SET's contents, 3190*cda5da8dSAndroid Build Coastguard Worker# add elements to SET, nor delete any element from SET except the one 3191*cda5da8dSAndroid Build Coastguard Worker# passed as an argument. The order that the elements are visited in 3192*cda5da8dSAndroid Build Coastguard Worker# is not guaranteed. This is faster than either of the corresponding 3193*cda5da8dSAndroid Build Coastguard Worker# m4_map_args([ACTION]m4_set_listc([SET])) 3194*cda5da8dSAndroid Build Coastguard Worker# m4_set_foreach([SET], [VAR], [ACTION(m4_defn([VAR]))]) 3195*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_map], 3196*cda5da8dSAndroid Build Coastguard Worker[m4_set_map_sep([$1], [$2(], [)])]) 3197*cda5da8dSAndroid Build Coastguard Worker 3198*cda5da8dSAndroid Build Coastguard Worker# m4_set_map_sep(SET, [PRE], [POST], [SEP]) 3199*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------- 3200*cda5da8dSAndroid Build Coastguard Worker# For each element of SET, expand PRE[value]POST[], and expand SEP 3201*cda5da8dSAndroid Build Coastguard Worker# between elements. 3202*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_map_sep], 3203*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set_cleanup($1)], [_m4_set_contents_1c], 3204*cda5da8dSAndroid Build Coastguard Worker [_m4_set_contents_1])([$1])_m4_set_contents_2($@)]) 3205*cda5da8dSAndroid Build Coastguard Worker 3206*cda5da8dSAndroid Build Coastguard Worker# m4_set_remove(SET, VALUE, [IF-PRESENT], [IF-ABSENT]) 3207*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------------------- 3208*cda5da8dSAndroid Build Coastguard Worker# If VALUE is an element of SET, delete it and expand IF-PRESENT. 3209*cda5da8dSAndroid Build Coastguard Worker# Otherwise expand IF-ABSENT. Deleting a single value is O(1), 3210*cda5da8dSAndroid Build Coastguard Worker# although it leaves memory occupied until the next O(n) traversal of 3211*cda5da8dSAndroid Build Coastguard Worker# the set which will compact the set. 3212*cda5da8dSAndroid Build Coastguard Worker# 3213*cda5da8dSAndroid Build Coastguard Worker# Optimize if the element being removed is the most recently added, 3214*cda5da8dSAndroid Build Coastguard Worker# since defining _m4_set_cleanup($1) slows down so many other macros. 3215*cda5da8dSAndroid Build Coastguard Worker# In particular, this plays well with m4_set_foreach and m4_set_map. 3216*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_remove], 3217*cda5da8dSAndroid Build Coastguard Worker[m4_set_contains([$1], [$2], [_m4_set_size([$1], 3218*cda5da8dSAndroid Build Coastguard Worker [m4_decr])m4_if(_m4_defn([_m4_set([$1])]), [$2], 3219*cda5da8dSAndroid Build Coastguard Worker [_m4_popdef([_m4_set([$1],$2)], [_m4_set([$1])])], 3220*cda5da8dSAndroid Build Coastguard Worker [m4_define([_m4_set_cleanup($1)])m4_define( 3221*cda5da8dSAndroid Build Coastguard Worker [_m4_set([$1],$2)], [0])])$3], [$4])]) 3222*cda5da8dSAndroid Build Coastguard Worker 3223*cda5da8dSAndroid Build Coastguard Worker# m4_set_size(SET) 3224*cda5da8dSAndroid Build Coastguard Worker# ---------------- 3225*cda5da8dSAndroid Build Coastguard Worker# Expand to the number of elements currently in SET. This operation 3226*cda5da8dSAndroid Build Coastguard Worker# is O(1), and thus more efficient than m4_count(m4_set_list([SET])). 3227*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_size], 3228*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set_size($1)], [m4_indir([_m4_set_size($1)])], [0])]) 3229*cda5da8dSAndroid Build Coastguard Worker 3230*cda5da8dSAndroid Build Coastguard Worker# _m4_set_size(SET, ACTION) 3231*cda5da8dSAndroid Build Coastguard Worker# ------------------------- 3232*cda5da8dSAndroid Build Coastguard Worker# ACTION must be either m4_incr or m4_decr, and the size of SET is 3233*cda5da8dSAndroid Build Coastguard Worker# changed accordingly. If the set is empty, ACTION must not be 3234*cda5da8dSAndroid Build Coastguard Worker# m4_decr. 3235*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_size], 3236*cda5da8dSAndroid Build Coastguard Worker[m4_define([_m4_set_size($1)], 3237*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([_m4_set_size($1)], [$2(m4_indir([_m4_set_size($1)]))], 3238*cda5da8dSAndroid Build Coastguard Worker [1]))]) 3239*cda5da8dSAndroid Build Coastguard Worker 3240*cda5da8dSAndroid Build Coastguard Worker# m4_set_union(SET1, SET2) 3241*cda5da8dSAndroid Build Coastguard Worker# ------------------------ 3242*cda5da8dSAndroid Build Coastguard Worker# Produce a LIST of double quoted elements that occur in either SET1 3243*cda5da8dSAndroid Build Coastguard Worker# or SET2, without duplicates. Output a comma prior to any elements, 3244*cda5da8dSAndroid Build Coastguard Worker# to distinguish the empty string from no elements. This can be 3245*cda5da8dSAndroid Build Coastguard Worker# directly used as a series of arguments, such as for m4_join, or 3246*cda5da8dSAndroid Build Coastguard Worker# wrapped inside quotes for use in m4_foreach. Order of the output is 3247*cda5da8dSAndroid Build Coastguard Worker# not guaranteed. 3248*cda5da8dSAndroid Build Coastguard Worker# 3249*cda5da8dSAndroid Build Coastguard Worker# We can rely on the fact that m4_set_listc prunes SET1, so we don't 3250*cda5da8dSAndroid Build Coastguard Worker# need to check _m4_set([$1],element) for 0. Short-circuit the 3251*cda5da8dSAndroid Build Coastguard Worker# idempotence relation. 3252*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_set_union], 3253*cda5da8dSAndroid Build Coastguard Worker[m4_set_listc([$1])m4_if([$1], [$2], [], 3254*cda5da8dSAndroid Build Coastguard Worker [m4_set_map_sep([$2], [_$0([$1],], [)])])]) 3255*cda5da8dSAndroid Build Coastguard Worker 3256*cda5da8dSAndroid Build Coastguard Workerm4_define([_m4_set_union], 3257*cda5da8dSAndroid Build Coastguard Worker[m4_ifdef([_m4_set([$1],$2)], [], [,[$2]])]) 3258*cda5da8dSAndroid Build Coastguard Worker 3259*cda5da8dSAndroid Build Coastguard Worker 3260*cda5da8dSAndroid Build Coastguard Worker## ------------------- ## 3261*cda5da8dSAndroid Build Coastguard Worker## 16. File handling. ## 3262*cda5da8dSAndroid Build Coastguard Worker## ------------------- ## 3263*cda5da8dSAndroid Build Coastguard Worker 3264*cda5da8dSAndroid Build Coastguard Worker 3265*cda5da8dSAndroid Build Coastguard Worker# It is a real pity that M4 comes with no macros to bind a diversion 3266*cda5da8dSAndroid Build Coastguard Worker# to a file. So we have to deal without, which makes us a lot more 3267*cda5da8dSAndroid Build Coastguard Worker# fragile than we should. 3268*cda5da8dSAndroid Build Coastguard Worker 3269*cda5da8dSAndroid Build Coastguard Worker 3270*cda5da8dSAndroid Build Coastguard Worker# m4_file_append(FILE-NAME, CONTENT) 3271*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------- 3272*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_file_append], 3273*cda5da8dSAndroid Build Coastguard Worker[m4_syscmd([cat >>$1 <<_m4eof 3274*cda5da8dSAndroid Build Coastguard Worker$2 3275*cda5da8dSAndroid Build Coastguard Worker_m4eof 3276*cda5da8dSAndroid Build Coastguard Worker]) 3277*cda5da8dSAndroid Build Coastguard Workerm4_if(m4_sysval, [0], [], 3278*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0: cannot write: $1])])]) 3279*cda5da8dSAndroid Build Coastguard Worker 3280*cda5da8dSAndroid Build Coastguard Worker 3281*cda5da8dSAndroid Build Coastguard Worker 3282*cda5da8dSAndroid Build Coastguard Worker## ------------------------ ## 3283*cda5da8dSAndroid Build Coastguard Worker## 17. Setting M4sugar up. ## 3284*cda5da8dSAndroid Build Coastguard Worker## ------------------------ ## 3285*cda5da8dSAndroid Build Coastguard Worker 3286*cda5da8dSAndroid Build Coastguard Worker# _m4_divert_diversion should be defined. 3287*cda5da8dSAndroid Build Coastguard Workerm4_divert_push([KILL]) 3288*cda5da8dSAndroid Build Coastguard Worker 3289*cda5da8dSAndroid Build Coastguard Worker# m4_init 3290*cda5da8dSAndroid Build Coastguard Worker# ------- 3291*cda5da8dSAndroid Build Coastguard Worker# Initialize the m4sugar language. 3292*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_init], 3293*cda5da8dSAndroid Build Coastguard Worker[# All the M4sugar macros start with `m4_', except `dnl' kept as is 3294*cda5da8dSAndroid Build Coastguard Worker# for sake of simplicity. 3295*cda5da8dSAndroid Build Coastguard Workerm4_pattern_forbid([^_?m4_]) 3296*cda5da8dSAndroid Build Coastguard Workerm4_pattern_forbid([^dnl$]) 3297*cda5da8dSAndroid Build Coastguard Worker 3298*cda5da8dSAndroid Build Coastguard Worker# If __m4_version__ is defined, we assume that we are being run by M4 3299*cda5da8dSAndroid Build Coastguard Worker# 1.6 or newer, thus $@ recursion is linear, and debugmode(+do) 3300*cda5da8dSAndroid Build Coastguard Worker# is available for faster checks of dereferencing undefined macros 3301*cda5da8dSAndroid Build Coastguard Worker# and forcing dumpdef to print to stderr regardless of debugfile. 3302*cda5da8dSAndroid Build Coastguard Worker# But if it is missing, we assume we are being run by M4 1.4.x, that 3303*cda5da8dSAndroid Build Coastguard Worker# $@ recursion is quadratic, and that we need foreach-based 3304*cda5da8dSAndroid Build Coastguard Worker# replacement macros. Also, m4 prior to 1.4.8 loses track of location 3305*cda5da8dSAndroid Build Coastguard Worker# during m4wrap text; __line__ should never be 0. 3306*cda5da8dSAndroid Build Coastguard Worker# 3307*cda5da8dSAndroid Build Coastguard Worker# Use the raw builtin to avoid tripping up include tracing. 3308*cda5da8dSAndroid Build Coastguard Worker# Meanwhile, avoid m4_copy, since it temporarily undefines m4_defn. 3309*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([__m4_version__], 3310*cda5da8dSAndroid Build Coastguard Worker[m4_debugmode([+do]) 3311*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_defn], _m4_defn([_m4_defn])) 3312*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_dumpdef], _m4_defn([_m4_dumpdef])) 3313*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_popdef], _m4_defn([_m4_popdef])) 3314*cda5da8dSAndroid Build Coastguard Workerm4_define([m4_undefine], _m4_defn([_m4_undefine]))], 3315*cda5da8dSAndroid Build Coastguard Worker[m4_builtin([include], [m4sugar/foreach.m4]) 3316*cda5da8dSAndroid Build Coastguard Workerm4_wrap_lifo([m4_if(__line__, [0], [m4_pushdef([m4_location], 3317*cda5da8dSAndroid Build Coastguard Worker]]m4_dquote(m4_dquote(m4_dquote(__file__:__line__)))[[)])])]) 3318*cda5da8dSAndroid Build Coastguard Worker 3319*cda5da8dSAndroid Build Coastguard Worker# Rewrite the first entry of the diversion stack. 3320*cda5da8dSAndroid Build Coastguard Workerm4_divert([KILL]) 3321*cda5da8dSAndroid Build Coastguard Worker 3322*cda5da8dSAndroid Build Coastguard Worker# Check the divert push/pop perfect balance. 3323*cda5da8dSAndroid Build Coastguard Worker# Some users are prone to also use m4_wrap to register last-minute 3324*cda5da8dSAndroid Build Coastguard Worker# m4_divert_text; so after our diversion cleanups, we restore 3325*cda5da8dSAndroid Build Coastguard Worker# KILL as the bottom of the diversion stack. 3326*cda5da8dSAndroid Build Coastguard Workerm4_wrap([m4_popdef([_m4_divert_diversion])m4_ifdef( 3327*cda5da8dSAndroid Build Coastguard Worker [_m4_divert_diversion], [m4_fatal([$0: unbalanced m4_divert_push: 3328*cda5da8dSAndroid Build Coastguard Worker]m4_divert_stack)])_m4_popdef([_m4_divert_stack])m4_divert_push([KILL])]) 3329*cda5da8dSAndroid Build Coastguard Worker]) 3330