Optimize AC_PREREQ and other m4sugar numerics.

* lib/m4sugar/m4sugar.m4 (m4_sign): Write with m4_eval.
(m4_cmp): Compare arbitrary expressions, without overflow.
(m4_version_unletter): Also recognize capital letters.
(m4_version_compare): Avoid regex when splitting version number
string.

Signed-off-by: Eric Blake <ebb9@byu.net>
This commit is contained in:
Eric Blake 2007-10-02 07:04:11 -06:00
parent 83294abba1
commit 7113f1b07c
2 changed files with 16 additions and 16 deletions

View File

@ -1,3 +1,12 @@
2007-10-02 Eric Blake <ebb9@byu.net>
Optimize AC_PREREQ and other m4sugar numerics.
* lib/m4sugar/m4sugar.m4 (m4_sign): Write with m4_eval.
(m4_cmp): Compare arbitrary expressions, without overflow.
(m4_version_unletter): Also recognize capital letters.
(m4_version_compare): Avoid regex when splitting version number
string.
2007-10-01 Eric Blake <ebb9@byu.net>
Once again, reject IRIX m4.

View File

@ -1660,27 +1660,18 @@ m4_define([m4_qdelta],
# m4_sign(A)
# ----------
#
# The sign of the integer A.
#
# Rather than resort to eval or regex, we merely delete [0\t ], collapse
# all other digits to 1, then use the first two characters to decide.
# The sign of the integer expression A.
m4_define([m4_sign],
[m4_case(m4_substr(m4_translit([[$1]], [2-90 ], [11111111]), 0, 2),
[-1], [-1],
[-], [0],
[], [0],
[1])])
[m4_eval((([$1]) > 0) - (([$1]) < 0))])
# m4_cmp(A, B)
# ------------
#
# Compare two integers.
# Compare two integer expressions.
# A < B -> -1
# A = B -> 0
# A > B -> 1
m4_define([m4_cmp],
[m4_sign(m4_eval([$1 - $2]))])
[m4_eval((([$1]) > ([$2])) - (([$1]) < ([$2])))])
# m4_list_cmp(A, B)
@ -1720,7 +1711,7 @@ m4_define([m4_list_cmp],
# This macro is absolutely not robust to active macro, it expects
# reasonable version numbers and is valid up to `z', no double letters.
m4_define([m4_version_unletter],
[m4_translit(m4_bpatsubsts([$1],
[m4_translit(m4_bpatsubsts(m4_tolower([[$1]]),
[\([0-9]+\)\([abcdefghi]\)],
[m4_eval(\1 + 1).-1.\2],
[\([0-9]+\)\([jklmnopqrs]\)],
@ -1738,8 +1729,8 @@ m4_define([m4_version_unletter],
# 0 if =
# 1 if >
m4_define([m4_version_compare],
[m4_list_cmp((m4_split(m4_version_unletter([$1]), [\.])),
(m4_split(m4_version_unletter([$2]), [\.])))])
[m4_list_cmp((m4_translit(m4_version_unletter([$1]), [.], [,])),
(m4_translit(m4_version_unletter([$2]), [.], [,])))])
# m4_PACKAGE_NAME