1 b3f61791 2004-03-21 devnull #include "os.h"
2 b3f61791 2004-03-21 devnull #include <mp.h>
3 b3f61791 2004-03-21 devnull #include "dat.h"
5 b3f61791 2004-03-21 devnull static struct {
6 b3f61791 2004-03-21 devnull int inited;
8 b3f61791 2004-03-21 devnull uchar t64[256];
9 b3f61791 2004-03-21 devnull uchar t32[256];
10 b3f61791 2004-03-21 devnull uchar t16[256];
11 b3f61791 2004-03-21 devnull uchar t10[256];
15 b3f61791 2004-03-21 devnull INVAL= 255
18 b3f61791 2004-03-21 devnull static char set64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
19 b3f61791 2004-03-21 devnull static char set32[] = "23456789abcdefghijkmnpqrstuvwxyz";
20 b3f61791 2004-03-21 devnull static char set16[] = "0123456789ABCDEF0123456789abcdef";
21 b3f61791 2004-03-21 devnull static char set10[] = "0123456789";
23 b3f61791 2004-03-21 devnull static void
24 b3f61791 2004-03-21 devnull init(void)
28 b3f61791 2004-03-21 devnull memset(tab.t64, INVAL, sizeof(tab.t64));
29 b3f61791 2004-03-21 devnull memset(tab.t32, INVAL, sizeof(tab.t32));
30 b3f61791 2004-03-21 devnull memset(tab.t16, INVAL, sizeof(tab.t16));
31 b3f61791 2004-03-21 devnull memset(tab.t10, INVAL, sizeof(tab.t10));
33 b3f61791 2004-03-21 devnull for(p = set64; *p; p++)
34 b3f61791 2004-03-21 devnull tab.t64[(uchar)*p] = p-set64;
35 b3f61791 2004-03-21 devnull for(p = set32; *p; p++)
36 b3f61791 2004-03-21 devnull tab.t32[(uchar)*p] = p-set32;
37 b3f61791 2004-03-21 devnull for(p = set16; *p; p++)
38 b3f61791 2004-03-21 devnull tab.t16[(uchar)*p] = (p-set16)%16;
39 b3f61791 2004-03-21 devnull for(p = set10; *p; p++)
40 b3f61791 2004-03-21 devnull tab.t10[(uchar)*p] = (p-set10);
42 b3f61791 2004-03-21 devnull tab.inited = 1;
45 b3f61791 2004-03-21 devnull static char*
46 b3f61791 2004-03-21 devnull from16(char *a, mpint *b)
48 b3f61791 2004-03-21 devnull char *p, *next;
50 b3f61791 2004-03-21 devnull mpdigit x;
52 b3f61791 2004-03-21 devnull b->top = 0;
53 b3f61791 2004-03-21 devnull for(p = a; *p; p++)
54 b3f61791 2004-03-21 devnull if(tab.t16[*(uchar*)p] == INVAL)
56 b3f61791 2004-03-21 devnull mpbits(b, (p-a)*4);
57 b3f61791 2004-03-21 devnull b->top = 0;
58 b3f61791 2004-03-21 devnull next = p;
59 b3f61791 2004-03-21 devnull while(p > a){
61 b3f61791 2004-03-21 devnull for(i = 0; i < Dbits; i += 4){
62 b3f61791 2004-03-21 devnull if(p <= a)
64 b3f61791 2004-03-21 devnull x |= tab.t16[*(uchar*)--p]<<i;
66 b3f61791 2004-03-21 devnull b->p[b->top++] = x;
68 b3f61791 2004-03-21 devnull return next;
71 b3f61791 2004-03-21 devnull static ulong mppow10[] = {
72 b3f61791 2004-03-21 devnull 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000
75 b3f61791 2004-03-21 devnull static char*
76 b3f61791 2004-03-21 devnull from10(char *a, mpint *b)
78 b3f61791 2004-03-21 devnull ulong x, y;
79 b3f61791 2004-03-21 devnull mpint *pow, *r;
82 b3f61791 2004-03-21 devnull pow = mpnew(0);
83 b3f61791 2004-03-21 devnull r = mpnew(0);
85 b3f61791 2004-03-21 devnull b->top = 0;
87 cbeb0b26 2006-04-01 devnull /* do a billion at a time in native arithmetic */
89 b3f61791 2004-03-21 devnull for(i = 0; i < 9; i++){
90 b3f61791 2004-03-21 devnull y = tab.t10[*(uchar*)a];
91 b3f61791 2004-03-21 devnull if(y == INVAL)
97 b3f61791 2004-03-21 devnull if(i == 0)
100 cbeb0b26 2006-04-01 devnull /* accumulate into mpint */
101 b3f61791 2004-03-21 devnull uitomp(mppow10[i], pow);
102 b3f61791 2004-03-21 devnull uitomp(x, r);
103 b3f61791 2004-03-21 devnull mpmul(b, pow, b);
104 b3f61791 2004-03-21 devnull mpadd(b, r, b);
105 b3f61791 2004-03-21 devnull if(i != 9)
108 b3f61791 2004-03-21 devnull mpfree(pow);
109 b3f61791 2004-03-21 devnull mpfree(r);
110 b3f61791 2004-03-21 devnull return a;
113 b3f61791 2004-03-21 devnull static char*
114 b3f61791 2004-03-21 devnull from64(char *a, mpint *b)
116 b3f61791 2004-03-21 devnull char *buf = a;
117 b3f61791 2004-03-21 devnull uchar *p;
118 b3f61791 2004-03-21 devnull int n, m;
120 b3f61791 2004-03-21 devnull for(; tab.t64[*(uchar*)a] != INVAL; a++)
122 b3f61791 2004-03-21 devnull n = a-buf;
123 b3f61791 2004-03-21 devnull mpbits(b, n*6);
124 b3f61791 2004-03-21 devnull p = malloc(n);
125 b3f61791 2004-03-21 devnull if(p == nil)
126 b3f61791 2004-03-21 devnull return a;
127 b3f61791 2004-03-21 devnull m = dec64(p, n, buf, n);
128 b3f61791 2004-03-21 devnull betomp(p, m, b);
129 b3f61791 2004-03-21 devnull free(p);
130 b3f61791 2004-03-21 devnull return a;
133 b3f61791 2004-03-21 devnull static char*
134 b3f61791 2004-03-21 devnull from32(char *a, mpint *b)
136 b3f61791 2004-03-21 devnull char *buf = a;
137 b3f61791 2004-03-21 devnull uchar *p;
138 b3f61791 2004-03-21 devnull int n, m;
140 b3f61791 2004-03-21 devnull for(; tab.t64[*(uchar*)a] != INVAL; a++)
142 b3f61791 2004-03-21 devnull n = a-buf;
143 b3f61791 2004-03-21 devnull mpbits(b, n*5);
144 b3f61791 2004-03-21 devnull p = malloc(n);
145 b3f61791 2004-03-21 devnull if(p == nil)
146 b3f61791 2004-03-21 devnull return a;
147 b3f61791 2004-03-21 devnull m = dec32(p, n, buf, n);
148 b3f61791 2004-03-21 devnull betomp(p, m, b);
149 b3f61791 2004-03-21 devnull free(p);
150 b3f61791 2004-03-21 devnull return a;
154 b3f61791 2004-03-21 devnull strtomp(char *a, char **pp, int base, mpint *b)
156 b3f61791 2004-03-21 devnull int sign;
157 b3f61791 2004-03-21 devnull char *e;
159 b3f61791 2004-03-21 devnull if(b == nil)
160 b3f61791 2004-03-21 devnull b = mpnew(0);
162 b3f61791 2004-03-21 devnull if(tab.inited == 0)
165 b3f61791 2004-03-21 devnull while(*a==' ' || *a=='\t')
168 b3f61791 2004-03-21 devnull sign = 1;
169 b3f61791 2004-03-21 devnull for(;; a++){
170 b3f61791 2004-03-21 devnull switch(*a){
171 b3f61791 2004-03-21 devnull case '-':
172 b3f61791 2004-03-21 devnull sign *= -1;
173 b3f61791 2004-03-21 devnull continue;
178 b3f61791 2004-03-21 devnull switch(base){
179 b3f61791 2004-03-21 devnull case 10:
180 b3f61791 2004-03-21 devnull e = from10(a, b);
182 b3f61791 2004-03-21 devnull default:
183 b3f61791 2004-03-21 devnull case 16:
184 b3f61791 2004-03-21 devnull e = from16(a, b);
186 b3f61791 2004-03-21 devnull case 32:
187 b3f61791 2004-03-21 devnull e = from32(a, b);
189 b3f61791 2004-03-21 devnull case 64:
190 b3f61791 2004-03-21 devnull e = from64(a, b);
194 cbeb0b26 2006-04-01 devnull /* if no characters parsed, there wasn't a number to convert */
195 b3f61791 2004-03-21 devnull if(e == a)
196 b3f61791 2004-03-21 devnull return nil;
198 b3f61791 2004-03-21 devnull mpnorm(b);
199 b3f61791 2004-03-21 devnull b->sign = sign;
200 b3f61791 2004-03-21 devnull if(pp != nil)
201 b3f61791 2004-03-21 devnull *pp = e;
203 b3f61791 2004-03-21 devnull return b;