Work around <=m4-1.4.9 bug in m4_format.

* lib/m4sugar/m4sugar.m4 (_m4_index): New internal macro.
(m4_init): Only use it in older m4.
* lib/autoconf/general.m4 (_AC_DEFINE_Q): Use it to avoid
m4_format bug in older m4.
* lib/autoconf/status.m4 (_AC_CONFIG_COMPUTE_DEST): Likewise.
Reported by Bob Proulx.

Signed-off-by: Eric Blake <ebb9@byu.net>
This commit is contained in:
Eric Blake 2008-11-10 21:00:44 -07:00
parent 5bf2204ddb
commit 74bb1a450d
4 changed files with 37 additions and 7 deletions

View File

@ -1,3 +1,13 @@
2008-11-10 Eric Blake <ebb9@byu.net>
Work around <=m4-1.4.9 bug in m4_format.
* lib/m4sugar/m4sugar.m4 (_m4_index): New internal macro.
(m4_init): Only use it in older m4.
* lib/autoconf/general.m4 (_AC_DEFINE_Q): Use it to avoid
m4_format bug in older m4.
* lib/autoconf/status.m4 (_AC_CONFIG_COMPUTE_DEST): Likewise.
Reported by Bob Proulx.
2008-11-10 Eric Blake <ebb9@byu.net>
Match upstream standards.texi.

View File

@ -2077,8 +2077,10 @@ m4_define([AC_DEFINE_UNQUOTED], [_AC_DEFINE_Q([], $@)])
# m4_format rather than regex to grab prefix up to first (). AC_name
# is defined with over-quotation, so that we can avoid m4_defn; this
# is only safe because the name should not contain $.
#
# Use _m4_index to avoid a bug in m4_format in older m4.
m4_define([_AC_DEFINE_Q],
[m4_pushdef([AC_name], m4_format([[[%.*s]]], m4_index([$2], [(]), [$2]))]dnl
[m4_pushdef([AC_name], m4_format([[[%.*s]]], _m4_index([$2], [(]), [$2]))]dnl
[AC_DEFINE_TRACE(AC_name)]dnl
[m4_cond([m4_index([$3], [
])], [-1], [],

View File

@ -247,9 +247,9 @@ m4_define([_AC_CONFIG_FOOS],
# _AC_CONFIG_COMPUTE_DEST(STRING)
# -------------------------------
# Compute the DEST from STRING by stripping any : and following
# characters.
# characters. Use _m4_index to avoid a bug in m4_format in older m4.
m4_define([_AC_CONFIG_COMPUTE_DEST],
[m4_format([[%.*s]], m4_index([$1], [:]), [$1])])
[m4_format([[%.*s]], _m4_index([$1], [:]), [$1])])
# _AC_CONFIG_REGISTER(MODE, TAG, [COMMANDS])
# ------------------------------------------

View File

@ -625,6 +625,22 @@ m4_define([m4_dumpdefs],
[m4_map_args([$0], $@)])])
# _m4_index(HAYSTACK, NEEDLE)
# ---------------------------
# Like the original, except return -2 instead of -1 if NEEDLE is not
# present in HAYSTACK. That way, it can be used to work around a bug
# in m4 1.4.9 and earlier where m4_format did not accept a precision
# of -1; this macro can be safely used in the idiom:
# m4_format([[%.*s]], _m4_index([$1],[$2]), [$1])
# to grab the prefix of $1 up to but excluding $2, if it was present,
# otherwise the entire $1.
m4_define([_m4_index],
[$0_(m4_index($@))])
m4_define([_m4_index_],
[m4_if([$1], [-1], [-2], [$1])])
# m4_popdef(NAME)
# ---------------
# Like the original, except guarantee a warning when using something which is
@ -2975,7 +2991,8 @@ m4_pattern_forbid([^dnl$])
# If __m4_version__ is defined, we assume that we are being run by M4
# 1.6 or newer, and thus that $@ recursion is linear and debugmode(d)
# is available for faster checks of dereferencing undefined macros.
# is available for faster checks of dereferencing undefined macros,
# and we don't need to worry about _m4_format bugs with _m4_index.
# But if it is missing, we assume we are being run by M4 1.4.x, that
# $@ recursion is quadratic, and that we need foreach-based
# replacement macros. Use the raw builtin to avoid tripping up
@ -2983,9 +3000,10 @@ m4_pattern_forbid([^dnl$])
# undefines m4_defn.
m4_ifdef([__m4_version__],
[m4_debugmode([+d])
m4_define([m4_defn], _m4_defn([m4_defn]))
m4_define([m4_popdef], _m4_defn([m4_popdef]))
m4_define([m4_undefine], _m4_defn([m4_undefine]))],
m4_define([m4_defn], _m4_defn([_m4_defn]))
m4_define([_m4_index], _m4_defn([m4_index]))
m4_define([m4_popdef], _m4_defn([_m4_popdef]))
m4_define([m4_undefine], _m4_defn([_m4_undefine]))],
[m4_builtin([include], [m4sugar/foreach.m4])])
# Rewrite the first entry of the diversion stack.