summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2007-11-21 16:05:23 -0700
committerEric Blake <ebb9@byu.net>2007-11-21 16:11:25 -0700
commited2e087c61541a94a3af378fe963cd1ae271d935 (patch)
tree5e7aa511520e85eea93b09f46a6c9797e445b8f9
parent902fc6fad4ed4194fa1305b94613abe7dc6cabd7 (diff)
downloadm4-ed2e087c61541a94a3af378fe963cd1ae271d935.tar.gz
Consistently report macro name first in messages.
* src/m4.h (evaluate): Adjust prototype. * src/builtin.c (bad_argc, numeric_arg, m4_placeholder): Alter wording to match head. (mkstemp_helper, substitute): Adjust signature. All callers changed. (m4_dumpdef, m4_builtin, m4_indir, m4_defn, m4_esyscmd, m4_eval) (m4_undivert, m4_maketemp, m4_m4exit, m4_debugmode) (m4_debugfile, m4_regexp, m4_patsubst): Mention macro name in message. (m4_format): Adjust call. * src/format.c (format): No longer skip argv[0]. * src/eval.c (evaluate): Mention macro name in message. (logical_or_term, logical_and_term, or_term, xor_term, and_term) (equality_term, cmp_term, shift_term, add_term, mult_term) (exp_term, unary_term, simple_term): Adjust signature. * src/macro.c (warn_builtin_concat): Likewise. (expand_argument): Adjust caller. * doc/m4.texinfo (Macro Arguments, Ifdef, Ifelse, Debug Output) (Dnl, Improved fatal_error, Defn, Builtin, Index macro, Regexp) (Substr, Translit, Patsubst, Format, Eval, Dumpdef, Include) (Improved forloop, Indir, Trace, Incr): Adjust tests to match. Signed-off-by: Eric Blake <ebb9@byu.net>
-rw-r--r--ChangeLog23
-rw-r--r--doc/m4.texinfo114
-rw-r--r--src/builtin.c147
-rw-r--r--src/eval.c126
-rw-r--r--src/format.c7
-rw-r--r--src/m4.h2
-rw-r--r--src/macro.c12
7 files changed, 237 insertions, 194 deletions
diff --git a/ChangeLog b/ChangeLog
index a6d25ec8..4179e81b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,28 @@
2007-11-21 Eric Blake <ebb9@byu.net>
+ Consistently report macro name first in messages.
+ * src/m4.h (evaluate): Adjust prototype.
+ * src/builtin.c (bad_argc, numeric_arg, m4_placeholder): Alter
+ wording to match head.
+ (mkstemp_helper, substitute): Adjust signature. All callers
+ changed.
+ (m4_dumpdef, m4_builtin, m4_indir, m4_defn, m4_esyscmd, m4_eval)
+ (m4_undivert, m4_maketemp, m4_m4exit, m4_debugmode)
+ (m4_debugfile, m4_regexp, m4_patsubst): Mention macro name in
+ message.
+ (m4_format): Adjust call.
+ * src/format.c (format): No longer skip argv[0].
+ * src/eval.c (evaluate): Mention macro name in message.
+ (logical_or_term, logical_and_term, or_term, xor_term, and_term)
+ (equality_term, cmp_term, shift_term, add_term, mult_term)
+ (exp_term, unary_term, simple_term): Adjust signature.
+ * src/macro.c (warn_builtin_concat): Likewise.
+ (expand_argument): Adjust caller.
+ * doc/m4.texinfo (Macro Arguments, Ifdef, Ifelse, Debug Output)
+ (Dnl, Improved fatal_error, Defn, Builtin, Index macro, Regexp)
+ (Substr, Translit, Patsubst, Format, Eval, Dumpdef, Include)
+ (Improved forloop, Indir, Trace, Incr): Adjust tests to match.
+
Make argument checking a bit more sane.
* src/builtin.c (bad_argc): Adjust signature, and don't force
callers to add 1. Adjust all callers.
diff --git a/doc/m4.texinfo b/doc/m4.texinfo
index c573e76f..6ae09f77 100644
--- a/doc/m4.texinfo
+++ b/doc/m4.texinfo
@@ -1450,12 +1450,12 @@ defined macros, there is no check of the number of arguments given.
@example
$ @kbd{m4}
index(`abc')
-@error{}m4:stdin:1: Warning: too few arguments to builtin `index'
+@error{}m4:stdin:1: Warning: index: too few arguments: 1 < 2
@result{}0
index(`abc',)
@result{}0
index(`abc', `b', `ignored')
-@error{}m4:stdin:3: Warning: excess arguments to builtin `index' ignored
+@error{}m4:stdin:3: Warning: index: extra arguments ignored: 3 > 2
@result{}1
@end example
@@ -2203,21 +2203,21 @@ version of @acronym{GNU} M4 may lift these restrictions.
define(`a', `A')define(`AA', `b')
@result{}
defn(`a', `divnum', `a')
-@error{}m4:stdin:2: Warning: cannot concatenate builtin `divnum'
+@error{}m4:stdin:2: Warning: defn: cannot concatenate builtin `divnum'
@result{}AA
define(`mydivnum', defn(`divnum', `divnum'))mydivnum
-@error{}m4:stdin:3: Warning: cannot concatenate builtin `divnum'
-@error{}m4:stdin:3: Warning: cannot concatenate builtin `divnum'
+@error{}m4:stdin:3: Warning: defn: cannot concatenate builtin `divnum'
+@error{}m4:stdin:3: Warning: defn: cannot concatenate builtin `divnum'
@result{}
define(`mydivnum', defn(`divnum')defn(`divnum'))mydivnum
-@error{}m4:stdin:4: Warning: cannot concatenate builtin `divnum'
-@error{}m4:stdin:4: Warning: cannot concatenate builtin `divnum'
+@error{}m4:stdin:4: Warning: define: cannot concatenate builtin `divnum'
+@error{}m4:stdin:4: Warning: define: cannot concatenate builtin `divnum'
@result{}
define(`mydivnum', defn(`divnum')`a')mydivnum
-@error{}m4:stdin:5: Warning: cannot concatenate builtin `divnum'
+@error{}m4:stdin:5: Warning: define: cannot concatenate builtin `divnum'
@result{}A
define(`mydivnum', `a'defn(`divnum'))mydivnum
-@error{}m4:stdin:6: Warning: cannot concatenate builtin `divnum'
+@error{}m4:stdin:6: Warning: define: cannot concatenate builtin `divnum'
@result{}A
@end example
@@ -2367,7 +2367,7 @@ f(define(`f', `2'))
indir(`f', define(`f', `3'))
@result{}3
indir(`f', undefine(`f'))
-@error{}m4:stdin:4: undefined macro `f'
+@error{}m4:stdin:4: indir: undefined macro `f'
@result{}
@end example
@@ -2389,7 +2389,7 @@ indir(`define', `foo', defn(`divnum'))
foo
@result{}0
indir(`divert', defn(`foo'))
-@error{}m4:stdin:5: empty string treated as 0 in builtin `divert'
+@error{}m4:stdin:5: divert: empty string treated as 0
@result{}
@end example
@@ -2452,10 +2452,10 @@ $ @kbd{m4 -P}
m4_builtin(`divnum')
@result{}0
m4_builtin(`m4_divnum')
-@error{}m4:stdin:2: undefined builtin `m4_divnum'
+@error{}m4:stdin:2: m4_builtin: undefined builtin `m4_divnum'
@result{}
m4_indir(`divnum')
-@error{}m4:stdin:3: undefined macro `divnum'
+@error{}m4:stdin:3: m4_indir: undefined macro `divnum'
@result{}
m4_indir(`m4_divnum')
@result{}0
@@ -2469,13 +2469,13 @@ recognized; but it will provoke a warning, and result in a void expansion.
builtin
@result{}builtin
builtin()
-@error{}m4:stdin:2: undefined builtin `'
+@error{}m4:stdin:2: builtin: undefined builtin `'
@result{}
builtin(`builtin')
-@error{}m4:stdin:3: Warning: too few arguments to builtin `builtin'
+@error{}m4:stdin:3: Warning: builtin: too few arguments: 0 < 1
@result{}
builtin(`builtin',)
-@error{}m4:stdin:4: undefined builtin `'
+@error{}m4:stdin:4: builtin: undefined builtin `'
@result{}
@end example
@@ -2531,7 +2531,7 @@ define(`foo', `')
ifdef(`foo', ``foo' is defined', ``foo' is not defined')
@result{}foo is defined
ifdef(`no_such_macro', `yes', `no', `extra argument')
-@error{}m4:stdin:4: Warning: excess arguments to builtin `ifdef' ignored
+@error{}m4:stdin:4: Warning: ifdef: extra arguments ignored: 4 > 3
@result{}no
@end example
@@ -2575,7 +2575,7 @@ case, the warning about missing arguments is never triggered.
ifelse(`some comments')
@result{}
ifelse(`foo', `bar')
-@error{}m4:stdin:2: Warning: too few arguments to builtin `ifelse'
+@error{}m4:stdin:2: Warning: ifelse: too few arguments: 2 < 3
@result{}
@end example
@@ -2624,14 +2624,14 @@ calls for an example:
@example
ifelse(`foo', `bar', `third', `gnu', `gnats')
-@error{}m4:stdin:1: Warning: excess arguments to builtin `ifelse' ignored
+@error{}m4:stdin:1: Warning: ifelse: extra arguments ignored: 5 > 4
@result{}gnu
ifelse(`foo', `bar', `third', `gnu', `gnats', `sixth')
@result{}
ifelse(`foo', `bar', `third', `gnu', `gnats', `sixth', `seventh')
@result{}seventh
ifelse(`foo', `bar', `3', `gnu', `gnats', `6', `7', `8')
-@error{}m4:stdin:4: Warning: excess arguments to builtin `ifelse' ignored
+@error{}m4:stdin:4: Warning: ifelse: extra arguments ignored: 8 > 7
@result{}7
@end example
@@ -3133,7 +3133,7 @@ f(popdef(`f')dumpdef(`f'))
@error{}f:@tabchar{}``$0'1'
@result{}f2
f(popdef(`f')dumpdef(`f'))
-@error{}m4:stdin:3: undefined macro `f'
+@error{}m4:stdin:3: dumpdef: undefined macro `f'
@result{}f1
@end example
@@ -3231,7 +3231,7 @@ undefine(`foo')
ifdef(`foo', `yes', `no')
@result{}no
indir(`foo')
-@error{}m4:stdin:8: undefined macro `foo'
+@error{}m4:stdin:8: indir: undefined macro `foo'
@result{}
define(`foo', `blah')
@result{}
@@ -3407,13 +3407,13 @@ $ @kbd{m4}
traceon(`divnum')
@result{}
divnum(`extra')
-@error{}m4:stdin:2: Warning: excess arguments to builtin `divnum' ignored
+@error{}m4:stdin:2: Warning: divnum: extra arguments ignored: 1 > 0
@error{}m4trace: -1- divnum(`extra') -> `0'
@result{}0
debugfile()
@result{}
divnum(`extra')
-@error{}m4:stdin:4: Warning: excess arguments to builtin `divnum' ignored
+@error{}m4:stdin:4: Warning: divnum: extra arguments ignored: 1 > 0
@result{}0
debugfile
@result{}
@@ -3476,7 +3476,7 @@ next newline, on whatever line containing it, will still be discarded.
@example
dnl(`args are ignored, but side effects occur',
define(`foo', `like this')) while this text is ignored: undefine(`foo')
-@error{}m4:stdin:1: Warning: excess arguments to builtin `dnl' ignored
+@error{}m4:stdin:1: Warning: dnl: extra arguments ignored: 2 > 0
See how `foo' was defined, foo?
@result{}See how foo was defined, like this?
@end example
@@ -4240,13 +4240,13 @@ parameters.
@comment status: 1
@example
-include(`none')
-@error{}m4:stdin:1: cannot open `none': No such file or directory
+include(`n')
+@error{}m4:stdin:1: include: cannot open `n': No such file or directory
@result{}
include()
-@error{}m4:stdin:2: cannot open `': No such file or directory
+@error{}m4:stdin:2: include: cannot open `': No such file or directory
@result{}
-sinclude(`none')
+sinclude(`n')
@result{}
sinclude()
@result{}
@@ -4797,7 +4797,7 @@ contrast this with an empty @var{substring}.
@example
index(`abc')
-@error{}m4:stdin:1: Warning: too few arguments to builtin `index'
+@error{}m4:stdin:1: Warning: index: too few arguments: 1 < 2
@result{}0
index(`abc', `')
@result{}0
@@ -4865,13 +4865,13 @@ Here are some more examples on the handling of backslash:
regexp(`abc', `\(b\)', `\\\10\a')
@result{}\b0a
regexp(`abc', `b', `\1\')
-@error{}m4:stdin:2: Warning: sub-expression 1 not present
-@error{}m4:stdin:2: Warning: trailing \ ignored in replacement
+@error{}m4:stdin:2: Warning: regexp: sub-expression 1 not present
+@error{}m4:stdin:2: Warning: regexp: trailing \ ignored in replacement
@result{}
regexp(`abc', `\(\(d\)?\)\(c\)', `\1\2\3\4\5\6')
-@error{}m4:stdin:3: Warning: sub-expression 4 not present
-@error{}m4:stdin:3: Warning: sub-expression 5 not present
-@error{}m4:stdin:3: Warning: sub-expression 6 not present
+@error{}m4:stdin:3: Warning: regexp: sub-expression 4 not present
+@error{}m4:stdin:3: Warning: regexp: sub-expression 5 not present
+@error{}m4:stdin:3: Warning: regexp: sub-expression 6 not present
@result{}c
@end example
@@ -4880,7 +4880,7 @@ contrast this with an empty @var{regexp} argument.
@example
regexp(`abc')
-@error{}m4:stdin:1: Warning: too few arguments to builtin `regexp'
+@error{}m4:stdin:1: Warning: regexp: too few arguments: 1 < 2
@result{}0
regexp(`abc', `')
@result{}0
@@ -4917,10 +4917,10 @@ Omitting @var{from} evokes a warning, but still produces output.
@example
substr(`abc')
-@error{}m4:stdin:1: Warning: too few arguments to builtin `substr'
+@error{}m4:stdin:1: Warning: substr: too few arguments: 1 < 2
@result{}abc
substr(`abc',)
-@error{}m4:stdin:2: empty string treated as 0 in builtin `substr'
+@error{}m4:stdin:2: substr: empty string treated as 0
@result{}abc
@end example
@@ -4997,7 +4997,7 @@ Omitting @var{chars} evokes a warning, but still produces output.
@example
translit(`abc')
-@error{}m4:stdin:1: Warning: too few arguments to builtin `translit'
+@error{}m4:stdin:1: Warning: translit: too few arguments: 1 < 2
@result{}abc
@end example
@@ -5051,7 +5051,7 @@ patsubst(`GNUs not Unix', `\w+', `(\&)')
patsubst(`GNUs not Unix', `[A-Z][a-z]+')
@result{}GN not@w{ }
patsubst(`GNUs not Unix', `not', `NOT\')
-@error{}m4:stdin:6: Warning: trailing \ ignored in replacement
+@error{}m4:stdin:6: Warning: patsubst: trailing \ ignored in replacement
@result{}GNUs NOT Unix
@end example
@@ -5128,7 +5128,7 @@ contrast this with an empty @var{regexp} argument.
@example
patsubst(`abc')
-@error{}m4:stdin:1: Warning: too few arguments to builtin `patsubst'
+@error{}m4:stdin:1: Warning: patsubst: too few arguments: 1 < 2
@result{}abc
patsubst(`abc', `')
@result{}abc
@@ -5224,7 +5224,7 @@ encountered. Likewise, escape sequences are not yet recognized.
@example
format(`%p', `0')
-@error{}m4:stdin:1: Warning: unrecognized specifier in `%p'
+@error{}m4:stdin:1: Warning: format: unrecognized specifier in `%p'
@result{}
@end example
@@ -5266,10 +5266,10 @@ incr(`4')
decr(`7')
@result{}6
incr()
-@error{}m4:stdin:3: empty string treated as 0 in builtin `incr'
+@error{}m4:stdin:3: incr: empty string treated as 0
@result{}1
decr()
-@error{}m4:stdin:4: empty string treated as 0 in builtin `decr'
+@error{}m4:stdin:4: decr: empty string treated as 0
@result{}-1
@end example
@@ -5339,13 +5339,13 @@ extension when @acronym{POSIX} mode is not requested, and that using
@comment status: 1
@example
eval(`2 = 2')
-@error{}m4:stdin:1: Warning: recommend ==, not =, for equality operator
+@error{}m4:stdin:1: Warning: eval: recommend ==, not =, for equality
@result{}1
eval(`++0')
-@error{}m4:stdin:2: invalid operator in eval: ++0
+@error{}m4:stdin:2: eval: invalid operator: ++0
@result{}
eval(`0 |= 1')
-@error{}m4:stdin:3: invalid operator in eval: 0 |= 1
+@error{}m4:stdin:3: eval: invalid operator: 0 |= 1
@result{}
@end example
@@ -5388,12 +5388,12 @@ eval(`+ + - ~ ! ~ 0')
eval(`2 || 1 / 0')
@result{}1
eval(`0 || 1 / 0')
-@error{}m4:stdin:9: divide by zero in eval: 0 || 1 / 0
+@error{}m4:stdin:9: eval: divide by zero: 0 || 1 / 0
@result{}
eval(`0 && 1 % 0')
@result{}0
eval(`2 && 1 % 0')
-@error{}m4:stdin:11: modulo by zero in eval: 2 && 1 % 0
+@error{}m4:stdin:11: eval: modulo by zero: 2 && 1 % 0
@result{}
@end example
@@ -5414,9 +5414,9 @@ eval(`2 ** 0')
@result{}1
eval(`0 ** 0')
@result{}
-@error{}m4:stdin:5: divide by zero in eval: 0 ** 0
+@error{}m4:stdin:5: eval: divide by zero: 0 ** 0
eval(`4 ** -2')
-@error{}m4:stdin:6: negative exponent in eval: 4 ** -2
+@error{}m4:stdin:6: eval: negative exponent: 4 ** -2
@result{}
@end example
@@ -5461,7 +5461,7 @@ square(square(`5')` + 1')
define(`foo', `666')
@result{}
eval(`foo / 6')
-@error{}m4:stdin:11: bad expression in eval: foo / 6
+@error{}m4:stdin:11: eval: bad expression: foo / 6
@result{}
eval(foo / 6)
@result{}111
@@ -5529,13 +5529,13 @@ eval(`10', `', `0')
eval(`10', `16')
@result{}a
eval(`1', `37')
-@error{}m4:stdin:9: radix 37 in builtin `eval' out of range
+@error{}m4:stdin:9: eval: radix 37 out of range
@result{}
eval(`1', , `-1')
-@error{}m4:stdin:10: negative width to builtin `eval'
+@error{}m4:stdin:10: eval: negative width
@result{}
eval()
-@error{}m4:stdin:11: empty string treated as 0 in builtin `eval'
+@error{}m4:stdin:11: eval: empty string treated as 0
@result{}0
@end example
@@ -6769,7 +6769,7 @@ forloop(`', `1', `2', ` odd iterator name')
forloop(`i', `5 + 5', `0xc', ` 0x`'eval(i, `16')')
@result{} 0xa 0xb 0xc
forloop(`i', `a', `b', `non-numeric bounds')
-@error{}m4:stdin:6: bad expression in eval (bad input): (b) >= (a)
+@error{}m4:stdin:6: eval: bad expression (bad input): (b) >= (a)
@result{}
@end example
@@ -7211,7 +7211,7 @@ m4wrap(`divnum(`demo of internal message')
fatal_error(`inside wrapped text')')
@result{}
^D
-@error{}m4:stdin:6: Warning: excess arguments to builtin `divnum' ignored
+@error{}m4:stdin:6: Warning: divnum: extra arguments ignored: 1 > 0
@result{}0
@error{}m4:stdin:6: fatal error: inside wrapped text
@end example
diff --git a/src/builtin.c b/src/builtin.c
index 4e6f5dc2..48df3d62 100644
--- a/src/builtin.c
+++ b/src/builtin.c
@@ -507,12 +507,14 @@ bad_argc (const char *name, int argc, unsigned int min, unsigned int max)
{
if (!suppress_warnings)
M4ERROR ((warning_status, 0,
- "Warning: too few arguments to builtin `%s'", name));
+ "Warning: %s: too few arguments: %d < %d",
+ name, argc - 1, min));
return true;
}
if (argc - 1 > max && !suppress_warnings)
M4ERROR ((warning_status, 0,
- "Warning: excess arguments to builtin `%s' ignored", name));
+ "Warning: %s: extra arguments ignored: %d > %d",
+ name, argc - 1, max));
return false;
}
@@ -530,8 +532,7 @@ numeric_arg (const char *name, const char *arg, int *valuep)
if (*arg == '\0')
{
*valuep = 0;
- M4ERROR ((warning_status, 0,
- "empty string treated as 0 in builtin `%s'", name));
+ M4ERROR ((warning_status, 0, "%s: empty string treated as 0", name));
}
else
{
@@ -540,15 +541,15 @@ numeric_arg (const char *name, const char *arg, int *valuep)
if (*endp != '\0')
{
M4ERROR ((warning_status, 0,
- "non-numeric argument to builtin `%s'", name));
+ "%s: non-numeric argument `%s'", name, arg));
return false;
}
if (isspace (to_uchar (*arg)))
M4ERROR ((warning_status, 0,
- "leading whitespace ignored in builtin `%s'", name));
+ "%s: leading whitespace ignored", name));
else if (errno == ERANGE)
M4ERROR ((warning_status, 0,
- "numeric overflow detected in builtin `%s'", name));
+ "%s: numeric overflow detected", name));
}
return true;
}
@@ -841,6 +842,7 @@ dumpdef_cmp (const void *s1, const void *s2)
static void
m4_dumpdef (struct obstack *obs, int argc, token_data **argv)
{
+ const char *me = ARG (0);
symbol *s;
int i;
struct dump_symbol_data data;
@@ -863,7 +865,7 @@ m4_dumpdef (struct obstack *obs, int argc, token_data **argv)
dump_symbol (s, &data);
else
M4ERROR ((warning_status, 0,
- "undefined macro `%s'", ARG (i)));
+ "%s: undefined macro `%s'", me, ARG (i)));
}
}
@@ -932,7 +934,7 @@ m4_builtin (struct obstack *obs, int argc, token_data **argv)
bp = find_builtin_by_name (name);
if (bp->func == m4_placeholder)
M4ERROR ((warning_status, 0,
- "undefined builtin `%s'", name));
+ "%s: undefined builtin `%s'", me, name));
else
{
int i;
@@ -974,7 +976,7 @@ m4_indir (struct obstack *obs, int argc, token_data **argv)
s = lookup_symbol (name, SYMBOL_LOOKUP);
if (s == NULL || SYMBOL_TYPE (s) == TOKEN_VOID)
M4ERROR ((warning_status, 0,
- "undefined macro `%s'", name));
+ "%s: undefined macro `%s'", me, name));
else
{
int i;
@@ -998,11 +1000,12 @@ m4_indir (struct obstack *obs, int argc, token_data **argv)
static void
m4_defn (struct obstack *obs, int argc, token_data **argv)
{
+ const char *me = ARG (0);
symbol *s;
builtin_func *b;
int i;
- if (bad_argc (ARG (0), argc, 1, -1))
+ if (bad_argc (me, argc, 1, -1))
return;
for (i = 1; i < argc; i++)
@@ -1023,11 +1026,11 @@ m4_defn (struct obstack *obs, int argc, token_data **argv)
b = SYMBOL_FUNC (s);
if (b == m4_placeholder)
M4ERROR ((warning_status, 0, "\
-builtin `%s' requested by frozen file is not supported", ARG (i)));
+Warning: %s: builtin `%s' requested by frozen file not found", me, ARG (i)));
else if (argc != 2)
M4ERROR ((warning_status, 0,
- "Warning: cannot concatenate builtin `%s'",
- ARG (i)));
+ "Warning: %s: cannot concatenate builtin `%s'",
+ me, ARG (i)));
else
push_macro (b);
break;
@@ -1103,10 +1106,11 @@ m4_syscmd (struct obstack *obs, int argc, token_data **argv)
static void
m4_esyscmd (struct obstack *obs, int argc, token_data **argv)
{
+ const char *me = ARG (0);
FILE *pin;
int ch;
- if (bad_argc (ARG (0), argc, 1, 1))
+ if (bad_argc (me, argc, 1, 1))
{
/* The empty command is successful. */
sysval = 0;
@@ -1119,7 +1123,7 @@ m4_esyscmd (struct obstack *obs, int argc, token_data **argv)
if (pin == NULL)
{
M4ERROR ((warning_status, errno,
- "cannot open pipe to command `%s'", ARG (1)));
+ "%s: cannot open pipe to command `%s'", me, ARG (1)));
sysval = -1;
}
else
@@ -1161,7 +1165,7 @@ m4_eval (struct obstack *obs, int argc, token_data **argv)
if (radix < 1 || radix > (int) strlen (digits))
{
M4ERROR ((warning_status, 0,
- "radix %d in builtin `%s' out of range", radix, me));
+ "%s: radix %d out of range", me, radix));
return;
}
@@ -1169,15 +1173,14 @@ m4_eval (struct obstack *obs, int argc, token_data **argv)
return;
if (min < 0)
{
- M4ERROR ((warning_status, 0,
- "negative width to builtin `%s'", me));
+ M4ERROR ((warning_status, 0, "%s: negative width", me));
return;
}
if (!*ARG (1))
M4ERROR ((warning_status, 0,
- "empty string treated as 0 in builtin `%s'", me));
- else if (evaluate (ARG (1), &value))
+ "%s: empty string treated as 0", me));
+ else if (evaluate (me, ARG (1), &value))
return;
if (radix == 1)
@@ -1292,25 +1295,26 @@ m4_undivert (struct obstack *obs, int argc, token_data **argv)
else
for (i = 1; i < argc; i++)
{
- file = strtol (ARG (i), &endp, 10);
- if (*endp == '\0' && !isspace (to_uchar (*ARG (i))))
+ const char *str = ARG (i);
+ file = strtol (str, &endp, 10);
+ if (*endp == '\0' && !isspace (to_uchar (*str)))
insert_diversion (file);
else if (no_gnu_extensions)
M4ERROR ((warning_status, 0,
- "non-numeric argument to builtin `%s'", me));
+ "%s: non-numeric argument `%s'", me, str));
else
{
- fp = m4_path_search (ARG (i), NULL);
+ fp = m4_path_search (str, NULL);
if (fp != NULL)
{
insert_file (fp);
if (fclose (fp) == EOF)
M4ERROR ((warning_status, errno,
- "error undiverting `%s'", ARG (i)));
+ "%s: error undiverting `%s'", me, str));
}
else
M4ERROR ((warning_status, errno,
- "cannot undivert `%s'", ARG (i)));
+ "%s: cannot undivert `%s'", me, str));
}
}
}
@@ -1405,10 +1409,11 @@ m4_changeword (struct obstack *obs, int argc, token_data **argv)
static void
include (int argc, token_data **argv, bool silent)
{
+ const char *me = ARG (0);
FILE *fp;
char *name;
- if (bad_argc (ARG (0), argc, 1, 1))
+ if (bad_argc (me, argc, 1, 1))
return;
fp = m4_path_search (ARG (1), &name);
@@ -1416,7 +1421,8 @@ include (int argc, token_data **argv, bool silent)
{
if (!silent)
{
- M4ERROR ((warning_status, errno, "cannot open `%s'", ARG (1)));
+ M4ERROR ((warning_status, errno, "%s: cannot open `%s'",
+ me, ARG (1)));
retcode = EXIT_FAILURE;
}
return;
@@ -1449,14 +1455,14 @@ m4_sinclude (struct obstack *obs, int argc, token_data **argv)
/* More miscellaneous builtins -- "maketemp", "errprint", "__file__",
"__line__", and "__program__". The last three are GNU specific. */
-/*------------------------------------------------------------------.
-| Use the first argument as at template for a temporary file name. |
-`------------------------------------------------------------------*/
+/*-----------------------------------------------------------------.
+| Use the first argument as a template for a temporary file name. |
+`-----------------------------------------------------------------*/
/* Add trailing 'X' to NAME if necessary, securely create the file,
- and place the new file name on OBS. */
+ and place the new file name on OBS. Report errors on behalf of ME. */
static void
-mkstemp_helper (struct obstack *obs, const char *name)
+mkstemp_helper (struct obstack *obs, const char *me, const char *name)
{
int fd;
int len;
@@ -1477,7 +1483,7 @@ mkstemp_helper (struct obstack *obs, const char *name)
fd = mkstemp ((char *) obstack_base (obs));
if (fd < 0)
{
- M4ERROR ((0, errno, "cannot create tempfile `%s'", name));
+ M4ERROR ((0, errno, "%s: cannot create tempfile `%s'", me, name));
obstack_free (obs, obstack_finish (obs));
}
else
@@ -1487,7 +1493,9 @@ mkstemp_helper (struct obstack *obs, const char *name)
static void
m4_maketemp (struct obstack *obs, int argc, token_data **argv)
{
- if (bad_argc (ARG (0), argc, 1, 1))
+ const char *me = ARG (0);
+
+ if (bad_argc (me, argc, 1, 1))
return;
if (no_gnu_extensions)
{
@@ -1507,7 +1515,7 @@ m4_maketemp (struct obstack *obs, int argc, token_data **argv)
int i;
int len2;
- M4ERROR ((warning_status, 0, "recommend using mkstemp instead"));
+ M4ERROR ((warning_status, 0, "%s: recommend using mkstemp instead", me));
for (i = len; i > 1; i--)
if (str[i - 1] != 'X')
break;
@@ -1524,15 +1532,17 @@ m4_maketemp (struct obstack *obs, int argc, token_data **argv)
}
}
else
- mkstemp_helper (obs, ARG (1));
+ mkstemp_helper (obs, me, ARG (1));
}
static void
m4_mkstemp (struct obstack *obs, int argc, token_data **argv)
{
- if (bad_argc (ARG (0), argc, 1, 1))
+ const char *me = ARG (0);
+
+ if (bad_argc (me, argc, 1, 1))
return;
- mkstemp_helper (obs, ARG (1));
+ mkstemp_helper (obs, me, ARG (1));
}
/*----------------------------------------.
@@ -1598,7 +1608,7 @@ m4_m4exit (struct obstack *obs, int argc, token_data **argv)
if (exit_code < 0 || exit_code > 255)
{
M4ERROR ((warning_status, 0,
- "exit status out of range: `%d'", exit_code));
+ "%s: exit status out of range: `%d'", me, exit_code));
exit_code = EXIT_FAILURE;
}
/* Change debug stream back to stderr, to force flushing debug stream and
@@ -1697,29 +1707,31 @@ m4_traceoff (struct obstack *obs, int argc, token_data **argv)
static void
m4_debugmode (struct obstack *obs, int argc, token_data **argv)
{
+ const char *me = ARG (0);
+ const char *str = ARG (1);
int new_debug_level;
int change_flag;
- bad_argc (ARG (0), argc, 0, 1);
+ bad_argc (me, argc, 0, 1);
if (argc == 1)
debug_level = 0;
else
{
- if (ARG (1)[0] == '+' || ARG (1)[0] == '-')
+ if (*str == '+' || *str == '-')
{
- change_flag = ARG (1)[0];
- new_debug_level = debug_decode (ARG (1) + 1);
+ change_flag = *str;
+ new_debug_level = debug_decode (str + 1);
}
else
{
change_flag = 0;
- new_debug_level = debug_decode (ARG (1));
+ new_debug_level = debug_decode (str);
}
if (new_debug_level < 0)
M4ERROR ((warning_status, 0,
- "Debugmode: bad debug flags: `%s'", ARG (1)));
+ "%s: bad debug flags: `%s'", me, str));
else
{
switch (change_flag)
@@ -1748,13 +1760,15 @@ m4_debugmode (struct obstack *obs, int argc, token_data **argv)
static void
m4_debugfile (struct obstack *obs, int argc, token_data **argv)
{
- bad_argc (ARG (0), argc, 0, 1);
+ const char *me = ARG (0);
+
+ bad_argc (me, argc, 0, 1);
if (argc == 1)
debug_set_output (NULL);
else if (!debug_set_output (ARG (1)))
M4ERROR ((warning_status, errno,
- "cannot set error file: `%s'", ARG (1)));
+ "%s: cannot set error file: `%s'", me, ARG (1)));
}
/* This section contains text processing macros: "len", "index",
@@ -1972,7 +1986,7 @@ m4_format (struct obstack *obs, int argc, token_data **argv)
{
if (bad_argc (ARG (0), argc, 1, -1))
return;
- format (obs, argc - 1, argv + 1);
+ format (obs, argc, argv);
}
/*-------------------------------------------------------------------------.
@@ -1987,8 +2001,8 @@ m4_format (struct obstack *obs, int argc, token_data **argv)
static int substitute_warned = 0;
static void
-substitute (struct obstack *obs, const char *victim, const char *repl,
- struct re_registers *regs)
+substitute (struct obstack *obs, const char *me, const char *victim,
+ const char *repl, struct re_registers *regs)
{
int ch;
@@ -2007,7 +2021,7 @@ substitute (struct obstack *obs, const char *victim, const char *repl,
if (!substitute_warned)
{
M4ERROR ((warning_status, 0, "\
-Warning: \\0 will disappear, use \\& instead in replacements"));
+Warning: %s: \\0 will disappear, use \\& instead in replacements", me));
substitute_warned = 1;
}
/* Fall through. */
@@ -2023,7 +2037,7 @@ Warning: \\0 will disappear, use \\& instead in replacements"));
ch -= '0';
if (!regs || regs->num_regs - 1 <= ch)
M4ERROR ((warning_status, 0,
- "Warning: sub-expression %d not present", ch));
+ "Warning: %s: sub-expression %d not present", me, ch));
else if (regs->end[ch] > 0)
obstack_grow (obs, victim + regs->start[ch],
regs->end[ch] - regs->start[ch]);
@@ -2031,7 +2045,7 @@ Warning: \\0 will disappear, use \\& instead in replacements"));
case '\0':
M4ERROR ((warning_status, 0,
- "Warning: trailing \\ ignored in replacement"));
+ "Warning: %s: trailing \\ ignored in replacement", me));
return;
default:
@@ -2069,6 +2083,7 @@ init_pattern_buffer (struct re_pattern_buffer *buf, struct re_registers *regs)
static void
m4_regexp (struct obstack *obs, int argc, token_data **argv)
{
+ const char *me = ARG (0);
const char *victim; /* first argument */
const char *regexp; /* regular expression */
const char *repl; /* replacement string */
@@ -2079,7 +2094,7 @@ m4_regexp (struct obstack *obs, int argc, token_data **argv)
int startpos; /* start position of match */
int length; /* length of first argument */
- if (bad_argc (ARG (0), argc, 2, 3))
+ if (bad_argc (me, argc, 2, 3))
{
/* builtin(`regexp') is blank, but regexp(`abc') is 0. */
if (argc == 2)
@@ -2097,7 +2112,7 @@ m4_regexp (struct obstack *obs, int argc, token_data **argv)
if (argc == 3)
shipout_int (obs, 0);
else
- substitute (obs, victim, repl, NULL);
+ substitute (obs, me, victim, repl, NULL);
return;
}
@@ -2111,7 +2126,7 @@ m4_regexp (struct obstack *obs, int argc, token_data **argv)
if (msg != NULL)
{
M4ERROR ((warning_status, 0,
- "bad regular expression: `%s': %s", regexp, msg));
+ "%s: bad regular expression: `%s': %s", me, regexp, msg));
return;
}
@@ -2122,11 +2137,11 @@ m4_regexp (struct obstack *obs, int argc, token_data **argv)
if (startpos == -2)
M4ERROR ((warning_status, 0,
- "error matching regular expression `%s'", regexp));
+ "%s: error matching regular expression `%s'", me, regexp));
else if (argc == 3)
shipout_int (obs, startpos);
else if (startpos >= 0)
- substitute (obs, victim, repl, regs);
+ substitute (obs, me, victim, repl, regs);
}
/*------------------------------------------------------------------.
@@ -2140,6 +2155,7 @@ m4_regexp (struct obstack *obs, int argc, token_data **argv)
static void
m4_patsubst (struct obstack *obs, int argc, token_data **argv)
{
+ const char *me = ARG (0);
const char *victim; /* first argument */
const char *regexp; /* regular expression */
const char *repl;
@@ -2151,7 +2167,7 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv)
int offset; /* current match offset */
int length; /* length of first argument */
- if (bad_argc (ARG (0), argc, 2, 3))
+ if (bad_argc (me, argc, 2, 3))
{
/* builtin(`patsubst') is blank, but patsubst(`abc') is abc. */
if (argc == 2)
@@ -2180,7 +2196,7 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv)
if (msg != NULL)
{
M4ERROR ((warning_status, 0,
- "bad regular expression `%s': %s", regexp, msg));
+ "%s: bad regular expression `%s': %s", me, regexp, msg));
return;
}
@@ -2201,7 +2217,8 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv)
if (matchpos == -2)
M4ERROR ((warning_status, 0,
- "error matching regular expression `%s'", regexp));
+ "%s: error matching regular expression `%s'",
+ me, regexp));
else if (offset < length)
obstack_grow (obs, victim + offset, length - offset);
break;
@@ -2214,7 +2231,7 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv)
/* Handle the part of the string that was covered by the match. */
- substitute (obs, victim, repl, regs);
+ substitute (obs, me, victim, repl, regs);
/* Update the offset to the end of the match. If the regexp
matched a null string, advance offset one more, to avoid
@@ -2246,7 +2263,7 @@ void
m4_placeholder (struct obstack *obs, int argc, token_data **argv)
{
M4ERROR ((warning_status, 0, "\
-builtin `%s' requested by frozen file is not supported", ARG (0)));
+builtin `%s' requested by frozen file not found", ARG (0)));
}
/*-------------------------------------------------------------------------.
diff --git a/src/eval.c b/src/eval.c
index 7abc7ab0..1af596e9 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -62,19 +62,19 @@ typedef enum eval_error
}
eval_error;
-static eval_error logical_or_term (eval_token, int32_t *);
-static eval_error logical_and_term (eval_token, int32_t *);
-static eval_error or_term (eval_token, int32_t *);
-static eval_error xor_term (eval_token, int32_t *);
-static eval_error and_term (eval_token, int32_t *);
-static eval_error equality_term (eval_token, int32_t *);
-static eval_error cmp_term (eval_token, int32_t *);
-static eval_error shift_term (eval_token, int32_t *);
-static eval_error add_term (eval_token, int32_t *);
-static eval_error mult_term (eval_token, int32_t *);
-static eval_error exp_term (eval_token, int32_t *);
-static eval_error unary_term (eval_token, int32_t *);
-static eval_error simple_term (eval_token, int32_t *);
+static eval_error logical_or_term (const char *, eval_token, int32_t *);
+static eval_error logical_and_term (const char *, eval_token, int32_t *);
+static eval_error or_term (const char *, eval_token, int32_t *);
+static eval_error xor_term (const char *, eval_token, int32_t *);
+static eval_error and_term (const char *, eval_token, int32_t *);
+static eval_error equality_term (const char *, eval_token, int32_t *);
+static eval_error cmp_term (const char *, eval_token, int32_t *);
+static eval_error shift_term (const char *, eval_token, int32_t *);
+static eval_error add_term (const char *, eval_token, int32_t *);
+static eval_error mult_term (const char *, eval_token, int32_t *);
+static eval_error exp_term (const char *, eval_token, int32_t *);
+static eval_error unary_term (const char *, eval_token, int32_t *);
+static eval_error simple_term (const char *, eval_token, int32_t *);
/*--------------------.
| Lexical functions. |
@@ -287,14 +287,14 @@ eval_lex (int32_t *val)
`---------------------------------------*/
bool
-evaluate (const char *expr, int32_t *val)
+evaluate (const char *me, const char *expr, int32_t *val)
{
eval_token et;
eval_error err;
eval_init_lex (expr);
et = eval_lex (val);
- err = logical_or_term (et, val);
+ err = logical_or_term (me, et, val);
if (err == NO_ERROR && *eval_text != '\0')
{
@@ -311,44 +311,44 @@ evaluate (const char *expr, int32_t *val)
case MISSING_RIGHT:
M4ERROR ((warning_status, 0,
- "bad expression in eval (missing right parenthesis): %s",
- expr));
+ "%s: bad expression (missing right parenthesis): %s",
+ me, expr));
break;
case SYNTAX_ERROR:
M4ERROR ((warning_status, 0,
- "bad expression in eval: %s", expr));
+ "%s: bad expression: %s", me, expr));
break;
case UNKNOWN_INPUT:
M4ERROR ((warning_status, 0,
- "bad expression in eval (bad input): %s", expr));
+ "%s: bad expression (bad input): %s", me, expr));
break;
case EXCESS_INPUT:
M4ERROR ((warning_status, 0,
- "bad expression in eval (excess input): %s", expr));
+ "%s: bad expression (excess input): %s", me, expr));
break;
case INVALID_OPERATOR:
M4ERROR ((warning_status, 0,
- "invalid operator in eval: %s", expr));
+ "%s: invalid operator: %s", me, expr));
retcode = EXIT_FAILURE;
break;
case DIVIDE_ZERO:
M4ERROR ((warning_status, 0,
- "divide by zero in eval: %s", expr));
+ "%s: divide by zero: %s", me, expr));
break;
case MODULO_ZERO:
M4ERROR ((warning_status, 0,
- "modulo by zero in eval: %s", expr));
+ "%s: modulo by zero: %s", me, expr));
break;
case NEGATIVE_EXPONENT:
M4ERROR ((warning_status, 0,
- "negative exponent in eval: %s", expr));
+ "%s: negative exponent: %s", me, expr));
break;
default:
@@ -364,12 +364,12 @@ evaluate (const char *expr, int32_t *val)
`---------------------------*/
static eval_error
-logical_or_term (eval_token et, int32_t *v1)
+logical_or_term (const char *me, eval_token et, int32_t *v1)
{
int32_t v2;
eval_error er;
- if ((er = logical_and_term (et, v1)) != NO_ERROR)
+ if ((er = logical_and_term (me, et, v1)) != NO_ERROR)
return er;
while ((et = eval_lex (&v2)) == LOR)
@@ -379,7 +379,7 @@ logical_or_term (eval_token et, int32_t *v1)
return UNKNOWN_INPUT;
/* Implement short-circuiting of valid syntax. */
- er = logical_and_term (et, &v2);
+ er = logical_and_term (me, et, &v2);
if (er == NO_ERROR)
*v1 = *v1 || v2;
else if (*v1 != 0 && er < SYNTAX_ERROR)
@@ -395,12 +395,12 @@ logical_or_term (eval_token et, int32_t *v1)
}
static eval_error
-logical_and_term (eval_token et, int32_t *v1)
+logical_and_term (const char *me, eval_token et, int32_t *v1)
{
int32_t v2;
eval_error er;
- if ((er = or_term (et, v1)) != NO_ERROR)
+ if ((er = or_term (me, et, v1)) != NO_ERROR)
return er;
while ((et = eval_lex (&v2)) == LAND)
@@ -410,7 +410,7 @@ logical_and_term (eval_token et, int32_t *v1)
return UNKNOWN_INPUT;
/* Implement short-circuiting of valid syntax. */
- er = or_term (et, &v2);
+ er = or_term (me, et, &v2);
if (er == NO_ERROR)
*v1 = *v1 && v2;
else if (*v1 == 0 && er < SYNTAX_ERROR)
@@ -426,12 +426,12 @@ logical_and_term (eval_token et, int32_t *v1)
}
static eval_error
-or_term (eval_token et, int32_t *v1)
+or_term (const char *me, eval_token et, int32_t *v1)
{
int32_t v2;
eval_error er;
- if ((er = xor_term (et, v1)) != NO_ERROR)
+ if ((er = xor_term (me, et, v1)) != NO_ERROR)
return er;
while ((et = eval_lex (&v2)) == OR)
@@ -440,7 +440,7 @@ or_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = xor_term (et, &v2)) != NO_ERROR)
+ if ((er = xor_term (me, et, &v2)) != NO_ERROR)
return er;
*v1 |= v2;
@@ -453,12 +453,12 @@ or_term (eval_token et, int32_t *v1)
}
static eval_error
-xor_term (eval_token et, int32_t *v1)
+xor_term (const char *me, eval_token et, int32_t *v1)
{
int32_t v2;
eval_error er;
- if ((er = and_term (et, v1)) != NO_ERROR)
+ if ((er = and_term (me, et, v1)) != NO_ERROR)
return er;
while ((et = eval_lex (&v2)) == XOR)
@@ -467,7 +467,7 @@ xor_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = and_term (et, &v2)) != NO_ERROR)
+ if ((er = and_term (me, et, &v2)) != NO_ERROR)
return er;
*v1 ^= v2;
@@ -480,12 +480,12 @@ xor_term (eval_token et, int32_t *v1)
}
static eval_error
-and_term (eval_token et, int32_t *v1)
+and_term (const char *me, eval_token et, int32_t *v1)
{
int32_t v2;
eval_error er;
- if ((er = equality_term (et, v1)) != NO_ERROR)
+ if ((er = equality_term (me, et, v1)) != NO_ERROR)
return er;
while ((et = eval_lex (&v2)) == AND)
@@ -494,7 +494,7 @@ and_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = equality_term (et, &v2)) != NO_ERROR)
+ if ((er = equality_term (me, et, &v2)) != NO_ERROR)
return er;
*v1 &= v2;
@@ -507,13 +507,13 @@ and_term (eval_token et, int32_t *v1)
}
static eval_error
-equality_term (eval_token et, int32_t *v1)
+equality_term (const char *me, eval_token et, int32_t *v1)
{
eval_token op;
int32_t v2;
eval_error er;
- if ((er = cmp_term (et, v1)) != NO_ERROR)
+ if ((er = cmp_term (me, et, v1)) != NO_ERROR)
return er;
/* In the 1.4.x series, we maintain the traditional behavior that
@@ -525,13 +525,13 @@ equality_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = cmp_term (et, &v2)) != NO_ERROR)
+ if ((er = cmp_term (me, et, &v2)) != NO_ERROR)
return er;
if (op == ASSIGN)
{
M4ERROR ((warning_status, 0, "\
-Warning: recommend ==, not =, for equality operator"));
+Warning: %s: recommend ==, not =, for equality", me));
op = EQ;
}
*v1 = (op == EQ) == (*v1 == v2);
@@ -544,13 +544,13 @@ Warning: recommend ==, not =, for equality operator"));
}
static eval_error
-cmp_term (eval_token et, int32_t *v1)
+cmp_term (const char *me, eval_token et, int32_t *v1)
{
eval_token op;
int32_t v2;
eval_error er;
- if ((er = shift_term (et, v1)) != NO_ERROR)
+ if ((er = shift_term (me, et, v1)) != NO_ERROR)
return er;
while ((op = eval_lex (&v2)) == GT || op == GTEQ
@@ -561,7 +561,7 @@ cmp_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = shift_term (et, &v2)) != NO_ERROR)
+ if ((er = shift_term (me, et, &v2)) != NO_ERROR)
return er;
switch (op)
@@ -595,14 +595,14 @@ cmp_term (eval_token et, int32_t *v1)
}
static eval_error
-shift_term (eval_token et, int32_t *v1)
+shift_term (const char *me, eval_token et, int32_t *v1)
{
eval_token op;
int32_t v2;
uint32_t u1;
eval_error er;
- if ((er = add_term (et, v1)) != NO_ERROR)
+ if ((er = add_term (me, et, v1)) != NO_ERROR)
return er;
while ((op = eval_lex (&v2)) == LSHIFT || op == RSHIFT)
@@ -612,7 +612,7 @@ shift_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = add_term (et, &v2)) != NO_ERROR)
+ if ((er = add_term (me, et, &v2)) != NO_ERROR)
return er;
/* Minimize undefined C behavior (shifting by a negative number,
@@ -648,13 +648,13 @@ shift_term (eval_token et, int32_t *v1)
}
static eval_error
-add_term (eval_token et, int32_t *v1)
+add_term (const char *me, eval_token et, int32_t *v1)
{
eval_token op;
int32_t v2;
eval_error er;
- if ((er = mult_term (et, v1)) != NO_ERROR)
+ if ((er = mult_term (me, et, v1)) != NO_ERROR)
return er;
while ((op = eval_lex (&v2)) == PLUS || op == MINUS)
@@ -663,7 +663,7 @@ add_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = mult_term (et, &v2)) != NO_ERROR)
+ if ((er = mult_term (me, et, &v2)) != NO_ERROR)
return er;
/* Minimize undefined C behavior on overflow. This code assumes
@@ -683,13 +683,13 @@ add_term (eval_token et, int32_t *v1)
}
static eval_error
-mult_term (eval_token et, int32_t *v1)
+mult_term (const char *me, eval_token et, int32_t *v1)
{
eval_token op;
int32_t v2;
eval_error er;
- if ((er = exp_term (et, v1)) != NO_ERROR)
+ if ((er = exp_term (me, et, v1)) != NO_ERROR)
return er;
while ((op = eval_lex (&v2)) == TIMES || op == DIVIDE || op == MODULO)
@@ -698,7 +698,7 @@ mult_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = exp_term (et, &v2)) != NO_ERROR)
+ if ((er = exp_term (me, et, &v2)) != NO_ERROR)
return er;
/* Minimize undefined C behavior on overflow. This code assumes
@@ -744,13 +744,13 @@ mult_term (eval_token et, int32_t *v1)
}
static eval_error
-exp_term (eval_token et, int32_t *v1)
+exp_term (const char *me, eval_token et, int32_t *v1)
{
uint32_t result;
int32_t v2;
eval_error er;
- if ((er = unary_term (et, v1)) != NO_ERROR)
+ if ((er = unary_term (me, et, v1)) != NO_ERROR)
return er;
while ((et = eval_lex (&v2)) == EXPONENT)
@@ -759,7 +759,7 @@ exp_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = exp_term (et, &v2)) != NO_ERROR)
+ if ((er = exp_term (me, et, &v2)) != NO_ERROR)
return er;
/* Minimize undefined C behavior on overflow. This code assumes
@@ -783,7 +783,7 @@ exp_term (eval_token et, int32_t *v1)
}
static eval_error
-unary_term (eval_token et, int32_t *v1)
+unary_term (const char *me, eval_token et, int32_t *v1)
{
eval_token et2 = et;
eval_error er;
@@ -794,7 +794,7 @@ unary_term (eval_token et, int32_t *v1)
if (et2 == ERROR)
return UNKNOWN_INPUT;
- if ((er = unary_term (et2, v1)) != NO_ERROR)
+ if ((er = unary_term (me, et2, v1)) != NO_ERROR)
return er;
/* Minimize undefined C behavior on overflow. This code assumes
@@ -808,14 +808,14 @@ unary_term (eval_token et, int32_t *v1)
else if (et == LNOT)
*v1 = *v1 == 0 ? 1 : 0;
}
- else if ((er = simple_term (et, v1)) != NO_ERROR)
+ else if ((er = simple_term (me, et, v1)) != NO_ERROR)
return er;
return NO_ERROR;
}
static eval_error
-simple_term (eval_token et, int32_t *v1)
+simple_term (const char *me, eval_token et, int32_t *v1)
{
int32_t v2;
eval_error er;
@@ -827,7 +827,7 @@ simple_term (eval_token et, int32_t *v1)
if (et == ERROR)
return UNKNOWN_INPUT;
- if ((er = logical_or_term (et, v1)) != NO_ERROR)
+ if ((er = logical_or_term (me, et, v1)) != NO_ERROR)
return er;
et = eval_lex (&v2);
diff --git a/src/format.c b/src/format.c
index 0cc283ad..a9e71504 100644
--- a/src/format.c
+++ b/src/format.c
@@ -55,6 +55,7 @@
void
format (struct obstack *obs, int argc, token_data **argv)
{
+ const char *me = TOKEN_DATA_TEXT (argv[0]);
const char *f; /* format control string */
const char *fmt; /* position within f */
char fstart[] = "%'+- 0#*.*hhd"; /* current format spec */
@@ -87,6 +88,8 @@ format (struct obstack *obs, int argc, token_data **argv)
char *str; /* malloc'd buffer of formatted text */
enum {CHAR, INT, LONG, DOUBLE, STR} datatype;
+ argv++;
+ argc--;
f = fmt = ARG_STR (argc, argv);
memset (ok, 0, sizeof ok);
for (;;)
@@ -231,7 +234,7 @@ format (struct obstack *obs, int argc, token_data **argv)
if (c > sizeof ok || !ok[c])
{
M4ERROR ((warning_status, 0,
- "Warning: unrecognized specifier in `%s'", f));
+ "Warning: %s: unrecognized specifier in `%s'", me, f));
if (c == '\0')
fmt--;
continue;
@@ -306,7 +309,7 @@ format (struct obstack *obs, int argc, token_data **argv)
if (str == NULL)
{
M4ERROR ((warning_status, 0,
- "Warning: unable to format output for `%s'", f));
+ "Warning: %s: unable to format output for `%s'", me, f));
continue;
}
diff --git a/src/m4.h b/src/m4.h
index a85bf41e..c372ffdc 100644
--- a/src/m4.h
+++ b/src/m4.h
@@ -438,7 +438,7 @@ FILE *m4_path_search (const char *, char **);
/* File: eval.c --- expression evaluation. */
-bool evaluate (const char *, int32_t *);
+bool evaluate (const char *, const char *, int32_t *);
/* File: format.c --- printf like formatting. */
diff --git a/src/macro.c b/src/macro.c
index 9a3123ae..6781cd97 100644
--- a/src/macro.c
+++ b/src/macro.c
@@ -130,12 +130,12 @@ expand_token (struct obstack *obs, token_type t, token_data *td, int line)
| text. |
`---------------------------------------------------------------*/
static void
-warn_builtin_concat (builtin_func *func)
+warn_builtin_concat (const char *caller, builtin_func *func)
{
const builtin *bp = find_builtin_by_addr (func);
assert (bp);
- M4ERROR ((warning_status, 0, "Warning: cannot concatenate builtin `%s'",
- bp->name));
+ M4ERROR ((warning_status, 0, "Warning: %s: cannot concatenate builtin `%s'",
+ caller, bp->name));
}
/*-------------------------------------------------------------------.
@@ -182,7 +182,7 @@ expand_argument (struct obstack *obs, token_data *argp, const char *caller)
{
if (obstack_object_size (obs) == 0)
return t == TOKEN_COMMA;
- warn_builtin_concat (TOKEN_DATA_FUNC (argp));
+ warn_builtin_concat (caller, TOKEN_DATA_FUNC (argp));
}
obstack_1grow (obs, '\0');
TOKEN_DATA_TYPE (argp) = TOKEN_TEXT;
@@ -221,8 +221,8 @@ expand_argument (struct obstack *obs, token_data *argp, const char *caller)
else
{
if (TOKEN_DATA_TYPE (argp) == TOKEN_FUNC)
- warn_builtin_concat (TOKEN_DATA_FUNC (argp));
- warn_builtin_concat (TOKEN_DATA_FUNC (&td));
+ warn_builtin_concat (caller, TOKEN_DATA_FUNC (argp));
+ warn_builtin_concat (caller, TOKEN_DATA_FUNC (&td));
TOKEN_DATA_TYPE (argp) = TOKEN_TEXT;
}
break;