Fix scan-build warnings
diff --git a/include/bc.h b/include/bc.h
index 36ccf61..959a275 100644
--- a/include/bc.h
+++ b/include/bc.h
@@ -107,6 +107,7 @@
BC_STATUS_EXEC_INVALID_TEMP,
BC_STATUS_EXEC_INVALID_READ_EXPR,
BC_STATUS_EXEC_PRINT_ERR,
+ BC_STATUS_EXEC_INVALID_CONSTANT,
BC_STATUS_EXEC_HALT,
BC_STATUS_POSIX_NAME_LEN,
diff --git a/include/data.h b/include/data.h
index 5c71d2a..96c9a77 100644
--- a/include/data.h
+++ b/include/data.h
@@ -218,7 +218,7 @@
BcStatus bc_array_init(BcArray* array);
void bc_array_free(void* array);
-BcStatus bc_local_initVar(BcLocal* local, const char* name, const char* num);
+BcStatus bc_local_initVar(BcLocal* local, const char* name, const char* num, size_t base, size_t scale);
BcStatus bc_local_initArray(BcLocal* local, const char* name, uint32_t nelems);
void bc_local_free(void* local);
diff --git a/src/bc/bc.c b/src/bc/bc.c
index ca5b692..caa7f4f 100644
--- a/src/bc/bc.c
+++ b/src/bc/bc.c
@@ -93,6 +93,7 @@
"Runtime",
"Runtime",
"Runtime",
+ "Runtime",
"POSIX",
"POSIX",
@@ -175,6 +176,7 @@
"invalid temp variable; this is most likely a bug in bc",
"invalid read() expression",
"print error",
+ "invalid constant",
"bc was not halted correctly; this is a bug in bc",
"POSIX only allows one character names; the following is invalid:",
diff --git a/src/bc/data.c b/src/bc/data.c
index 96d168b..53168af 100644
--- a/src/bc/data.c
+++ b/src/bc/data.c
@@ -99,6 +99,7 @@
return BC_STATUS_MALLOC_FAIL;
}
+ func->params = params;
func->param_cap = new_cap;
}
@@ -128,6 +129,7 @@
return BC_STATUS_MALLOC_FAIL;
}
+ func->autos = autos;
func->auto_cap = new_cap;
}
@@ -226,15 +228,19 @@
bc_vec_free(a);
}
-BcStatus bc_local_initVar(BcLocal* local, const char* name, const char* num) {
+BcStatus bc_local_initVar(BcLocal* local, const char* name,
+ const char* num, size_t base, size_t scale)
+{
+ BcStatus status;
+
+ status = bc_num_init(&local->num, strlen(num));
+
+ if (status) return status;
local->name = name;
local->var = true;
- // TODO: Don't malloc.
- //arb_str2fxdpnt(num);
-
- return BC_STATUS_SUCCESS;
+ return bc_num_parse(&local->num, num, base, scale);
}
BcStatus bc_local_initArray(BcLocal* local, const char* name, uint32_t nelems) {
diff --git a/src/bc/num.c b/src/bc/num.c
index e096942..5425716 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -715,20 +715,28 @@
static BcStatus bc_num_alg_s(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
- scale = BC_MAX(a->rdx, b->rdx);
+ (void) scale;
+ c->rdx = BC_MAX(a->rdx, b->rdx);
+
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_alg_m(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
scale = BC_MAX(scale, a->rdx);
scale = BC_MAX(scale, b->rdx);
- scale = BC_MIN(a->rdx + b->rdx, scale);
+ c->rdx = BC_MIN(a->rdx + b->rdx, scale);
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_alg_d(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
-
+ (void) a;
+ (void) b;
+ (void) c;
+ (void) scale;
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_alg_mod(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
@@ -739,7 +747,7 @@
// TODO: Compute a / b.
- scale = BC_MAX(scale + b->rdx, a->rdx);
+ c->rdx = BC_MAX(scale + b->rdx, a->rdx);
// TODO: Compute a - (a / b) * b.
@@ -747,15 +755,25 @@
}
static BcStatus bc_num_alg_rem(BcNum* a, BcNum* b, BcNum* c) {
-
+ (void) a;
+ (void) b;
+ (void) c;
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_alg_p(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
-
+ (void) a;
+ (void) b;
+ (void) c;
+ (void) scale;
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_sqrt_newton(BcNum* a, BcNum* b, size_t scale) {
-
+ (void) a;
+ (void) b;
+ (void) scale;
+ return BC_STATUS_SUCCESS;
}
static bool bc_num_strValid(const char* val, size_t base) {
@@ -912,78 +930,20 @@
static BcStatus bc_num_parseLowBase(BcNum* n, const char* val,
size_t base, size_t scale)
{
- const char* ptr;
- char* nptr;
- size_t len;
- size_t radix;
- size_t digits;
- char c;
- char carry;
- size_t pow;
-
- len = strlen(val);
-
- ptr = strchr(val, '.');
-
- if (ptr) {
- --ptr;
- }
- else {
- ptr = val + len - 1;
- }
-
- radix = ptr - val;
-
- nptr = n->num + radix;
- ++radix;
-
- c = 0;
- carry = 0;
- digits = 0;
- pow = 1;
-
- while (ptr >= val) {
-
- c += BC_NUM_FROM_CHAR(*ptr) * pow;
- --ptr;
- pow *= base;
-
- if (pow > 10) {
-
- --nptr;
-
- while (c >= 10) {
- *nptr += 1;
- c -= 10;
- }
-
- *(nptr + 1) += c;
- ++digits;
-
- carry = 1;
- c = 0;
- pow = 1;
- }
- }
-
- if (c) {
- *nptr += c;
- --nptr;
- ++digits;
- }
-
- if (nptr >= n->num) {
- memmove(n->num, nptr + 1, digits * sizeof(char));
- }
-
- // TODO: After radix.
-
+ (void) n;
+ (void) val;
+ (void) base;
+ (void) scale;
return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_parseHighBase(BcNum* n, const char* val,
size_t base, size_t scale)
{
-
+ (void) n;
+ (void) val;
+ (void) base;
+ (void) scale;
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_printDecimal(BcNum* n, FILE* f) {
@@ -1050,7 +1010,6 @@
size_t size;
char* buf;
- size_t i;
size = BC_MAX(n->rdx, n->len - n->rdx) * ((10 * 2) / base);
@@ -1058,8 +1017,6 @@
if (!buf) return BC_STATUS_MALLOC_FAIL;
- i = 0;
-
fputc('\n', f);
free(buf);
@@ -1068,11 +1025,17 @@
}
static BcStatus bc_num_printHighBase(BcNum* n, size_t base, FILE* f) {
-
+ (void) n;
+ (void) base;
+ (void) f;
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_printHighestBase(BcNum* n, size_t base, FILE* f) {
-
+ (void) n;
+ (void) base;
+ (void) f;
+ return BC_STATUS_SUCCESS;
}
static BcStatus bc_num_trunc(BcNum* n, size_t places) {
diff --git a/src/bc/parse.c b/src/bc/parse.c
index 8cd4e86..2373de4 100644
--- a/src/bc/parse.c
+++ b/src/bc/parse.c
@@ -324,8 +324,6 @@
return BC_STATUS_INVALID_PARAM;
}
- status = BC_STATUS_SUCCESS;
-
switch (parse->token.type) {
case BC_LEX_NEWLINE:
@@ -627,8 +625,11 @@
}
if (parse->token.type == BC_LEX_COMMA) {
+
comma = true;
status = bc_lex_next(&parse->lex, &parse->token);
+
+ if (status) return status;
}
else {
comma = false;
@@ -759,8 +760,6 @@
BcStatus status;
uint8_t* flag_ptr;
- status = BC_STATUS_SUCCESS;
-
switch (parse->token.type) {
case BC_LEX_OP_INC:
@@ -780,6 +779,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -816,6 +816,7 @@
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -848,6 +849,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -861,6 +863,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -874,6 +877,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
status = bc_parse_auto(parse);
@@ -886,6 +890,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -899,6 +904,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -912,6 +918,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -937,6 +944,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -950,6 +958,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
status = bc_lex_next(&parse->lex, &parse->token);
@@ -973,6 +982,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -986,6 +996,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -1002,6 +1013,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -1021,6 +1033,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -1034,6 +1047,7 @@
{
if (BC_PARSE_IF_END(parse)) {
status = bc_parse_noElse(parse, code);
+ if (status) return status;
}
parse->auto_part = false;
@@ -1608,7 +1622,6 @@
return bc_vec_pushByte(code, 0);
}
- comma = false;
nparams = 0;
do {
diff --git a/src/bc/program.c b/src/bc/program.c
index acd3c00..8820f6e 100644
--- a/src/bc/program.c
+++ b/src/bc/program.c
@@ -58,8 +58,9 @@
};
+static BcStatus bc_program_execCode(BcProgram* p, BcFunc* func, BcInstPtr* ip);
static BcStatus bc_program_op(BcProgram* p, uint8_t inst);
-static BcNum* bc_program_num(BcProgram *p, BcResult* result);
+static BcStatus bc_program_num(BcProgram* p, BcResult* result, BcNum** num);
static BcStatus bc_program_printString(const char* str);
#if 0
static BcStatus bc_program_assign(BcProgram* p, BcExpr* expr,
@@ -491,14 +492,8 @@
BcStatus bc_program_exec(BcProgram* p) {
- BcStatus status;
- int pchars;
BcFunc* func;
- uint8_t* code;
BcInstPtr* ip;
- size_t idx;
-
- status = BC_STATUS_SUCCESS;
ip = bc_vec_top(&p->stack);
@@ -506,154 +501,7 @@
assert(func);
- code = func->code.array;
-
- for (; ip->idx < func->code.len; ++ip->idx) {
-
- uint8_t inst;
-
- inst = code[ip->idx];
-
- // TODO: Add all instructions.
- switch (inst) {
-
- case BC_INST_READ:
- {
- status = bc_program_read(p);
- break;
- }
-
- case BC_INST_PRINT:
- {
- BcResult* num;
-
- num = bc_vec_top(&p->expr_stack);
-
- bc_num_print(&num->num, p->obase);
-
- bc_vec_pop(&p->expr_stack);
-
- break;
- }
-
- case BC_INST_STR:
- {
- const char* string;
-
- idx = bc_program_index(code, &ip->idx);
-
- if (idx >= p->strings.len) {
- return BC_STATUS_EXEC_INVALID_STRING;
- }
-
- string = bc_vec_item(&p->strings, idx);
-
- pchars = fprintf(stdout, "%s", string);
- status = pchars > 0 ? BC_STATUS_SUCCESS :
- BC_STATUS_EXEC_PRINT_ERR;
-
- break;
- }
-
- case BC_INST_PRINT_STR:
- {
- const char* string;
-
- idx = bc_program_index(code, &ip->idx);
-
- if (idx >= p->strings.len) {
- return BC_STATUS_EXEC_INVALID_STRING;
- }
-
- string = bc_vec_item(&p->strings, idx);
-
- status = bc_program_printString(string);
-
- break;
- }
-
- case BC_INST_HALT:
- {
- status = BC_STATUS_EXEC_HALT;
- break;
- }
-
- case BC_INST_PUSH_NUM:
- {
- size_t idx;
- BcResult result;
- char* str;
-
- idx = bc_program_index(code, &ip->idx);
-
- str = *((char**) bc_vec_item(&p->constants, idx));
-
- if (!str) return BC_STATUS_EXEC_INVALID_EXPR;
-
- status = bc_num_init(&result.num, strlen(str));
-
- if (status) return status;
-
- status = bc_num_parse(&result.num, str, p->ibase, p->scale);
-
- if (status) return status;
-
- result.type = BC_RESULT_CONSTANT;
-
- status = bc_vec_push(&p->expr_stack, &result);
-
- break;
- }
-
- case BC_INST_OP_MODULUS:
- case BC_INST_OP_MULTIPLY:
- case BC_INST_OP_PLUS:
- case BC_INST_OP_MINUS:
- case BC_INST_OP_DIVIDE:
- case BC_INST_OP_POWER:
- {
- status = bc_program_op(p, inst);
- break;
- }
-
- case BC_INST_OP_NEGATE:
- {
- BcResult* ptr;
- BcResult result;
-
- ptr = bc_vec_top(&p->expr_stack);
-
- if (!ptr) return BC_STATUS_EXEC_INVALID_EXPR;
-
- result.type = BC_RESULT_INTERMEDIATE;
-
- status = bc_num_init(&result.num, BC_NUM_DEF_SIZE);
-
- if (status) return status;
-
- status = bc_num_copy(&result.num, &ptr->num);
-
- if (status) return status;
-
- result.num.neg = !result.num.neg;
-
- status = bc_vec_pop(&p->expr_stack);
-
- if (status) return status;
-
- status = bc_vec_push(&p->expr_stack, &result);
-
- break;
- }
-
- default:
- {
- return BC_STATUS_EXEC_INVALID_STMT;
- }
- }
- }
-
- return status;
+ return bc_program_execCode(p, func, ip);
}
void bc_program_printCode(BcProgram* p) {
@@ -751,12 +599,211 @@
memset(p, 0, sizeof(BcProgram));
}
+static BcStatus bc_program_execCode(BcProgram* p, BcFunc* func, BcInstPtr* ip) {
+
+ BcStatus status;
+ uint8_t* code;
+ size_t idx;
+ int pchars;
+
+ status = BC_STATUS_SUCCESS;
+
+ code = func->code.array;
+
+ for (; ip->idx < func->code.len; ++ip->idx) {
+
+ uint8_t inst;
+
+ inst = code[ip->idx];
+
+ // TODO: Add all instructions.
+ switch (inst) {
+
+ case BC_INST_READ:
+ {
+ status = bc_program_read(p);
+ break;
+ }
+
+ case BC_INST_PRINT:
+ {
+ BcResult* num;
+
+ num = bc_vec_top(&p->expr_stack);
+
+ bc_num_print(&num->num, p->obase);
+
+ bc_vec_pop(&p->expr_stack);
+
+ break;
+ }
+
+ case BC_INST_STR:
+ {
+ const char* string;
+
+ idx = bc_program_index(code, &ip->idx);
+
+ if (idx >= p->strings.len) {
+ return BC_STATUS_EXEC_INVALID_STRING;
+ }
+
+ string = bc_vec_item(&p->strings, idx);
+
+ pchars = fprintf(stdout, "%s", string);
+ status = pchars > 0 ? BC_STATUS_SUCCESS :
+ BC_STATUS_EXEC_PRINT_ERR;
+
+ break;
+ }
+
+ case BC_INST_PRINT_STR:
+ {
+ const char* string;
+
+ idx = bc_program_index(code, &ip->idx);
+
+ if (idx >= p->strings.len) {
+ return BC_STATUS_EXEC_INVALID_STRING;
+ }
+
+ string = bc_vec_item(&p->strings, idx);
+
+ status = bc_program_printString(string);
+
+ break;
+ }
+
+ case BC_INST_HALT:
+ {
+ status = BC_STATUS_EXEC_HALT;
+ break;
+ }
+
+ case BC_INST_PUSH_NUM:
+ {
+ BcResult result;
+
+ result.type = BC_RESULT_CONSTANT;
+ result.idx = bc_program_index(code, &ip->idx);
+
+ status = bc_vec_push(&p->expr_stack, &result);
+
+ break;
+ }
+
+ case BC_INST_OP_MODULUS:
+ case BC_INST_OP_MULTIPLY:
+ case BC_INST_OP_PLUS:
+ case BC_INST_OP_MINUS:
+ case BC_INST_OP_DIVIDE:
+ case BC_INST_OP_POWER:
+ {
+ status = bc_program_op(p, inst);
+ break;
+ }
+
+ case BC_INST_OP_NEGATE:
+ {
+ BcResult* ptr;
+ BcResult result;
+
+ ptr = bc_vec_top(&p->expr_stack);
+
+ if (!ptr) return BC_STATUS_EXEC_INVALID_EXPR;
+
+ result.type = BC_RESULT_INTERMEDIATE;
+
+ status = bc_num_init(&result.num, BC_NUM_DEF_SIZE);
+
+ if (status) return status;
+
+ status = bc_num_copy(&result.num, &ptr->num);
+
+ if (status) return status;
+
+ result.num.neg = !result.num.neg;
+
+ status = bc_vec_pop(&p->expr_stack);
+
+ if (status) return status;
+
+ status = bc_vec_push(&p->expr_stack, &result);
+
+ break;
+ }
+
+ default:
+ {
+ return BC_STATUS_EXEC_INVALID_STMT;
+ }
+ }
+ }
+
+ return status;
+}
+
+static BcStatus bc_program_op(BcProgram* p, uint8_t inst) {
+
+ BcStatus status;
+ BcResult* result1;
+ BcResult* result2;
+ BcResult result;
+ BcNum* num1;
+ BcNum* num2;
+
+ result2 = bc_vec_item_rev(&p->expr_stack, 0);
+
+ if (!result2) return BC_STATUS_EXEC_INVALID_EXPR;
+
+ result1 = bc_vec_item_rev(&p->expr_stack, 1);
+
+ if (!result1) return BC_STATUS_EXEC_INVALID_EXPR;
+
+ result.type = BC_RESULT_INTERMEDIATE;
+
+ status = bc_num_init(&result.num, BC_NUM_DEF_SIZE);
+
+ if (status) return status;
+
+ status = bc_program_num(p, result1, &num1);
+
+ if (status) return status;
+
+ status = bc_program_num(p, result2, &num2);
+
+ if (status) return status;
+
+ if (inst != BC_INST_OP_POWER) {
+
+ BcMathOpFunc op;
+
+ op = bc_math_ops[inst - BC_INST_OP_MODULUS];
+
+ status = op(&result1->num, &result2->num, &result.num, p->scale);
+ }
+ else {
+ status = bc_num_pow(&result1->num, &result2->num, &result.num, p->scale);
+ }
+
+ if (status) return status;
+
+ status = bc_vec_pop(&p->expr_stack);
+
+ if (status) return status;
+
+ status = bc_vec_pop(&p->expr_stack);
+
+ if (status) return status;
+
+ return bc_vec_push(&p->expr_stack, &result);
+}
+
static BcStatus bc_program_read(BcProgram* p) {
BcStatus status;
BcParse parse;
char* buffer;
- BcVec exprs;
BcTemp temp;
size_t size;
BcVec code;
@@ -881,67 +928,40 @@
putchar(byte);
}
-static BcStatus bc_program_op(BcProgram* p, uint8_t inst) {
+static BcStatus bc_program_num(BcProgram* p, BcResult* result, BcNum** num) {
BcStatus status;
- BcResult* result1;
- BcResult* result2;
- BcResult result;
- BcNum* num1;
- BcNum* num2;
- result2 = bc_vec_item_rev(&p->expr_stack, 0);
-
- if (!result2) return BC_STATUS_EXEC_INVALID_EXPR;
-
- result1 = bc_vec_item_rev(&p->expr_stack, 1);
-
- if (!result1) return BC_STATUS_EXEC_INVALID_EXPR;
-
- result.type = BC_RESULT_INTERMEDIATE;
-
- status = bc_num_init(&result.num, BC_NUM_DEF_SIZE);
-
- if (status) return status;
-
- num1 = bc_program_num(p, result1);
- num2 = bc_program_num(p, result2);
-
- if (!num1 || !num2) return BC_STATUS_EXEC_INVALID_EXPR;
-
- if (inst != BC_INST_OP_POWER) {
-
- BcMathOpFunc op;
-
- op = bc_math_ops[inst - BC_INST_OP_MODULUS];
-
- status = op(&result1->num, &result2->num, &result.num, p->scale);
- }
- else {
- status = bc_num_pow(&result1->num, &result2->num, &result.num, p->scale);
- }
-
- if (status) return status;
-
- status = bc_vec_pop(&p->expr_stack);
-
- if (status) return status;
-
- status = bc_vec_pop(&p->expr_stack);
-
- if (status) return status;
-
- return bc_vec_push(&p->expr_stack, &result);
-}
-
-static BcNum* bc_program_num(BcProgram* p, BcResult* result) {
+ status = BC_STATUS_SUCCESS;
switch (result->type) {
case BC_RESULT_INTERMEDIATE:
+ {
+ *num = &result->num;
+ break;
+ }
+
case BC_RESULT_CONSTANT:
{
- return &result->num;
+ char** s;
+ size_t idx;
+
+ idx = result->idx;
+
+ s = bc_vec_item(&p->constants, idx);
+
+ if (!s) return BC_STATUS_EXEC_INVALID_CONSTANT;
+
+ status = bc_num_init(&result->num, strlen(*s));
+
+ if (status) return status;
+
+ *num = &result->num;
+
+ status = bc_num_parse(&result->num, *s, p->ibase, p->scale);
+
+ break;
}
case BC_RESULT_VAR:
@@ -976,11 +996,12 @@
default:
{
- return NULL;
+ status = BC_STATUS_EXEC_INVALID_EXPR;
+ break;
}
}
- return NULL;
+ return status;
}
static BcStatus bc_program_printString(const char* str) {