bc: convert BC_STATUS_EXEC_MISMATCHED_PARAMS and BC_STATUS_EXEC_UNDEFINED_FUNC
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 3 Dec 2018 20:10:57 +0000 (21:10 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 5 Dec 2018 14:43:35 +0000 (15:43 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/bc.c

index b57f741d619e42024f0aa148be294ce0925d34d8..0d81e13cf9dab83eea174dc194edf65102de0fce 100644 (file)
@@ -200,8 +200,8 @@ typedef enum BcStatus {
        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,
@@ -241,7 +241,7 @@ typedef enum BcStatus {
 // 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:",
@@ -272,8 +272,8 @@ static const char *const bc_err_msgs[] = {
        "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]",
@@ -5990,8 +5990,12 @@ static BcStatus bc_program_call(char *code, size_t *idx)
        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) {
@@ -6848,9 +6852,11 @@ static BcStatus bc_vm_error(BcStatus s, const char *file, size_t line)
 {
        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));
 }