diff options
| -rw-r--r-- | miscutils/bc.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index 685427e58..9eafa80e9 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
| @@ -1411,23 +1411,26 @@ static void bc_num_copy(BcNum *d, BcNum *s) | |||
| 1411 | } | 1411 | } |
| 1412 | } | 1412 | } |
| 1413 | 1413 | ||
| 1414 | static BcStatus bc_num_ulong(BcNum *n, unsigned long *result) | 1414 | static BcStatus bc_num_ulong(BcNum *n, unsigned long *result_p) |
| 1415 | { | 1415 | { |
| 1416 | size_t i; | 1416 | size_t i; |
| 1417 | unsigned long pow; | 1417 | unsigned long pow, result; |
| 1418 | 1418 | ||
| 1419 | if (n->neg) return bc_error("negative number"); | 1419 | if (n->neg) return bc_error("negative number"); |
| 1420 | 1420 | ||
| 1421 | for (*result = 0, pow = 1, i = n->rdx; i < n->len; ++i) { | 1421 | for (result = 0, pow = 1, i = n->rdx; i < n->len; ++i) { |
| 1422 | 1422 | ||
| 1423 | unsigned long prev = *result, powprev = pow; | 1423 | unsigned long prev = result, powprev = pow; |
| 1424 | 1424 | ||
| 1425 | *result += ((unsigned long) n->num[i]) * pow; | 1425 | result += ((unsigned long) n->num[i]) * pow; |
| 1426 | pow *= 10; | 1426 | pow *= 10; |
| 1427 | 1427 | ||
| 1428 | if (*result < prev || pow < powprev) | 1428 | if (result < prev || pow < powprev) |
| 1429 | return bc_error("overflow"); | 1429 | return bc_error("overflow"); |
| 1430 | prev = result; | ||
| 1431 | powprev = pow; | ||
| 1430 | } | 1432 | } |
| 1433 | *result_p = result; | ||
| 1431 | 1434 | ||
| 1432 | return BC_STATUS_SUCCESS; | 1435 | return BC_STATUS_SUCCESS; |
| 1433 | } | 1436 | } |
| @@ -5855,7 +5858,6 @@ static BcStatus bc_program_assign(char inst) | |||
| 5855 | BcStatus s; | 5858 | BcStatus s; |
| 5856 | BcResult *left, *right, res; | 5859 | BcResult *left, *right, res; |
| 5857 | BcNum *l = NULL, *r = NULL; | 5860 | BcNum *l = NULL, *r = NULL; |
| 5858 | unsigned long val, max; | ||
| 5859 | bool assign = inst == BC_INST_ASSIGN, ib, sc; | 5861 | bool assign = inst == BC_INST_ASSIGN, ib, sc; |
| 5860 | 5862 | ||
| 5861 | s = bc_program_binOpPrep(&left, &l, &right, &r, assign); | 5863 | s = bc_program_binOpPrep(&left, &l, &right, &r, assign); |
| @@ -5909,6 +5911,7 @@ static BcStatus bc_program_assign(char inst) | |||
| 5909 | "bad obase; must be [2, BC_BASE_MAX]", //BC_RESULT_OBASE | 5911 | "bad obase; must be [2, BC_BASE_MAX]", //BC_RESULT_OBASE |
| 5910 | }; | 5912 | }; |
| 5911 | size_t *ptr; | 5913 | size_t *ptr; |
| 5914 | unsigned long val, max; | ||
| 5912 | 5915 | ||
| 5913 | s = bc_num_ulong(l, &val); | 5916 | s = bc_num_ulong(l, &val); |
| 5914 | if (s) | 5917 | if (s) |
