summaryrefslogtreecommitdiff
path: root/sys/src/libmp
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2015-12-08 20:26:17 +0100
committeraiju <devnull@localhost>2015-12-08 20:26:17 +0100
commit15c6cd755557de5bb91c14668f9f0c2cbcbe988e (patch)
tree1428221dd26129f58a03a7c8ef2e54199eaf70c1 /sys/src/libmp
parent609a9922adac98516b33d67dc98b432ac9c10cc9 (diff)
mp: strtomp support for bases 2,4,8
Diffstat (limited to 'sys/src/libmp')
-rw-r--r--sys/src/libmp/port/strtomp.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/sys/src/libmp/port/strtomp.c b/sys/src/libmp/port/strtomp.c
index 0a9959692..59c7dd76b 100644
--- a/sys/src/libmp/port/strtomp.c
+++ b/sys/src/libmp/port/strtomp.c
@@ -44,21 +44,23 @@ init(void)
}
static char*
-from16(char *a, mpint *b)
+frompow2(char *a, mpint *b, int s)
{
char *p, *next;
int i;
mpdigit x;
+ int sn;
+ sn = 1<<s;
for(p = a; *p; p++)
- if(tab.t16[*(uchar*)p] == INVAL)
+ if((uchar)tab.t16[*(uchar*)p] >= sn)
break;
mpbits(b, (p-a)*4);
b->top = 0;
next = p;
while(p > a){
x = 0;
- for(i = 0; i < Dbits; i += 4){
+ for(i = 0; i < Dbits; i += s){
if(p <= a)
break;
x |= tab.t16[*(uchar*)--p]<<i;
@@ -178,12 +180,21 @@ strtomp(char *a, char **pp, int base, mpint *b)
}
switch(base){
+ case 2:
+ e = frompow2(a, b, 1);
+ break;
+ case 4:
+ e = frompow2(a, b, 2);
+ break;
+ case 8:
+ e = frompow2(a, b, 3);
+ break;
case 10:
e = from10(a, b);
break;
default:
case 16:
- e = from16(a, b);
+ e = frompow2(a, b, 4);
break;
case 32:
e = from32(a, b);