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