diff options
author | Gavin Howard <yzena.tech@gmail.com> | 2018-12-31 13:21:47 -0700 |
---|---|---|
committer | Gavin Howard <yzena.tech@gmail.com> | 2018-12-31 13:21:47 -0700 |
commit | ecc7fc2f95ffddaadf9ce1ac5e8c9e4fa5af9f52 (patch) | |
tree | caf5d6e7ddae9f3b89dc37b3db51f5179b03619e /src | |
parent | 223fa6d8fd41d8ce3565159b3b4d9f4689e5fa01 (diff) | |
download | platform_external_bc-ecc7fc2f95ffddaadf9ce1ac5e8c9e4fa5af9f52.tar.gz platform_external_bc-ecc7fc2f95ffddaadf9ce1ac5e8c9e4fa5af9f52.tar.bz2 platform_external_bc-ecc7fc2f95ffddaadf9ce1ac5e8c9e4fa5af9f52.zip |
Improve error reporting across the board
Diffstat (limited to 'src')
-rw-r--r-- | src/bc/lex.c | 2 | ||||
-rw-r--r-- | src/bc/parse.c | 2 | ||||
-rw-r--r-- | src/data.c | 20 | ||||
-rw-r--r-- | src/dc/lex.c | 2 | ||||
-rw-r--r-- | src/dc/parse.c | 2 | ||||
-rw-r--r-- | src/lang.c | 5 | ||||
-rw-r--r-- | src/lex.c | 6 | ||||
-rw-r--r-- | src/num.c | 4 | ||||
-rw-r--r-- | src/program.c | 16 | ||||
-rw-r--r-- | src/read.c | 4 | ||||
-rw-r--r-- | src/vm.c | 15 |
11 files changed, 46 insertions, 32 deletions
diff --git a/src/bc/lex.c b/src/bc/lex.c index a29ef490..971f4aa7 100644 --- a/src/bc/lex.c +++ b/src/bc/lex.c @@ -83,7 +83,7 @@ BcStatus bc_lex_string(BcLex *l) { len = i - l->i; if (len > BC_MAX_STRING) - return bc_vm_error(BC_ERROR_EXEC_STRING_LEN, l->line); + return bc_vm_error(BC_ERROR_EXEC_STRING_LEN, l->line, BC_MAX_STRING); bc_vec_string(&l->str, len, l->buf + l->i); diff --git a/src/bc/parse.c b/src/bc/parse.c index 185cd561..5919a7ee 100644 --- a/src/bc/parse.c +++ b/src/bc/parse.c @@ -874,7 +874,7 @@ BcStatus bc_parse_func(BcParse *p) { } #if BC_ENABLE_REFERENCES else if (t == BC_TYPE_REF) { - s = bc_vm_error(BC_ERROR_PARSE_REF_VAR, p->l.line); + s = bc_vm_error(BC_ERROR_PARSE_REF_VAR, p->l.line, name); goto err; } #endif // BC_ENABLE_REFERENCES @@ -109,8 +109,8 @@ const char* const bc_err_msgs[] = { "memory allocation error", "I/O error", - "file is not text:", - "path is a directory:", + "file is not text: %s", + "path is a directory: %s", // ** Exclude start. ** "Bad command-line option: '%c' (\"%s\")", // ** Exclude end. ** @@ -130,7 +130,7 @@ const char* const bc_err_msgs[] = { "block end could not be found", "end of file", #if BC_ENABLE_REFERENCES - "vars cannot be references", + "var cannot be reference: %s", #endif // BC_ENABLE_REFERENCES "negative number", @@ -139,14 +139,14 @@ const char* const bc_err_msgs[] = { "divide by zero", "bad number string", - "could not open file:", + "could not open file: %s", "mismatched parameters; need %zu, have %zu", - "undefined function", - "file is not executable:", - "number too long: must be [1, BC_NUM_MAX]", - "name too long: must be [1, BC_NAME_MAX]", - "string too long: must be [1, BC_STRING_MAX]", - "array too long; must be [1, BC_DIM_MAX]", + "undefined function: %s()", + "file is not executable: %s", + "number too long: must be [1, %lu]", + "name too long: must be [1, %lu]", + "string too long: must be [1, %lu]", + "array too long; must be [1, %lu]", "bad ibase; must be [%lu, %lu]", "bad obase; must be [%lu, %lu]", "bad scale; must be [%lu, %lu]", diff --git a/src/dc/lex.c b/src/dc/lex.c index e326f6e2..efaaf4f6 100644 --- a/src/dc/lex.c +++ b/src/dc/lex.c @@ -75,7 +75,7 @@ BcStatus dc_lex_string(BcLex *l) { bc_vec_pushByte(&l->str, '\0'); if (i - l->i > BC_MAX_STRING) - return bc_vm_error(BC_ERROR_EXEC_STRING_LEN, l->line); + return bc_vm_error(BC_ERROR_EXEC_STRING_LEN, l->line, BC_MAX_STRING); l->i = i; l->line += nls; diff --git a/src/dc/parse.c b/src/dc/parse.c index 826598b3..b9bcac28 100644 --- a/src/dc/parse.c +++ b/src/dc/parse.c @@ -50,7 +50,7 @@ BcStatus dc_parse_string(BcParse *p) { BcFunc f; - bc_program_addFunc(p->prog, &f); + bc_program_addFunc(p->prog, &f, bc_func_main); bc_parse_string(p); return bc_lex_next(&p->l); @@ -59,8 +59,8 @@ BcStatus bc_func_insert(BcFunc *f, char *name, BcType type, size_t line) { } #endif // BC_ENABLED -void bc_func_init(BcFunc *f) { - assert(f); +void bc_func_init(BcFunc *f, const char *name) { + assert(f && name); bc_vec_init(&f->code, sizeof(uchar), NULL); bc_vec_init(&f->strs, sizeof(char*), bc_string_free); bc_vec_init(&f->consts, sizeof(char*), bc_string_free); @@ -68,6 +68,7 @@ void bc_func_init(BcFunc *f) { bc_vec_init(&f->autos, sizeof(BcId), bc_id_free); bc_vec_init(&f->labels, sizeof(size_t), NULL); f->nparams = 0; + f->name = name; #endif // BC_ENABLED } @@ -100,7 +100,8 @@ BcStatus bc_lex_number(BcLex *l, char start) { len = i + 1 * !last_pt - bslashes * 2; - if (len > BC_MAX_NUM) return bc_vm_error(BC_ERROR_EXEC_NUM_LEN, l->line); + if (len > BC_MAX_NUM) + return bc_vm_error(BC_ERROR_EXEC_NUM_LEN, l->line, BC_MAX_NUM); bc_vec_npop(&l->str, l->str.len); bc_vec_expand(&l->str, len + 1); @@ -137,7 +138,8 @@ BcStatus bc_lex_name(BcLex *l) { while ((c >= 'a' && c <= 'z') || isdigit(c) || c == '_') c = buf[++i]; - if (i > BC_MAX_STRING) return bc_vm_error(BC_ERROR_EXEC_NAME_LEN, l->line); + if (i > BC_MAX_NAME) + return bc_vm_error(BC_ERROR_EXEC_NAME_LEN, l->line, BC_MAX_NAME); bc_vec_string(&l->str, i, buf); @@ -195,7 +195,8 @@ void bc_num_split(BcNum *restrict n, size_t idx, BcNum *restrict a, BcStatus bc_num_shift(BcNum *restrict n, size_t places) { if (places == 0 || n->len == 0) return BC_STATUS_SUCCESS; - if (places + n->len > BC_MAX_NUM) return bc_vm_err(BC_ERROR_EXEC_NUM_LEN); + if (places + n->len > BC_MAX_NUM) + return bc_vm_verr(BC_ERROR_EXEC_NUM_LEN, BC_MAX_NUM); if (n->rdx >= places) n->rdx -= places; else { @@ -749,6 +750,7 @@ BcStatus bc_num_right(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { if (len > c->len) { + if (len > BC_MAX_NUM) return bc_vm_verr(BC_ERROR_EXEC_NUM_LEN, BC_MAX_NUM); if (len > c->cap) bc_num_expand(c, len); memset(c->num + c->len, 0, len - c->len); diff --git a/src/program.c b/src/program.c index 42e5fb4f..169f5e86 100644 --- a/src/program.c +++ b/src/program.c @@ -786,7 +786,7 @@ BcStatus bc_program_assign(BcProgram *p, uchar inst) { ptr = ib ? &p->ib_t : &p->ob_t; } - if (val > max || val < min) return bc_vm_error(e, 0, min, max); + if (val > max || val < min) return bc_vm_verr(e, min, max); if (!sc) bc_num_copy(ib ? &p->ib : &p->ob, l); *ptr = (size_t) val; @@ -869,7 +869,7 @@ BcStatus bc_program_pushArray(BcProgram *p, const char *restrict code, if (s) goto err; if (temp > BC_MAX_DIM) { - s = bc_vm_err(BC_ERROR_EXEC_ARRAY_LEN); + s = bc_vm_verr(BC_ERROR_EXEC_ARRAY_LEN, BC_MAX_DIM); goto err; } @@ -930,9 +930,9 @@ BcStatus bc_program_call(BcProgram *p, const char *restrict code, ip.func = bc_program_index(code, idx); f = bc_vec_item(&p->fns, ip.func); - if (f->code.len == 0) return bc_vm_err(BC_ERROR_EXEC_UNDEFINED_FUNC); + if (f->code.len == 0) return bc_vm_verr(BC_ERROR_EXEC_UNDEF_FUNC, f->name); if (nparams != f->nparams) - return bc_vm_error(BC_ERROR_EXEC_PARAMS, 0, f->nparams, nparams); + return bc_vm_verr(BC_ERROR_EXEC_PARAMS, f->nparams, nparams); ip.len = p->results.len - nparams; assert(BC_PROG_STACK(&p->results, nparams)); @@ -1214,7 +1214,7 @@ BcStatus bc_program_asciify(BcProgram *p) { str[0] = c; str[1] = '\0'; - bc_program_addFunc(p, &f); + bc_program_addFunc(p, &f, bc_func_main); str2 = bc_vm_strdup(str); // Make sure the pointer is updated. @@ -1472,8 +1472,8 @@ void bc_program_init(BcProgram *p) { bc_vec_push(&p->stack, &ip); } -void bc_program_addFunc(BcProgram *p, BcFunc *f) { - bc_func_init(f); +void bc_program_addFunc(BcProgram *p, BcFunc *f, const char *name) { + bc_func_init(f, name); bc_vec_push(&p->fns, f); } @@ -1499,7 +1499,7 @@ size_t bc_program_insertFunc(BcProgram *p, char *name) { bc_func_reset(func); free(name); } - else bc_program_addFunc(p, &f); + else bc_program_addFunc(p, &f, name); return idx; } @@ -124,7 +124,7 @@ BcStatus bc_read_file(const char *path, char **buf) { assert(path); f = fopen(path, "r"); - if (!f) return bc_vm_err(BC_ERROR_EXEC_FILE_ERR); + if (!f) return bc_vm_verr(BC_ERROR_EXEC_FILE_ERR, path); if (fstat(fileno(f), &pstat) == -1) goto malloc_err; if (S_ISDIR(pstat.st_mode)) { @@ -158,5 +158,5 @@ read_err: free(*buf); malloc_err: fclose(f); - return bc_vm_err(e); + return bc_vm_verr(e, path); } @@ -79,9 +79,18 @@ void bc_vm_printError(BcError e, const char* const fmt, fprintf(stderr, fmt, bc_errs[(size_t) bc_err_ids[e]]); vfprintf(stderr, bc_err_msgs[e], args); - if (vm->file) { + assert(vm->file); + + // This is the condition for parsing vs runtime. + // If line is not 0, it is parsing. + if (line != 0) { fprintf(stderr, "\n %s", vm->file); - if (line) fprintf(stderr, bc_err_line, line); + fprintf(stderr, bc_err_line, line); + } + else { + BcInstPtr *ip = bc_vec_item_rev(&vm->prog.stack, 0); + BcFunc *f = bc_vec_item(&vm->prog.fns, ip->func); + fprintf(stderr, "\n Function: %s", f->name); } fputs("\n\n", stderr); @@ -304,7 +313,7 @@ BcStatus bc_vm_file(BcVm *vm, const char *file) { if (vm->prs.flags.len > 1) s = bc_vm_error(BC_ERROR_PARSE_BLOCK, vm->prs.l.line); else if (!BC_PARSE_CAN_EXEC(&vm->prs) || main_func->code.len < ip->idx) - s = bc_vm_err(BC_ERROR_EXEC_FILE_NOT_EXECUTABLE); + s = bc_vm_verr(BC_ERROR_EXEC_FILE_NOT_EXECUTABLE, vm->file); err: free(data); |