Blame


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"
4 b3f61791 2004-03-21 devnull
5 b3f61791 2004-03-21 devnull static struct {
6 b3f61791 2004-03-21 devnull int inited;
7 b3f61791 2004-03-21 devnull
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];
12 b3f61791 2004-03-21 devnull } tab;
13 b3f61791 2004-03-21 devnull
14 b3f61791 2004-03-21 devnull enum {
15 b3f61791 2004-03-21 devnull INVAL= 255
16 b3f61791 2004-03-21 devnull };
17 b3f61791 2004-03-21 devnull
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";
22 b3f61791 2004-03-21 devnull
23 b3f61791 2004-03-21 devnull static void
24 b3f61791 2004-03-21 devnull init(void)
25 b3f61791 2004-03-21 devnull {
26 b3f61791 2004-03-21 devnull char *p;
27 b3f61791 2004-03-21 devnull
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));
32 b3f61791 2004-03-21 devnull
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);
41 b3f61791 2004-03-21 devnull
42 b3f61791 2004-03-21 devnull tab.inited = 1;
43 b3f61791 2004-03-21 devnull }
44 b3f61791 2004-03-21 devnull
45 b3f61791 2004-03-21 devnull static char*
46 b3f61791 2004-03-21 devnull from16(char *a, mpint *b)
47 b3f61791 2004-03-21 devnull {
48 b3f61791 2004-03-21 devnull char *p, *next;
49 b3f61791 2004-03-21 devnull int i;
50 b3f61791 2004-03-21 devnull mpdigit x;
51 b3f61791 2004-03-21 devnull
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)
55 b3f61791 2004-03-21 devnull break;
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){
60 b3f61791 2004-03-21 devnull x = 0;
61 b3f61791 2004-03-21 devnull for(i = 0; i < Dbits; i += 4){
62 b3f61791 2004-03-21 devnull if(p <= a)
63 b3f61791 2004-03-21 devnull break;
64 b3f61791 2004-03-21 devnull x |= tab.t16[*(uchar*)--p]<<i;
65 b3f61791 2004-03-21 devnull }
66 b3f61791 2004-03-21 devnull b->p[b->top++] = x;
67 b3f61791 2004-03-21 devnull }
68 b3f61791 2004-03-21 devnull return next;
69 b3f61791 2004-03-21 devnull }
70 b3f61791 2004-03-21 devnull
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
73 b3f61791 2004-03-21 devnull };
74 b3f61791 2004-03-21 devnull
75 b3f61791 2004-03-21 devnull static char*
76 b3f61791 2004-03-21 devnull from10(char *a, mpint *b)
77 b3f61791 2004-03-21 devnull {
78 b3f61791 2004-03-21 devnull ulong x, y;
79 b3f61791 2004-03-21 devnull mpint *pow, *r;
80 b3f61791 2004-03-21 devnull int i;
81 b3f61791 2004-03-21 devnull
82 b3f61791 2004-03-21 devnull pow = mpnew(0);
83 b3f61791 2004-03-21 devnull r = mpnew(0);
84 b3f61791 2004-03-21 devnull
85 b3f61791 2004-03-21 devnull b->top = 0;
86 b3f61791 2004-03-21 devnull for(;;){
87 cbeb0b26 2006-04-01 devnull /* do a billion at a time in native arithmetic */
88 b3f61791 2004-03-21 devnull x = 0;
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)
92 b3f61791 2004-03-21 devnull break;
93 b3f61791 2004-03-21 devnull a++;
94 b3f61791 2004-03-21 devnull x *= 10;
95 b3f61791 2004-03-21 devnull x += y;
96 b3f61791 2004-03-21 devnull }
97 b3f61791 2004-03-21 devnull if(i == 0)
98 b3f61791 2004-03-21 devnull break;
99 b3f61791 2004-03-21 devnull
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)
106 b3f61791 2004-03-21 devnull break;
107 b3f61791 2004-03-21 devnull }
108 b3f61791 2004-03-21 devnull mpfree(pow);
109 b3f61791 2004-03-21 devnull mpfree(r);
110 b3f61791 2004-03-21 devnull return a;
111 b3f61791 2004-03-21 devnull }
112 b3f61791 2004-03-21 devnull
113 b3f61791 2004-03-21 devnull static char*
114 b3f61791 2004-03-21 devnull from64(char *a, mpint *b)
115 b3f61791 2004-03-21 devnull {
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;
119 b3f61791 2004-03-21 devnull
120 b3f61791 2004-03-21 devnull for(; tab.t64[*(uchar*)a] != INVAL; a++)
121 b3f61791 2004-03-21 devnull ;
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;
131 b3f61791 2004-03-21 devnull }
132 b3f61791 2004-03-21 devnull
133 b3f61791 2004-03-21 devnull static char*
134 b3f61791 2004-03-21 devnull from32(char *a, mpint *b)
135 b3f61791 2004-03-21 devnull {
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;
139 b3f61791 2004-03-21 devnull
140 b3f61791 2004-03-21 devnull for(; tab.t64[*(uchar*)a] != INVAL; a++)
141 b3f61791 2004-03-21 devnull ;
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;
151 b3f61791 2004-03-21 devnull }
152 b3f61791 2004-03-21 devnull
153 b3f61791 2004-03-21 devnull mpint*
154 b3f61791 2004-03-21 devnull strtomp(char *a, char **pp, int base, mpint *b)
155 b3f61791 2004-03-21 devnull {
156 b3f61791 2004-03-21 devnull int sign;
157 b3f61791 2004-03-21 devnull char *e;
158 b3f61791 2004-03-21 devnull
159 b3f61791 2004-03-21 devnull if(b == nil)
160 b3f61791 2004-03-21 devnull b = mpnew(0);
161 b3f61791 2004-03-21 devnull
162 b3f61791 2004-03-21 devnull if(tab.inited == 0)
163 b3f61791 2004-03-21 devnull init();
164 b3f61791 2004-03-21 devnull
165 b3f61791 2004-03-21 devnull while(*a==' ' || *a=='\t')
166 b3f61791 2004-03-21 devnull a++;
167 b3f61791 2004-03-21 devnull
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;
174 b3f61791 2004-03-21 devnull }
175 b3f61791 2004-03-21 devnull break;
176 b3f61791 2004-03-21 devnull }
177 b3f61791 2004-03-21 devnull
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);
181 b3f61791 2004-03-21 devnull break;
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);
185 b3f61791 2004-03-21 devnull break;
186 b3f61791 2004-03-21 devnull case 32:
187 b3f61791 2004-03-21 devnull e = from32(a, b);
188 b3f61791 2004-03-21 devnull break;
189 b3f61791 2004-03-21 devnull case 64:
190 b3f61791 2004-03-21 devnull e = from64(a, b);
191 b3f61791 2004-03-21 devnull break;
192 b3f61791 2004-03-21 devnull }
193 b3f61791 2004-03-21 devnull
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;
197 b3f61791 2004-03-21 devnull
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;
202 b3f61791 2004-03-21 devnull
203 b3f61791 2004-03-21 devnull return b;
204 b3f61791 2004-03-21 devnull }