ref: bdc2b7556896a069f71dcafb9d4ba4e94872bcfe
parent: a8f8de1cdeec7f9bee287c137b576e0249e8df82
author: aiju <devnull@localhost>
date: Sun Dec 20 08:45:28 EST 2015
mpfmt: handle base 2, 4
--- a/sys/src/libmp/port/mpfmt.c
+++ b/sys/src/libmp/port/mpfmt.c
@@ -44,21 +44,22 @@
static char set16[] = "0123456789ABCDEF";
static int
-to16(mpint *b, char *buf, int len)
+topow2(mpint *b, char *buf, int len, int s)
{
mpdigit *p, x;
- int i, j;
+ int i, j, sn;
char *out, *eout;
if(len < 1)
return -1;
+ sn = 1<<s;
out = buf;
eout = buf+len;
for(p = &b->p[b->top-1]; p >= b->p; p--){
x = *p;
- for(i = Dbits-4; i >= 0; i -= 4){
- j = 0xf & (x>>i);
+ for(i = Dbits-s; i >= 0; i -= s){
+ j = x >> i & sn - 1;
if(j != 0 || out != buf){
if(out >= eout)
return -1;
@@ -190,10 +191,16 @@
break;
default:
case 16:
- rv = to16(b, out, len);
+ rv = topow2(b, out, len, 4);
break;
case 10:
rv = to10(b, out, len);
+ break;
+ case 4:
+ rv = topow2(b, out, len, 2);
+ break;
+ case 2:
+ rv = topow2(b, out, len, 1);
break;
}
if(rv < 0){