[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: m4_dumpdef and m4 1.4.x
From: |
Eric Blake |
Subject: |
Re: m4_dumpdef and m4 1.4.x |
Date: |
Tue, 23 Dec 2008 21:19:14 -0700 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.18) Gecko/20081105 Thunderbird/2.0.0.18 Mnenhy/0.7.5.666 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
According to Eric Blake on 12/18/2008 4:15 PM:
> m4_dumpdef([m4_dumpdef])
>
> now outputs the less-than-helpful:
>
> m4_dumpdef: []
>
> instead of the desired
>
> m4_dumpdef: <dumpdef>
>
> This is not technically a regression (since before my patch, any use of
> m4_dumpdef under M4 1.4.x flat-out confused autom4te), but it would be nice
> to
> fix.
>
> For m4 1.6, where dumpdef output always goes to stderr instead of to the
> debugfile (well, it will, once I check in a backported patch from the master
> branch), I can make m4_dumpdef useful.
m4.git now contains a patch on branch-1.6 and newer that adds the
m4_debugmode([+o]) flag to force dumpdef output to stderr regardless of
the current --debugfile settings. Therefore, I'm committing this patch
(no impact to m4 1.4.x users, but if you were living on the edge and
testing m4.git's branch-1.6, you will need to update m4 first, but that
should not be a big deal since you are already living on the edge ;)
- --
Don't work too hard, make some time for fun as well!
Eric Blake address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAklRuEIACgkQ84KuGfSFAYCblACePpq3AZjE7WvLkpxRsk46XYEy
SZgAoNRrgXTmChZuEn1ZZH9LUYX8Q/v9
=3xC+
-----END PGP SIGNATURE-----
>From 5f85192b8081c9f6f4d6912785dad9b6a78c9f8d Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Tue, 23 Dec 2008 14:29:48 -0700
Subject: [PATCH] Make m4_dumpdef more useful with M4 1.6.
* lib/m4sugar/m4sugar.m4 (_m4_dumpdef): New macro.
(m4_init): Install it for new enough m4.
* tests/m4sugar.at (m4@&address@hidden): Enhance test.
* doc/autoconf.texi (Redefined M4 Macros) <m4_dumpdef>: Mention
lack of sorting.
Signed-off-by: Eric Blake <address@hidden>
---
ChangeLog | 9 +++++++++
doc/autoconf.texi | 3 ++-
lib/m4sugar/m4sugar.m4 | 20 ++++++++++++++++----
tests/m4sugar.at | 24 ++++++++++++++++++++++++
4 files changed, 51 insertions(+), 5 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f7a7d3a..099c19e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-12-23 Eric Blake <address@hidden>
+
+ Make m4_dumpdef more useful with M4 1.6.
+ * lib/m4sugar/m4sugar.m4 (_m4_dumpdef): New macro.
+ (m4_init): Install it for new enough m4.
+ * tests/m4sugar.at (m4@&address@hidden): Enhance test.
+ * doc/autoconf.texi (Redefined M4 Macros) <m4_dumpdef>: Mention
+ lack of sorting.
+
2008-12-24 Bruno Haible <address@hidden>
Improve INSTALL for HP-UX.
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index 004ddb2..2d8d3c7 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -10558,7 +10558,8 @@ Redefined M4 Macros
@msindex{dumpdefs}
@code{m4_dumpdef} is like the M4 builtin, except that this version
requires at least one argument, output always goes to standard error
-rather than the current debug file, and an error is issued if any
+rather than the current debug file, no sorting is done on multiple
+arguments, and an error is issued if any
@var{name} is undefined. @code{m4_dumpdefs} is a convenience macro that
calls @code{m4_dumpdef} for all of the
@code{m4_pushdef} stack of definitions, starting with the current, and
diff --git a/lib/m4sugar/m4sugar.m4 b/lib/m4sugar/m4sugar.m4
index 05e357a..f64ef16 100644
--- a/lib/m4sugar/m4sugar.m4
+++ b/lib/m4sugar/m4sugar.m4
@@ -603,13 +603,23 @@ m4_define([m4_defn],
# always dumps to stderr, regardless of the current debugfile; it also
# provides m4symbols as a way to grab all current macro names. But
# dumpdefs is not frequently called, so we don't need to worry about
-# conditionally using these newer features.
+# conditionally using these newer features. Also, this version
+# doesn't sort multiple arguments.
+#
+# If we detect m4 1.6 or newer, then provide an alternate definition,
+# installed during m4_init, that allows builtins through.
+# Unfortunately, there is no nice way in m4 1.4.x to dump builtins.
m4_define([m4_dumpdef],
[m4_if([$#], [0], [m4_fatal([$0: missing argument])],
[$#], [1], [m4_ifdef([$1], [m4_errprintn(
[$1: ]m4_dquote(_m4_defn([$1])))], [m4_fatal([$0: undefined macro: $1])])],
[m4_map_args([$0], $@)])])
+m4_define([_m4_dumpdef],
+[m4_if([$#], [0], [m4_fatal([$0: missing argument])],
+ [$#], [1], [m4_builtin([dumpdef], [$1])],
+ [m4_map_args_sep([m4_builtin([dumpdef],], [)], [], $@)])])
+
# m4_dumpdefs(NAME...)
# --------------------
@@ -3053,8 +3063,9 @@ m4_pattern_forbid([^_?m4_])
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.
+# 1.6 or newer, thus $@ recursion is linear, and debugmode(+do)
+# is available for faster checks of dereferencing undefined macros
+# and forcing dumpdef to print to stderr regardless of debugfile.
# 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. Also, m4 prior to 1.4.8 loses track of location
@@ -3063,8 +3074,9 @@ m4_pattern_forbid([^dnl$])
# Use the raw builtin to avoid tripping up include tracing.
# Meanwhile, avoid m4_copy, since it temporarily undefines m4_defn.
m4_ifdef([__m4_version__],
-[m4_debugmode([+d])
+[m4_debugmode([+do])
m4_define([m4_defn], _m4_defn([_m4_defn]))
+m4_define([m4_dumpdef], _m4_defn([_m4_dumpdef]))
m4_define([m4_popdef], _m4_defn([_m4_popdef]))
m4_define([m4_undefine], _m4_defn([_m4_undefine]))],
[m4_builtin([include], [m4sugar/foreach.m4])
diff --git a/tests/m4sugar.at b/tests/m4sugar.at
index 4938027..0d90ca2 100644
--- a/tests/m4sugar.at
+++ b/tests/m4sugar.at
@@ -194,6 +194,30 @@ a: [2]
a: [1]
]])
+# Check behavior when dumping builtins. Unfortunately, when using M4 1.4.x
+# (or more precisely, when __m4_version__ is undefined), builtins get
+# flattened to an empty string. It takes M4 1.6 to work around this.
+AT_DATA_M4SUGAR([script.4s],
+[[m4_ifdef([__m4_version__], [_m4_undefine([__m4_version__])])
+m4_init
+m4_dumpdef([m4_define])
+]])
+
+AT_CHECK_M4SUGAR([-o-], [0], [],
+[[m4_define: []
+]])
+
+AT_DATA_M4SUGAR([script.4s],
+[[m4_init
+m4_ifdef([__m4_version__],
+[m4_dumpdef([m4_define])],
+[m4_errprintn([m4_define: <define>])])
+]])
+
+AT_CHECK_M4SUGAR([-o-], [0], [],
+[[m4_define: <define>
+]])
+
AT_CLEANUP
--
1.6.0.4