bool neg;
} BcNum;
-#define BC_NUM_MIN_BASE ((unsigned long) 2)
#define BC_NUM_MAX_IBASE ((unsigned long) 16)
// larger value might speed up BIGNUM calculations a bit:
#define BC_NUM_DEF_SIZE (16)
size_t len;
size_t scale;
- BcNum ib;
size_t ib_t;
- BcNum ob;
size_t ob_t;
-
- BcNum hexb;
+ BcNum ob;
#if ENABLE_DC
BcNum strmb;
// Note: n is already "bc_num_zero()"ed,
// leading zeroes in "val" are removed
-static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base)
+static void bc_num_parseBase(BcNum *n, const char *val, unsigned base_t)
{
BcStatus s;
BcNum temp, mult, result;
+ BcNum base;
BcDig c = '\0';
unsigned long v;
size_t i, digits;
bc_num_init_DEF_SIZE(&temp);
bc_num_init_DEF_SIZE(&mult);
+ bc_num_init_DEF_SIZE(&base);
+ bc_num_ulong2num(&base, base_t);
for (;;) {
c = *val++;
v = (unsigned long) (c <= '9' ? c - '0' : c - 'A' + 10);
- s = zbc_num_mul(n, base, &mult, 0);
+ s = zbc_num_mul(n, &base, &mult, 0);
if (s) goto int_err;
bc_num_ulong2num(&temp, v);
s = zbc_num_add(&mult, &temp, n, 0);
if (s) goto int_err;
}
- bc_num_init(&result, base->len);
+ bc_num_init(&result, base.len);
//bc_num_zero(&result); - already is
bc_num_one(&mult);
v = (unsigned long) (c <= '9' ? c - '0' : c - 'A' + 10);
- s = zbc_num_mul(&result, base, &result, 0);
+ s = zbc_num_mul(&result, &base, &result, 0);
if (s) goto err;
bc_num_ulong2num(&temp, v);
s = zbc_num_add(&result, &temp, &result, 0);
if (s) goto err;
- s = zbc_num_mul(&mult, base, &mult, 0);
+ s = zbc_num_mul(&mult, &base, &mult, 0);
if (s) goto err;
}
err:
bc_num_free(&result);
int_err:
+ bc_num_free(&base);
bc_num_free(&mult);
bc_num_free(&temp);
}
-static BC_STATUS zbc_num_parse(BcNum *n, const char *val, BcNum *base,
- size_t base_t)
+static BC_STATUS zbc_num_parse(BcNum *n, const char *val, unsigned base_t)
{
if (!bc_num_strValid(val, base_t))
RETURN_STATUS(bc_error("bad number string"));
if (base_t == 10)
bc_num_parseDecimal(n, val);
else
- bc_num_parseBase(n, val, base);
+ bc_num_parseBase(n, val, base_t);
RETURN_STATUS(BC_STATUS_SUCCESS);
}
{
BcStatus s;
char **str = bc_vec_item(&G.prog.consts, r->d.id.idx);
- size_t base_t, len = strlen(*str);
- BcNum *base;
+ unsigned base_t;
+ size_t len = strlen(*str);
bc_num_init(&r->d.n, len);
hex = hex && len == 1;
- base = hex ? &G.prog.hexb : &G.prog.ib;
- base_t = hex ? BC_NUM_MAX_IBASE : G.prog.ib_t;
- s = zbc_num_parse(&r->d.n, *str, base, base_t);
+ base_t = hex ? 16 : G.prog.ib_t;
+ s = zbc_num_parse(&r->d.n, *str, base_t);
if (s) {
bc_num_free(&r->d.n);
if (G.prog.ob_t <= BC_NUM_MAX_IBASE) {
width = 1;
print = bc_num_printHex;
- }
- else {
+ } else {
for (i = G.prog.ob_t - 1, width = 0; i != 0; i /= 10, ++width)
continue;
print = bc_num_printDigits;
if (n->len == 0) {
bb_putchar('0');
++G.prog.nchars;
- }
- else if (G.prog.ob_t == 10)
+ } else if (G.prog.ob_t == 10)
bc_num_printDecimal(n);
else
s = zbc_num_printBase(n);
"bad obase; must be [2,"BC_MAX_OBASE_STR"]", //BC_RESULT_OBASE
};
size_t *ptr;
- unsigned long val, max;
+ size_t max;
+ unsigned long val;
s = zbc_num_ulong(l, &val);
if (s) RETURN_STATUS(s);
if (sc) {
max = BC_MAX_SCALE;
ptr = &G.prog.scale;
- }
- else {
- if (val < BC_NUM_MIN_BASE)
+ } else {
+ if (val < 2)
RETURN_STATUS(bc_error(msg[s]));
max = ib ? BC_NUM_MAX_IBASE : BC_MAX_OBASE;
ptr = ib ? &G.prog.ib_t : &G.prog.ob_t;
if (val > max)
RETURN_STATUS(bc_error(msg[s]));
- if (!sc)
- bc_num_copy(ib ? &G.prog.ib : &G.prog.ob, l);
+ if (!sc && !ib)
+ bc_num_copy(&G.prog.ob, l);
*ptr = (size_t) val;
s = BC_STATUS_SUCCESS;
#if ENABLE_FEATURE_CLEAN_UP
static void bc_program_free(void)
{
- bc_num_free(&G.prog.ib);
bc_num_free(&G.prog.ob);
- bc_num_free(&G.prog.hexb);
# if ENABLE_DC
bc_num_free(&G.prog.strmb);
# endif
memset(&ip, 0, sizeof(BcInstPtr));
// G.prog.nchars = G.prog.scale = 0; - already is
- bc_num_init_DEF_SIZE(&G.prog.ib);
- bc_num_ten(&G.prog.ib);
G.prog.ib_t = 10;
bc_num_init_DEF_SIZE(&G.prog.ob);
bc_num_ten(&G.prog.ob);
G.prog.ob_t = 10;
- bc_num_init_DEF_SIZE(&G.prog.hexb);
- bc_num_ten(&G.prog.hexb);
- G.prog.hexb.num[0] = 6;
-
#if ENABLE_DC
bc_num_init_DEF_SIZE(&G.prog.strmb);
bc_num_ulong2num(&G.prog.strmb, UCHAR_MAX + 1);