BC_STATUS_MATH_BAD_STRING,
// BC_STATUS_EXEC_FILE_ERR,
- BC_STATUS_EXEC_MISMATCHED_PARAMS,
- BC_STATUS_EXEC_UNDEFINED_FUNC,
+// BC_STATUS_EXEC_MISMATCHED_PARAMS,
+// BC_STATUS_EXEC_UNDEFINED_FUNC,
BC_STATUS_EXEC_FILE_NOT_EXECUTABLE,
BC_STATUS_EXEC_NUM_LEN,
BC_STATUS_EXEC_NAME_LEN,
// Keep enum above and messages below in sync!
static const char *const bc_err_msgs[] = {
NULL,
- "",
+ NULL,
// "memory allocation error",
// "I/O error",
// "file is not text:",
"bad number string",
// "could not open file:",
- "mismatched parameters", // wrong number of them, to be exact
- "undefined function",
+// "mismatched parameters", // wrong number of them, to be exact
+// "undefined function",
"file is not executable:",
"number too long: must be [1, BC_NUM_MAX]",
"name too long: must be [1, BC_NAME_MAX]",
ip.func = bc_program_index(code, idx);
func = bc_vec_item(&G.prog.fns, ip.func);
- if (func->code.len == 0) return BC_STATUS_EXEC_UNDEFINED_FUNC;
- if (nparams != func->nparams) return BC_STATUS_EXEC_MISMATCHED_PARAMS;
+ if (func->code.len == 0) {
+ return bc_error("undefined function");
+ }
+ if (nparams != func->nparams) {
+ return bc_error("function has %u parameters, but called with %u", func->nparams, nparams);
+ }
ip.len = G.prog.results.len - nparams;
for (i = 0; i < nparams; ++i) {
{
if (!s || s > BC_STATUS_BEFORE_POSIX) return s;
- fprintf(stderr, bc_err_fmt, bc_err_msgs[s]);
- fprintf(stderr, " %s", file);
- fprintf(stderr, bc_err_line + 4 * !line, line);
+ if (bc_err_msgs[s]) {
+ fprintf(stderr, bc_err_fmt, bc_err_msgs[s]);
+ fprintf(stderr, " %s", file);
+ fprintf(stderr, bc_err_line + 4 * !line, line);
+ }
return s * (!G.ttyin || !!strcmp(file, bc_program_stdin_name));
}