mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Resync m4sugar from autoconf.
* data/m4sugar/m4sugar.m4 (m4_defn, m4_popdef, m4_undefine) (m4_init): Adjust to latest m4.git changes. (m4_mapall_sep, _m4_list_cmp, m4_version_compare): Reduce side effects. * data/m4sugar/foreach.m4 (_m4_shiftn): Fix off-by-one bug. (_m4_list_cmp): Reduce side effects. Signed-off-by: Eric Blake <ebb9@byu.net>
This commit is contained in:
10
ChangeLog
10
ChangeLog
@@ -1,3 +1,13 @@
|
|||||||
|
2008-08-27 Eric Blake <ebb9@byu.net>
|
||||||
|
|
||||||
|
Resync m4sugar from autoconf.
|
||||||
|
* data/m4sugar/m4sugar.m4 (m4_defn, m4_popdef, m4_undefine)
|
||||||
|
(m4_init): Adjust to latest m4.git changes.
|
||||||
|
(m4_mapall_sep, _m4_list_cmp, m4_version_compare): Reduce side
|
||||||
|
effects.
|
||||||
|
* data/m4sugar/foreach.m4 (_m4_shiftn): Fix off-by-one bug.
|
||||||
|
(_m4_list_cmp): Reduce side effects.
|
||||||
|
|
||||||
2008-08-27 Akim Demaille <demaille@gostai.com>
|
2008-08-27 Akim Demaille <demaille@gostai.com>
|
||||||
|
|
||||||
Check yyerrok in calc.at.
|
Check yyerrok in calc.at.
|
||||||
|
|||||||
@@ -74,6 +74,8 @@
|
|||||||
# are not future-proof. Thus, this file is conditionally included as
|
# are not future-proof. Thus, this file is conditionally included as
|
||||||
# part of m4_init(), only when it is detected that M4 probably has
|
# part of m4_init(), only when it is detected that M4 probably has
|
||||||
# quadratic behavior (ie. it lacks the macro __m4_version__).
|
# quadratic behavior (ie. it lacks the macro __m4_version__).
|
||||||
|
#
|
||||||
|
# Please keep this file in sync with m4sugar.m4.
|
||||||
|
|
||||||
# m4_foreach(VARIABLE, LIST, EXPRESSION)
|
# m4_foreach(VARIABLE, LIST, EXPRESSION)
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
@@ -211,9 +213,9 @@ m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$$1], [$$2]))]])
|
|||||||
# ,[$5],[$6],...,[$m]_m4_popdef([_m4_s])
|
# ,[$5],[$6],...,[$m]_m4_popdef([_m4_s])
|
||||||
# before calling m4_shift(_m4_s($@)).
|
# before calling m4_shift(_m4_s($@)).
|
||||||
m4_define([_m4_shiftn],
|
m4_define([_m4_shiftn],
|
||||||
[m4_define([_m4_s],
|
[m4_if(m4_incr([$1]), [$#], [], [m4_define([_m4_s],
|
||||||
m4_pushdef([_m4_s])_m4_for([_m4_s], m4_eval([$1 + 2]), [$#], [1],
|
m4_pushdef([_m4_s])_m4_for([_m4_s], m4_eval([$1 + 2]), [$#], [1],
|
||||||
[[,]m4_dquote([$]_m4_s)])[_m4_popdef([_m4_s])])m4_shift(_m4_s($@))])
|
[[,]m4_dquote([$]_m4_s)])[_m4_popdef([_m4_s])])m4_shift(_m4_s($@))])])
|
||||||
|
|
||||||
# m4_do(STRING, ...)
|
# m4_do(STRING, ...)
|
||||||
# ------------------
|
# ------------------
|
||||||
@@ -336,6 +338,8 @@ m4_define([m4_joinall],
|
|||||||
# -----------------
|
# -----------------
|
||||||
# Compare the two lists of integer expressions A and B.
|
# Compare the two lists of integer expressions A and B.
|
||||||
#
|
#
|
||||||
|
# m4_list_cmp takes care of any side effects; we only override
|
||||||
|
# _m4_list_cmp_raw, where we can safely expand lists multiple times.
|
||||||
# First, insert padding so that both lists are the same length; the
|
# First, insert padding so that both lists are the same length; the
|
||||||
# trailing +0 is necessary to handle a missing list. Next, create a
|
# trailing +0 is necessary to handle a missing list. Next, create a
|
||||||
# temporary macro to perform pairwise comparisons until an inequality
|
# temporary macro to perform pairwise comparisons until an inequality
|
||||||
@@ -344,9 +348,9 @@ m4_define([m4_joinall],
|
|||||||
# m4_eval([($2) != ($4)]), [1], [m4_cmp([$2], [$4])],
|
# m4_eval([($2) != ($4)]), [1], [m4_cmp([$2], [$4])],
|
||||||
# [0]_m4_popdef([_m4_cmp], [_m4_size]))
|
# [0]_m4_popdef([_m4_cmp], [_m4_size]))
|
||||||
# then calls _m4_cmp([1+0], [0], [1], [2+0])
|
# then calls _m4_cmp([1+0], [0], [1], [2+0])
|
||||||
m4_define([m4_list_cmp],
|
m4_define([_m4_list_cmp_raw],
|
||||||
[m4_if([$1], [$2], 0,
|
[m4_if([$1], [$2], 0, [m4_pushdef(
|
||||||
[m4_pushdef([_m4_size])_$0($1+0_m4_list_pad(m4_count($1), m4_count($2)),
|
[_m4_size])_m4_list_cmp($1+0_m4_list_pad(m4_count($1), m4_count($2)),
|
||||||
$2+0_m4_list_pad(m4_count($2), m4_count($1)))])])
|
$2+0_m4_list_pad(m4_count($2), m4_count($1)))])])
|
||||||
|
|
||||||
m4_define([_m4_list_pad],
|
m4_define([_m4_list_pad],
|
||||||
|
|||||||
@@ -361,6 +361,8 @@ m4_define([m4_ifndef],
|
|||||||
# }.
|
# }.
|
||||||
# All the values are optional, and the macro is robust to active
|
# All the values are optional, and the macro is robust to active
|
||||||
# symbols properly quoted.
|
# symbols properly quoted.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_case],
|
m4_define([m4_case],
|
||||||
[m4_if([$#], 0, [],
|
[m4_if([$#], 0, [],
|
||||||
[$#], 1, [],
|
[$#], 1, [],
|
||||||
@@ -384,6 +386,8 @@ m4_define([m4_case],
|
|||||||
#
|
#
|
||||||
# All the values are optional, and the macro is robust to active symbols
|
# All the values are optional, and the macro is robust to active symbols
|
||||||
# properly quoted.
|
# properly quoted.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_bmatch],
|
m4_define([m4_bmatch],
|
||||||
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
|
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
|
||||||
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
|
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
|
||||||
@@ -444,6 +448,8 @@ m4_define([_m4_cdr],
|
|||||||
#
|
#
|
||||||
# In the common case of $1 with no backslash, only one m4_index expansion
|
# In the common case of $1 with no backslash, only one m4_index expansion
|
||||||
# occurs, and m4_eval is avoided altogether.
|
# occurs, and m4_eval is avoided altogether.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_cond],
|
m4_define([m4_cond],
|
||||||
[m4_if([$#], [0], [m4_fatal([$0: cannot be called without arguments])],
|
[m4_if([$#], [0], [m4_fatal([$0: cannot be called without arguments])],
|
||||||
[$#], [1], [$1],
|
[$#], [1], [$1],
|
||||||
@@ -479,6 +485,8 @@ m4_define([_m4_cond],
|
|||||||
#
|
#
|
||||||
# Recall that m4_shift3 always results in an argument. Hence, we need
|
# Recall that m4_shift3 always results in an argument. Hence, we need
|
||||||
# to distinguish between a final deletion vs. ending recursion.
|
# to distinguish between a final deletion vs. ending recursion.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_bpatsubsts],
|
m4_define([m4_bpatsubsts],
|
||||||
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
|
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
|
||||||
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
|
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
|
||||||
@@ -519,19 +527,18 @@ m4_define([m4_default],
|
|||||||
#
|
#
|
||||||
# This macro is called frequently, so minimize the amount of additional
|
# This macro is called frequently, so minimize the amount of additional
|
||||||
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
|
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
|
||||||
# (added in M4 1.6), then let m4 do the job for us.
|
# (added in M4 1.6), then let m4 do the job for us (see m4_init).
|
||||||
#
|
#
|
||||||
# _m4_defn is for internal use only - it bypasses the wrapper, so it
|
# _m4_defn is for internal use only - it bypasses the wrapper, so it
|
||||||
# must only be used on one argument at a time, and only on macros
|
# must only be used on one argument at a time, and only on macros
|
||||||
# known to be defined. Make sure this still works if the user renames
|
# known to be defined. Make sure this still works if the user renames
|
||||||
# m4_defn but not _m4_defn.
|
# m4_defn but not _m4_defn.
|
||||||
m4_copy([m4_defn], [_m4_defn])
|
m4_copy([m4_defn], [_m4_defn])
|
||||||
m4_ifdef([__m4_version__], [],
|
m4_define([m4_defn],
|
||||||
[m4_define([m4_defn],
|
|
||||||
[m4_if([$#], [0], [[$0]],
|
[m4_if([$#], [0], [[$0]],
|
||||||
[$#], [1], [m4_ifdef([$1], [_m4_defn([$1])],
|
[$#], [1], [m4_ifdef([$1], [_m4_defn([$1])],
|
||||||
[m4_fatal([$0: undefined macro: $1])])],
|
[m4_fatal([$0: undefined macro: $1])])],
|
||||||
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])])
|
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
|
||||||
|
|
||||||
|
|
||||||
# _m4_dumpdefs_up(NAME)
|
# _m4_dumpdefs_up(NAME)
|
||||||
@@ -569,18 +576,17 @@ _m4_dumpdefs_down([$1])])
|
|||||||
#
|
#
|
||||||
# This macro is called frequently, so minimize the amount of additional
|
# This macro is called frequently, so minimize the amount of additional
|
||||||
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
|
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
|
||||||
# (added in M4 1.6), then let m4 do the job for us.
|
# (added in M4 1.6), then let m4 do the job for us (see m4_init).
|
||||||
#
|
#
|
||||||
# _m4_popdef is for internal use only - it bypasses the wrapper, so it
|
# _m4_popdef is for internal use only - it bypasses the wrapper, so it
|
||||||
# must only be used on macros known to be defined. Make sure this
|
# must only be used on macros known to be defined. Make sure this
|
||||||
# still works if the user renames m4_popdef but not _m4_popdef.
|
# still works if the user renames m4_popdef but not _m4_popdef.
|
||||||
m4_copy([m4_popdef], [_m4_popdef])
|
m4_copy([m4_popdef], [_m4_popdef])
|
||||||
m4_ifdef([__m4_version__], [],
|
m4_define([m4_popdef],
|
||||||
[m4_define([m4_popdef],
|
|
||||||
[m4_if([$#], [0], [[$0]],
|
[m4_if([$#], [0], [[$0]],
|
||||||
[$#], [1], [m4_ifdef([$1], [_m4_popdef([$1])],
|
[$#], [1], [m4_ifdef([$1], [_m4_popdef([$1])],
|
||||||
[m4_fatal([$0: undefined macro: $1])])],
|
[m4_fatal([$0: undefined macro: $1])])],
|
||||||
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])])
|
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
|
||||||
|
|
||||||
|
|
||||||
# m4_shiftn(N, ...)
|
# m4_shiftn(N, ...)
|
||||||
@@ -598,6 +604,8 @@ m4_ifdef([__m4_version__], [],
|
|||||||
# [_m4_shiftn(m4_decr([$1]), m4_shift(m4_shift($@)))])
|
# [_m4_shiftn(m4_decr([$1]), m4_shift(m4_shift($@)))])
|
||||||
# but with the final `m4_shift(m4_shift($@)))' shared between the two
|
# but with the final `m4_shift(m4_shift($@)))' shared between the two
|
||||||
# paths. The first leg uses a no-op m4_shift(,$@) to balance out the ().
|
# paths. The first leg uses a no-op m4_shift(,$@) to balance out the ().
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_shiftn],
|
m4_define([m4_shiftn],
|
||||||
[m4_assert(0 < $1 && $1 < $#)_$0($@)])
|
[m4_assert(0 < $1 && $1 < $#)_$0($@)])
|
||||||
|
|
||||||
@@ -634,18 +642,17 @@ m4_define([_m4_shift3],
|
|||||||
#
|
#
|
||||||
# This macro is called frequently, so minimize the amount of additional
|
# This macro is called frequently, so minimize the amount of additional
|
||||||
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
|
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
|
||||||
# (added in M4 1.6), then let m4 do the job for us.
|
# (added in M4 1.6), then let m4 do the job for us (see m4_init).
|
||||||
#
|
#
|
||||||
# _m4_undefine is for internal use only - it bypasses the wrapper, so
|
# _m4_undefine is for internal use only - it bypasses the wrapper, so
|
||||||
# it must only be used on macros known to be defined. Make sure this
|
# it must only be used on macros known to be defined. Make sure this
|
||||||
# still works if the user renames m4_undefine but not _m4_undefine.
|
# still works if the user renames m4_undefine but not _m4_undefine.
|
||||||
m4_copy([m4_undefine], [_m4_undefine])
|
m4_copy([m4_undefine], [_m4_undefine])
|
||||||
m4_ifdef([__m4_version__], [],
|
m4_define([m4_undefine],
|
||||||
[m4_define([m4_undefine],
|
|
||||||
[m4_if([$#], [0], [[$0]],
|
[m4_if([$#], [0], [[$0]],
|
||||||
[$#], [1], [m4_ifdef([$1], [_m4_undefine([$1])],
|
[$#], [1], [m4_ifdef([$1], [_m4_undefine([$1])],
|
||||||
[m4_fatal([$0: undefined macro: $1])])],
|
[m4_fatal([$0: undefined macro: $1])])],
|
||||||
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])])
|
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
|
||||||
|
|
||||||
# _m4_wrap(PRE, POST)
|
# _m4_wrap(PRE, POST)
|
||||||
# -------------------
|
# -------------------
|
||||||
@@ -706,6 +713,8 @@ m4_define([m4_count], [$#])
|
|||||||
# useful for making your macros more structured and readable by dropping
|
# useful for making your macros more structured and readable by dropping
|
||||||
# unnecessary dnl's and have the macros indented properly. No concatenation
|
# unnecessary dnl's and have the macros indented properly. No concatenation
|
||||||
# occurs after a STRING; use m4_unquote(m4_join(,STRING)) for that.
|
# occurs after a STRING; use m4_unquote(m4_join(,STRING)) for that.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_do],
|
m4_define([m4_do],
|
||||||
[m4_if([$#], 0, [],
|
[m4_if([$#], 0, [],
|
||||||
[$#], 1, [$1[]],
|
[$#], 1, [$1[]],
|
||||||
@@ -721,6 +730,8 @@ m4_define([m4_dquote], [[$@]])
|
|||||||
# m4_dquote_elt(ARGS)
|
# m4_dquote_elt(ARGS)
|
||||||
# -------------------
|
# -------------------
|
||||||
# Return ARGS as an unquoted list of double-quoted arguments.
|
# Return ARGS as an unquoted list of double-quoted arguments.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_dquote_elt],
|
m4_define([m4_dquote_elt],
|
||||||
[m4_if([$#], [0], [],
|
[m4_if([$#], [0], [],
|
||||||
[$#], [1], [[[$1]]],
|
[$#], [1], [[[$1]]],
|
||||||
@@ -818,6 +829,8 @@ m4_define([_m4_quote],
|
|||||||
# m4_reverse(ARGS)
|
# m4_reverse(ARGS)
|
||||||
# ----------------
|
# ----------------
|
||||||
# Output ARGS in reverse order.
|
# Output ARGS in reverse order.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_reverse],
|
m4_define([m4_reverse],
|
||||||
[m4_if([$#], [0], [], [$#], [1], [[$1]],
|
[m4_if([$#], [0], [], [$#], [1], [[$1]],
|
||||||
[$0(m4_shift($@)), [$1]])])
|
[$0(m4_shift($@)), [$1]])])
|
||||||
@@ -982,6 +995,8 @@ m4_define([_m4_for],
|
|||||||
# [] and use m4_car/m4_cdr for recursion, we instead unbox the list (which
|
# [] and use m4_car/m4_cdr for recursion, we instead unbox the list (which
|
||||||
# requires swapping the argument order in the helper), insert an ignored
|
# requires swapping the argument order in the helper), insert an ignored
|
||||||
# third argument, and use m4_shift3 to detect when recursion is complete.
|
# third argument, and use m4_shift3 to detect when recursion is complete.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_foreach],
|
m4_define([m4_foreach],
|
||||||
[m4_if([$2], [], [],
|
[m4_if([$2], [], [],
|
||||||
[m4_pushdef([$1])_$0([$1], [$3], [], $2)m4_popdef([$1])])])
|
[m4_pushdef([$1])_$0([$1], [$3], [], $2)m4_popdef([$1])])])
|
||||||
@@ -1021,6 +1036,8 @@ m4_define([m4_foreach_w],
|
|||||||
# _m4_map. For m4_map, an empty list behaves like an empty sublist
|
# _m4_map. For m4_map, an empty list behaves like an empty sublist
|
||||||
# and gets ignored; for m4_mapall, we must special-case the empty
|
# and gets ignored; for m4_mapall, we must special-case the empty
|
||||||
# list.
|
# list.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_map],
|
m4_define([m4_map],
|
||||||
[_m4_map([_m4_apply([$1]], [], $2)])
|
[_m4_map([_m4_apply([$1]], [], $2)])
|
||||||
|
|
||||||
@@ -1041,7 +1058,8 @@ m4_define([m4_mapall],
|
|||||||
# arguments.
|
# arguments.
|
||||||
#
|
#
|
||||||
# For m4_mapall_sep, merely expand the first iteration without the
|
# For m4_mapall_sep, merely expand the first iteration without the
|
||||||
# separator, then include separator as part of subsequent recursion.
|
# separator, then include separator as part of subsequent recursion;
|
||||||
|
# but avoid extra expansion of LIST's side-effects via a helper macro.
|
||||||
# For m4_map_sep, things are trickier - we don't know if the first
|
# For m4_map_sep, things are trickier - we don't know if the first
|
||||||
# list element is an empty sublist, so we must define a self-modifying
|
# list element is an empty sublist, so we must define a self-modifying
|
||||||
# helper macro and use that as the separator instead.
|
# helper macro and use that as the separator instead.
|
||||||
@@ -1050,8 +1068,10 @@ m4_define([m4_map_sep],
|
|||||||
[_m4_map([_m4_apply([m4_Sep([$2])[]$1]], [], $3)m4_popdef([m4_Sep])])
|
[_m4_map([_m4_apply([m4_Sep([$2])[]$1]], [], $3)m4_popdef([m4_Sep])])
|
||||||
|
|
||||||
m4_define([m4_mapall_sep],
|
m4_define([m4_mapall_sep],
|
||||||
[m4_if([$3], [], [],
|
[m4_if([$3], [], [], [_$0([$1], [$2], $3)])])
|
||||||
[m4_apply([$1], m4_car($3))_m4_map([m4_apply([$2[]$1]], $3)])])
|
|
||||||
|
m4_define([_m4_mapall_sep],
|
||||||
|
[m4_apply([$1], [$3])_m4_map([m4_apply([$2[]$1]], m4_shift2($@))])
|
||||||
|
|
||||||
# _m4_map(PREFIX, IGNORED, SUBLIST, ...)
|
# _m4_map(PREFIX, IGNORED, SUBLIST, ...)
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
@@ -1061,6 +1081,8 @@ m4_define([m4_mapall_sep],
|
|||||||
# then appends `,', the current SUBLIST and the closing `)', then
|
# then appends `,', the current SUBLIST and the closing `)', then
|
||||||
# recurses to the next SUBLIST. IGNORED is an aid to ending recursion
|
# recurses to the next SUBLIST. IGNORED is an aid to ending recursion
|
||||||
# efficiently.
|
# efficiently.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([_m4_map],
|
m4_define([_m4_map],
|
||||||
[m4_if([$#], [2], [],
|
[m4_if([$#], [2], [],
|
||||||
[$1, [$3])$0([$1], m4_shift2($@))])])
|
[$1, [$3])$0([$1], m4_shift2($@))])])
|
||||||
@@ -1069,6 +1091,8 @@ m4_define([_m4_map],
|
|||||||
# --------------------------------
|
# --------------------------------
|
||||||
# Expand EXPRESSION([ARG]) for each argument. More efficient than
|
# Expand EXPRESSION([ARG]) for each argument. More efficient than
|
||||||
# m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))])
|
# m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))])
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_transform],
|
m4_define([m4_transform],
|
||||||
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
|
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
|
||||||
[$#], [1], [],
|
[$#], [1], [],
|
||||||
@@ -1088,6 +1112,8 @@ m4_define([m4_transform],
|
|||||||
# => (a,b)
|
# => (a,b)
|
||||||
# => (c,d)
|
# => (c,d)
|
||||||
# => (e)
|
# => (e)
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_transform_pair],
|
m4_define([m4_transform_pair],
|
||||||
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
|
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
|
||||||
[$#], [1], [m4_fatal([$0: too few arguments: $#: $1])],
|
[$#], [1], [m4_fatal([$0: too few arguments: $#: $1])],
|
||||||
@@ -1947,6 +1973,8 @@ m4_define([m4_normalize],
|
|||||||
# elements, and outputs them following a separator. The final trick to
|
# elements, and outputs them following a separator. The final trick to
|
||||||
# note is that we decide between recursing with $0 or _$0 based on the
|
# note is that we decide between recursing with $0 or _$0 based on the
|
||||||
# nested m4_if ending with `_'.
|
# nested m4_if ending with `_'.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_join],
|
m4_define([m4_join],
|
||||||
[m4_if([$#], [1], [],
|
[m4_if([$#], [1], [],
|
||||||
[$#], [2], [[$2]],
|
[$#], [2], [[$2]],
|
||||||
@@ -1959,6 +1987,8 @@ m4_define([_m4_join],
|
|||||||
# ------------------------------
|
# ------------------------------
|
||||||
# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP.
|
# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP.
|
||||||
# No expansion is performed on SEP or ARGs.
|
# No expansion is performed on SEP or ARGs.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_joinall], [[$2]_$0([$1], m4_shift($@))])
|
m4_define([m4_joinall], [[$2]_$0([$1], m4_shift($@))])
|
||||||
m4_define([_m4_joinall],
|
m4_define([_m4_joinall],
|
||||||
[m4_if([$#], [2], [], [[$1$3]$0([$1], m4_shift2($@))])])
|
[m4_if([$#], [2], [], [[$1$3]$0([$1], m4_shift2($@))])])
|
||||||
@@ -2233,15 +2263,21 @@ m4_define([m4_cmp],
|
|||||||
# long lists, since less text is being expanded for deciding when to end
|
# long lists, since less text is being expanded for deciding when to end
|
||||||
# recursion. The recursion is between a pair of macros that alternate
|
# recursion. The recursion is between a pair of macros that alternate
|
||||||
# which list is trimmed by one element; this is more efficient than
|
# which list is trimmed by one element; this is more efficient than
|
||||||
# calling m4_cdr on both lists from a single macro.
|
# calling m4_cdr on both lists from a single macro. Guarantee exactly
|
||||||
|
# one expansion of both lists' side effects.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_list_cmp],
|
m4_define([m4_list_cmp],
|
||||||
|
[_$0_raw(m4_dquote($1), m4_dquote($2))])
|
||||||
|
|
||||||
|
m4_define([_m4_list_cmp_raw],
|
||||||
[m4_if([$1], [$2], [0], [_m4_list_cmp_1([$1], $2)])])
|
[m4_if([$1], [$2], [0], [_m4_list_cmp_1([$1], $2)])])
|
||||||
|
|
||||||
m4_define([_m4_list_cmp],
|
m4_define([_m4_list_cmp],
|
||||||
[m4_if([$1], [], [0m4_ignore], [$2], [0], [m4_unquote], [$2m4_ignore])])
|
[m4_if([$1], [], [0m4_ignore], [$2], [0], [m4_unquote], [$2m4_ignore])])
|
||||||
|
|
||||||
m4_define([_m4_list_cmp_1],
|
m4_define([_m4_list_cmp_1],
|
||||||
[_m4_list_cmp_2([$2], m4_dquote(m4_shift2($@)), $1)])
|
[_m4_list_cmp_2([$2], [m4_shift2($@)], $1)])
|
||||||
|
|
||||||
m4_define([_m4_list_cmp_2],
|
m4_define([_m4_list_cmp_2],
|
||||||
[_m4_list_cmp([$1$3], m4_cmp([$3+0], [$1+0]))(
|
[_m4_list_cmp([$1$3], m4_cmp([$3+0], [$1+0]))(
|
||||||
@@ -2256,6 +2292,8 @@ m4_define([_m4_list_cmp_2],
|
|||||||
# M4 1.4.x doesn't provide ?:. Hence this huge m4_eval. Avoid m4_eval
|
# M4 1.4.x doesn't provide ?:. Hence this huge m4_eval. Avoid m4_eval
|
||||||
# if both arguments are identical, but be aware of m4_max(0xa, 10) (hence
|
# if both arguments are identical, but be aware of m4_max(0xa, 10) (hence
|
||||||
# the use of <=, not just <, in the second multiply).
|
# the use of <=, not just <, in the second multiply).
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_max],
|
m4_define([m4_max],
|
||||||
[m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
|
[m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
|
||||||
[$#], [1], [m4_eval([$1])],
|
[$#], [1], [m4_eval([$1])],
|
||||||
@@ -2280,6 +2318,8 @@ m4_define([_m4_min],
|
|||||||
# ---------------------------------
|
# ---------------------------------
|
||||||
# Common recursion code for m4_max and m4_min. METHOD must be _m4_max
|
# Common recursion code for m4_max and m4_min. METHOD must be _m4_max
|
||||||
# or _m4_min, and there must be at least two arguments to combine.
|
# or _m4_min, and there must be at least two arguments to combine.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([_m4_minmax],
|
m4_define([_m4_minmax],
|
||||||
[m4_if([$#], [3], [$1([$2], [$3])],
|
[m4_if([$#], [3], [$1([$2], [$3])],
|
||||||
[$0([$1], $1([$2], [$3]), m4_shift3($@))])])
|
[$0([$1], $1([$2], [$3]), m4_shift3($@))])])
|
||||||
@@ -2333,8 +2373,11 @@ m4_dquote(m4_dquote(m4_defn([m4_cr_Letters])))[[+],
|
|||||||
# -1 if VERSION-1 < VERSION-2
|
# -1 if VERSION-1 < VERSION-2
|
||||||
# 0 if =
|
# 0 if =
|
||||||
# 1 if >
|
# 1 if >
|
||||||
|
#
|
||||||
|
# Since _m4_version_unletter does not output side effects, we can
|
||||||
|
# safely bypass the overhead of m4_version_cmp.
|
||||||
m4_define([m4_version_compare],
|
m4_define([m4_version_compare],
|
||||||
[m4_list_cmp(_m4_version_unletter([$1]), _m4_version_unletter([$2]))])
|
[_m4_list_cmp_raw(_m4_version_unletter([$1]), _m4_version_unletter([$2]))])
|
||||||
|
|
||||||
|
|
||||||
# m4_PACKAGE_NAME
|
# m4_PACKAGE_NAME
|
||||||
@@ -2436,6 +2479,8 @@ m4_define([m4_set_add],
|
|||||||
# not pruned. The recursion helpers ignore their second argument, so
|
# not pruned. The recursion helpers ignore their second argument, so
|
||||||
# that we can use the faster m4_shift2 and 2 arguments, rather than
|
# that we can use the faster m4_shift2 and 2 arguments, rather than
|
||||||
# _m4_shift2 and one argument, as the signal to end recursion.
|
# _m4_shift2 and one argument, as the signal to end recursion.
|
||||||
|
#
|
||||||
|
# Please keep foreach.m4 in sync with any adjustments made here.
|
||||||
m4_define([m4_set_add_all],
|
m4_define([m4_set_add_all],
|
||||||
[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1])
|
[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1])
|
||||||
+ m4_len(m4_ifdef([_m4_set_cleanup($1)], [_$0_check], [_$0])([$1], $@))))])
|
+ m4_len(m4_ifdef([_m4_set_cleanup($1)], [_$0_check], [_$0])([$1], $@))))])
|
||||||
@@ -2721,12 +2766,18 @@ m4_pattern_forbid([^_?m4_])
|
|||||||
m4_pattern_forbid([^dnl$])
|
m4_pattern_forbid([^dnl$])
|
||||||
|
|
||||||
# If __m4_version__ is defined, we assume that we are being run by M4
|
# If __m4_version__ is defined, we assume that we are being run by M4
|
||||||
# 1.6 or newer, and thus that $@ recursion is linear; nothing further
|
# 1.6 or newer, and thus that $@ recursion is linear and debugmode(d)
|
||||||
# needs to be done. But if it is missing, we assume we are being run
|
# is available for faster checks of dereferencing undefined macros.
|
||||||
# by M4 1.4.x, that $@ recursion is quadratic, and that we need
|
# But if it is missing, we assume we are being run by M4 1.4.x, that
|
||||||
# foreach-based replacement macros. Use the raw builtin to avoid
|
# $@ recursion is quadratic, and that we need foreach-based
|
||||||
# tripping up include tracing.
|
# replacement macros. Use the raw builtin to avoid tripping up
|
||||||
m4_ifndef([__m4_version__], [m4_builtin([include], [m4sugar/foreach.m4])])
|
# include tracing.
|
||||||
|
m4_ifdef([__m4_version__],
|
||||||
|
[m4_debugmode([+d])
|
||||||
|
m4_copy([_m4_defn], [m4_defn])
|
||||||
|
m4_copy([_m4_popdef], [m4_popdef])
|
||||||
|
m4_copy([_m4_undefine], [m4_undefine])],
|
||||||
|
[m4_builtin([include], [m4sugar/foreach.m4])])
|
||||||
|
|
||||||
# _m4_divert_diversion should be defined:
|
# _m4_divert_diversion should be defined:
|
||||||
m4_divert_push([KILL])
|
m4_divert_push([KILL])
|
||||||
|
|||||||
Reference in New Issue
Block a user