2008-10-24 Eric Blake <ebb9@byu.net>
+ Make m4_defun_init more robust.
+ * lib/m4sugar/m4sugar.m4 (m4_defun_init): Handle indirect macro
+ names, and correct number of arguments.
+ (m4_copy): Also set up location of the copy.
+ (m4_defun): When copied, use current macro name, not original.
+ * tests/m4sugar.at (m4@&t@_require: one-shot initialization):
+ Update test.
+
Optimize clients of AS_REQUIRE.
* lib/m4sugar/m4sugar.m4 (m4_defun): Add undocumented third
argument.
m4_define([m4_copy],
[m4_ifdef([$2], [m4_fatal([$0: won't overwrite defined macro: $2])],
[_$0([$1], [m4_tmp])_$0([m4_tmp], [$2],
- [m4_pushdef([$1], _m4_defn([m4_tmp]))])])])
+ [m4_pushdef([$1], _m4_defn([m4_tmp]))])m4_ifdef([m4_location($1)],
+ [m4_define([m4_location($2)], m4_location)])])])
m4_define([_m4_copy],
[m4_ifdef([$1], [m4_pushdef([$2], _m4_defn([$1]))$3[]_m4_popdef([$1])$0($@)])])
# previously m4_define'd definition so that subsequent use of the
# macro is faster.
m4_define([m4_defun],
-[m4_define([m4_location($1)], m4_location)dnl
-m4_default([$3], [m4_define])([$1],
- [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])
+[m4_define([m4_location($1)], m4_location)]dnl
+[m4_default([$3], [m4_define])([$1],
+ [_m4_defun_pro(]m4_dquote($[0])[)$2[]_m4_defun_epi(]m4_dquote($[0])[)])])
# m4_defun_init(NAME, INIT, COMMON)
# to m4_defun.
m4_define([m4_defun_init],
[m4_define([$1], [$3])m4_defun([$1],
- [$2[]_m4_popdef(]m4_dquote([$][0])[)$][0($][@)], [m4_pushdef])])
+ [$2[]_m4_popdef(]m4_dquote($[0])[)m4_indir(]m4_dquote($[0])dnl
+[m4_if(]m4_dquote($[#])[, [0], [], ]m4_dquote([,$]@)[))], [m4_pushdef])])
# m4_defun_once(NAME, EXPANSION)
## ---------------------- ##
AT_SETUP([m4@&t@_require: one-shot initialization])
-AT_KEYWORDS([m4@&t@_defun_init])
+AT_KEYWORDS([m4@&t@_defun_init m4@&t@_copy])
AT_CHECK_M4SUGAR_TEXT([[
m4_defun_init([a], [[init a
b
c
a
+m4_defun_init([-], [hello, ], [m4_if([$#], [0], [world], [[$1]])])dnl
+m4_copy([-], [.])dnl
+m4_indir([.])
+m4_indir([.], [goodbye])
+m4_indir([-], [again])
]], [[
init a
common a
b
c
common a
+hello, world
+goodbye
+hello, again
]])
AT_CLEANUP