1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdivert(-1)#                                                  -*- Autoconf -*-
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This file is part of Autoconf.
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Base M4 layer.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Requires GNU M4.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Copyright (C) 1999-2012 Free Software Foundation, Inc.
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This file is part of Autoconf.  This program is free
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# software; you can redistribute it and/or modify it under the
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# terms of the GNU General Public License as published by the
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Free Software Foundation, either version 3 of the License, or
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (at your option) any later version.
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This program is distributed in the hope that it will be useful,
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# but WITHOUT ANY WARRANTY; without even the implied warranty of
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# GNU General Public License for more details.
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Under Section 7 of GPL version 3, you are granted additional
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# permissions described in the Autoconf Configure Script Exception,
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# version 3.0, as published by the Free Software Foundation.
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# You should have received a copy of the GNU General Public License
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and a copy of the Autoconf Configure Script Exception along with
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this program; see the files COPYINGv3 and COPYING.EXCEPTION
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# respectively.  If not, see <http://www.gnu.org/licenses/>.
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Written by Akim Demaille.
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Set the quotes, whatever the current quoting system.
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchangequote()
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchangequote([, ])
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Some old m4's don't support m4exit.  But they provide
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# equivalent functionality by core dumping because of the
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# long macros we define.
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectifdef([__gnu__], ,
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[errprint(M4sugar requires GNU M4. Install it before installing M4sugar or
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset the M4 environment variable to its absolute file name.)
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4exit(2)])
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------------- ##
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## 1. Simulate --prefix-builtins.  ##
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------------- ##
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_define
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_defn
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_undefine
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefine([m4_define],   defn([define]))
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefine([m4_defn],     defn([defn]))
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefine([m4_undefine], defn([undefine]))
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_undefine([define])
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_undefine([defn])
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_undefine([undefine])
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_copy(SRC, DST)
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Define DST as the definition of SRC.
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# What's the difference between:
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# 1. m4_copy([from], [to])
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# 2. m4_define([to], [from($@)])
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Well, obviously 1 is more expensive in space.  Maybe 2 is more expensive
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# in time, but because of the space cost of 1, it's not that obvious.
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Nevertheless, one huge difference is the handling of `$0'.  If `from'
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# uses `$0', then with 1, `to''s `$0' is `to', while it is `from' in 2.
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The user would certainly prefer to see `to'.
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This definition is in effect during m4sugar initialization, when
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# there are no pushdef stacks; later on, we redefine it to something
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# more powerful for all other clients to use.
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_copy],
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_define([$2], m4_defn([$1]))])
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_rename(SRC, DST)
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rename the macro SRC to DST.
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_rename],
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_copy([$1], [$2])m4_undefine([$1])])
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_rename_m4(MACRO-NAME)
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------------------
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rename MACRO-NAME to m4_MACRO-NAME.
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_rename_m4],
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_rename([$1], [m4_$1])])
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_copy_unm4(m4_MACRO-NAME)
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------------
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Copy m4_MACRO-NAME to MACRO-NAME.
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_copy_unm4],
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_copy([$1], m4_bpatsubst([$1], [^m4_\(.*\)], [[\1]]))])
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Some m4 internals have names colliding with tokens we might use.
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rename them a` la `m4 --prefix-builtins'.  Conditionals first, since
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# some subsequent renames are conditional.
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_rename_m4([ifdef])
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_rename([ifelse], [m4_if])
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([builtin])
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([changecom])
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([changequote])
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_ifdef([changeword],dnl conditionally available in 1.4.x
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_undefine([changeword])])
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([debugfile])
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([debugmode])
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([decr])
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([divnum])
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([dumpdef])
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([errprint])
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([esyscmd])
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([eval])
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([format])
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_undefine([include])
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([incr])
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([index])
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([indir])
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([len])
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename([m4exit], [m4_exit])
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_undefine([m4wrap])
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_ifdef([mkstemp],dnl added in M4 1.4.8
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_rename_m4([mkstemp])
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_copy([m4_mkstemp], [m4_maketemp])
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_undefine([maketemp])],
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_rename_m4([maketemp])
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_copy([m4_maketemp], [m4_mkstemp])])
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename([patsubst], [m4_bpatsubst])
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_rename_m4([popdef])
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([pushdef])
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename([regexp], [m4_bregexp])
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([shift])
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_undefine([sinclude])
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([substr])
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_ifdef([symbols],dnl present only in alpha-quality 1.4o
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_rename_m4([symbols])])
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([syscmd])
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([sysval])
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([traceoff])
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([traceon])
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_rename_m4([translit])
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_defn(ARG)
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_defn is for internal use only - it bypasses the wrapper, so it
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# must only be used on one argument at a time, and only on macros
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# known to be defined.  Make sure this still works if the user renames
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_defn but not _m4_defn.
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_copy([m4_defn], [_m4_defn])
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_divert_raw(NUM)
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_divert_raw is for internal use only.  Use this instead of
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_builtin([divert], NUM), so that tracing diversion flow is easier.
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_rename([divert], [_m4_divert_raw])
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_popdef(ARG...)
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_popdef is for internal use only - it bypasses the wrapper, so it
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# must only be used on macros known to be defined.  Make sure this
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# still works if the user renames m4_popdef but not _m4_popdef.
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_copy([m4_popdef], [_m4_popdef])
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_undefine(ARG...)
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_undefine is for internal use only - it bypasses the wrapper, so
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it must only be used on macros known to be defined.  Make sure this
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# still works if the user renames m4_undefine but not _m4_undefine.
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_copy([m4_undefine], [_m4_undefine])
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_undivert(NUM...)
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_undivert is for internal use only, and should always be given
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# arguments.  Use this instead of m4_builtin([undivert], NUM...), so
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# that tracing diversion flow is easier.
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_rename([undivert], [_m4_undivert])
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------- ##
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## 2. Error messages.  ##
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------- ##
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_location
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Output the current file, colon, and the current line number.
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_location],
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[__file__:__line__])
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_errprintn(MSG)
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Same as `errprint', but with the missing end of line.
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_errprintn],
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_errprint([$1
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project])])
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_warning(MSG)
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Warn the user.
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_warning],
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_errprintn(m4_location[: warning: $1])])
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_fatal(MSG, [EXIT-STATUS])
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Fatal the user.                                                      :)
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_fatal],
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_errprintn(m4_location[: error: $1]
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_expansion_stack)m4_exit(m4_if([$2],, 1, [$2]))])
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_assert(EXPRESSION, [EXIT-STATUS = 1])
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------------------
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This macro ensures that EXPRESSION evaluates to true, and exits if
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# EXPRESSION evaluates to false.
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_assert],
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if(m4_eval([$1]), 0,
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [m4_fatal([assert failed: $1], [$2])])])
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------- ##
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## 3. Warnings.  ##
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------- ##
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_warn(CATEGORY, MESSAGE, [STACK-TRACE])
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------------------
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This is for traces only.
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If present, STACK-TRACE is a \n-separated list of "LOCATION: MESSAGE",
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# where the last line (and no other) ends with "the top level".
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Within m4, the macro is a no-op.  This macro really matters
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# when autom4te post-processes the trace output.
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_warn], [])
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_warn(CATEGORY, MESSAGE)
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------------
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_warn],
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[_m4_warn([$1], [$2],
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_ifdef([_m4_expansion_stack], [m4_expansion_stack]))])
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------- ##
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## 4. File inclusion.  ##
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------- ##
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# We also want to neutralize include (and sinclude for symmetry),
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# but we want to extend them slightly: warn when a file is included
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# several times.  This is, in general, a dangerous operation, because
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# too many people forget to quote the first argument of m4_define.
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# For instance in the following case:
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   m4_define(foo, [bar])
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# then a second reading will turn into
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   m4_define(bar, [bar])
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# which is certainly not what was meant.
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_include_unique(FILE)
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------------
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Declare that the FILE was loading; and warn if it has already
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# been included.
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_include_unique],
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifdef([m4_include($1)],
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  [m4_warn([syntax], [file `$1' included several times])])dnl
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_include($1)])])
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_include(FILE)
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like the builtin include, but warns against multiple inclusions.
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_include],
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_include_unique([$1])dnl
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_builtin([include], [$1])])
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_sinclude(FILE)
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like the builtin sinclude, but warns against multiple inclusions.
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_sinclude],
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_include_unique([$1])dnl
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_builtin([sinclude], [$1])])
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------------------ ##
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## 5. Additional branching constructs.  ##
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------------------ ##
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Both `m4_ifval' and `m4_ifset' tests against the empty string.  The
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# difference is that `m4_ifset' is specialized on macros.
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In case of arguments of macros, eg. $1, it makes little difference.
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# In the case of a macro `FOO', you don't want to check `m4_ifval(FOO,
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# TRUE)', because if `FOO' expands with commas, there is a shifting of
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# the arguments.  So you want to run `m4_ifval([FOO])', but then you just
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# compare the *string* `FOO' against `', which, of course fails.
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# So you want the variation `m4_ifset' that expects a macro name as $1.
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If this macro is both defined and defined to a non empty value, then
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it runs TRUE, etc.
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_ifblank(COND, [IF-BLANK], [IF-TEXT])
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_ifnblank(COND, [IF-TEXT], [IF-BLANK])
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------------------------
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If COND is empty, or consists only of blanks (space, tab, newline),
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# then expand IF-BLANK, otherwise expand IF-TEXT.  This differs from
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_ifval only if COND has just whitespace, but it helps optimize in
32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# spite of users who mistakenly leave trailing space after what they
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# thought was an empty argument:
32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   macro(
32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#         []
32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#        )
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Writing one macro in terms of the other causes extra overhead, so
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# we inline both definitions.
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_ifblank],
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(m4_translit([[$1]],  [ ][	][
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang]), [], [$2], [$3])])
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_ifnblank],
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(m4_translit([[$1]],  [ ][	][
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]), [], [$3], [$2])])
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_ifval(COND, [IF-TRUE], [IF-FALSE])
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------------------
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If COND is not the empty string, expand IF-TRUE, otherwise IF-FALSE.
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Comparable to m4_ifdef.
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_ifval],
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if([$1], [], [$3], [$2])])
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_n(TEXT)
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If TEXT is not empty, return TEXT and a new line, otherwise nothing.
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_n],
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if([$1],
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [], [],
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   [$1
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project])])
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_ifvaln(COND, [IF-TRUE], [IF-FALSE])
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------------------------
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Same as `m4_ifval', but add an extra newline to IF-TRUE or IF-FALSE
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# unless that argument is empty.
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_ifvaln],
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if([$1],
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [],   [m4_n([$3])],
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     [m4_n([$2])])])
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_ifset(MACRO, [IF-TRUE], [IF-FALSE])
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------------------------
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If MACRO has no definition, or of its definition is the empty string,
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# expand IF-FALSE, otherwise IF-TRUE.
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_ifset],
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifdef([$1],
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_ifval(_m4_defn([$1]), [$2], [$3])],
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  [$3])])
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_ifndef(NAME, [IF-NOT-DEFINED], [IF-DEFINED])
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------------------------------------
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_ifndef],
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifdef([$1], [$3], [$2])])
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT)
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------------------------------------------------
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4 equivalent of
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# switch (SWITCH)
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# {
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   case VAL1:
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     IF-VAL1;
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     break;
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   case VAL2:
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     IF-VAL2;
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     break;
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ...
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   default:
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     DEFAULT;
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     break;
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# }.
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# All the values are optional, and the macro is robust to active
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# symbols properly quoted.
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_case],
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if([$#], 0, [],
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$#], 1, [],
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$#], 2, [$2],
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$1], [$2], [$3],
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$0([$1], m4_shift3($@))])])
408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT)
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------------------------------------------
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4 equivalent of
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if (SWITCH =~ RE1)
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   VAL1;
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# elif (SWITCH =~ RE2)
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   VAL2;
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# elif ...
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ...
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DEFAULT
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# All the values are optional, and the macro is robust to active symbols
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# properly quoted.
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_bmatch],
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$#], 2, [$2],
43105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shift3($@))],
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      [$3])])])
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_argn(N, ARGS...)
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Extract argument N (greater than 0) from ARGS.  Example:
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([b], [B])
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_argn([2], [a], [b], [c]) => b
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rather than using m4_car(m4_shiftn([$1], $@)), we exploit the fact that
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# GNU m4 can directly reference any argument, through an indirect macro.
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_argn],
44305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_assert([0 < $1])]dnl
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_$0], [_m4_popdef([_$0])]m4_dquote([$]m4_incr([$1])))_$0($@)])
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_car(ARGS...)
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cdr(ARGS...)
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Manipulate m4 lists.  m4_car returns the first argument.  m4_cdr
45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# bundles all but the first argument into a quoted list.  These two
45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macros are generally used with list arguments, with quoting removed
45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to break the list into multiple m4 ARGS.
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_car], [[$1]])
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cdr],
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$#], 1, [],
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [m4_dquote(m4_shift($@))])])
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_cdr(ARGS...)
46105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------
46205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_cdr, except include a leading comma unless only one argument
46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# remains.  Why?  Because comparing a large list against [] is more
46405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expensive in expansion time than comparing the number of arguments; so
46505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_cdr can be used to reduce the number of arguments when it is time
46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to end recursion.
46705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_cdr],
46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], 1, [],
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [, m4_dquote(m4_shift($@))])])
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT])
47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------------------------------------------
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Similar to m4_if, except that each TEST is expanded when encountered.
47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If the expansion of TESTn matches the string VALn, the result is IF-VALn.
47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The result is DEFAULT if no tests passed.  This macro allows
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# short-circuiting of expensive tests, where it pays to arrange quick
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# filter tests to run first.
48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For an example, consider a previous implementation of _AS_QUOTE_IFELSE:
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    m4_if(m4_index([$1], [\]), [-1], [$2],
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#          m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#          m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#          m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#          m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#          [$2])
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Here, m4_index is computed 5 times, and m4_eval 4, even if $1 contains
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# no backslash.  It is more efficient to do:
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    m4_cond([m4_index([$1], [\])], [-1], [$2],
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#            [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#            [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#            [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
49705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#            [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#            [$2])
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In the common case of $1 with no backslash, only one m4_index expansion
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# occurs, and m4_eval is avoided altogether.
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_cond],
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: cannot be called without arguments])],
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [$1],
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       m4_eval([$# % 3]), [2], [m4_fatal([$0: missing an argument])],
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_$0($@)])])
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_cond],
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(($1), [($2)], [$3],
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [3], [],
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [4], [$4],
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$0(m4_shift3($@))])])
515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ---------------------------------------- ##
518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## 6. Enhanced version of some primitives.  ##
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ---------------------------------------- ##
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...)
522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------------------------------
523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4 equivalent of
524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   $_ = STRING;
526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   s/RE1/SUBST1/g;
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   s/RE2/SUBST2/g;
528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ...
529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# All the values are optional, and the macro is robust to active symbols
531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# properly quoted.
532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# I would have liked to name this macro `m4_bpatsubst', unfortunately,
534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# due to quotation problems, I need to double quote $1 below, therefore
535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# the anchors are broken :(  I can't let users be trapped by that.
53605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Recall that m4_shift3 always results in an argument.  Hence, we need
53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to distinguish between a final deletion vs. ending recursion.
53905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
54005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_bpatsubsts],
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
54405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], 2, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2]))],
54505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], 3, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2], [$3]))],
54605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_$0($@m4_if(m4_eval($# & 1), 0, [,]))])])
54705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_bpatsubsts],
54805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], 2, [$1],
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       [$0(m4_builtin([patsubst], [[$1]], [$2], [$3]),
55005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   m4_shift3($@))])])
551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_copy(SRC, DST)
55405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------
55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Define the pushdef stack DST as a copy of the pushdef stack SRC;
55605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# give an error if DST is already defined.  This is particularly nice
55705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# for copying self-modifying pushdef stacks, where the top definition
55805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# includes one-shot initialization that is later popped to the normal
55905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# definition.  This version intentionally does nothing if SRC is
56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undefined.
56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
56205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Some macros simply can't be renamed with this method: namely, anything
56305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# involved in the implementation of m4_stack_foreach_sep.
56405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_copy],
56505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([$2], [m4_fatal([$0: won't overwrite defined macro: $2])],
56605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_stack_foreach_sep([$1], [m4_pushdef([$2],], [)])])]dnl
56705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([m4_location($1)], [m4_define([m4_location($2)], m4_location)])])
568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
57005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_copy_force(SRC, DST)
57105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_rename_force(SRC, DST)
57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------
57305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_copy/m4_rename, except blindly overwrite any existing DST.
57405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Note that m4_copy_force tolerates undefined SRC, while m4_rename_force
57505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# does not.
57605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_copy_force],
57705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([$2], [_m4_undefine([$2])])m4_copy($@)])
57805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
57905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_rename_force],
58005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([$2], [_m4_undefine([$2])])m4_rename($@)])
581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_define_default(MACRO, VALUE)
584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------------
585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If MACRO is undefined, set it to VALUE.
586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_define_default],
587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifndef([$1], [m4_define($@)])])
588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_default(EXP1, EXP2)
59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_default_nblank(EXP1, EXP2)
59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------------
59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Returns EXP1 if not empty/blank, otherwise EXP2.  Expand the result.
59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
59505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_default is called on hot paths, so inline the contents of m4_ifval,
59605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# for one less round of expansion.
597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_default],
59805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [], [$2], [$1])])
59905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_default_nblank],
60105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifblank([$1], [$2], [$1])])
60205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_default_quoted(EXP1, EXP2)
60505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_default_nblank_quoted(EXP1, EXP2)
60605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------------
60705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Returns EXP1 if non empty/blank, otherwise EXP2.  Leave the result quoted.
60805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
60905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For comparison:
61005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([active], [ACTIVE])
61105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_default([active], [default]) => ACTIVE
61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_default([], [active]) => ACTIVE
61305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   -m4_default([ ], [active])- => - -
61405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   -m4_default_nblank([ ], [active])- => -ACTIVE-
61505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_default_quoted([active], [default]) => active
61605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_default_quoted([], [active]) => active
61705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   -m4_default_quoted([ ], [active])- => - -
61805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   -m4_default_nblank_quoted([ ], [active])- => -active-
61905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
62005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_default macro is called on hot paths, so inline the contents of m4_ifval,
62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# for one less round of expansion.
62205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_default_quoted],
62305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [], [[$2]], [[$1]])])
62405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
62505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_default_nblank_quoted],
62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifblank([$1], [[$2]], [[$1]])])
627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_defn(NAME)
630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------
63105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like the original, except guarantee a warning when using something which is
63205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undefined (unlike M4 1.4.x).  This replacement is not a full-featured
63305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# replacement: if any of the defined macros contain unbalanced quoting, but
63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# when pasted together result in a well-quoted string, then only native m4
63505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# support is able to get it correct.  But that's where quadrigraphs come in
63605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# handy, if you really need unbalanced quotes inside your macros.
63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
63805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro is called frequently, so minimize the amount of additional
63905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansions by skipping m4_ifndef.  Better yet, if __m4_version__ exists,
64005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (added in M4 1.6), then let m4 do the job for us (see m4_init).
641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_defn],
64205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [[$0]],
64305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_ifdef([$1], [_m4_defn([$1])],
64405436638acc7c010349a69c3395f1a57c642dc62Ying Wang			    [m4_fatal([$0: undefined macro: $1])])],
64505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_map_args([$0], $@)])])
646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
64805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_dumpdef(NAME...)
64905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------
65005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In m4 1.4.x, dumpdef writes to the current debugfile, rather than
65105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# stderr.  This in turn royally confuses autom4te; so we follow the
65205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# lead of newer m4 and always dump to stderr.  Unlike the original,
65305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this version requires an argument, since there is no convenient way
65405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# in m4 1.4.x to grab the names of all defined macros.  Newer m4
65505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# always dumps to stderr, regardless of the current debugfile; it also
65605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# provides m4symbols as a way to grab all current macro names.  But
65705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# dumpdefs is not frequently called, so we don't need to worry about
65805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# conditionally using these newer features.  Also, this version
65905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# doesn't sort multiple arguments.
66005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
66105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If we detect m4 1.6 or newer, then provide an alternate definition,
66205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# installed during m4_init, that allows builtins through.
66305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Unfortunately, there is no nice way in m4 1.4.x to dump builtins.
66405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_dumpdef],
66505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: missing argument])],
66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_ifdef([$1], [m4_errprintn(
66705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [$1:	]m4_dquote(_m4_defn([$1])))], [m4_fatal([$0: undefined macro: $1])])],
66805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_map_args([$0], $@)])])
66905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
67005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_dumpdef],
67105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: missing argument])],
67205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_builtin([dumpdef], [$1])],
67305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_map_args_sep([m4_builtin([dumpdef],], [)], [], $@)])])
67405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
67505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
67605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_dumpdefs(NAME...)
67705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------
67805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Similar to `m4_dumpdef(NAME)', but if NAME was m4_pushdef'ed, display its
67905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# value stack (most recent displayed first).  Also, this version silently
68005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ignores undefined macros, rather than erroring out.
68105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
68205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro cheats, because it relies on the current definition of NAME
68305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# while the second argument of m4_stack_foreach_lifo is evaluated (which
68405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# would be undefined according to the API).
68505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_dumpdefs],
68605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: missing argument])],
68705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_stack_foreach_lifo([$1], [m4_dumpdef([$1])m4_ignore])],
68805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_map_args([$0], $@)])])
68905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
69005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_esyscmd_s(COMMAND)
691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------
69205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_esyscmd, except strip any trailing newlines, thus behaving
69305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# more like shell command substitution.
69405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_esyscmd_s],
69505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_chomp_all(m4_esyscmd([$1]))])
696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_popdef(NAME)
69905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
70005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like the original, except guarantee a warning when using something which is
70105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undefined (unlike M4 1.4.x).
70205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
70305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro is called frequently, so minimize the amount of additional
70405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansions by skipping m4_ifndef.  Better yet, if __m4_version__ exists,
70505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (added in M4 1.6), then let m4 do the job for us (see m4_init).
70605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_popdef],
70705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [[$0]],
70805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_ifdef([$1], [_m4_popdef([$1])],
70905436638acc7c010349a69c3395f1a57c642dc62Ying Wang			    [m4_fatal([$0: undefined macro: $1])])],
71005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_map_args([$0], $@)])])
711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_shiftn(N, ...)
714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------
71505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Returns ... shifted N times.  Useful for recursive "varargs" constructs.
71605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
71705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Autoconf does not use this macro, because it is inherently slower than
71805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# calling the common cases of m4_shift2 or m4_shift3 directly.  But it
71905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# might as well be fast for other clients, such as Libtool.  One way to
72005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# do this is to expand $@ only once in _m4_shiftn (otherwise, for long
72105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# lists, the expansion of m4_if takes twice as much memory as what the
72205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# list itself occupies, only to throw away the unused branch).  The end
72305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# result is strictly equivalent to
72405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_if([$1], 1, [m4_shift(,m4_shift(m4_shift($@)))],
72505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#         [_m4_shiftn(m4_decr([$1]), m4_shift(m4_shift($@)))])
72605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# but with the final `m4_shift(m4_shift($@)))' shared between the two
72705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# paths.  The first leg uses a no-op m4_shift(,$@) to balance out the ().
72805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
72905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
73005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_shiftn],
73105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_assert(0 < $1 && $1 < $#)_$0($@)])
732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_shiftn],
73405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], 1, [m4_shift(],
73505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$0(m4_decr([$1])]), m4_shift(m4_shift($@)))])
736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_shift2(...)
73805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_shift3(...)
73905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------
74005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Returns ... shifted twice, and three times.  Faster than m4_shiftn.
74105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_shift2], [m4_shift(m4_shift($@))])
74205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_shift3], [m4_shift(m4_shift(m4_shift($@)))])
74305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
74405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_shift2(...)
74505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_shift3(...)
746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------
74705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_shift2 or m4_shift3, except include a leading comma unless shifting
74805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# consumes all arguments.  Why?  Because in recursion, it is nice to
74905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# distinguish between 1 element left and 0 elements left, based on how many
75005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# arguments this shift expands to.
75105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_shift2],
75205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [2], [],
75305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [, m4_shift(m4_shift($@))])])
75405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_shift3],
75505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [3], [],
75605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [, m4_shift(m4_shift(m4_shift($@)))])])
757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
75905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_undefine(NAME)
76005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------
76105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like the original, except guarantee a warning when using something which is
76205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undefined (unlike M4 1.4.x).
76305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
76405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro is called frequently, so minimize the amount of additional
76505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansions by skipping m4_ifndef.  Better yet, if __m4_version__ exists,
76605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (added in M4 1.6), then let m4 do the job for us (see m4_init).
76705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_undefine],
76805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [[$0]],
76905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_ifdef([$1], [_m4_undefine([$1])],
77005436638acc7c010349a69c3395f1a57c642dc62Ying Wang			    [m4_fatal([$0: undefined macro: $1])])],
77105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_map_args([$0], $@)])])
77205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
77305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_wrap(PRE, POST)
77405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------
77505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Helper macro for m4_wrap and m4_wrap_lifo.  Allows nested calls to
77605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_wrap within wrapped text.  Use _m4_defn and _m4_popdef for speed.
77705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_wrap],
77805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([$0_text],
77905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_define([$0_text], [$1]_m4_defn([$0_text])[$2])],
78005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_builtin([m4wrap], [m4_unquote(
78105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _m4_defn([$0_text])_m4_popdef([$0_text]))])m4_define([$0_text], [$1$2])])])
78205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
78305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_wrap(TEXT)
78405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------
78505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Append TEXT to the list of hooks to be executed at the end of input.
78605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Whereas the order of the original may be LIFO in the underlying m4,
78705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this version is always FIFO.
78805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_wrap],
78905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_wrap([], [$1[]])])
79005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
79105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_wrap_lifo(TEXT)
79205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------
79305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Prepend TEXT to the list of hooks to be executed at the end of input.
79405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Whereas the order of m4_wrap may be FIFO in the underlying m4, this
79505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# version is always LIFO.
79605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_wrap_lifo],
79705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_wrap([$1[]])])
79805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
79905436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ------------------------- ##
80005436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 7. Quoting manipulation.  ##
80105436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ------------------------- ##
80205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
80305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
80405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_apply(MACRO, LIST)
80505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------
80605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Invoke MACRO, with arguments provided from the quoted list of
80705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# comma-separated quoted arguments.  If LIST is empty, invoke MACRO
80805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# without arguments.  The expansion will not be concatenated with
80905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# subsequent text.
81005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_apply],
81105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$2], [], [$1], [$1($2)])[]])
81205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
81305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_apply(MACRO, LIST)
81405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------
81505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_apply, except do nothing if LIST is empty.
81605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_apply],
81705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$2], [], [], [$1($2)[]])])
81805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
81905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
82005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_count(ARGS)
821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------
82205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return a count of how many ARGS are present.
82305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_count], [$#])
82405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
82505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
82605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_curry(MACRO, ARG...)
82705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------
82805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Perform argument currying.  The expansion of this macro is another
82905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro that takes exactly one argument, appends it to the end of the
83005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# original ARG list, then invokes MACRO.  For example:
83105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_curry([m4_curry], [m4_reverse], [1])([2])([3]) => 3, 2, 1
83205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Not quite as practical as m4_incr, but you could also do:
83305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([add], [m4_eval(([$1]) + ([$2]))])
83405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([add_one], [m4_curry([add], [1])])
83505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   add_one()([2]) => 3
83605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_curry], [$1(m4_shift($@,)_$0])
83705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_curry],               [[$1])])
83805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
83905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
84005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_do(STRING, ...)
84105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------
84205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro invokes all its arguments (in sequence, of course).  It is
84305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# useful for making your macros more structured and readable by dropping
84405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# unnecessary dnl's and have the macros indented properly.  No concatenation
84505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# occurs after a STRING; use m4_unquote(m4_join(,STRING)) for that.
846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
84705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
84805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_do],
84905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], 0, [],
85005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], 1, [$1[]],
85105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$1[]$0(m4_shift($@))])])
85205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
85305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
85405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_dquote(ARGS)
85505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
85605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return ARGS as a quoted list of quoted arguments.
857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_dquote],  [[$@]])
858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
86005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_dquote_elt(ARGS)
86105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------
86205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return ARGS as an unquoted list of double-quoted arguments.
86305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
86405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
86505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_dquote_elt],
86605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [],
86705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [[[$1]]],
86805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [[[$1]],$0(m4_shift($@))])])
86905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
87005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
87105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_echo(ARGS)
87205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------
87305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return the ARGS, with the same level of quoting.  Whitespace after
87405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# unquoted commas are consumed.
87505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_echo], [$@])
87605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
87705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
87805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_expand(ARG)
87905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_expand(ARG)
88005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
88105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return the expansion of ARG as a single string.  Unlike
88205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_quote($1), this preserves whitespace following single-quoted
88305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# commas that appear within ARG.  It also deals with shell case
88405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# statements.
88505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
88605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([active], [ACT, IVE])
88705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([active2], [[ACT, IVE]])
88805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_quote(active, active2)
88905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   => ACT,IVE,ACT, IVE
89005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_expand([active, active2])
89105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   => ACT, IVE, ACT, IVE
89205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
89305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Unfortunately, due to limitations in m4, ARG must expand to
89405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# something with balanced quotes (use quadrigraphs to get around
89505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this), and should not contain the unlikely delimiters -=<{( or
89605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# )}>=-.  It is possible to have unbalanced quoted `(' or `)', as well
89705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# as unbalanced unquoted `)'.  m4_expand can handle unterminated
89805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# comments or dnl on the final line, at the expense of speed; it also
89905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# aids in detecting attempts to incorrectly change the current
90005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# diversion inside ARG.  Meanwhile, _m4_expand is faster but must be
90105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# given a terminated expansion, and has no safety checks for
90205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# mis-diverted text.
90305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
90405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Exploit that extra unquoted () will group unquoted commas and the
90505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# following whitespace.  m4_bpatsubst can't handle newlines inside $1,
90605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and m4_substr strips quoting.  So we (ab)use m4_changequote, using
90705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# temporary quotes to remove the delimiters that conveniently included
90805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the unquoted () that were added prior to the changequote.
90905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
91005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Thanks to shell case statements, too many people are prone to pass
91105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# underquoted `)', so we try to detect that by passing a marker as a
91205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# fourth argument; if the marker is not present, then we assume that
91305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# we encountered an early `)', and re-expand the first argument, but
91405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this time with one more `(' in the second argument and in the
91505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# open-quote delimiter.  We must also ignore the slop from the
91605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# previous try.  The final macro is thus half line-noise, half art.
91705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_expand],
91805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([m4_divert], _m4_defn([_m4_divert_unsafe]))]dnl
91905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([m4_divert_push], _m4_defn([_m4_divert_unsafe]))]dnl
92005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_chomp(_$0([$1
92105436638acc7c010349a69c3395f1a57c642dc62Ying Wang]))_m4_popdef([m4_divert], [m4_divert_push])])
92205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
92305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_expand], [$0_([$1], [(], -=<{($1)}>=-, [}>=-])])
92405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
92505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_expand_],
92605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$4], [}>=-],
92705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_changequote([-=<{$2], [)}>=-])$3m4_changequote([, ])],
92805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$0([$1], [($2], -=<{($2$1)}>=-, [}>=-])m4_ignore$2])])
92905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
93005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
93105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_ignore(ARGS)
93205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
93305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expands to nothing.  Useful for conditionally ignoring an arbitrary
93405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# number of arguments (see _m4_list_cmp for an example).
93505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_ignore])
93605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
93705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
93805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_make_list(ARGS)
93905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------
94005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Similar to m4_dquote, this creates a quoted list of quoted ARGS.  This
94105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# version is less efficient than m4_dquote, but separates each argument
94205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# with a comma and newline, rather than just comma, for readability.
94305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# When developing an m4sugar algorithm, you could temporarily use
94405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_pushdef([m4_dquote],m4_defn([m4_make_list]))
94505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# around your code to make debugging easier.
94605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_make_list], [m4_join([,
94705436638acc7c010349a69c3395f1a57c642dc62Ying Wang], m4_dquote_elt($@))])
94805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
94905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_noquote(STRING)
951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------------
952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Return the result of ignoring all quotes in STRING and invoking the
95305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macros it contains.  Among other things, this is useful for enabling
95405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro invocations inside strings with [] blocks (for instance regexps
95505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and help-strings).  On the other hand, since all quotes are disabled,
95605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# any macro expanded during this time that relies on nested [] quoting
95705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# will likely crash and burn.  This macro is seldom useful; consider
95805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_unquote or m4_expand instead.
959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_noquote],
96005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_changequote([-=<{(],[)}>=-])$1-=<{()}>=-m4_changequote([,])])
961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
96305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_quote(ARGS)
96405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------
96505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return ARGS as a single argument.  Any whitespace after unquoted commas
96605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is stripped.  There is always output, even when there were no arguments.
96705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
96805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# It is important to realize the difference between `m4_quote(exp)' and
96905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# `[exp]': in the first case you obtain the quoted *result* of the
97005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansion of EXP, while in the latter you just obtain the string
97105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# `exp'.
97205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_quote],  [[$*]])
973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
97505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_quote(ARGS)
97605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
97705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_quote, except that when there are no arguments, there is no
97805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# output.  For conditional scenarios (such as passing _m4_quote as the
97905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro name in m4_mapall), this feature can be used to distinguish between
98005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# one argument of the empty string vs. no arguments.  However, in the
98105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# normal case with arguments present, this is less efficient than m4_quote.
98205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_quote],
98305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [], [[$*]])])
984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
98605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_reverse(ARGS)
98705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------
98805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Output ARGS in reverse order.
98905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
99005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
99105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_reverse],
99205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [], [$#], [1], [[$1]],
99305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$0(m4_shift($@)), [$1]])])
99405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
99505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
99605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_unquote(ARGS)
99705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------
99805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Remove one layer of quotes from each ARG, performing one level of
99905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansion.  For one argument, m4_unquote([arg]) is more efficient than
100005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_do([arg]), but for multiple arguments, the difference is that
100105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_unquote separates arguments with commas while m4_do concatenates.
100205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Follow this macro with [] if concatenation with subsequent text is
100305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undesired.
100405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_unquote], [$*])
1005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## -------------------------- ##
100805436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 8. Implementing m4 loops.  ##
1009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## -------------------------- ##
1010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION)
1013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------------------------------------------
101405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO with
101505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# increments of STEP.  Both limits are included, and bounds are
101605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# checked for consistency.  The algorithm is robust to indirect
101705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# VARIABLE names.  Changing VARIABLE inside EXPRESSION will not impact
101805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the number of iterations.
101905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
102005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Uses _m4_defn for speed, and avoid dnl in the macro body.  Factor
102105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the _m4_for call so that EXPRESSION is only parsed once.
1022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_for],
102305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([$1], m4_eval([$2]))]dnl
102405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_cond([m4_eval(([$3]) > ([$2]))], 1,
102505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   [m4_pushdef([_m4_step], m4_eval(m4_default_quoted([$4],
102605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      1)))m4_assert(_m4_step > 0)_$0(_m4_defn([$1]),
102705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  m4_eval((([$3]) - ([$2])) / _m4_step * _m4_step + ([$2])), _m4_step,],
102805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	 [m4_eval(([$3]) < ([$2]))], 1,
102905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   [m4_pushdef([_m4_step], m4_eval(m4_default_quoted([$4],
103005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      -1)))m4_assert(_m4_step < 0)_$0(_m4_defn([$1]),
103105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  m4_eval((([$2]) - ([$3])) / -(_m4_step) * _m4_step + ([$2])), _m4_step,],
103205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	 [m4_pushdef([_m4_step])_$0(_m4_defn([$1]), _m4_defn([$1]), 0,])]dnl
103305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_define([$1],], [)$5])m4_popdef([_m4_step], [$1])])
103405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
103505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_for(COUNT, LAST, STEP, PRE, POST)
103605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------------
103705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Core of the loop, no consistency checks, all arguments are plain
103805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# numbers.  Expand PRE[COUNT]POST, then alter COUNT by STEP and
103905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# iterate if COUNT is not LAST.
1040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_for],
104105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[$4[$1]$5[]m4_if([$1], [$2], [],
104205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 [$0(m4_eval([$1 + $3]), [$2], [$3], [$4], [$5])])])
1043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Implementing `foreach' loops in m4 is much more tricky than it may
104605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# seem.  For example, the old M4 1.4.4 manual had an incorrect example,
104705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# which looked like this (when translated to m4sugar):
1048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | # foreach(VAR, (LIST), STMT)
1050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([foreach],
105105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# |   [m4_pushdef([$1])_foreach([$1], [$2], [$3])m4_popdef([$1])])
1052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([_arg1], [$1])
1053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([_foreach],
105405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# |   [m4_if([$2], [()], ,
105505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# |     [m4_define([$1], _arg1$2)$3[]_foreach([$1], (m4_shift$2), [$3])])])
1056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# But then if you run
1058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define(a, 1)
1060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define(b, 2)
1061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define(c, 3)
1062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | foreach([f], [([a], [(b], [c)])], [echo f
1063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | ])
1064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# it gives
1066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  => echo 1
1068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  => echo (2,3)
1069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# which is not what is expected.
1071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Of course the problem is that many quotes are missing.  So you add
1073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# plenty of quotes at random places, until you reach the expected
1074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# result.  Alternatively, if you are a quoting wizard, you directly
1075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# reach the following implementation (but if you really did, then
1076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# apply to the maintenance of m4sugar!).
1077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | # foreach(VAR, (LIST), STMT)
1079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
1080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([_arg1], [[$1]])
1081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([_foreach],
1082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# |  [m4_if($2, [()], ,
108305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# |    [m4_define([$1], [_arg1$2])$3[]_foreach([$1], [(m4_shift$2)], [$3])])])
1084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# which this time answers
1086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  => echo a
1088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  => echo (b
1089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  => echo c)
1090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Bingo!
1092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Well, not quite.
1094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# With a better look, you realize that the parens are more a pain than
1096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# a help: since anyway you need to quote properly the list, you end up
1097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# with always using an outermost pair of parens and an outermost pair
1098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# of quotes.  Rejecting the parens both eases the implementation, and
1099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# simplifies the use:
1100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | # foreach(VAR, (LIST), STMT)
1102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
1103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([_arg1], [$1])
1104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_define([_foreach],
1105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# |  [m4_if($2, [], ,
110605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# |    [m4_define([$1], [_arg1($2)])$3[]_foreach([$1], [m4_shift($2)], [$3])])])
1107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Now, just replace the `$2' with `m4_quote($2)' in the outer `m4_if'
111005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to improve robustness, and you come up with a nice implementation
111105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# that doesn't require extra parentheses in the user's LIST.
111205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
111305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# But wait -  now the algorithm is quadratic, because every recursion of
111405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the algorithm keeps the entire LIST and merely adds another m4_shift to
111505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the quoted text.  If the user has a lot of elements in LIST, you can
111605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# bring the system to its knees with the memory m4 then requires, or trip
111705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the m4 --nesting-limit recursion factor.  The only way to avoid
111805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# quadratic growth is ensure m4_shift is expanded prior to the recursion.
111905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Hence the design below.
112005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
112105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The M4 manual now includes a chapter devoted to this issue, with
112205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the lessons learned from m4sugar.  And still, this design is only
112305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# optimal for M4 1.6; see foreach.m4 for yet more comments on why
112405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# M4 1.4.x uses yet another implementation.
1125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_foreach(VARIABLE, LIST, EXPRESSION)
1128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------------------------
1129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Expand EXPRESSION assigning each value of the LIST to VARIABLE.
1131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# LIST should have the form `item_1, item_2, ..., item_n', i.e. the
1132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# whole list must *quoted*.  Quote members too if you don't want them
1133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# to be expanded.
1134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This macro is robust to active symbols:
1136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#      | m4_define(active, [ACT, IVE])
1137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#      | m4_foreach(Var, [active, active], [-Var-])
1138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     => -ACT--IVE--ACT--IVE-
1139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#      | m4_foreach(Var, [[active], [active]], [-Var-])
1141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     => -ACT, IVE--ACT, IVE-
1142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#      | m4_foreach(Var, [[[active]], [[active]]], [-Var-])
1144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     => -active--active-
114505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
114605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro is called frequently, so avoid extra expansions such as
114705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_ifval and dnl.  Also, since $2 might be quite large, try to use it
114805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# as little as possible in _m4_foreach; each extra use requires that much
114905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# more memory for expansion.  So, rather than directly compare $2 against
115005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# [] and use m4_car/m4_cdr for recursion, we instead unbox the list (which
115105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# requires swapping the argument order in the helper), insert an ignored
115205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# third argument, and use m4_shift3 to detect when recursion is complete,
115305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# at which point this looks very much like m4_map_args.
1154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_foreach],
115505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$2], [], [],
115605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_pushdef([$1])_$0([m4_define([$1],], [)$3], [],
115705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  $2)m4_popdef([$1])])])
1158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
115905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_foreach(PRE, POST, IGNORED, ARG...)
116005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------------
116105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Form the common basis of the m4_foreach and m4_map macros.  For each
116205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ARG, expand PRE[ARG]POST[].  The IGNORED argument makes recursion
116305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# easier, and must be supplied rather than implicit.
116405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
116505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
1166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_foreach],
116705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [3], [],
116805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$1[$4]$2[]$0([$1], [$2], m4_shift3($@))])])
1169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_foreach_w(VARIABLE, LIST, EXPRESSION)
1172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------------------
117305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_foreach, but the list is whitespace separated.  Depending on
117405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# EXPRESSION, it may be more efficient to use m4_map_args_w.
1175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This macro is robust to active symbols:
1177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    m4_foreach_w([Var], [ active
1178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    b	act\
1179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    ive  ], [-Var-])end
1180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => -active--b--active-end
1181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
118205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This used to use a slower implementation based on m4_foreach:
118305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])
1184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_foreach_w],
118505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([$1])m4_map_args_w([$2],
118605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [m4_define([$1],], [)$3])m4_popdef([$1])])
118705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
118805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
118905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_map(MACRO, LIST)
119005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_mapall(MACRO, LIST)
119105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------
119205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements of
119305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# LIST.  $1, $2... must in turn be lists, appropriate for m4_apply.
119405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If LIST contains an empty sublist, m4_map skips the expansion of
119505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# MACRO, while m4_mapall expands MACRO with no arguments.
119605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
119705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Since LIST may be quite large, we want to minimize how often it
119805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# appears in the expansion.  Rather than use m4_car/m4_cdr iteration,
119905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# we unbox the list, and use _m4_foreach for iteration.  For m4_map,
120005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# an empty list behaves like an empty sublist and gets ignored; for
120105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_mapall, we must special-case the empty list.
120205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_map],
120305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_foreach([_m4_apply([$1],], [)], [], $2)])
120405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
120505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_mapall],
120605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$2], [], [],
120705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_m4_foreach([m4_apply([$1],], [)], [], $2)])])
120805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
120905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
121005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_map_sep(MACRO, [SEPARATOR], LIST)
121105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_mapall_sep(MACRO, [SEPARATOR], LIST)
121205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------------
121305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1,
121405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# $2... $N are the elements of LIST, and are in turn lists appropriate
121505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# for m4_apply.  SEPARATOR is expanded, in order to allow the creation
121605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# of a list of arguments by using a single-quoted comma as the
121705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# separator.  For each empty sublist, m4_map_sep skips the expansion
121805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# of MACRO and SEPARATOR, while m4_mapall_sep expands MACRO with no
121905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# arguments.
122005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
122105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For m4_mapall_sep, merely expand the first iteration without the
122205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# separator, then include separator as part of subsequent recursion;
122305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# but avoid extra expansion of LIST's side-effects via a helper macro.
122405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For m4_map_sep, things are trickier - we don't know if the first
122505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# list element is an empty sublist, so we must define a self-modifying
122605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# helper macro and use that as the separator instead.
122705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_map_sep],
122805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([m4_Sep], [m4_define([m4_Sep], _m4_defn([m4_unquote]))])]dnl
122905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_foreach([_m4_apply([m4_Sep([$2])[]$1],], [)], [], $3)m4_popdef([m4_Sep])])
123005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
123105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_mapall_sep],
123205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$3], [], [], [_$0([$1], [$2], $3)])])
123305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
123405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_mapall_sep],
123505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_apply([$1], [$3])_m4_foreach([m4_apply([$2[]$1],], [)], m4_shift2($@))])
123605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
123705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_map_args(EXPRESSION, ARG...)
123805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------
123905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand EXPRESSION([ARG]) for each argument.  More efficient than
124005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))])
124105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Shorthand for m4_map_args_sep([EXPRESSION(], [)], [], ARG...).
124205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_map_args],
124305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
124405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [],
124505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [2], [$1([$2])[]],
124605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_m4_foreach([$1(], [)], $@)])])
124705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
124805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
124905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_map_args_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...)
125005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------------------------------------
125105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Perform a pairwise grouping of consecutive ARGs, by expanding
125205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# EXPRESSION([ARG1], [ARG2]).  If there are an odd number of ARGs, the
125305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# final argument is expanded with END-EXPR([ARGn]).
125405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
125505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For example:
125605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([show], [($*)m4_newline])dnl
125705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_map_args_pair([show], [], [a], [b], [c], [d], [e])dnl
125805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   => (a,b)
125905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   => (c,d)
126005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   => (e)
126105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
126205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
126305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_map_args_pair],
126405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
126505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_fatal([$0: too few arguments: $#: $1])],
126605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [2], [],
126705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [3], [m4_default([$2], [$1])([$3])[]],
126805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [4], [$1([$3], [$4])[]],
126905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$1([$3], [$4])[]$0([$1], [$2], m4_shift(m4_shift3($@)))])])
127005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
127105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
127205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_map_args_sep([PRE], [POST], [SEP], ARG...)
127305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------------------
127405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand PRE[ARG]POST for each argument, with SEP between arguments.
127505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_map_args_sep],
127605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
127705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [],
127805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [2], [],
127905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [3], [],
128005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [4], [$1[$4]$2[]],
128105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$1[$4]$2[]_m4_foreach([$3[]$1], [$2], m4_shift3($@))])])
128205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
128305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
128405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_map_args_w(STRING, [PRE], [POST], [SEP])
128505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------------------
128605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Perform the expansion of PRE[word]POST[] for each word in STRING
128705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# separated by whitespace.  More efficient than:
128805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_foreach_w([var], [STRING], [PRE[]m4_defn([var])POST])
128905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Additionally, expand SEP between words.
129005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
129105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# As long as we have to use m4_bpatsubst to split the string, we might
129205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# as well make it also apply PRE and POST; this avoids iteration
129305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# altogether.  But we must be careful of any \ in PRE or POST.
129405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_strip returns a quoted string, but that's okay, since it also
129505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# supplies an empty leading and trailing argument due to our
129605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# intentional whitespace around STRING.  We use m4_substr to strip the
129705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# empty elements and remove the extra layer of quoting.
129805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_map_args_w],
129905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_$0(_m4_split([ ]m4_flatten([$1])[ ], [[	 ]+],
130005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	       m4_if(m4_index([$2$3$4], [\]), [-1], [[$3[]$4[]$2]],
130105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     [m4_bpatsubst([[$3[]$4[]$2]], [\\], [\\\\])])),
130205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     m4_len([[]$3[]$4]), m4_len([$4[]$2[]]))])
130305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
130405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_map_args_w],
130505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_substr([$1], [$2], m4_eval(m4_len([$1]) - [$2] - [$3]))])
130605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
130705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
130805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_stack_foreach(MACRO, FUNC)
130905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_stack_foreach_lifo(MACRO, FUNC)
131005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------------------
131105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Pass each stacked definition of MACRO to the one-argument macro FUNC.
131205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_stack_foreach proceeds in FIFO order, while m4_stack_foreach_lifo
131305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# processes the topmost definitions first.  In addition, FUNC should
131405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# not push or pop definitions of MACRO, and should not expect anything about
131505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the active definition of MACRO (it will not be the topmost, and may not
131605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# be the one passed to FUNC either).
131705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
131805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Some macros simply can't be examined with this method: namely,
131905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# anything involved in the implementation of _m4_stack_reverse.
132005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_stack_foreach],
132105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([$1], [m4_tmp-$1])]dnl
132205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([m4_tmp-$1], [$1], [$2(_m4_defn([m4_tmp-$1]))])])
132305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
132405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_stack_foreach_lifo],
132505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([$1], [m4_tmp-$1], [$2(_m4_defn([m4_tmp-$1]))])]dnl
132605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([m4_tmp-$1], [$1])])
132705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
132805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_stack_foreach_sep(MACRO, [PRE], [POST], [SEP])
132905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_stack_foreach_sep_lifo(MACRO, [PRE], [POST], [SEP])
133005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------------------------------
133105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Similar to m4_stack_foreach and m4_stack_foreach_lifo, in that every
133205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# definition of a pushdef stack will be visited.  But rather than
133305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# passing the definition as a single argument to a macro, this variant
133405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expands the concatenation of PRE[]definition[]POST, and expands SEP
133505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# between consecutive expansions.  Note that m4_stack_foreach([a], [b])
133605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is equivalent to m4_stack_foreach_sep([a], [b(], [)]).
133705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_stack_foreach_sep],
133805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([$1], [m4_tmp-$1])]dnl
133905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([m4_tmp-$1], [$1], [$2[]_m4_defn([m4_tmp-$1])$3], [$4[]])])
134005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
134105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_stack_foreach_sep_lifo],
134205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([$1], [m4_tmp-$1], [$2[]_m4_defn([m4_tmp-$1])$3], [$4[]])]dnl
134305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([m4_tmp-$1], [$1])])
134405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
134505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
134605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_stack_reverse(OLD, NEW, [ACTION], [SEP])
134705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------------------------------
134805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# A recursive worker for pushdef stack manipulation.  Destructively
134905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# copy the OLD stack into the NEW, and expanding ACTION for each
135005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# iteration.  After the first iteration, SEP is promoted to the front
135105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# of ACTION (note that SEP should include a trailing [] if it is to
135205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# avoid interfering with ACTION).  The current definition is examined
135305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# after the NEW has been pushed but before OLD has been popped; this
135405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# order is important, as ACTION is permitted to operate on either
135505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_defn([OLD]) or _m4_defn([NEW]).  Since the operation is
135605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# destructive, this macro is generally used twice, with a temporary
135705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro name holding the swapped copy.
135805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_stack_reverse],
135905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([$1], [m4_pushdef([$2],
136005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _m4_defn([$1]))$3[]_m4_popdef([$1])$0([$1], [$2], [$4$3])])])
1361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## --------------------------- ##
136505436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 9. More diversion support.  ##
1366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## --------------------------- ##
1367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
136905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cleardivert(DIVERSION-NAME...)
137005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------
137105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Discard any text in DIVERSION-NAME.
137205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
137305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This works even inside m4_expand.
137405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_cleardivert],
137505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: missing argument])],
137605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_m4_divert_raw([-1])m4_undivert($@)_m4_divert_raw(
137705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	 _m4_divert(_m4_defn([_m4_divert_diversion]), [-]))])])
137805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
137905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
138005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_divert(DIVERSION-NAME or NUMBER, [NOWARN])
138105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------------------------------
1382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If DIVERSION-NAME is the name of a diversion, return its number,
138305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# otherwise if it is a NUMBER return it.  Issue a warning about
138405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the use of a number instead of a name, unless NOWARN is provided.
1385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_divert],
1386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifdef([_m4_divert($1)],
1387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  [m4_indir([_m4_divert($1)])],
138805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_if([$2], [], [m4_warn([syntax],
138905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	     [prefer named diversions])])$1])])
1390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# KILL is only used to suppress output.
1392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_divert(KILL)],           -1)
1393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
139405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The empty diversion name is a synonym for 0.
139505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_divert()],                0)
139605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
139705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
139805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_divert_stack
139905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
140005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Print the diversion stack, if it's nonempty.  The caller is
140105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# responsible for any leading or trailing newline.
140205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_divert_stack],
140305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_stack_foreach_sep_lifo([_m4_divert_stack], [], [], [
140405436638acc7c010349a69c3395f1a57c642dc62Ying Wang])])
1405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
140605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
140705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_divert_stack_push(MACRO-NAME, DIVERSION-NAME)
140805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------------------------
140905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Form an entry of the diversion stack from caller MACRO-NAME and
141005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# entering DIVERSION-NAME and push it.
141105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_divert_stack_push],
141205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_m4_divert_stack], m4_location[: $1: $2])])
1413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_divert(DIVERSION-NAME)
1416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------
1417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Change the diversion stream to DIVERSION-NAME.
1418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_divert],
141905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_popdef([_m4_divert_stack])]dnl
142005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([_m4_divert_diversion], [$1])]dnl
142105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_divert_stack_push([$0], [$1])]dnl
142205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_divert_raw(_m4_divert([$1]))])
1423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
142505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_divert_push(DIVERSION-NAME, [NOWARN])
142605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------------------------
1427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Change the diversion stream to DIVERSION-NAME, while stacking old values.
142805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For internal use only: if NOWARN is not empty, DIVERSION-NAME can be a
142905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# number instead of a name.
1430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_divert_push],
143105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_divert_stack_push([$0], [$1])]dnl
143205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_m4_divert_diversion], [$1])]dnl
143305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_divert_raw(_m4_divert([$1], [$2]))])
1434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_divert_pop([DIVERSION-NAME])
1437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------------
1438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Change the diversion stream to its previous value, unstacking it.
1439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If specified, verify we left DIVERSION-NAME.
1440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# When we pop the last value from the stack, we divert to -1.
1441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_divert_pop],
144205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [], [],
144305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$1], _m4_defn([_m4_divert_diversion]), [],
144405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_fatal([$0($1): diversion mismatch:
144505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]m4_divert_stack)])]dnl
144605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_popdef([_m4_divert_stack], [_m4_divert_diversion])]dnl
144705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_divert_diversion], [],
144805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   [m4_fatal([too many m4_divert_pop])])]dnl
144905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_divert_raw(_m4_divert(_m4_defn([_m4_divert_diversion]), [-]))])
1450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_divert_text(DIVERSION-NAME, CONTENT)
1453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------------------------
1454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Output CONTENT into DIVERSION-NAME (which may be a number actually).
1455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# An end of line is appended for free to CONTENT.
1456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_divert_text],
145705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_divert_push([$1])$2
145805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_divert_pop([$1])])
1459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_divert_once(DIVERSION-NAME, CONTENT)
1462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------------------------
146305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Output CONTENT into DIVERSION-NAME once, if not already there.
146405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# An end of line is appended for free to CONTENT.
1465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_divert_once],
1466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_expand_once([m4_divert_text([$1], [$2])])])
1467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
146905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_divert_unsafe(DIVERSION-NAME)
147005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------
147105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Issue a warning that the attempt to change the current diversion to
147205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# DIVERSION-NAME is unsafe, because this macro is being expanded
147305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# during argument collection of m4_expand.
147405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_divert_unsafe],
147505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_fatal([$0: cannot change diversion to `$1' inside m4_expand])])
147605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
147705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
147805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_undivert(DIVERSION-NAME...)
147905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------
148005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Undivert DIVERSION-NAME.  Unlike the M4 version, this requires at
148105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# least one DIVERSION-NAME; also, due to support for named diversions,
148205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this should not be used to undivert files.
1483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_undivert],
148405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([$0: missing argument])],
148505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [_m4_undivert(_m4_divert([$1]))],
148605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_map_args([$0], $@)])])
1487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
148905436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------------------------------------- ##
149005436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 10. Defining macros with bells and whistles.  ##
149105436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------------------------------------- ##
1492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# `m4_defun' is basically `m4_define' but it equips the macro with the
1494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# needed machinery for `m4_require'.  A macro must be m4_defun'd if
1495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# either it is m4_require'd, or it m4_require's.
1496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Two things deserve attention and are detailed below:
1498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  1. Implementation of m4_require
1499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  2. Keeping track of the expansion stack
1500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# 1. Implementation of m4_require
1502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ===============================
1503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
150405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Of course m4_defun calls m4_provide, so that a macro which has
1505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# been expanded is not expanded again when m4_require'd, but the
1506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# difficult part is the proper expansion of macros when they are
1507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_require'd.
1508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
150905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The implementation is based on three ideas, (i) using diversions to
1510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# prepare the expansion of the macro and its dependencies (by Franc,ois
151105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Pinard), (ii) expand the most recently m4_require'd macros _after_
151205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the previous macros (by Axel Thimm), and (iii) track instances of
151305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# provide before require (by Eric Blake).
1514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
151605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The first idea: why use diversions?
151705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------------------
1518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# When a macro requires another, the other macro is expanded in new
1520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# diversion, GROW.  When the outer macro is fully expanded, we first
1521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# undivert the most nested diversions (GROW - 1...), and finally
1522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# undivert GROW.  To understand why we need several diversions,
1523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# consider the following example:
1524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
152505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST1], [Test...m4_require([TEST2])1])
152605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST2], [Test...m4_require([TEST3])2])
1527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_defun([TEST3], [Test...3])
1528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Because m4_require is not required to be first in the outer macros, we
153005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# must keep the expansions of the various levels of m4_require separated.
1531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Right before executing the epilogue of TEST1, we have:
1532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2: Test...3
1534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1: Test...2
1535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:     Test...1
1536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:
1537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Finally the epilogue of TEST1 undiverts GROW - 2, GROW - 1, and
1539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# GROW into the regular flow, BODY.
1540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2:
1542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1:
1543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:
1544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:        Test...3; Test...2; Test...1
1545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# (The semicolons are here for clarification, but of course are not
1547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# emitted.)  This is what Autoconf 2.0 (I think) to 2.13 (I'm sure)
1548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# implement.
1549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The second idea: first required first out
1552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------------------------------
1553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The natural implementation of the idea above is buggy and produces
1555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# very surprising results in some situations.  Let's consider the
1556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# following example to explain the bug:
1557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
155805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST1],  [m4_require([TEST2a])m4_require([TEST2b])])
1559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | m4_defun([TEST2a], [])
156005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST2b], [m4_require([TEST3])])
156105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST3],  [m4_require([TEST2a])])
1562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# |
1563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | AC_INIT
1564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# | TEST1
1565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The dependencies between the macros are:
1567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#		 3 --- 2b
1569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#		/        \              is m4_require'd by
1570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	       /          \       left -------------------- right
1571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	    2a ------------ 1
1572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If you strictly apply the rules given in the previous section you get:
1574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2: TEST3
1576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1: TEST2a; TEST2b
1577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:     TEST1
1578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:
1579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# (TEST2a, although required by TEST3 is not expanded in GROW - 3
1581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# because is has already been expanded before in GROW - 1, so it has
1582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# been AC_PROVIDE'd, so it is not expanded again) so when you undivert
1583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# the stack of diversions, you get:
1584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2:
1586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1:
1587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:
1588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:        TEST3; TEST2a; TEST2b; TEST1
1589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# i.e., TEST2a is expanded after TEST3 although the latter required the
1591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# former.
1592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
159305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Starting from 2.50, we use an implementation provided by Axel Thimm.
1594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The idea is simple: the order in which macros are emitted must be the
159505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# same as the one in which macros are expanded.  (The bug above can
159605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# indeed be described as: a macro has been m4_provide'd before its
159705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# dependent, but it is emitted after: the lack of correlation between
159805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# emission and expansion order is guilty).
1599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
160005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# How to do that?  You keep the stack of diversions to elaborate the
1601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# macros, but each time a macro is fully expanded, emit it immediately.
1602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# In the example above, when TEST2a is expanded, but it's epilogue is
1604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# not run yet, you have:
1605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2:
1607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1: TEST2a
1608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:     Elaboration of TEST1
1609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:
1610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The epilogue of TEST2a emits it immediately:
1612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2:
1614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1:
1615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:     Elaboration of TEST1
1616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:     TEST2a
1617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# TEST2b then requires TEST3, so right before the epilogue of TEST3, you
1619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# have:
1620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2: TEST3
1622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1: Elaboration of TEST2b
1623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:     Elaboration of TEST1
1624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:      TEST2a
1625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The epilogue of TEST3 emits it:
1627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2:
1629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1: Elaboration of TEST2b
1630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:     Elaboration of TEST1
1631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:     TEST2a; TEST3
1632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# TEST2b is now completely expanded, and emitted:
1634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2:
1636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1:
1637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:     Elaboration of TEST1
1638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:     TEST2a; TEST3; TEST2b
1639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# and finally, TEST1 is finished and emitted:
1641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 2:
1643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW - 1:
1644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   GROW:
1645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	   BODY:     TEST2a; TEST3; TEST2b: TEST1
1646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
164705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The idea is simple, but the implementation is a bit involved.  If
164805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# you are like me, you will want to see the actual functioning of this
1649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# implementation to be convinced.  The next section gives the full
1650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# details.
1651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The Axel Thimm implementation at work
1654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------------------
1655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# We consider the macros above, and this configure.ac:
1657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	    AC_INIT
1659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#	    TEST1
1660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# You should keep the definitions of _m4_defun_pro, _m4_defun_epi, and
1662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_require at hand to follow the steps.
1663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
166405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This implementation tries not to assume that the current diversion is
1665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# BODY, so as soon as a macro (m4_defun'd) is expanded, we first
1666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# record the current diversion under the name _m4_divert_dump (denoted
1667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# DUMP below for short).  This introduces an important difference with
1668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# the previous versions of Autoconf: you cannot use m4_require if you
1669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# are not inside an m4_defun'd macro, and especially, you cannot
1670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_require directly from the top level.
1671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# We have not tried to simulate the old behavior (better yet, we
1673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# diagnose it), because it is too dangerous: a macro m4_require'd from
1674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# the top level is expanded before the body of `configure', i.e., before
1675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# any other test was run.  I let you imagine the result of requiring
1676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# AC_STDC_HEADERS for instance, before AC_PROG_CC was actually run....
1677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# After AC_INIT was run, the current diversion is BODY.
1679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# * AC_INIT was run
1680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:                undefined
1681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversion stack:     BODY |-
1682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# * TEST1 is expanded
1684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The prologue of TEST1 sets _m4_divert_dump, which is the diversion
1685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# where the current elaboration will be dumped, to the current
1686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# diversion.  It also m4_divert_push to GROW, where the full
1687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# expansion of TEST1 and its dependencies will be elaborated.
1688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        empty
1690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW, BODY |-
1691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# * TEST1 requires TEST2a
1693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# _m4_require_call m4_divert_pushes another temporary diversion,
1694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# GROW - 1, and expands TEST2a in there.
1695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        empty
1697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   GROW - 1:    TEST2a
1698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW - 1, GROW, BODY |-
169905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Then the content of the temporary diversion is moved to DUMP and the
1700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# temporary diversion is popped.
1701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        TEST2a
1703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW, BODY |-
1704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# * TEST1 requires TEST2b
1706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Again, _m4_require_call pushes GROW - 1 and heads to expand TEST2b.
1707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        TEST2a
1709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW - 1, GROW, BODY |-
1710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# * TEST2b requires TEST3
1712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# _m4_require_call pushes GROW - 2 and expands TEST3 here.
1713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# (TEST3 requires TEST2a, but TEST2a has already been m4_provide'd, so
1714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# nothing happens.)
1715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        TEST2a
1717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   GROW - 2:    TEST3
1718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW - 2, GROW - 1, GROW, BODY |-
171905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Then the diversion is appended to DUMP, and popped.
1720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        TEST2a; TEST3
1722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW - 1, GROW, BODY |-
1723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# * TEST1 requires TEST2b (contd.)
1725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The content of TEST2b is expanded...
1726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        TEST2a; TEST3
1728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   GROW - 1:    TEST2b,
1729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW - 1, GROW, BODY |-
1730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ... and moved to DUMP.
1731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        TEST2a; TEST3; TEST2b
1733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  GROW, BODY |-
1734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# * TEST1 is expanded: epilogue
1736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# TEST1's own content is in GROW...
1737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:        BODY
1738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:        TEST2a; TEST3; TEST2b
1739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   GROW:        TEST1
1740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions:  BODY |-
1741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ... and it's epilogue moves it to DUMP and then undefines DUMP.
1742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   DUMP:       undefined
1743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   BODY:       TEST2a; TEST3; TEST2b; TEST1
1744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   diversions: BODY |-
1745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
174705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The third idea: track macros provided before they were required
174805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------------------------------------
174905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
175005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Using just the first two ideas, Autoconf 2.50 through 2.63 still had
175105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# a subtle bug for more than seven years.  Let's consider the
175205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# following example to explain the bug:
175305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
175405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST1], [1])
175505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST2], [2[]m4_require([TEST1])])
175605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST3], [3 TEST1 m4_require([TEST2])])
175705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | TEST3
175805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
175905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# After the prologue of TEST3, we are collecting text in GROW with the
176005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# intent of dumping it in BODY during the epilogue.  Next, we
176105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# encounter the direct invocation of TEST1, which provides the macro
176205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# in place in GROW.  From there, we encounter a requirement for TEST2,
176305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# which must be collected in a new diversion.  While expanding TEST2,
176405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# we encounter a requirement for TEST1, but since it has already been
176505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expanded, the Axel Thimm algorithm states that we can treat it as a
176605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# no-op.  But that would lead to an end result of `2 3 1', meaning
176705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# that we have once again output a macro (TEST2) prior to its
176805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# requirements (TEST1).
176905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
177005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The problem can only occur if a single defun'd macro first provides,
177105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# then later indirectly requires, the same macro.  Note that directly
177205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expanding then requiring a macro is okay: because the dependency was
177305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# met, the require phase can be a no-op.  For that matter, the outer
177405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro can even require two helpers, where the first helper expands
177505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the macro, and the second helper indirectly requires the macro.
177605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Out-of-order expansion is only present if the inner macro is
177705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# required by something that will be hoisted in front of where the
177805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# direct expansion occurred.  In other words, we must be careful not
177905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to warn on:
178005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
178105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST4], [4])
178205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST5], [5 TEST4 m4_require([TEST4])])
178305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | TEST5 => 5 4
178405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
178505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# or even the more complex:
178605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
178705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST6], [6])
178805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST7], [7 TEST6])
178905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST8], [8 m4_require([TEST6])])
179005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST9], [9 m4_require([TEST8])])
179105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | m4_defun([TEST10], [10 m4_require([TEST7]) m4_require([TEST9])])
179205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# | TEST10 => 7 6 8 9 10
179305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
179405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# So, to detect whether a require was direct or indirect, m4_defun and
179505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_require track the name of the macro that caused a diversion to be
179605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# created (using the stack _m4_diverting, coupled with an O(1) lookup
179705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_diverting([NAME])), and m4_provide stores the name associated
179805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# with the diversion at which a macro was provided.  A require call is
179905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# direct if it occurs within the same diversion where the macro was
180005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# provided, or if the diversion associated with the providing context
180105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# has been collected.
180205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
180305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The implementation of the warning involves tracking the set of
180405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macros which have been provided since the start of the outermost
180505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# defun'd macro (the set is named _m4_provide).  When starting an
180605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# outermost macro, the set is emptied; when a macro is provided, it is
180705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# added to the set; when require expands the body of a macro, it is
180805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# removed from the set; and when a macro is indirectly required, the
180905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# set is checked.  If a macro is in the set, then it has been provided
181005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# before it was required, and we satisfy dependencies by expanding the
181105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro as if it had never been provided; in the example given above,
181205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this means we now output `1 2 3 1'.  Meanwhile, a warning is issued
181305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to inform the user that her macros trigger the bug in older autoconf
181405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# versions, and that her output file now contains redundant contents
181505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (and possibly new problems, if the repeated macro was not
181605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# idempotent).  Meanwhile, macros defined by m4_defun_once instead of
181705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_defun are idempotent, avoiding any warning or duplicate output.
181805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
181905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
1820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# 2. Keeping track of the expansion stack
1821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# =======================================
1822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# When M4 expansion goes wrong it is often extremely hard to find the
1824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# path amongst macros that drove to the failure.  What is needed is
1825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# the stack of macro `calls'. One could imagine that GNU M4 would
1826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# maintain a stack of macro expansions, unfortunately it doesn't, so
1827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# we do it by hand.  This is of course extremely costly, but the help
1828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# this stack provides is worth it.  Nevertheless to limit the
1829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# performance penalty this is implemented only for m4_defun'd macros,
1830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# not for define'd macros.
1831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
183205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Each time we enter an m4_defun'd macros, we add a definition in
183305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_expansion_stack, and when we exit the macro, we remove it (thanks
183405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to pushdef/popdef).  m4_stack_foreach is used to print the expansion
183505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# stack in the rare cases when it's needed.
1836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# In addition, we want to detect circular m4_require dependencies.
1838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Each time we expand a macro FOO we define _m4_expanding(FOO); and
1839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_require(BAR) simply checks whether _m4_expanding(BAR) is defined.
1840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
184205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_expansion_stack
184305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------
184405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expands to the entire contents of the expansion stack.  The caller
184505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# must supply a trailing newline.  This macro always prints a
184605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# location; check whether _m4_expansion_stack is defined to filter out
184705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the case when no defun'd macro is in force.
184805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_expansion_stack],
184905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_stack_foreach_sep_lifo([_$0], [_$0_entry(], [)
185005436638acc7c010349a69c3395f1a57c642dc62Ying Wang])m4_location[: the top level]])
185105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
185205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_expansion_stack_entry(MACRO)
185305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------------------
185405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Format an entry for MACRO found on the expansion stack.
185505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_expansion_stack_entry],
185605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_defn([m4_location($1)])[: $1 is expanded from...]])
1857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
185805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_expansion_stack_push(MACRO)
185905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------
186005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Form an entry of the expansion stack on entry to MACRO and push it.
186105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_expansion_stack_push],
186205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_m4_expansion_stack], [$1])])
1863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# _m4_divert(GROW)
1866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------
1867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This diversion is used by the m4_defun/m4_require machinery.  It is
1868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# important to keep room before GROW because for each nested
1869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# AC_REQUIRE we use an additional diversion (i.e., two m4_require's
1870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# will use GROW - 2.  More than 3 levels has never seemed to be
1871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# needed.)
1872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
1873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ...
1874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# - GROW - 2
1875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   m4_require'd code, 2 level deep
1876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# - GROW - 1
1877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   m4_require'd code, 1 level deep
1878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# - GROW
1879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   m4_defun'd macros are elaborated here.
1880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_divert(GROW)],       10000)
1882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# _m4_defun_pro(MACRO-NAME)
1885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------
1886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The prologue for Autoconf macros.
188705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
188805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This is called frequently, so minimize the number of macro invocations
188905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# by avoiding dnl and m4_defn overhead.
1890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_defun_pro],
189105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_pro_outer([$1])])]dnl
189205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_expansion_stack_push([$1])m4_pushdef([_m4_expanding($1)])])
1893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_defun_pro_outer],
189505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_delete([_m4_provide])]dnl
189605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl
189705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_m4_divert_dump], m4_divnum)m4_divert_push([GROW])])
1898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# _m4_defun_epi(MACRO-NAME)
1900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------
1901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The Epilogue for Autoconf macros.  MACRO-NAME only helps tracing
1902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# the PRO/EPI pairs.
190305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
190405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This is called frequently, so minimize the number of macro invocations
190505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# by avoiding dnl and m4_popdef overhead.
1906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_defun_epi],
190705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_popdef([_m4_expanding($1)], [_m4_expansion_stack])]dnl
190805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_epi_outer([$1])])]dnl
190905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_provide([$1])])
1910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_defun_epi_outer],
191205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_popdef([_m4_divert_dump], [_m4_diverting([$1])], [_m4_diverting])]dnl
191305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_divert_pop([GROW])m4_undivert([GROW])])
1914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
191605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_divert_dump
191705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------
191805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If blank, we are outside of any defun'd macro.  Otherwise, expands
191905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to the diversion number (not name) where require'd macros should be
192005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# moved once completed.
192105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_divert_dump])
192205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
192305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
192405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_divert_require(DIVERSION, NAME-TO-CHECK, [BODY-TO-EXPAND])
192505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------------------------------------
192605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Same as m4_require, but BODY-TO-EXPAND goes into the named DIVERSION;
192705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# requirements still go in the current diversion though.
192805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
192905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_divert_require],
193005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_expanding($2)],
193105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [m4_fatal([$0: circular dependency of $2])])]dnl
193205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(_m4_divert_dump, [],
193305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [m4_fatal([$0($2): cannot be used outside of an m4_defun'd macro])])]dnl
193405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_provide_if([$2], [],
193505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [_m4_require_call([$2], [$3], _m4_divert([$1], [-]))])])
193605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
193705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
193805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_defun(NAME, EXPANSION, [MACRO = m4_define])
193905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------------------------------
194005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Define a macro NAME which automatically provides itself.  Add
194105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# machinery so the macro automatically switches expansion to the
194205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# diversion stack if it is not already using it, prior to EXPANSION.
194305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In this case, once finished, it will bring back all the code
194405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# accumulated in the diversion stack.  This, combined with m4_require,
194505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# achieves the topological ordering of macros.  We don't use this
194605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro to define some frequently called macros that are not involved
194705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# in ordering constraints, to save m4 processing.
194805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
194905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# MACRO is an undocumented argument; when set to m4_pushdef, and NAME
195005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is already defined, the new definition is added to the pushdef
195105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# stack, rather than overwriting the current definition.  It can thus
195205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# be used to write self-modifying macros, which pop themselves to a
195305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# previously m4_define'd definition so that subsequent use of the
195405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro is faster.
1955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_defun],
195605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([m4_location($1)], m4_location)]dnl
195705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_default([$3], [m4_define])([$1],
195805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [_m4_defun_pro(]m4_dquote($[0])[)$2[]_m4_defun_epi(]m4_dquote($[0])[)])])
195905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
196005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
196105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_defun_init(NAME, INIT, COMMON)
196205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------
196305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_defun, but split EXPANSION into two portions: INIT which is
196405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# done only the first time NAME is invoked, and COMMON which is
196505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expanded every time.
196605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
196705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For now, the COMMON definition is always m4_define'd, giving an even
196805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# lighter-weight definition.  m4_defun allows self-providing, but once
196905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# a macro is provided, m4_require no longer cares if it is m4_define'd
197005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# or m4_defun'd.  m4_defun also provides location tracking to identify
197105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# dependency bugs, but once the INIT has been expanded, we know there
197205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# are no dependency bugs.  However, if a future use needs COMMON to be
197305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_defun'd, we can add a parameter, similar to the third parameter
197405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to m4_defun.
197505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_defun_init],
197605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([$1], [$3[]])m4_defun([$1],
197705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   [$2[]_m4_popdef(]m4_dquote($[0])[)m4_indir(]m4_dquote($[0])dnl
197805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(]m4_dquote($[#])[, [0], [], ]m4_dquote([,$]@)[))], [m4_pushdef])])
1979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_defun_once(NAME, EXPANSION)
1982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------------------------
198305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like m4_defun, but guarantee that EXPANSION only happens once
198405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (thereafter, using NAME is a no-op).
198505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
198605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If _m4_divert_dump is empty, we are called at the top level;
198705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# otherwise, we must ensure that we are required in front of the
198805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# current defun'd macro.  Use a helper macro so that EXPANSION need
198905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# only occur once in the definition of NAME, since it might be large.
1990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_defun_once],
199105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([m4_location($1)], m4_location)]dnl
199205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([$1], [_m4_defun_once([$1], [$2], m4_if(_m4_divert_dump, [],
199305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [[_m4_defun_pro([$1])m4_unquote(], [)_m4_defun_epi([$1])]],
199405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_ifdef([_m4_diverting([$1])], [-]), [-], [[m4_unquote(], [)]],
199505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [[_m4_require_call([$1],], [, _m4_divert_dump)]]))])])
199605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
199705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_defun_once],
199805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([$1])$3[$2[]m4_provide([$1])]$4])
1999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_pattern_forbid(ERE, [WHY])
2002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------------------
200305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Declare that no token matching the forbidden extended regular
200405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expression ERE should be seen in the output unless...
2005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_pattern_forbid], [])
2006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_pattern_allow(ERE)
2009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------
201005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ... that token also matches the allowed extended regular expression ERE.
2011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Both used via traces.
2012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_pattern_allow], [])
2013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
201505436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------------------------- ##
201605436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 11. Dependencies between macros.  ##
201705436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------------------------- ##
2018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME)
2021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------------------------------
202205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Issue a warning if CALLED-MACRO-NAME was called before THIS-MACRO-NAME.
2023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_before],
2024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_provide_if([$2],
2025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       [m4_warn([syntax], [$2 was called before $1])])])
2026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_require(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK])
2029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------------------------------------------------
2030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If NAME-TO-CHECK has never been expanded (actually, if it is not
2031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_provide'd), expand BODY-TO-EXPAND *before* the current macro
203205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansion; follow the expansion with a newline.  Once expanded, emit
203305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it in _m4_divert_dump.  Keep track of the m4_require chain in
203405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_expansion_stack.
2035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The normal cases are:
2037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# - NAME-TO-CHECK == BODY-TO-EXPAND
2039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   Which you can use for regular macros with or without arguments, e.g.,
2040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     m4_require([AC_PROG_CC], [AC_PROG_CC])
204105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#     m4_require([AC_CHECK_HEADERS(threads.h)], [AC_CHECK_HEADERS(threads.h)])
2042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   which is just the same as
2043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     m4_require([AC_PROG_CC])
204405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#     m4_require([AC_CHECK_HEADERS(threads.h)])
2045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# - BODY-TO-EXPAND == m4_indir([NAME-TO-CHECK])
2047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   In the case of macros with irregular names.  For instance:
2048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     m4_require([AC_LANG_COMPILER(C)], [indir([AC_LANG_COMPILER(C)])])
2049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   which means `if the macro named `AC_LANG_COMPILER(C)' (the parens are
2050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   part of the name, it is not an argument) has not been run, then
2051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   call it.'
2052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   Had you used
2053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#     m4_require([AC_LANG_COMPILER(C)], [AC_LANG_COMPILER(C)])
2054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   then m4_require would have tried to expand `AC_LANG_COMPILER(C)', i.e.,
2055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   call the macro `AC_LANG_COMPILER' with `C' as argument.
2056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   You could argue that `AC_LANG_COMPILER', when it receives an argument
2058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   such as `C' should dispatch the call to `AC_LANG_COMPILER(C)'.  But this
2059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   `extension' prevents `AC_LANG_COMPILER' from having actual arguments that
2060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   it passes to `AC_LANG_COMPILER(C)'.
206105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
206205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This is called frequently, so minimize the number of macro invocations
206305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# by avoiding dnl and other overhead on the common path.
2064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_require],
2065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifdef([_m4_expanding($1)],
206605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [m4_fatal([$0: circular dependency of $1])])]dnl
206705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(_m4_divert_dump, [],
206805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [m4_fatal([$0($1): cannot be used outside of an ]dnl
206905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_if([$0], [m4_require], [[m4_defun]], [[AC_DEFUN]])['d macro])])]dnl
207005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_provide_if([$1], [m4_set_contains([_m4_provide], [$1],
207105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    [_m4_require_check([$1], _m4_defn([m4_provide($1)]), [$0])], [m4_ignore])],
207205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [_m4_require_call])([$1], [$2], _m4_divert_dump)])
207305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
207405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
207505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_require_call(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK],
207605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#                  DIVERSION-NUMBER)
207705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------------------------------------------------
207805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If m4_require decides to expand the body, it calls this macro.  The
207905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansion is placed in DIVERSION-NUMBER.
208005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
208105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This is called frequently, so minimize the number of macro invocations
208205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# by avoiding dnl and other overhead on the common path.
2083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_require_call],
208405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_m4_divert_grow], m4_decr(_m4_divert_grow))]dnl
208505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl
208605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_divert_push(_m4_divert_grow, [-])]dnl
208705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$2], [], [$1], [$2])
208805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_provide_if([$1], [m4_set_remove([_m4_provide], [$1])],
208905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [m4_warn([syntax], [$1 is m4_require'd but not m4_defun'd])])]dnl
209005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_divert_raw($3)_m4_undivert(_m4_divert_grow)]dnl
209105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_divert_pop(_m4_divert_grow)_m4_popdef([_m4_divert_grow],
209205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_diverting([$1])], [_m4_diverting])])
209305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
209405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
209505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_require_check(NAME-TO-CHECK, OWNER, CALLER)
209605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------------------------------
209705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# NAME-TO-CHECK has been identified as previously expanded in the
209805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# diversion owned by OWNER.  If this is a problem, warn on behalf of
209905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# CALLER and return _m4_require_call; otherwise return m4_ignore.
210005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_require_check],
210105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(_m4_defn([_m4_diverting]), [$2], [m4_ignore],
210205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       m4_ifdef([_m4_diverting([$2])], [-]), [-], [m4_warn([syntax],
210305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   [$3: `$1' was expanded before it was required
210405436638acc7c010349a69c3395f1a57c642dc62Ying Wanghttp://www.gnu.org/software/autoconf/manual/autoconf.html#Expanded-Before-Required])_m4_require_call],
210505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_ignore])])
2106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# _m4_divert_grow
2109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------
2110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The counter for _m4_require_call.
2111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_divert_grow], _m4_divert([GROW]))
2112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_expand_once(TEXT, [WITNESS = TEXT])
2115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------------------------
2116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If TEXT has never been expanded, expand it *here*.  Use WITNESS as
2117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# as a memory that TEXT has already been expanded.
2118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_expand_once],
211905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_provide_if(m4_default_quoted([$2], [$1]),
2120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       [],
212105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	       [m4_provide(m4_default_quoted([$2], [$1]))[]$1])])
2122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_provide(MACRO-NAME)
2125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------
2126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_provide],
212705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([m4_provide($1)], [],
212805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_add([_m4_provide], [$1], [m4_define([m4_provide($1)],
212905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  m4_ifdef([_m4_diverting], [_m4_defn([_m4_diverting])]))])])])
2130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
2133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------------------------------------
2134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED.
2135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The purpose of this macro is to provide the user with a means to
2136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# check macros which are provided without letting her know how the
2137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# information is coded.
2138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_provide_if],
2139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifdef([m4_provide($1)],
2140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  [$2], [$3])])
2141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
214305436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------------- ##
214405436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 12. Text processing.  ##
214505436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------------- ##
2146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_cr_letters
2149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_cr_LETTERS
2150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_cr_Letters
2151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------
2152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cr_letters], [abcdefghijklmnopqrstuvwxyz])
2153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cr_LETTERS], [ABCDEFGHIJKLMNOPQRSTUVWXYZ])
2154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cr_Letters],
2155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_defn([m4_cr_letters])dnl
2156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_defn([m4_cr_LETTERS])dnl
2157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project)
2158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_cr_digits
2161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------
2162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cr_digits], [0123456789])
2163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
216505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_alnum
216605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------
216705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_cr_alnum],
216805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_defn([m4_cr_Letters])dnl
216905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_defn([m4_cr_digits])dnl
217005436638acc7c010349a69c3395f1a57c642dc62Ying Wang)
217105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
217205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
217305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_symbols1
217405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_symbols2
217505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------
2176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cr_symbols1],
2177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_defn([m4_cr_Letters])dnl
2178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_)
2179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cr_symbols2],
2181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_defn([m4_cr_symbols1])dnl
2182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_defn([m4_cr_digits])dnl
2183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project)
2184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
218505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_all
218605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------
218705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The character range representing everything, with `-' as the last
218805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# character, since it is special to m4_translit.  Use with care, because
218905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it contains characters special to M4 (fortunately, both ASCII and EBCDIC
219005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# have [] in order, so m4_defn([m4_cr_all]) remains a valid string).  It
219105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# also contains characters special to terminals, so it should never be
219205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# displayed in an error message.  Also, attempts to map [ and ] to other
219305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# characters via m4_translit must deal with the fact that m4_translit does
219405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# not add quotes to the output.
219505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
219605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In EBCDIC, $ is immediately followed by *, which leads to problems
219705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if m4_cr_all is inlined into a macro definition; so swap them.
219805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
219905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# It is mainly useful in generating inverted character range maps, for use
220005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# in places where m4_translit is faster than an equivalent m4_bpatsubst;
220105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the regex `[^a-z]' is equivalent to:
220205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  m4_translit(m4_dquote(m4_defn([m4_cr_all])), [a-z])
220305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_cr_all],
220405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_translit(m4_dquote(m4_format(m4_dquote(m4_for(
220505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ,1,255,,[[%c]]))m4_for([i],1,255,,[,i]))), [$*-], [*$])-)
220605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
220705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
220805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_define_cr_not(CATEGORY)
220905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------
221005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Define m4_cr_not_CATEGORY as the inverse of m4_cr_CATEGORY.
221105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_define_cr_not],
221205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([m4_cr_not_$1],
221305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   m4_translit(m4_dquote(m4_defn([m4_cr_all])),
221405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		       m4_defn([m4_cr_$1])))])
221505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
221605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
221705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_not_letters
221805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_not_LETTERS
221905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_not_Letters
222005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_not_digits
222105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_not_alnum
222205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_not_symbols1
222305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_cr_not_symbols2
222405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------
222505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Inverse character sets
222605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_m4_define_cr_not([letters])
222705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_m4_define_cr_not([LETTERS])
222805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_m4_define_cr_not([Letters])
222905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_m4_define_cr_not([digits])
223005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_m4_define_cr_not([alnum])
223105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_m4_define_cr_not([symbols1])
223205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_m4_define_cr_not([symbols2])
223305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
223405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
223505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_newline([STRING])
223605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------
223705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expands to a newline, possibly followed by STRING.  Exists mostly for
223805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# formatting reasons.
223905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_newline], [
224005436638acc7c010349a69c3395f1a57c642dc62Ying Wang$1])
224105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_re_escape(STRING)
2244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------
2245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Escape RE active characters in STRING.
2246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_re_escape],
2247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_bpatsubst([$1],
2248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      [[][*+.?\^$]], [\\\&])])
2249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_re_string
2252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------
2253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Regexp for `[a-zA-Z_0-9]*'
2254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_dquote provides literal [] for the character class.
2255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_re_string],
2256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_dquote(m4_defn([m4_cr_symbols2]))dnl
2257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[*]dnl
2258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project)
2259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_re_word
2262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------
2263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Regexp for `[a-zA-Z_][a-zA-Z_0-9]*'
2264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_re_word],
2265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_dquote(m4_defn([m4_cr_symbols1]))dnl
2266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_defn([m4_re_string])dnl
2267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project)
2268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_tolower(STRING)
2271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_toupper(STRING)
2272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------------
227305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# These macros convert STRING to lowercase or uppercase.
227405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
227505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rather than expand the m4_defn each time, we inline them up front.
2276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_tolower],
227705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_translit([[$1]], ]m4_dquote(m4_defn([m4_cr_LETTERS]))[,
227805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     ]m4_dquote(m4_defn([m4_cr_letters]))[)])
2279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_toupper],
228005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_translit([[$1]], ]m4_dquote(m4_defn([m4_cr_letters]))[,
228105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     ]m4_dquote(m4_defn([m4_cr_LETTERS]))[)])
2282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_split(STRING, [REGEXP])
2285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------------
2286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Split STRING into an m4 list of quoted elements.  The elements are
2287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# quoted with [ and ].  Beginning spaces and end spaces *are kept*.
2288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Use m4_strip to remove them.
2289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# REGEXP specifies where to split.  Default is [\t ]+.
2291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If STRING is empty, the result is an empty list.
2293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Pay attention to the m4_changequotes.  When m4 reads the definition of
2295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_split, it still has quotes set to [ and ].  Luckily, these are matched
229605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# in the macro body, so the definition is stored correctly.  Use the same
229705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# alternate quotes as m4_noquote; it must be unlikely to appear in $1.
2298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Also, notice that $1 is quoted twice, since we want the result to
2300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# be quoted.  Then you should understand that the argument of
230105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# patsubst is -=<{(STRING)}>=- (i.e., with additional -=<{( and )}>=-).
2302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This macro is safe on active symbols, i.e.:
2304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   m4_define(active, ACTIVE)
2305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   m4_split([active active ])end
2306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   => [active], [active], []end
230705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
230805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Optimize on regex of ` ' (space), since m4_foreach_w already guarantees
230905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# that the list contains single space separators, and a common case is
231005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# splitting a single-element list.  This macro is called frequently,
231105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# so avoid unnecessary dnl inside the definition.
2312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_split],
231305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [], [],
231405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$2], [ ], [m4_if(m4_index([$1], [ ]), [-1], [[[$1]]],
231505436638acc7c010349a69c3395f1a57c642dc62Ying Wang			 [_$0([$1], [$2], [, ])])],
231605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$2], [], [_$0([$1], [[	 ]+], [, ])],
231705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_$0([$1], [$2], [, ])])])
2318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([_m4_split],
232005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_changequote([-=<{(],[)}>=-])]dnl
232105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_bpatsubst(-=<{(-=<{($1)}>=-)}>=-, -=<{($2)}>=-,
232205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	       -=<{(]$3[)}>=-)]m4_changequote([, ])])
232305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
232405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
232505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_chomp(STRING)
232605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_chomp_all(STRING)
232705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------
232805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return STRING quoted, but without a trailing newline.  m4_chomp
232905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# removes at most one newline, while m4_chomp_all removes all
233005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# consecutive trailing newlines.  Embedded newlines are not touched,
233105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and a trailing backslash-newline leaves just a trailing backslash.
233205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
233305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_bregexp is slower than m4_index, and we don't always want to
233405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# remove all newlines; hence the two variants.  We massage characters
233505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to give a nicer pattern to match, particularly since m4_bregexp is
233605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# line-oriented.  Both versions must guarantee a match, to avoid bugs
233705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# with precision -1 in m4_format in older m4.
233805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_chomp],
233905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_format([[%.*s]], m4_index(m4_translit([[$1]], [
234005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/.], [/  ])[./.], [/.]), [$1])])
2341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
234205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_chomp_all],
234305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_format([[%.*s]], m4_bregexp(m4_translit([[$1]], [
234405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/], [/ ]), [/*$]), [$1])])
2345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_flatten(STRING)
2348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------------
2349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If STRING contains end of lines, replace them with spaces.  If there
2350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# are backslashed end of lines, remove them.  This macro is safe with
2351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# active symbols.
2352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    m4_define(active, ACTIVE)
2353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    m4_flatten([active
2354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    act\
2355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    ive])end
2356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => active activeend
235705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
235805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In m4, m4_bpatsubst is expensive, so first check for a newline.
2359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_flatten],
236005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(m4_index([$1], [
236105436638acc7c010349a69c3395f1a57c642dc62Ying Wang]), [-1], [[$1]],
236205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_translit(m4_bpatsubst([[[$1]]], [\\
2363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project]), [
236405436638acc7c010349a69c3395f1a57c642dc62Ying Wang], [ ])])])
2365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_strip(STRING)
2368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------
2369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Expands into STRING with tabs and spaces singled out into a single
2370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# space, and removing leading and trailing spaces.
2371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This macro is robust to active symbols.
2373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    m4_define(active, ACTIVE)
2374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    m4_strip([  active <tab> <tab>active ])end
2375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => active activeend
2376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
237705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# First, notice that we guarantee trailing space.  Why?  Because regular
237805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expressions are greedy, and `.* ?' would always group the space into the
237905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# .* portion.  The algorithm is simpler by avoiding `?' at the end.  The
238005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# algorithm correctly strips everything if STRING is just ` '.
2381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
238205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Then notice the second pattern: it is in charge of removing the
2383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# leading/trailing spaces.  Why not just `[^ ]'?  Because they are
238405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# applied to over-quoted strings, i.e. more or less [STRING], due
238505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to the limitations of m4_bpatsubsts.  So the leading space in STRING
238605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is the *second* character; equally for the trailing space.
2387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_strip],
238805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_bpatsubsts([$1 ],
2389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       [[	 ]+], [ ],
239005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	       [^. ?\(.*\) .$], [[[\1]]])])
2391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_normalize(STRING)
2394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------
2395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Apply m4_flatten and m4_strip to STRING.
2396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The argument is quoted, so that the macro is robust to active symbols:
2398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    m4_define(active, ACTIVE)
2400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    m4_normalize([  act\
2401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    ive
2402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    active ])end
2403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => active activeend
2404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_normalize],
2406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_strip(m4_flatten([$1]))])
2407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_join(SEP, ARG1, ARG2...)
2411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------------
241205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Produce ARG1SEPARG2...SEPARGn.  Avoid back-to-back SEP when a given ARG
241305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is the empty string.  No expansion is performed on SEP or ARGs.
241405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
241505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Since the number of arguments to join can be arbitrarily long, we
241605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# want to avoid having more than one $@ in the macro definition;
241705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# otherwise, the expansion would require twice the memory of the already
241805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# long list.  Hence, m4_join merely looks for the first non-empty element,
241905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and outputs just that element; while _m4_join looks for all non-empty
242005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elements, and outputs them following a separator.  The final trick to
242105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# note is that we decide between recursing with $0 or _$0 based on the
242205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# nested m4_if ending with `_'.
242305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
242405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
242505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_join],
242605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [1], [],
242705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [2], [[$2]],
242805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift2($@))])])
242905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_join],
243005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#$2], [2], [],
243105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift2($@))])])
243205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
243305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_joinall(SEP, ARG1, ARG2...)
243405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------
243505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Produce ARG1SEPARG2...SEPARGn.  An empty ARG results in back-to-back SEP.
243605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# No expansion is performed on SEP or ARGs.
243705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
243805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
243905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_joinall], [[$2]_$0([$1], m4_shift($@))])
244005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_joinall],
244105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [2], [], [[$1$3]$0([$1], m4_shift2($@))])])
2442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
244305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_combine([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX...)
244405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------------------------------------------
244505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Produce the pairwise combination of every element in the quoted,
244605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# comma-separated PREFIX-LIST with every element from the SUFFIX arguments.
244705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Each pair is joined with INFIX, and pairs are separated by SEPARATOR.
244805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# No expansion occurs on SEPARATOR, INFIX, or elements of either list.
244905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
245005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For example:
245105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
245205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   => a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
245305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
245405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This definition is a bit hairy; the thing to realize is that we want
245505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to construct m4_map_args_sep([[prefix$3]], [], [[$1]], m4_shift3($@))
245605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# as the inner loop, using each prefix generated by the outer loop,
245705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and without recalculating m4_shift3 every outer iteration.
245805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_combine],
245905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$2], [], [], m4_eval([$# > 3]), [1],
246005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_map_args_sep([m4_map_args_sep(m4_dquote(], [)[[$3]], [], [[$1]],]]]dnl
246105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_dquote(m4_dquote(m4_shift3($@)))[[)], [[$1]], $2)])])
2462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_append(MACRO-NAME, STRING, [SEPARATOR])
2465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------------------------------------
2466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Redefine MACRO-NAME to hold its former content plus `SEPARATOR`'STRING'
2467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# at the end.  It is valid to use this macro with MACRO-NAME undefined,
2468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# in which case no SEPARATOR is added.  Be aware that the criterion is
2469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# `not being defined', and not `not being empty'.
2470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
247105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Note that neither STRING nor SEPARATOR are expanded here; rather, when
247205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# you expand MACRO-NAME, they will be expanded at that point in time.
247305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
2474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This macro is robust to active symbols.  It can be used to grow
2475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# strings.
2476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
247705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_define(active, ACTIVE)dnl
247805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([sentence], [This is an])dnl
247905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([sentence], [ active ])dnl
248005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([sentence], [symbol.])dnl
2481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    | sentence
2482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    | m4_undefine([active])dnl
2483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    | sentence
2484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => This is an ACTIVE symbol.
2485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => This is an active symbol.
2486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# It can be used to define hooks.
2488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
248905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_define(active, ACTIVE)dnl
249005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([hooks], [m4_define([act1], [act2])])dnl
249105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([hooks], [m4_define([act2], [active])])dnl
249205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_undefine([active])dnl
2493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    | act1
2494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    | hooks
2495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    | act1
2496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => act1
2497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    =>
2498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    => active
249905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
250005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# It can also be used to create lists, although this particular usage was
250105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# broken prior to autoconf 2.62.
250205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([list], [one], [, ])dnl
250305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([list], [two], [, ])dnl
250405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_append([list], [three], [, ])dnl
250505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | list
250605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    | m4_dquote(list)
250705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    => one, two, three
250805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    => [one],[two],[three]
250905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
251005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Note that m4_append can benefit from amortized O(n) m4 behavior, if
251105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the underlying m4 implementation is smart enough to avoid copying existing
251205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# contents when enlarging a macro's definition into any pre-allocated storage
251305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (m4 1.4.x unfortunately does not implement this optimization).  We do
251405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# not implement m4_prepend, since it is inherently O(n^2) (pre-allocated
251505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# storage only occurs at the end of a macro, so the existing contents must
251605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# always be moved).
251705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
251805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Use _m4_defn for speed.
2519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_append],
252005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([$1], m4_ifdef([$1], [_m4_defn([$1])[$3]])[$2])])
2521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR], [IF-UNIQ], [IF-DUP])
252405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------------------------------------------------------
252505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like `m4_append', but append only if not yet present.  Additionally,
252605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expand IF-UNIQ if STRING was appended, or IF-DUP if STRING was already
252705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# present.  Also, warn if SEPARATOR is not empty and occurs within STRING,
252805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# as the algorithm no longer guarantees uniqueness.
252905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
253005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Note that while m4_append can be O(n) (depending on the quality of the
253105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# underlying M4 implementation), m4_append_uniq is inherently O(n^2)
253205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# because each append operation searches the entire string.
2533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_append_uniq],
253405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifval([$3], [m4_if(m4_index([$2], [$3]), [-1], [],
253505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		       [m4_warn([syntax],
253605436638acc7c010349a69c3395f1a57c642dc62Ying Wang				[$0: `$2' contains `$3'])])])_$0($@)])
253705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_append_uniq],
2538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_ifdef([$1],
253905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_if(m4_index([$3]_m4_defn([$1])[$3], [$3$2$3]), [-1],
254005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 [m4_append([$1], [$2], [$3])$4], [$5])],
254105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_define([$1], [$2])$4])])
254205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
254305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_append_uniq_w(MACRO-NAME, STRINGS)
254405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------------
254505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For each of the words in the whitespace separated list STRINGS, append
254605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# only the unique strings to the definition of MACRO-NAME.
254705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
254805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Use _m4_defn for speed.
254905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_append_uniq_w],
255005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_map_args_w([$2], [_m4_append_uniq([$1],], [, [ ])])])
255105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
255205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
255305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_escape(STRING)
255405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------
255505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Output quoted STRING, but with embedded #, $, [ and ] turned into
255605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# quadrigraphs.
255705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
255805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# It is faster to check if STRING is already good using m4_translit
255905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# than to blindly perform four m4_bpatsubst.
256005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
256105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Because the translit is stripping quotes, it must also neutralize
256205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# anything that might be in a macro name, as well as comments, commas,
256305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and parentheses.  All the problem characters are unified so that a
256405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# single m4_index can scan the result.
256505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
256605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rather than expand m4_defn every time m4_escape is expanded, we
256705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# inline its expansion up front.
256805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_escape],
256905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(m4_index(m4_translit([$1],
257005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   [[]#,()]]m4_dquote(m4_defn([m4_cr_symbols2]))[, [$$$]), [$]),
257105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [-1], [m4_echo], [_$0])([$1])])
257205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
257305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_escape],
257405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_changequote([-=<{(],[)}>=-])]dnl
257505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_bpatsubst(m4_bpatsubst(m4_bpatsubst(m4_bpatsubst(
257605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  -=<{(-=<{(-=<{(-=<{(-=<{($1)}>=-)}>=-)}>=-)}>=-)}>=-,
257705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	-=<{(#)}>=-, -=<{(@%:@)}>=-),
257805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      -=<{(\[)}>=-, -=<{(@<:@)}>=-),
257905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -=<{(\])}>=-, -=<{(@:>@)}>=-),
258005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -=<{(\$)}>=-, -=<{(@S|@)}>=-)m4_changequote([,])])
2581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH])
2584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------------------------------------------------------
2585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Expands into STRING wrapped to hold in WIDTH columns (default = 79).
2586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# If PREFIX is given, each line is prefixed with it.  If FIRST-PREFIX is
2587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# specified, then the first line is prefixed with it.  As a special case,
2588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if the length of FIRST-PREFIX is greater than that of PREFIX, then
2589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# FIRST-PREFIX will be left alone on the first line.
2590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
259105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# No expansion occurs on the contents STRING, PREFIX, or FIRST-PREFIX,
259205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# although quadrigraphs are correctly recognized.  More precisely,
259305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# you may redefine m4_qlen to recognize whatever escape sequences that
259405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# you will post-process.
259505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
2596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Typical outputs are:
2597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_text_wrap([Short string */], [   ], [/* ], 20)
2599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  => /* Short string */
2600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_text_wrap([Much longer string */], [   ], [/* ], 20)
2602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  => /* Much longer
2603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  =>    string */
2604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_text_wrap([Short doc.], [          ], [  --short ], 30)
2606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  =>   --short Short doc.
2607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_text_wrap([Short doc.], [          ], [  --too-wide ], 30)
2609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  =>   --too-wide
2610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  =>           Short doc.
2611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_text_wrap([Super long documentation.], [          ], [  --too-wide ], 30)
2613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  =>   --too-wide
2614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  =>      Super long
2615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  =>      documentation.
2616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# FIXME: there is no checking of a longer PREFIX than WIDTH, but do
2618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# we really want to bother with people trying each single corner
2619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# of a software?
2620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
262105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro does not leave a trailing space behind the last word of a line,
262205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# which complicates it a bit.  The algorithm is otherwise stupid and simple:
262305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# all the words are preceded by m4_Separator which is defined to empty for
262405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the first word, and then ` ' (single space) for all the others.
262505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
262605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The algorithm uses a helper that uses $2 through $4 directly, rather than
262705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# using local variables, to avoid m4_defn overhead, or expansion swallowing
262805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# any $.  It also bypasses m4_popdef overhead with _m4_popdef since no user
262905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# macro expansion occurs in the meantime.  Also, the definition is written
263005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# with m4_do, to avoid time wasted on dnl during expansion (since this is
263105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# already a time-consuming macro).
2632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_text_wrap],
263305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_$0(m4_escape([$1]), [$2], m4_default_quoted([$3], [$2]),
263405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     m4_default_quoted([$4], [79]))])
263505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
263605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_text_wrap],
263705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_do(dnl set up local variables, to avoid repeated calculations
263805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_pushdef([m4_Indent], m4_qlen([$2]))]],
263905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_pushdef([m4_Cursor], m4_qlen([$3]))]],
264005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_pushdef([m4_Separator], [m4_define([m4_Separator], [ ])])]],
264105436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl expand the first prefix, then check its length vs. regular prefix
264205436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl same length: nothing special
264305436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl prefix1 longer: output on line by itself, and reset cursor
264405436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl prefix1 shorter: pad to length of prefix, and reset cursor
264505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[[$3]m4_cond([m4_Cursor], m4_Indent, [],
264605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      [m4_eval(m4_Cursor > m4_Indent)], [1], [
264705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[$2]m4_define([m4_Cursor], m4_Indent)],
264805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      [m4_format([%*s], m4_max([0],
264905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  m4_eval(m4_Indent - m4_Cursor)), [])m4_define([m4_Cursor], m4_Indent)])]],
265005436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl now, for each word, compute the cursor after the word is output, then
265105436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl check if the cursor would exceed the wrap column
265205436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl if so, reset cursor, and insert newline and prefix
265305436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl if not, insert the separator (usually a space)
265405436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl either way, insert the word
265505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_map_args_w([$1], [$0_word(], [, [$2], [$4])])]],
265605436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl finally, clean up the local variables
265705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[_m4_popdef([m4_Separator], [m4_Cursor], [m4_Indent])]]))
265805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
265905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_text_wrap_word],
266005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([m4_Cursor], m4_eval(m4_Cursor + m4_qlen([$1]) + 1))]dnl
266105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if(m4_eval(m4_Cursor > ([$3])),
266205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [1], [m4_define([m4_Cursor], m4_eval(m4_Indent + m4_qlen([$1]) + 1))
266305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[$2]],
266405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [m4_Separator[]])[$1]])
2665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_text_box(MESSAGE, [FRAME-CHARACTER = `-'])
2667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------------------------------------
266805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Turn MESSAGE into:
266905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  ## ------- ##
267005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  ## MESSAGE ##
267105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  ## ------- ##
267205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# using FRAME-CHARACTER in the border.
267305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
267405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Quadrigraphs are correctly recognized.  More precisely, you may
267505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# redefine m4_qlen to recognize whatever escape sequences that you
267605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# will post-process.
2677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_text_box],
267805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([m4_Border],
267905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    m4_translit(m4_format([[[%*s]]], m4_decr(m4_qlen(_m4_expand([$1
268005436638acc7c010349a69c3395f1a57c642dc62Ying Wang]))), []), [ ], m4_default_quoted([$2], [-])))]dnl
268105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[##] _m4_defn([m4_Border]) [##]
268205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[##] $1 [##]
268305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[##] _m4_defn([m4_Border]) [##]_m4_popdef([m4_Border])])
2684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_qlen(STRING)
2687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ---------------
2688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Expands to the length of STRING after autom4te converts all quadrigraphs.
268905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
269005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If you use some other means of post-processing m4 output rather than
269105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# autom4te, then you may redefine this macro to recognize whatever
269205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# escape sequences your post-processor will handle.  For that matter,
269305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_define([m4_qlen], m4_defn([m4_len])) is sufficient if you don't
269405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# do any post-processing.
269505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
269605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Avoid bpatsubsts for the common case of no quadrigraphs.  Cache
269705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# results, as configure scripts tend to ask about lengths of common
269805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# strings like `/*' and `*/' rather frequently.  Minimize the number
269905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# of times that $1 occurs in m4_qlen, so there is less text to parse
270005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# on a cache hit.
2701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_qlen],
270205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([$0-$1], [_m4_defn([$0-]], [_$0(])[$1])])
270305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_qlen],
270405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([m4_qlen-$1],
270505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_if(m4_index([$1], [@]), [-1], [m4_len([$1])],
270605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [m4_len(m4_bpatsubst([[$1]],
270705436638acc7c010349a69c3395f1a57c642dc62Ying Wang			   [@\(\(<:\|:>\|S|\|%:\|\{:\|:\}\)\(@\)\|&t@\)],
270805436638acc7c010349a69c3395f1a57c642dc62Ying Wang			   [\3]))]))_m4_defn([m4_qlen-$1])])
270905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
271005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_copyright_condense(TEXT)
271105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------
271205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Condense the copyright notice in TEXT to only display the final
271305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# year, wrapping the results to fit in 80 columns.
271405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_copyright_condense],
271505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_text_wrap(m4_bpatsubst(m4_flatten([[$1]]),
271605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[(C)[-	 ,0-9]*\([1-9][0-9][0-9][0-9]\)], [(C) \1]))])
2717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ----------------------- ##
271905436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 13. Number processing.  ##
2720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ----------------------- ##
2721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_cmp(A, B)
2723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ------------
272405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Compare two integer expressions.
2725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# A < B -> -1
2726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# A = B ->  0
2727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# A > B ->  1
2728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_cmp],
272905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_eval((([$1]) > ([$2])) - (([$1]) < ([$2])))])
2730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_list_cmp(A, B)
2733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -----------------
2734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
273505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Compare the two lists of integer expressions A and B.  For instance:
273605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([1, 0],     [1])    ->  0
273705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([1, 0],     [1, 0]) ->  0
273805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([1, 2],     [1, 0]) ->  1
273905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([1, 2, 3],  [1, 2]) ->  1
274005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([1, 2, -3], [1, 2]) -> -1
274105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([1, 0],     [1, 2]) -> -1
274205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([1],        [1, 2]) -> -1
274305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_define([xa], [oops])dnl
274405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_list_cmp([[0xa]],    [5+5])  -> 0
274505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
274605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rather than face the overhead of m4_case, we use a helper function whose
274705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# expansion includes the name of the macro to invoke on the tail, either
274805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_ignore or m4_unquote.  This is particularly useful when comparing
274905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# long lists, since less text is being expanded for deciding when to end
275005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# recursion.  The recursion is between a pair of macros that alternate
275105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# which list is trimmed by one element; this is more efficient than
275205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# calling m4_cdr on both lists from a single macro.  Guarantee exactly
275305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# one expansion of both lists' side effects.
275405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
275505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
2756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_list_cmp],
275705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_$0_raw(m4_dquote($1), m4_dquote($2))])
275805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
275905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_list_cmp_raw],
276005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [$2], [0], [_m4_list_cmp_1([$1], $2)])])
276105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
276205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_list_cmp],
276305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [], [0m4_ignore], [$2], [0], [m4_unquote], [$2m4_ignore])])
276405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
276505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_list_cmp_1],
276605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_list_cmp_2([$2], [m4_shift2($@)], $1)])
276705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
276805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_list_cmp_2],
276905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_list_cmp([$1$3], m4_cmp([$3+0], [$1+0]))(
277005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [_m4_list_cmp_1(m4_dquote(m4_shift3($@)), $2)])])
277105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
277205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_max(EXPR, ...)
277305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_min(EXPR, ...)
277405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------
277505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Return the decimal value of the maximum (or minimum) in a series of
277605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# integer expressions.
277705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
277805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# M4 1.4.x doesn't provide ?:.  Hence this huge m4_eval.  Avoid m4_eval
277905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if both arguments are identical, but be aware of m4_max(0xa, 10) (hence
278005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the use of <=, not just <, in the second multiply).
278105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
278205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
278305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_max],
278405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
278505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_eval([$1])],
278605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#$1], [2$2], [m4_eval([$1])],
278705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [2], [_$0($@)],
278805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_m4_minmax([_$0], $@)])])
278905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
279005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_max],
279105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_eval((([$1]) > ([$2])) * ([$1]) + (([$1]) <= ([$2])) * ([$2]))])
279205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
279305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_min],
279405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
279505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [1], [m4_eval([$1])],
279605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#$1], [2$2], [m4_eval([$1])],
279705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$#], [2], [_$0($@)],
279805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [_m4_minmax([_$0], $@)])])
279905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
280005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_min],
280105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_eval((([$1]) < ([$2])) * ([$1]) + (([$1]) >= ([$2])) * ([$2]))])
280205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
280305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_minmax(METHOD, ARG1, ARG2...)
280405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------
280505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Common recursion code for m4_max and m4_min.  METHOD must be _m4_max
280605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# or _m4_min, and there must be at least two arguments to combine.
280705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
280805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
280905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_minmax],
281005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [3], [$1([$2], [$3])],
281105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [$0([$1], $1([$2], [$3]), m4_shift3($@))])])
281205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
281305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
281405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_sign(A)
281505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------
281605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The sign of the integer expression A.
281705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_sign],
281805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_eval((([$1]) > 0) - (([$1]) < 0))])
2819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------ ##
282305436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 14. Version processing.  ##
2824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------ ##
2825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_version_unletter(VERSION)
2828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------
282905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Normalize beta version numbers with letters to numeric expressions, which
283005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# can then be handed to m4_eval for the purpose of comparison.
2831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
2832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   Nl -> (N+1).-1.(l#)
2833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
283405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# for example:
283505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   [2.14a] -> [0,2,14+1,-1,[0r36:a]] -> 2.15.-1.10
283605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   [2.14b] -> [0,2,15+1,-1,[0r36:b]] -> 2.15.-1.11
283705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   [2.61aa.b] -> [0,2.61,1,-1,[0r36:aa],+1,-1,[0r36:b]] -> 2.62.-1.370.1.-1.11
283805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   [08] -> [0,[0r10:0]8] -> 8
283905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
284005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This macro expects reasonable version numbers, but can handle double
284105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# letters and does not expand any macros.  Original version strings can
284205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# use both `.' and `-' separators.
284305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
284405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Inline constant expansions, to avoid m4_defn overhead.
284505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_version_unletter is the real workhorse used by m4_version_compare,
284605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# but since [0r36:a] and commas are less readable than 10 and dots, we
284705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# provide a wrapper for human use.
2848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_version_unletter],
284905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_substr(m4_map_args([.m4_eval], m4_unquote(_$0([$1]))), [3])])
285005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_version_unletter],
285105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_bpatsubst(m4_bpatsubst(m4_translit([[[[0,$1]]]], [.-], [,,]),]dnl
285205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_dquote(m4_dquote(m4_defn([m4_cr_Letters])))[[+],
285305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      [+1,-1,[0r36:\&]]), [,0], [,[0r10:0]])])
2854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_version_compare(VERSION-1, VERSION-2)
2857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------------------
2858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Compare the two version numbers and expand into
2859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  -1 if VERSION-1 < VERSION-2
2860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   0 if           =
2861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   1 if           >
286205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
286305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Since _m4_version_unletter does not output side effects, we can
286405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# safely bypass the overhead of m4_version_cmp.
2865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_version_compare],
286605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_list_cmp_raw(_m4_version_unletter([$1]), _m4_version_unletter([$2]))])
2867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_PACKAGE_NAME
2870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_PACKAGE_TARNAME
2871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_PACKAGE_VERSION
2872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_PACKAGE_STRING
2873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_PACKAGE_BUGREPORT
2874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# --------------------
287505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If m4sugar/version.m4 is present, then define version strings.  This
287605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# file is optional, provided by Autoconf but absent in Bison.
287705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_sinclude([m4sugar/version.m4])
2878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL])
2881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------------------------------
2882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Check this Autoconf version against VERSION.
2883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_version_prereq],
288405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_ifdef([m4_PACKAGE_VERSION],
288505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_if(m4_version_compare(]m4_dquote(m4_defn([m4_PACKAGE_VERSION]))[, [$1]),
288605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	[-1],
288705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	[m4_default([$3],
288805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [m4_fatal([Autoconf version $1 or higher is required],
288905436638acc7c010349a69c3395f1a57c642dc62Ying Wang			      [63])])],
289005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	[$2])]],
289105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[m4_fatal([m4sugar/version.m4 not found])]]))
289205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
289305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
289405436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ------------------ ##
289505436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 15. Set handling.  ##
289605436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ------------------ ##
289705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
289805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Autoconf likes to create arbitrarily large sets; for example, as of
289905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# this writing, the configure.ac for coreutils tracks a set of more
290005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# than 400 AC_SUBST.  How do we track all of these set members,
290105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# without introducing duplicates?  We could use m4_append_uniq, with
290205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the set NAME residing in the contents of the macro NAME.
290305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Unfortunately, m4_append_uniq is quadratic for set creation, because
290405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it costs O(n) to search the string for each of O(n) insertions; not
290505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to mention that with m4 1.4.x, even using m4_append is slow, costing
290605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# O(n) rather than O(1) per insertion.  Other set operations, not used
290705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# by Autoconf but still possible by manipulation of the definition
290805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# tracked in macro NAME, include O(n) deletion of one element and O(n)
290905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# computation of set size.  Because the set is exposed to the user via
291005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the definition of a single macro, we cannot cache any data about the
291105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# set without risking the cache being invalidated by the user
291205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# redefining NAME.
291305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
291405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Can we do better?  Yes, because m4 gives us an O(1) search function
291505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# for free: ifdef.  Additionally, even m4 1.4.x gives us an O(1)
291605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# insert operation for free: pushdef.  But to use these, we must
291705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# represent the set via a group of macros; to keep the set consistent,
291805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# we must hide the set so that the user can only manipulate it through
291905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# accessor macros.  The contents of the set are maintained through two
292005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# access points; _m4_set([name]) is a pushdef stack of values in the
292105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# set, useful for O(n) traversal of the set contents; while the
292205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# existence of _m4_set([name],value) with no particular value is
292305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# useful for O(1) querying of set membership.  And since the user
292405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# cannot externally manipulate the set, we are free to add additional
292505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# caching macros for other performance improvements.  Deletion can be
292605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# O(1) per element rather than O(n), by reworking the definition of
292705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set([name],value) to be 0 or 1 based on current membership, and
292805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# adding _m4_set_cleanup(name) to defer the O(n) cleanup of
292905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set([name]) until we have another reason to do an O(n)
293005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# traversal.  The existence of _m4_set_cleanup(name) can then be used
293105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elsewhere to determine if we must dereference _m4_set([name],value),
293205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# or assume that definition implies set membership.  Finally, size can
293305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# be tracked in an O(1) fashion with _m4_set_size(name).
293405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
293505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# The quoting in _m4_set([name],value) is chosen so that there is no
293605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ambiguity with a set whose name contains a comma, and so that we can
293705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# supply the value via _m4_defn([_m4_set([name])]) without needing any
293805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# quote manipulation.
293905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
294005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_add(SET, VALUE, [IF-UNIQ], [IF-DUP])
294105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------------------
294205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Add VALUE as an element of SET.  Expand IF-UNIQ on the first
294305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# addition, and IF-DUP if it is already in the set.  Addition of one
294405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# element is O(1), such that overall set creation is O(n).
294505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
294605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# We do not want to add a duplicate for a previously deleted but
294705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# unpruned element, but it is just as easy to check existence directly
294805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# as it is to query _m4_set_cleanup($1).
294905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_add],
295005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set([$1],$2)],
295105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_if(m4_indir([_m4_set([$1],$2)]), [0],
295205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 [m4_define([_m4_set([$1],$2)],
295305436638acc7c010349a69c3395f1a57c642dc62Ying Wang			    [1])_m4_set_size([$1], [m4_incr])$3], [$4])],
295405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_define([_m4_set([$1],$2)],
295505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     [1])m4_pushdef([_m4_set([$1])],
295605436638acc7c010349a69c3395f1a57c642dc62Ying Wang				    [$2])_m4_set_size([$1], [m4_incr])$3])])
295705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
295805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_add_all(SET, VALUE...)
295905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------------
296005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Add each VALUE into SET.  This is O(n) in the number of VALUEs, and
296105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# can be faster than calling m4_set_add for each VALUE.
296205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
296305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Implement two recursion helpers; the check variant is slower but
296405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# handles the case where an element has previously been removed but
296505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# not pruned.  The recursion helpers ignore their second argument, so
296605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# that we can use the faster m4_shift2 and 2 arguments, rather than
296705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_shift2 and one argument, as the signal to end recursion.
296805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
296905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Please keep foreach.m4 in sync with any adjustments made here.
297005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_add_all],
297105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1])
297205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  + m4_len(m4_ifdef([_m4_set_cleanup($1)], [_$0_check], [_$0])([$1], $@))))])
297305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
297405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_add_all],
297505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [2], [],
297605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_ifdef([_m4_set([$1],$3)], [],
297705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 [m4_define([_m4_set([$1],$3)], [1])m4_pushdef([_m4_set([$1])],
297805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   [$3])-])$0([$1], m4_shift2($@))])])
297905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
298005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_add_all_check],
298105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$#], [2], [],
298205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_set_add([$1], [$3])$0([$1], m4_shift2($@))])])
298305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
298405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_contains(SET, VALUE, [IF-PRESENT], [IF-ABSENT])
298505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------------------------------------
298605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand IF-PRESENT if SET contains VALUE, otherwise expand IF-ABSENT.
298705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This is always O(1).
298805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_contains],
298905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set_cleanup($1)],
299005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_if(m4_ifdef([_m4_set([$1],$2)],
299105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [m4_indir([_m4_set([$1],$2)])], [0]), [1], [$3], [$4])],
299205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_ifdef([_m4_set([$1],$2)], [$3], [$4])])])
299305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
299405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_contents(SET, [SEP])
299505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------
299605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand to a single string containing all the elements in SET,
299705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# separated by SEP, without modifying SET.  No provision is made for
299805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# disambiguating set elements that contain non-empty SEP as a
299905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# sub-string, or for recognizing a set that contains only the empty
300005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# string.  Order of the output is not guaranteed.  If any elements
300105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# have been previously removed from the set, this action will prune
300205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the unused memory.  This is O(n) in the size of the set before
300305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# pruning.
300405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
300505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Use _m4_popdef for speed.  The existence of _m4_set_cleanup($1)
300605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# determines which version of _1 helper we use.
300705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_contents],
300805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_map_sep([$1], [], [], [[$2]])])
300905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
301005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set_contents_1(SET)
301105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set_contents_1c(SET)
301205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set_contents_2(SET, [PRE], [POST], [SEP])
301305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ---------------------------------------------
301405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand to a list of quoted elements currently in the set, each
301505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# surrounded by PRE and POST, and moving SEP in front of PRE on
301605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# recursion.  To avoid nesting limit restrictions, the algorithm must
301705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# be broken into two parts; _1 destructively copies the stack in
301805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# reverse into _m4_set_($1), producing no output; then _2
301905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# destructively copies _m4_set_($1) back into the stack in reverse.
302005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If no elements were deleted, then this visits the set in the order
302105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# that elements were inserted.  Behavior is undefined if PRE/POST/SEP
302205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# tries to recursively list or modify SET in any way other than
302305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# calling m4_set_remove on the current element.  Use _1 if all entries
302405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# in the stack are guaranteed to be in the set, and _1c to prune
302505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# removed entries.  Uses _m4_defn and _m4_popdef for speed.
302605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_contents_1],
302705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([_m4_set([$1])], [_m4_set_($1)])])
302805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
302905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_contents_1c],
303005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set([$1])],
303105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_set_contains([$1], _m4_defn([_m4_set([$1])]),
303205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   [m4_pushdef([_m4_set_($1)], _m4_defn([_m4_set([$1])]))],
303305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   [_m4_popdef([_m4_set([$1],]_m4_defn(
303405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [_m4_set([$1])])[)])])_m4_popdef([_m4_set([$1])])$0([$1])],
303505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [_m4_popdef([_m4_set_cleanup($1)])])])
303605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
303705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_contents_2],
303805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[_m4_stack_reverse([_m4_set_($1)], [_m4_set([$1])],
303905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [$2[]_m4_defn([_m4_set_($1)])$3], [$4[]])])
304005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
304105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_delete(SET)
304205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------
304305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Delete all elements in SET, and reclaim any memory occupied by the
304405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# set.  This is O(n) in the set size.
304505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
304605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Use _m4_defn and _m4_popdef for speed.
304705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_delete],
304805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set([$1])],
304905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [_m4_popdef([_m4_set([$1],]_m4_defn([_m4_set([$1])])[)],
305005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		      [_m4_set([$1])])$0([$1])],
305105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_ifdef([_m4_set_cleanup($1)],
305205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [_m4_popdef([_m4_set_cleanup($1)])])m4_ifdef(
305305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [_m4_set_size($1)],
305405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [_m4_popdef([_m4_set_size($1)])])])])
305505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
305605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_difference(SET1, SET2)
305705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------------
305805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Produce a LIST of quoted elements that occur in SET1 but not SET2.
305905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Output a comma prior to any elements, to distinguish the empty
306005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# string from no elements.  This can be directly used as a series of
306105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# arguments, such as for m4_join, or wrapped inside quotes for use in
306205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_foreach.  Order of the output is not guaranteed.
306305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
306405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Short-circuit the idempotence relation.
306505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_difference],
306605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [$2], [], [m4_set_map_sep([$1], [_$0([$2],], [)])])])
306705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
306805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_difference],
306905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_contains([$1], [$2], [], [,[$2]])])
307005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
307105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_dump(SET, [SEP])
307205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------
307305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand to a single string containing all the elements in SET,
307405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# separated by SEP, then delete SET.  In general, if you only need to
307505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# list the contents once, this is faster than m4_set_contents.  No
307605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# provision is made for disambiguating set elements that contain
307705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# non-empty SEP as a sub-string.  Order of the output is not
307805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# guaranteed.  This is O(n) in the size of the set before pruning.
307905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
308005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Use _m4_popdef for speed.  Use existence of _m4_set_cleanup($1) to
308105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# decide if more expensive recursion is needed.
308205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_dump],
308305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set_size($1)],
308405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [_m4_popdef([_m4_set_size($1)])])m4_ifdef([_m4_set_cleanup($1)],
308505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    [_$0_check], [_$0])([$1], [], [$2])])
308605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
308705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set_dump(SET, [SEP], [PREP])
308805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set_dump_check(SET, [SEP], [PREP])
308905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------------------------
309005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Print SEP and the current element, then delete the element and
309105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# recurse with empty SEP changed to PREP.  The check variant checks
309205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# whether the element has been previously removed.  Use _m4_defn and
309305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_popdef for speed.
309405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_dump],
309505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set([$1])],
309605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [[$2]_m4_defn([_m4_set([$1])])_m4_popdef([_m4_set([$1],]_m4_defn(
309705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		[_m4_set([$1])])[)], [_m4_set([$1])])$0([$1], [$2$3])])])
309805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
309905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_dump_check],
310005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set([$1])],
310105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_set_contains([$1], _m4_defn([_m4_set([$1])]),
310205436638acc7c010349a69c3395f1a57c642dc62Ying Wang			   [[$2]_m4_defn([_m4_set([$1])])])_m4_popdef(
310305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    [_m4_set([$1],]_m4_defn([_m4_set([$1])])[)],
310405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    [_m4_set([$1])])$0([$1], [$2$3])],
310505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [_m4_popdef([_m4_set_cleanup($1)])])])
310605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
310705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_empty(SET, [IF-EMPTY], [IF-ELEMENTS])
310805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------------------------------
310905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand IF-EMPTY if SET has no elements, otherwise IF-ELEMENTS.
311005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_empty],
311105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set_size($1)],
311205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [m4_if(m4_indir([_m4_set_size($1)]), [0], [$2], [$3])], [$2])])
311305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
311405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_foreach(SET, VAR, ACTION)
311505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# --------------------------------
311605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For each element of SET, define VAR to the element and expand
311705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ACTION.  ACTION should not recursively list SET's contents, add
311805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elements to SET, nor delete any element from SET except the one
311905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# currently in VAR.  The order that the elements are visited in is not
312005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# guaranteed.  This is faster than the corresponding m4_foreach([VAR],
312105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION])
312205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_foreach],
312305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_pushdef([$2])m4_set_map_sep([$1], [m4_define([$2],], [)$3])])
312405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
312505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_intersection(SET1, SET2)
312605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------------
312705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Produce a LIST of quoted elements that occur in both SET1 or SET2.
312805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Output a comma prior to any elements, to distinguish the empty
312905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# string from no elements.  This can be directly used as a series of
313005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# arguments, such as for m4_join, or wrapped inside quotes for use in
313105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_foreach.  Order of the output is not guaranteed.
313205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
313305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Iterate over the smaller set, and short-circuit the idempotence
313405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# relation.
313505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_intersection],
313605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_if([$1], [$2], [m4_set_listc([$1])],
313705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       m4_eval(m4_set_size([$2]) < m4_set_size([$1])), [1], [$0([$2], [$1])],
313805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       [m4_set_map_sep([$1], [_$0([$2],], [)])])])
313905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
314005436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_intersection],
314105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_contains([$1], [$2], [,[$2]])])
314205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
314305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_list(SET)
314405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_listc(SET)
314505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------
314605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Produce a LIST of quoted elements of SET.  This can be directly used
314705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# as a series of arguments, such as for m4_join or m4_set_add_all, or
314805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# wrapped inside quotes for use in m4_foreach or m4_map.  With
314905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_list, there is no way to distinguish an empty set from a set
315005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# containing only the empty string; with m4_set_listc, a leading comma
315105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is output if there are any elements.
315205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_list],
315305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_map_sep([$1], [], [], [,])])
315405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
315505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_listc],
315605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_map_sep([$1], [,])])
315705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
315805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_map(SET, ACTION)
315905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------
316005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For each element of SET, expand ACTION with a single argument of the
316105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# current element.  ACTION should not recursively list SET's contents,
316205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# add elements to SET, nor delete any element from SET except the one
316305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# passed as an argument.  The order that the elements are visited in
316405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is not guaranteed.  This is faster than either of the corresponding
316505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_map_args([ACTION]m4_set_listc([SET]))
316605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   m4_set_foreach([SET], [VAR], [ACTION(m4_defn([VAR]))])
316705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_map],
316805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_map_sep([$1], [$2(], [)])])
316905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
317005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_map_sep(SET, [PRE], [POST], [SEP])
317105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -----------------------------------------
317205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# For each element of SET, expand PRE[value]POST[], and expand SEP
317305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# between elements.
317405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_map_sep],
317505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set_cleanup($1)], [_m4_set_contents_1c],
317605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  [_m4_set_contents_1])([$1])_m4_set_contents_2($@)])
3177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
317805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_remove(SET, VALUE, [IF-PRESENT], [IF-ABSENT])
317905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------------------------------------------
318005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If VALUE is an element of SET, delete it and expand IF-PRESENT.
318105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Otherwise expand IF-ABSENT.  Deleting a single value is O(1),
318205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# although it leaves memory occupied until the next O(n) traversal of
318305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the set which will compact the set.
318405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
318505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Optimize if the element being removed is the most recently added,
318605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# since defining _m4_set_cleanup($1) slows down so many other macros.
318705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In particular, this plays well with m4_set_foreach and m4_set_map.
318805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_remove],
318905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_contains([$1], [$2], [_m4_set_size([$1],
319005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    [m4_decr])m4_if(_m4_defn([_m4_set([$1])]), [$2],
319105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [_m4_popdef([_m4_set([$1],$2)], [_m4_set([$1])])],
319205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [m4_define([_m4_set_cleanup($1)])m4_define(
319305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		      [_m4_set([$1],$2)], [0])])$3], [$4])])
319405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
319505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_size(SET)
319605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ----------------
319705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Expand to the number of elements currently in SET.  This operation
319805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is O(1), and thus more efficient than m4_count(m4_set_list([SET])).
319905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_size],
320005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set_size($1)], [m4_indir([_m4_set_size($1)])], [0])])
320105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
320205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_set_size(SET, ACTION)
320305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# -------------------------
320405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ACTION must be either m4_incr or m4_decr, and the size of SET is
320505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# changed accordingly.  If the set is empty, ACTION must not be
320605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_decr.
320705436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_size],
320805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_define([_m4_set_size($1)],
320905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   m4_ifdef([_m4_set_size($1)], [$2(m4_indir([_m4_set_size($1)]))],
321005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    [1]))])
321105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
321205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_set_union(SET1, SET2)
321305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ------------------------
321405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Produce a LIST of double quoted elements that occur in either SET1
321505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# or SET2, without duplicates.  Output a comma prior to any elements,
321605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# to distinguish the empty string from no elements.  This can be
321705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# directly used as a series of arguments, such as for m4_join, or
321805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# wrapped inside quotes for use in m4_foreach.  Order of the output is
321905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# not guaranteed.
322005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
322105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# We can rely on the fact that m4_set_listc prunes SET1, so we don't
322205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# need to check _m4_set([$1],element) for 0.  Short-circuit the
322305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# idempotence relation.
322405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_set_union],
322505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_set_listc([$1])m4_if([$1], [$2], [],
322605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [m4_set_map_sep([$2], [_$0([$1],], [)])])])
322705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
322805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([_m4_set_union],
322905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_ifdef([_m4_set([$1],$2)], [], [,[$2]])])
3230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------- ##
323305436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 16. File handling.  ##
3234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------- ##
3235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# It is a real pity that M4 comes with no macros to bind a diversion
3238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# to a file.  So we have to deal without, which makes us a lot more
323905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# fragile than we should.
3240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_file_append(FILE-NAME, CONTENT)
3243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ----------------------------------
3244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_file_append],
3245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[m4_syscmd([cat >>$1 <<_m4eof
3246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$2
3247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_m4eof
3248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project])
3249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_if(m4_sysval, [0], [],
3250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      [m4_fatal([$0: cannot write: $1])])])
3251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------ ##
325505436638acc7c010349a69c3395f1a57c642dc62Ying Wang## 17. Setting M4sugar up.  ##
3256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project## ------------------------ ##
3257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
325805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# _m4_divert_diversion should be defined.
325905436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_divert_push([KILL])
3260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# m4_init
3262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# -------
326305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Initialize the m4sugar language.
3264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_define([m4_init],
3265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[# All the M4sugar macros start with `m4_', except `dnl' kept as is
3266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# for sake of simplicity.
3267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_pattern_forbid([^_?m4_])
3268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectm4_pattern_forbid([^dnl$])
3269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
327005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# If __m4_version__ is defined, we assume that we are being run by M4
327105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 1.6 or newer, thus $@ recursion is linear, and debugmode(+do)
327205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# is available for faster checks of dereferencing undefined macros
327305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# and forcing dumpdef to print to stderr regardless of debugfile.
327405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# But if it is missing, we assume we are being run by M4 1.4.x, that
327505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# $@ recursion is quadratic, and that we need foreach-based
327605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# replacement macros.  Also, m4 prior to 1.4.8 loses track of location
327705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# during m4wrap text; __line__ should never be 0.
327805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
327905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Use the raw builtin to avoid tripping up include tracing.
328005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Meanwhile, avoid m4_copy, since it temporarily undefines m4_defn.
328105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_ifdef([__m4_version__],
328205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_debugmode([+do])
328305436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_defn], _m4_defn([_m4_defn]))
328405436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_dumpdef], _m4_defn([_m4_dumpdef]))
328505436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_popdef], _m4_defn([_m4_popdef]))
328605436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_define([m4_undefine], _m4_defn([_m4_undefine]))],
328705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[m4_builtin([include], [m4sugar/foreach.m4])
328805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_wrap_lifo([m4_if(__line__, [0], [m4_pushdef([m4_location],
328905436638acc7c010349a69c3395f1a57c642dc62Ying Wang]]m4_dquote(m4_dquote(m4_dquote(__file__:__line__)))[[)])])])
329005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
329105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Rewrite the first entry of the diversion stack.
329205436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_divert([KILL])
3293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
329405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Check the divert push/pop perfect balance.
329505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Some users are prone to also use m4_wrap to register last-minute
329605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# m4_divert_text; so after our diversion cleanups, we restore
329705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# KILL as the bottom of the diversion stack.
329805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_wrap([m4_popdef([_m4_divert_diversion])m4_ifdef(
329905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  [_m4_divert_diversion], [m4_fatal([$0: unbalanced m4_divert_push:
330005436638acc7c010349a69c3395f1a57c642dc62Ying Wang]m4_divert_stack)])_m4_popdef([_m4_divert_stack])m4_divert_push([KILL])])
3301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project])
3302