aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGavin Howard <yzena.tech@gmail.com>2018-12-31 13:21:47 -0700
committerGavin Howard <yzena.tech@gmail.com>2018-12-31 13:21:47 -0700
commitecc7fc2f95ffddaadf9ce1ac5e8c9e4fa5af9f52 (patch)
treecaf5d6e7ddae9f3b89dc37b3db51f5179b03619e /src
parent223fa6d8fd41d8ce3565159b3b4d9f4689e5fa01 (diff)
downloadplatform_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.c2
-rw-r--r--src/bc/parse.c2
-rw-r--r--src/data.c20
-rw-r--r--src/dc/lex.c2
-rw-r--r--src/dc/parse.c2
-rw-r--r--src/lang.c5
-rw-r--r--src/lex.c6
-rw-r--r--src/num.c4
-rw-r--r--src/program.c16
-rw-r--r--src/read.c4
-rw-r--r--src/vm.c15
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
diff --git a/src/data.c b/src/data.c
index e1a58d8c..5c1dbdc0 100644
--- a/src/data.c
+++ b/src/data.c
@@ -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);
diff --git a/src/lang.c b/src/lang.c
index d8099abd..196bdc5f 100644
--- a/src/lang.c
+++ b/src/lang.c
@@ -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
}
diff --git a/src/lex.c b/src/lex.c
index 02071012..c0bb825d 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -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);
diff --git a/src/num.c b/src/num.c
index dab1df6b..70a0711d 100644
--- a/src/num.c
+++ b/src/num.c
@@ -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;
}
diff --git a/src/read.c b/src/read.c
index 768cfe24..9b2c6b17 100644
--- a/src/read.c
+++ b/src/read.c
@@ -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);
}
diff --git a/src/vm.c b/src/vm.c
index 11a19537..b1085efd 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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);