bc: get rid of G.prog.ob, G.prog.strmb

function                                             old     new   delta
zbc_num_printNum                                     489     540     +51
zbc_program_asciify                                  426     473     +47
zbc_program_print                                    686     684      -2
zbc_program_exec                                    4008    3995     -13
zbc_program_assign                                   474     440     -34
bc_vm_init                                           739     663     -76
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/4 up/down: 98/-125)           Total: -27 bytes
   text	   data	    bss	    dec	    hex	filename
 981404	    485	   7296	 989185	  f1801	busybox_old
 981377	    485	   7296	 989158	  f17e6	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 0b891d8..566808e 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -1355,14 +1355,6 @@
 	n->num[0] = 1;
 }
 
-static void bc_num_ten(BcNum *n)
-{
-	bc_num_setToZero(n, 0);
-	n->len = 2;
-	n->num[0] = 0;
-	n->num[1] = 1;
-}
-
 // Note: this also sets BcNum to zero
 static void bc_num_init(BcNum *n, size_t req)
 {
@@ -2251,6 +2243,7 @@
 
 	bc_num_init_DEF_SIZE(&temp);
 	bc_num_init_DEF_SIZE(&mult);
+//TODO: have BcNumSmall type, with static buffer
 	bc_num_init_DEF_SIZE(&base);
 	bc_num_ulong2num(&base, base_t);
 
@@ -5314,10 +5307,11 @@
 		bc_num_printHex((size_t) n->num[i], 1, i == rdx);
 }
 
-static BC_STATUS zbc_num_printNum(BcNum *n, BcNum *base, size_t width, BcNumDigitOp print)
+static BC_STATUS zbc_num_printNum(BcNum *n, unsigned base_t, size_t width, BcNumDigitOp print)
 {
 	BcStatus s;
 	BcVec stack;
+	BcNum base;
 	BcNum intp, fracp, digit, frac_len;
 	unsigned long dig, *ptr;
 	size_t i;
@@ -5335,13 +5329,16 @@
 	bc_num_init(&frac_len, BC_NUM_INT(n));
 	bc_num_copy(&intp, n);
 	bc_num_one(&frac_len);
+//TODO: have BcNumSmall type, with static buffer
+	bc_num_init_DEF_SIZE(&base);
+	bc_num_ulong2num(&base, base_t);
 
 	bc_num_truncate(&intp, intp.rdx);
 	s = zbc_num_sub(n, &intp, &fracp, 0);
 	if (s) goto err;
 
 	while (intp.len != 0) {
-		s = zbc_num_divmod(&intp, base, &intp, &digit, 0);
+		s = zbc_num_divmod(&intp, &base, &intp, &digit, 0);
 		if (s) goto err;
 		s = zbc_num_ulong(&digit, &dig);
 		if (s) goto err;
@@ -5356,7 +5353,7 @@
 	if (!n->rdx) goto err;
 
 	for (radix = true; frac_len.len <= n->rdx; radix = false) {
-		s = zbc_num_mul(&fracp, base, &fracp, n->rdx);
+		s = zbc_num_mul(&fracp, &base, &fracp, n->rdx);
 		if (s) goto err;
 		s = zbc_num_ulong(&fracp, &dig);
 		if (s) goto err;
@@ -5364,10 +5361,11 @@
 		s = zbc_num_sub(&fracp, &intp, &fracp, 0);
 		if (s) goto err;
 		print(dig, width, radix);
-		s = zbc_num_mul(&frac_len, base, &frac_len, 0);
+		s = zbc_num_mul(&frac_len, &base, &frac_len, 0);
 		if (s) goto err;
 	}
  err:
+	bc_num_free(&base);
 	bc_num_free(&frac_len);
 	bc_num_free(&digit);
 	bc_num_free(&fracp);
@@ -5406,7 +5404,7 @@
 		print = bc_num_printDigits;
 	}
 
-	s = zbc_num_printNum(n, &G.prog.ob, width, print);
+	s = zbc_num_printNum(n, G.prog.ob_t, width, print);
 	n->neg = neg;
 
 	RETURN_STATUS(s);
@@ -5692,8 +5690,6 @@
 
 		if (val > max)
 			RETURN_STATUS(bc_error(msg[s]));
-		if (!sc && !ib)
-			bc_num_copy(&G.prog.ob, l);
 
 		*ptr = (size_t) val;
 		s = BC_STATUS_SUCCESS;
@@ -6092,11 +6088,18 @@
 	if (s) RETURN_STATUS(s);
 
 	if (BC_PROG_NUM(r, num)) {
+		BcNum strmb;
+
 		bc_num_init_DEF_SIZE(&n);
 		bc_num_copy(&n, num);
 		bc_num_truncate(&n, n.rdx);
 
-		s = zbc_num_mod(&n, &G.prog.strmb, &n, 0);
+//TODO: have BcNumSmall type, with static buffer
+		bc_num_init_DEF_SIZE(&strmb);
+		bc_num_ulong2num(&strmb, 0x100);
+		s = zbc_num_mod(&n, &strmb, &n, 0);
+		bc_num_free(&strmb);
+
 		if (s) goto num_err;
 		s = zbc_num_ulong(&n, &val);
 		if (s) goto num_err;
@@ -6156,7 +6159,7 @@
 	if (s) RETURN_STATUS(s);
 
 	if (BC_PROG_NUM(r, n)) {
-		s = zbc_num_printNum(n, &G.prog.strmb, 1, bc_num_printChar);
+		s = zbc_num_printNum(n, 0x100, 1, bc_num_printChar);
 	} else {
 		idx = (r->t == BC_RESULT_STR) ? r->d.id.idx : n->rdx;
 		str = *bc_program_str(idx);
@@ -6945,10 +6948,6 @@
 #if ENABLE_FEATURE_CLEAN_UP
 static void bc_program_free(void)
 {
-	bc_num_free(&G.prog.ob);
-# if ENABLE_DC
-	bc_num_free(&G.prog.strmb);
-# endif
 	bc_vec_free(&G.prog.fns);
 	bc_vec_free(&G.prog.fn_map);
 	bc_vec_free(&G.prog.vars);
@@ -6984,16 +6983,8 @@
 
 	// G.prog.nchars = G.prog.scale = 0; - already is
 	G.prog.ib_t = 10;
-
-	bc_num_init_DEF_SIZE(&G.prog.ob);
-	bc_num_ten(&G.prog.ob);
 	G.prog.ob_t = 10;
 
-#if ENABLE_DC
-	bc_num_init_DEF_SIZE(&G.prog.strmb);
-	bc_num_ulong2num(&G.prog.strmb, UCHAR_MAX + 1);
-#endif
-
 	bc_num_init_DEF_SIZE(&G.prog.last);
 	//bc_num_zero(&G.prog.last); - already is