Re: improved error messages

Eric Blake <[email protected]>
Newsgroups gmane.comp.gnu.m4.patches
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Eric Blake on 11/23/2007 4:29 PM:
>> 2007-11-22  Eric Blake  <[email protected]>
> 
>>         More error messages tied to macro names.

And while I'm at it, I found it easier if both branch and head passed just
a macro name to m4_bad_argc and m4_numeric_arg rather than the entire argv
structure.  So head needed this patch:

- --
Don't work too hard, make some time for fun as well!

Eric Blake             [email protected]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFHSDBO84KuGfSFAYARAv5WAJ9eAcDR92GigvpBsA6zCq515Rb9ZwCgi4f1
u/EiYgjfarZ/WGIgYE4T/V0=
=PEGF
-----END PGP SIGNATURE-----

_______________________________________________
M4-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/m4-patches
m4.patch296 (text/plain, 20 KB)
From 32ab6f9f819643ec7187bf1680d582eb8f131774 Mon Sep 17 00:00:00 2001
From: Eric Blake <[email protected]>
Date: Sat, 24 Nov 2007 07:04:18 -0700
Subject: [PATCH] Pass only macro name to utility functions.

* m4/m4module.h (m4_bad_argc, m4_numeric_arg): Adjust signature.
* m4/utility.c (m4_bad_argc, m4_numeric_arg): Adjust
implementation.
* m4/macro.c (m4_macro_call): Adjust callers.
* modules/gnu.c (builtin, debuglen): Likewise.
* modules/m4.c (ifelse, incr, decr, divert, undivert, m4exit)
(substr): Likewise.
* modules/evalparse.c (m4_evaluate): Likewise.
* modules/stdlib.c (setenv, getpwuid, srand): Likewise.
* modules/time.c (ctime, gmtime, localtime, mktime, strftime):
Likewise.

Signed-off-by: Eric Blake <[email protected]>
---
 ChangeLog           |   15 +++++++++++++++
 m4/m4module.h       |    4 ++--
 m4/macro.c          |    2 +-
 m4/utility.c        |   38 ++++++++++++++++++--------------------
 modules/evalparse.c |   34 +++++++++++++++++-----------------
 modules/gnu.c       |   29 +++++++++++++++--------------
 modules/m4.c        |   27 +++++++++++++++------------
 modules/stdlib.c    |    6 +++---
 modules/time.c      |   23 ++++++++++++-----------
 9 files changed, 98 insertions(+), 80 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0b02b24..f71a00f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2007-11-24  Eric Blake  <[email protected]>
+
+	Pass only macro name to utility functions.
+	* m4/m4module.h (m4_bad_argc, m4_numeric_arg): Adjust signature.
+	* m4/utility.c (m4_bad_argc, m4_numeric_arg): Adjust
+	implementation.
+	* m4/macro.c (m4_macro_call): Adjust callers.
+	* modules/gnu.c (builtin, debuglen): Likewise.
+	* modules/m4.c (ifelse, incr, decr, divert, undivert, m4exit)
+	(substr): Likewise.
+	* modules/evalparse.c (m4_evaluate): Likewise.
+	* modules/stdlib.c (setenv, getpwuid, srand): Likewise.
+	* modules/time.c (ctime, gmtime, localtime, mktime, strftime):
+	Likewise.
+
 2007-11-23  Eric Blake  <[email protected]>
 
 	Add macro name to debugfile messages.
diff --git a/m4/m4module.h b/m4/m4module.h
index 8b59e15..01514db 100644
--- a/m4/m4module.h
+++ b/m4/m4module.h
@@ -102,9 +102,9 @@ struct m4_macro
 
 #define M4ARG(i)	(argc > (i) ? m4_get_symbol_value_text (argv[i]) : "")
 
-extern bool	m4_bad_argc	   (m4 *, int, m4_symbol_value **,
+extern bool	m4_bad_argc	   (m4 *, int, const char *,
 				    unsigned int, unsigned int, bool);
-extern bool	m4_numeric_arg	   (m4 *, int, m4_symbol_value **, int, int *);
+extern bool	m4_numeric_arg	   (m4 *, const char *, const char *, int *);
 extern void	m4_dump_args	   (m4 *, m4_obstack *, int,
 				    m4_symbol_value **, const char *, bool);
 extern bool	m4_parse_truth_arg (m4 *, const char *, const char *, bool);
diff --git a/m4/macro.c b/m4/macro.c
index ffe55f7..dd93152 100644
--- a/m4/macro.c
+++ b/m4/macro.c
@@ -389,7 +389,7 @@ void
 m4_macro_call (m4 *context, m4_symbol_value *value, m4_obstack *expansion,
 	       int argc, m4_symbol_value **argv)
 {
-  if (m4_bad_argc (context, argc, argv,
+  if (m4_bad_argc (context, argc, m4_get_symbol_value_text (argv[0]),
 		   VALUE_MIN_ARGS (value), VALUE_MAX_ARGS (value),
 		   BIT_TEST (VALUE_FLAGS (value),
 			     VALUE_SIDE_EFFECT_ARGS_BIT)))
diff --git a/m4/utility.c b/m4/utility.c
index 1839ea1..a8873f3 100644
--- a/m4/utility.c
+++ b/m4/utility.c
@@ -27,7 +27,7 @@
 #include "verror.h"
 #include "xvasprintf.h"
 
-static const char * skip_space (m4 *, const char *);
+static const char *skip_space (m4 *, const char *);
 
 
 
@@ -36,23 +36,23 @@ static const char * skip_space (m4 *, const char *);
    number of acceptable arguments, MAX is the 0-based maximum number
    or UINT_MAX if not applicable, and SIDE_EFFECT is true if the macro
    has side effects even if min is not satisfied.  ARGC is the 1-based
-   count of ARGV, where ARGV[0] is the name of the macro.  Return true
-   if the macro is guaranteed to expand to the empty string, false
-   otherwise.  */
+   count of supplied arguments, and CALLER is the name of the macro.
+   Return true if the macro is guaranteed to expand to the empty
+   string, false otherwise.  */
 bool
-m4_bad_argc (m4 *context, int argc, m4_symbol_value **argv,
-	     unsigned int min, unsigned int max, bool side_effect)
+m4_bad_argc (m4 *context, int argc, const char *caller, unsigned int min,
+	     unsigned int max, bool side_effect)
 {
   if (argc - 1 < min)
     {
-      m4_warn (context, 0, M4ARG (0), _("too few arguments: %d < %d"),
+      m4_warn (context, 0, caller, _("too few arguments: %d < %d"),
 	       argc - 1, min);
-      return ! side_effect;
+      return !side_effect;
     }
 
   if (argc - 1 > max)
     {
-      m4_warn (context, 0, M4ARG (0), _("extra arguments ignored: %d > %d"),
+      m4_warn (context, 0, caller, _("extra arguments ignored: %d > %d"),
 	       argc - 1, max);
     }
 
@@ -68,28 +68,26 @@ skip_space (m4 *context, const char *arg)
 }
 
 /* The function m4_numeric_arg () converts ARG to an int pointed to by
-   VALUEP. If the conversion fails, print error message for macro.
+   VALUEP. If the conversion fails, print error message for CALLER.
    Return true iff conversion succeeds.  */
 /* FIXME: Convert this to use gnulib's xstrtoimax, xstrtoumax.
    Otherwise, we are arbitrarily limiting integer values.  */
 bool
-m4_numeric_arg (m4 *context, int argc, m4_symbol_value **argv,
-		int arg, int *valuep)
+m4_numeric_arg (m4 *context, const char *caller, const char *arg, int *valuep)
 {
   char *endp;
 
-  if (*M4ARG (arg) == '\0')
+  if (*arg == '\0')
     {
       *valuep = 0;
-      m4_warn (context, 0, M4ARG (0), _("empty string treated as 0"));
+      m4_warn (context, 0, caller, _("empty string treated as 0"));
     }
   else
     {
-      *valuep = strtol (skip_space (context, M4ARG (arg)), &endp, 10);
+      *valuep = strtol (skip_space (context, arg), &endp, 10);
       if (*skip_space (context, endp) != 0)
 	{
-	  m4_warn (context, 0, M4ARG (0), _("non-numeric argument `%s'"),
-		   M4ARG (arg));
+	  m4_warn (context, 0, caller, _("non-numeric argument `%s'"), arg);
 	  return false;
 	}
     }
@@ -164,7 +162,7 @@ m4_verror_at_line (m4 *context, bool warn, int status, int errnum,
 		  full ? full : format, args);
   free (full);
   if ((!warn || m4_get_fatal_warnings_opt (context))
-      && ! m4_get_exit_status (context))
+      && !m4_get_exit_status (context))
     m4_set_exit_status (context, EXIT_FAILURE);
 }
 
@@ -182,7 +180,7 @@ m4_error (m4 *context, int status, int errnum, const char *macro,
 {
   va_list args;
   int line = m4_get_current_line (context);
-  assert (m4_get_current_file (context) || ! line);
+  assert (m4_get_current_file (context) || !line);
   va_start (args, format);
   if (status == EXIT_SUCCESS && m4_get_warnings_exit_opt (context))
     status = EXIT_FAILURE;
@@ -228,7 +226,7 @@ m4_warn (m4 *context, int errnum, const char *macro, const char *format, ...)
       va_list args;
       int status = EXIT_SUCCESS;
       int line = m4_get_current_line (context);
-      assert (m4_get_current_file (context) || ! line);
+      assert (m4_get_current_file (context) || !line);
       va_start (args, format);
       if (m4_get_warnings_exit_opt (context))
 	status = EXIT_FAILURE;
diff --git a/modules/evalparse.c b/modules/evalparse.c
index b4639b0..260ee1a 100644
--- a/modules/evalparse.c
+++ b/modules/evalparse.c
@@ -887,38 +887,40 @@ simple_term (m4 *context, eval_token et, number *v1)
 void
 m4_evaluate (m4 *context, m4_obstack *obs, int argc, m4_symbol_value **argv)
 {
+  const char *	me	= M4ARG (0);
+  const char *	str	= M4ARG (1);
   int		radix	= 10;
   int		min	= 1;
   number	val;
   eval_token	et;
   eval_error	err	= NO_ERROR;
 
-  if (*M4ARG (2) && !m4_numeric_arg (context, argc, argv, 2, &radix))
+  if (*M4ARG (2) && !m4_numeric_arg (context, me, M4ARG (2), &radix))
     return;
 
   if (radix < 1 || radix > 36)
     {
-      m4_warn (context, 0, M4ARG (0), _("radix out of range: %d"), radix);
+      m4_warn (context, 0, me, _("radix out of range: %d"), radix);
       return;
     }
 
-  if (argc >= 4 && !m4_numeric_arg (context, argc, argv, 3, &min))
+  if (argc >= 4 && !m4_numeric_arg (context, me, M4ARG (3), &min))
     return;
 
   if (min < 0)
     {
-      m4_warn (context, 0, M4ARG (0), _("negative width: %d"), min);
+      m4_warn (context, 0, me, _("negative width: %d"), min);
       return;
     }
 
   numb_initialise ();
-  eval_init_lex (M4ARG (1));
+  eval_init_lex (str);
 
   numb_init (val);
   et = eval_lex (&val);
   if (et == EOTEXT)
     {
-      m4_warn (context, 0, M4ARG (0), _("empty string treated as zero"));
+      m4_warn (context, 0, me, _("empty string treated as zero"));
       numb_set (val, numb_ZERO);
     }
   else
@@ -939,42 +941,40 @@ m4_evaluate (m4 *context, m4_obstack *obs, int argc, m4_symbol_value **argv)
       break;
 
     case MISSING_RIGHT:
-      m4_warn (context, 0, M4ARG (0), _("missing right parenthesis: %s"),
-	       M4ARG (1));
+      m4_warn (context, 0, me, _("missing right parenthesis: %s"), str);
       break;
 
     case MISSING_COLON:
-      m4_warn (context, 0, M4ARG (0), _("missing colon: %s"), M4ARG (1));
+      m4_warn (context, 0, me, _("missing colon: %s"), str);
       break;
 
     case SYNTAX_ERROR:
-      m4_warn (context, 0, M4ARG (0), _("bad expression: %s"), M4ARG (1));
+      m4_warn (context, 0, me, _("bad expression: %s"), str);
       break;
 
     case UNKNOWN_INPUT:
-      m4_warn (context, 0, M4ARG (0), _("bad input: %s"), M4ARG (1));
+      m4_warn (context, 0, me, _("bad input: %s"), str);
       break;
 
     case EXCESS_INPUT:
-      m4_warn (context, 0, M4ARG (0), _("excess input: %s"), M4ARG (1));
+      m4_warn (context, 0, me, _("excess input: %s"), str);
       break;
 
     case INVALID_OPERATOR:
       /* POSIX requires an error here, unless XCU ERN 137 is approved.  */
-      m4_error (context, 0, 0, M4ARG (0), _("invalid operator: %s"),
-		M4ARG (1));
+      m4_error (context, 0, 0, me, _("invalid operator: %s"), str);
       break;
 
     case DIVIDE_ZERO:
-      m4_warn (context, 0, M4ARG (0), _("divide by zero: %s"), M4ARG (1));
+      m4_warn (context, 0, me, _("divide by zero: %s"), str);
       break;
 
     case MODULO_ZERO:
-      m4_warn (context, 0, M4ARG (0), _("modulo by zero: %s"), M4ARG (1));
+      m4_warn (context, 0, me, _("modulo by zero: %s"), str);
       break;
 
     case NEGATIVE_EXPONENT:
-      m4_warn (context, 0, M4ARG (0), _("negative exponent: %s"), M4ARG (1));
+      m4_warn (context, 0, me, _("negative exponent: %s"), str);
       break;
 
     default:
diff --git a/modules/gnu.c b/modules/gnu.c
index 1aba84b..e857632 100644
--- a/modules/gnu.c
+++ b/modules/gnu.c
@@ -405,25 +405,26 @@ M4BUILTIN_HANDLER (__program__)
  **/
 M4BUILTIN_HANDLER (builtin)
 {
+  const char *me = M4ARG (0);
   const char *name;
   m4_symbol_value *value;
 
-  if (! m4_is_symbol_value_text (argv[1]))
+  if (!m4_is_symbol_value_text (argv[1]))
     {
       if (m4_is_symbol_value_func (argv[1])
 	  && m4_get_symbol_value_func (argv[1]) == builtin_builtin)
 	{
-	  if (m4_bad_argc (context, argc, argv, 2, 2, false))
+	  if (m4_bad_argc (context, argc, me, 2, 2, false))
 	    return;
-	  if (! m4_is_symbol_value_text (argv[2]))
+	  if (!m4_is_symbol_value_text (argv[2]))
 	    {
-	      m4_warn (context, 0, M4ARG (0), _("invalid macro name ignored"));
+	      m4_warn (context, 0, me, _("invalid macro name ignored"));
 	      return;
 	    }
 	  name = M4ARG (2);
 	  value = m4_builtin_find_by_name (NULL, name);
 	  if (value == NULL)
-	    m4_warn (context, 0, M4ARG (0), _("undefined builtin `%s'"), name);
+	    m4_warn (context, 0, me, _("undefined builtin `%s'"), name);
 	  else
 	    {
 	      m4_push_builtin (context, value);
@@ -431,25 +432,25 @@ M4BUILTIN_HANDLER (builtin)
 	    }
 	}
       else
-	m4_warn (context, 0, M4ARG (0), _("invalid macro name ignored"));
+	m4_warn (context, 0, me, _("invalid macro name ignored"));
     }
   else
     {
       name = M4ARG (1);
       value = m4_builtin_find_by_name (NULL, name);
       if (value == NULL)
-	m4_warn (context, 0, M4ARG (0), _("undefined builtin `%s'"), name);
+	m4_warn (context, 0, me, _("undefined builtin `%s'"), name);
       else
 	{
 	  const m4_builtin *bp = m4_get_symbol_value_builtin (value);
-	  if (!m4_bad_argc (context, argc - 1, argv + 1,
+	  if (!m4_bad_argc (context, argc - 1, name,
 			    bp->min_args, bp->max_args,
 			    (bp->flags & M4_BUILTIN_SIDE_EFFECT) != 0))
 	    {
 	      int i;
 	      if ((bp->flags & M4_BUILTIN_GROKS_MACRO) == 0)
 		for (i = 2; i < argc; i++)
-		  if (! m4_is_symbol_value_text (argv[i]))
+		  if (!m4_is_symbol_value_text (argv[i]))
 		    m4_set_symbol_value_text (argv[i], "");
 	      bp->func (context, obs, argc - 1, argv + 1);
 	    }
@@ -559,7 +560,7 @@ M4BUILTIN_HANDLER (debugfile)
 M4BUILTIN_HANDLER (debuglen)
 {
   int i;
-  if (!m4_numeric_arg (context, argc, argv, 1, &i))
+  if (!m4_numeric_arg (context, M4ARG (0), M4ARG (1), &i))
     return;
   /* FIXME - make m4_numeric_arg more powerful - we want to accept
      suffixes, and limit the result to size_t.  */
@@ -666,7 +667,7 @@ M4BUILTIN_HANDLER (format)
  **/
 M4BUILTIN_HANDLER (indir)
 {
-  if (! m4_is_symbol_value_text (argv[1]))
+  if (!m4_is_symbol_value_text (argv[1]))
     m4_warn (context, 0, M4ARG (0), _("invalid macro name ignored"));
   else
     {
@@ -678,9 +679,9 @@ M4BUILTIN_HANDLER (indir)
       else
 	{
 	  int i;
-	  if (! m4_symbol_groks_macro (symbol))
+	  if (!m4_symbol_groks_macro (symbol))
 	    for (i = 2; i < argc; i++)
-	      if (! m4_is_symbol_value_text (argv[i]))
+	      if (!m4_is_symbol_value_text (argv[i]))
 		m4_set_symbol_value_text (argv[i], "");
 	  m4_macro_call (context, m4_get_symbol_value (symbol), obs,
 			 argc - 1, argv + 1);
@@ -784,7 +785,7 @@ M4BUILTIN_HANDLER (regexp)
 
       /* The first case is the most difficult, because the empty string
 	 is a valid RESYNTAX, yet we want `regexp(aab, a*, )' to return
-	 an empty string as per M4 1.4.x!  */
+	 an empty string as per M4 1.4.x.  */
 
       if ((*replace == '\0') || (resyntax < 0))
 	/* regexp(VICTIM, REGEXP, REPLACEMENT) */
diff --git a/modules/m4.c b/modules/m4.c
index ec2372a..bffb274 100644
--- a/modules/m4.c
+++ b/modules/m4.c
@@ -246,6 +246,7 @@ M4BUILTIN_HANDLER (ifdef)
 
 M4BUILTIN_HANDLER (ifelse)
 {
+  const char *me = M4ARG (0);
   const char *result;
 
   /* The valid ranges of argc for ifelse is discontinuous, we cannot
@@ -253,11 +254,11 @@ M4BUILTIN_HANDLER (ifelse)
   if (argc == 2)
     return;
 
-  if (m4_bad_argc (context, argc, argv, 3, -1, false))
+  if (m4_bad_argc (context, argc, me, 3, -1, false))
     return;
   else if (argc % 3 == 0)
     /* Diagnose excess arguments if 5, 8, 11, etc., actual arguments.  */
-    m4_bad_argc (context, argc, argv, 0, argc - 2, false);
+    m4_bad_argc (context, argc, me, 0, argc - 2, false);
 
   argv++;
   argc--;
@@ -549,7 +550,7 @@ M4BUILTIN_HANDLER (incr)
 {
   int value;
 
-  if (!m4_numeric_arg (context, argc, argv, 1, &value))
+  if (!m4_numeric_arg (context, M4ARG (0), M4ARG (1), &value))
     return;
 
   m4_shipout_int (obs, value + 1);
@@ -559,7 +560,7 @@ M4BUILTIN_HANDLER (decr)
 {
   int value;
 
-  if (!m4_numeric_arg (context, argc, argv, 1, &value))
+  if (!m4_numeric_arg (context, M4ARG (0), M4ARG (1), &value))
     return;
 
   m4_shipout_int (obs, value - 1);
@@ -576,7 +577,7 @@ M4BUILTIN_HANDLER (divert)
   int i = 0;
   const char *text;
 
-  if (argc >= 2 && !m4_numeric_arg (context, argc, argv, 1, &i))
+  if (argc >= 2 && !m4_numeric_arg (context, M4ARG (0), M4ARG (1), &i))
     return;
 
   m4_make_diversion (context, i);
@@ -613,7 +614,7 @@ M4BUILTIN_HANDLER (undivert)
 	if (*endp == '\0' && !isspace ((unsigned char) *str))
 	  m4_insert_diversion (context, diversion);
 	else if (m4_get_posixly_correct_opt (context))
-	  m4_numeric_arg (context, argc, argv, i, &diversion);
+	  m4_numeric_arg (context, me, str, &diversion);
 	else
 	  {
 	    FILE *fp = m4_path_search (context, str, NULL);
@@ -825,7 +826,7 @@ M4BUILTIN_HANDLER (m4exit)
   int exit_code = EXIT_SUCCESS;
 
   /* Warn on bad arguments, but still exit.  */
-  if (argc >= 2 && !m4_numeric_arg (context, argc, argv, 1, &exit_code))
+  if (argc >= 2 && !m4_numeric_arg (context, me, M4ARG (1), &exit_code))
     exit_code = EXIT_FAILURE;
   if (exit_code < 0 || exit_code > 255)
     {
@@ -934,21 +935,23 @@ M4BUILTIN_HANDLER (index)
    substring extends to the end of the first argument.  */
 M4BUILTIN_HANDLER (substr)
 {
+  const char *me = M4ARG (0);
+  const char *str = M4ARG (1);
   int start = 0;
   int length;
   int avail;
 
   if (argc <= 2)
     {
-      obstack_grow (obs, M4ARG (1), strlen (M4ARG (1)));
+      obstack_grow (obs, str, strlen (str));
       return;
     }
 
-  length = avail = strlen (M4ARG (1));
-  if (!m4_numeric_arg (context, argc, argv, 2, &start))
+  length = avail = strlen (str);
+  if (!m4_numeric_arg (context, me, M4ARG (2), &start))
     return;
 
-  if (argc >= 4 && !m4_numeric_arg (context, argc, argv, 3, &length))
+  if (argc >= 4 && !m4_numeric_arg (context, me, M4ARG (3), &length))
     return;
 
   if (start < 0 || length <= 0 || start >= avail)
@@ -956,7 +959,7 @@ M4BUILTIN_HANDLER (substr)
 
   if (start + length > avail)
     length = avail - start;
-  obstack_grow (obs, M4ARG (1) + start, length);
+  obstack_grow (obs, str + start, length);
 }
 
 
diff --git a/modules/stdlib.c b/modules/stdlib.c
index 471ae17..62fdae7 100644
--- a/modules/stdlib.c
+++ b/modules/stdlib.c
@@ -110,7 +110,7 @@ M4BUILTIN_HANDLER (setenv)
   int overwrite = 1;
 
   if (argc >= 4)
-    if (!m4_numeric_arg (context, argc, argv, 3, &overwrite))
+    if (!m4_numeric_arg (context, M4ARG (0), M4ARG (3), &overwrite))
       return;
 
 #if HAVE_SETENV
@@ -209,7 +209,7 @@ M4BUILTIN_HANDLER (getpwuid)
   struct passwd *pw;
   int uid;
 
-  if (!m4_numeric_arg (context, argc, argv, 1, &uid))
+  if (!m4_numeric_arg (context, M4ARG (0), M4ARG (1), &uid))
     return;
 
   pw = getpwuid (uid);
@@ -264,7 +264,7 @@ M4BUILTIN_HANDLER (srand)
     seed = time (0L) * getpid ();
   else
     {
-      if (!m4_numeric_arg (context, argc, argv, 1, &seed))
+      if (!m4_numeric_arg (context, M4ARG (0), M4ARG (1), &seed))
 	return;
     }
 
diff --git a/modules/time.c b/modules/time.c
index 62cff92..9807ae0 100644
--- a/modules/time.c
+++ b/modules/time.c
@@ -107,7 +107,7 @@ M4BUILTIN_HANDLER (ctime)
 
   if (argc == 2)
     {
-      m4_numeric_arg (context, argc, argv, 1, &i);
+      m4_numeric_arg (context, M4ARG (0), M4ARG (1), &i);
       t = i;
     }
   else
@@ -155,7 +155,7 @@ M4BUILTIN_HANDLER (gmtime)
   time_t t;
   int i;
 
-  if (!m4_numeric_arg (context, argc, argv, 1, &i))
+  if (!m4_numeric_arg (context, M4ARG (0), M4ARG (1), &i))
     return;
 
   t = i;
@@ -170,7 +170,7 @@ M4BUILTIN_HANDLER (localtime)
   time_t t;
   int i;
 
-  if (!m4_numeric_arg (context, argc, argv, 1, &i))
+  if (!m4_numeric_arg (context, M4ARG (0), M4ARG (1), &i))
     return;
 
   t = i;
@@ -183,22 +183,23 @@ M4BUILTIN_HANDLER (localtime)
  **/
 M4BUILTIN_HANDLER (mktime)
 {
+  const char *me = M4ARG (0);
   struct tm tm;
   time_t t;
 
-  if (!m4_numeric_arg (context, argc, argv, 1, &tm.tm_sec))
+  if (!m4_numeric_arg (context, me, M4ARG (1), &tm.tm_sec))
     return;
-  if (!m4_numeric_arg (context, argc, argv, 2, &tm.tm_min))
+  if (!m4_numeric_arg (context, me, M4ARG (2), &tm.tm_min))
     return;
-  if (!m4_numeric_arg (context, argc, argv, 3, &tm.tm_hour))
+  if (!m4_numeric_arg (context, me, M4ARG (3), &tm.tm_hour))
     return;
-  if (!m4_numeric_arg (context, argc, argv, 4, &tm.tm_mday))
+  if (!m4_numeric_arg (context, me, M4ARG (4), &tm.tm_mday))
     return;
-  if (!m4_numeric_arg (context, argc, argv, 5, &tm.tm_mon))
+  if (!m4_numeric_arg (context, me, M4ARG (5), &tm.tm_mon))
     return;
-  if (!m4_numeric_arg (context, argc, argv, 6, &tm.tm_year))
+  if (!m4_numeric_arg (context, me, M4ARG (6), &tm.tm_year))
     return;
-  if (M4ARG (7) && !m4_numeric_arg (context, argc, argv, 7, &tm.tm_isdst))
+  if (M4ARG (7) && !m4_numeric_arg (context, me, M4ARG (7), &tm.tm_isdst))
     return;
 
   t = mktime (&tm);
@@ -218,7 +219,7 @@ M4BUILTIN_HANDLER (strftime)
   char *buf;
   int l;
 
-  if (!m4_numeric_arg (context, argc, argv, 2, &l))
+  if (!m4_numeric_arg (context, M4ARG (0), M4ARG (2), &l))
     return;
 
   t = l;
-- 
1.5.3.5
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.