mp: strtomp support for bases 2,4,8

This commit is contained in:
aiju 2015-12-08 20:26:17 +01:00
parent 609a9922ad
commit 15c6cd7555

View file

@ -44,21 +44,23 @@ init(void)
} }
static char* static char*
from16(char *a, mpint *b) frompow2(char *a, mpint *b, int s)
{ {
char *p, *next; char *p, *next;
int i; int i;
mpdigit x; mpdigit x;
int sn;
sn = 1<<s;
for(p = a; *p; p++) for(p = a; *p; p++)
if(tab.t16[*(uchar*)p] == INVAL) if((uchar)tab.t16[*(uchar*)p] >= sn)
break; break;
mpbits(b, (p-a)*4); mpbits(b, (p-a)*4);
b->top = 0; b->top = 0;
next = p; next = p;
while(p > a){ while(p > a){
x = 0; x = 0;
for(i = 0; i < Dbits; i += 4){ for(i = 0; i < Dbits; i += s){
if(p <= a) if(p <= a)
break; break;
x |= tab.t16[*(uchar*)--p]<<i; x |= tab.t16[*(uchar*)--p]<<i;
@ -178,12 +180,21 @@ strtomp(char *a, char **pp, int base, mpint *b)
} }
switch(base){ 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: case 10:
e = from10(a, b); e = from10(a, b);
break; break;
default: default:
case 16: case 16:
e = from16(a, b); e = frompow2(a, b, 4);
break; break;
case 32: case 32:
e = from32(a, b); e = from32(a, b);