bc: print error line numbers
FILE:
print 1
print "
$ busybox bc -q FILE
bc: FILE:2: string end could not be found
ready for more input
>>> _
function old new delta
bc_verror_msg - 99 +99
bc_lex_file 12 28 +16
bc_lex_next 77 92 +15
dc_lex_token 687 701 +14
bc_lex_token 1237 1251 +14
bc_posix_error_fmt 90 58 -32
bc_error_fmt 70 36 -34
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 4/2 up/down: 158/-66) Total: 92 bytes
text data bss dec hex filename
987108 485 7296 994889 f2e49 busybox_old
987210 485 7296 994991 f2eaf busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 97adeaa..1c1672c 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -786,6 +786,10 @@
BcParse prs;
BcProgram prog;
+ // For error messages. Can be set to current parsed line,
+ // or [TODO] to current executing line (can be before last parsed one)
+ unsigned err_line;
+
BcVec files;
char *env_args;
@@ -928,19 +932,27 @@
exit(0);
}
+static void bc_verror_msg(const char *fmt, va_list p)
+{
+ const char *sv = sv; /* for compiler */
+ if (G.prog.file) {
+ sv = applet_name;
+ applet_name = xasprintf("%s: %s:%u", applet_name, G.prog.file, G.err_line);
+ }
+ bb_verror_msg(fmt, p, NULL);
+ if (G.prog.file) {
+ free((char*)applet_name);
+ applet_name = sv;
+ }
+}
+
static NOINLINE int bc_error_fmt(const char *fmt, ...)
{
- const char *sv;
va_list p;
- sv = applet_name;
- if (G.prog.file)
- applet_name = G.prog.file;
-
va_start(p, fmt);
- bb_verror_msg(fmt, p, NULL);
+ bc_verror_msg(fmt, p);
va_end(p);
- applet_name = sv;
if (!G.ttyin)
exit(1);
@@ -949,21 +961,15 @@
static NOINLINE int bc_posix_error_fmt(const char *fmt, ...)
{
- const char *sv;
va_list p;
// Are non-POSIX constructs totally ok?
if (!(option_mask32 & (BC_FLAG_S|BC_FLAG_W)))
return BC_STATUS_SUCCESS; // yes
- sv = applet_name;
- if (G.prog.file)
- applet_name = G.prog.file;
-
va_start(p, fmt);
- bb_verror_msg(fmt, p, NULL);
+ bc_verror_msg(fmt, p);
va_end(p);
- applet_name = sv;
// Do we treat non-POSIX constructs as errors?
if (!(option_mask32 & BC_FLAG_S))
@@ -2877,7 +2883,7 @@
static void bc_lex_file(BcLex *l)
{
- l->line = 1;
+ G.err_line = l->line = 1;
l->newline = false;
}
@@ -2889,6 +2895,7 @@
if (l->t.last == BC_LEX_EOF) return bc_error("end of file");
l->line += l->newline;
+ G.err_line = l->line;
l->t.t = BC_LEX_EOF;
l->newline = (l->i == l->len);
@@ -2971,6 +2978,7 @@
l->i = i + 1;
l->line += nls;
+ G.err_line = l->line;
return BC_STATUS_SUCCESS;
}
@@ -3011,6 +3019,7 @@
l->i = i + 1;
l->line += nls;
+ G.err_line = l->line;
return BC_STATUS_SUCCESS;
}
@@ -3347,6 +3356,7 @@
l->i = i;
l->line += nls;
+ G.err_line = l->line;
return BC_STATUS_SUCCESS;
}