i = 0;
x = y = 0;
while(p > a){
y = *--p - '0';
x |= y << i;
i += 3;
if(i >= Dbits){
Digout:
i -= Dbits;
b->p[b->top++] = x;
x = y >> 3-i;
}
}
if(i > 0)
goto Digout;
b->top = 0;
for(;;){
// do a billion at a time in native arithmetic
x = 0;
for(i = 0; i < 9; i++){
y = *a - '0';
if(y > 9)
break;
a++;
x *= 10;
x += y;
}
if(i == 0)
break;
if(base == 0){
base = 10;
if(a[0] == '0'){
if(a[1] == 'x' || a[1] == 'X') {
a += 2;
base = 16;
} else if(a[1] == 'b' || a[1] == 'B') {
a += 2;
base = 2;
} else if(a[1] >= '0' && a[1] <= '7') {
a++;
base = 8;
}
}
}
switch(base){
case 2:
e = frompow2(a, b, 1);
break;
case 4:
e = frompow2(a, b, 2);
break;
case 8:
e = from8(a, b);
break;
case 10:
e = from10(a, b);
break;
case 16:
e = frompow2(a, b, 4);
break;
case 32:
e = fromdecx(a, b, dec32chr, dec32);
break;
case 64:
e = fromdecx(a, b, dec64chr, dec64);
break;
default:
abort();
return nil;
}
if(pp != nil)
*pp = e;
// if no characters parsed, there wasn't a number to convert
if(e == a)
return nil;