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 <libsec.h>
4 b3f61791 2004-03-21 devnull #include "dat.h"
5 b3f61791 2004-03-21 devnull
6 b3f61791 2004-03-21 devnull static struct {
7 b3f61791 2004-03-21 devnull int inited;
8 b3f61791 2004-03-21 devnull
9 b3f61791 2004-03-21 devnull uchar t64[256];
10 b3f61791 2004-03-21 devnull uchar t32[256];
11 b3f61791 2004-03-21 devnull uchar t16[256];
12 b3f61791 2004-03-21 devnull uchar t10[256];
13 b3f61791 2004-03-21 devnull } tab;
14 b3f61791 2004-03-21 devnull
15 b3f61791 2004-03-21 devnull enum {
16 b3f61791 2004-03-21 devnull INVAL= 255
17 b3f61791 2004-03-21 devnull };
18 b3f61791 2004-03-21 devnull
19 b3f61791 2004-03-21 devnull static char set64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
20 b3f61791 2004-03-21 devnull static char set32[] = "23456789abcdefghijkmnpqrstuvwxyz";
21 b3f61791 2004-03-21 devnull static char set16[] = "0123456789ABCDEF0123456789abcdef";
22 b3f61791 2004-03-21 devnull static char set10[] = "0123456789";
23 b3f61791 2004-03-21 devnull
24 b3f61791 2004-03-21 devnull static void
25 b3f61791 2004-03-21 devnull init(void)
26 b3f61791 2004-03-21 devnull {
27 b3f61791 2004-03-21 devnull char *p;
28 b3f61791 2004-03-21 devnull
29 b3f61791 2004-03-21 devnull memset(tab.t64, INVAL, sizeof(tab.t64));
30 b3f61791 2004-03-21 devnull memset(tab.t32, INVAL, sizeof(tab.t32));
31 b3f61791 2004-03-21 devnull memset(tab.t16, INVAL, sizeof(tab.t16));
32 b3f61791 2004-03-21 devnull memset(tab.t10, INVAL, sizeof(tab.t10));
33 b3f61791 2004-03-21 devnull
34 b3f61791 2004-03-21 devnull for(p = set64; *p; p++)
35 b3f61791 2004-03-21 devnull tab.t64[(uchar)*p] = p-set64;
36 b3f61791 2004-03-21 devnull for(p = set32; *p; p++)
37 b3f61791 2004-03-21 devnull tab.t32[(uchar)*p] = p-set32;
38 b3f61791 2004-03-21 devnull for(p = set16; *p; p++)
39 b3f61791 2004-03-21 devnull tab.t16[(uchar)*p] = (p-set16)%16;
40 b3f61791 2004-03-21 devnull for(p = set10; *p; p++)
41 b3f61791 2004-03-21 devnull tab.t10[(uchar)*p] = (p-set10);
42 b3f61791 2004-03-21 devnull
43 b3f61791 2004-03-21 devnull tab.inited = 1;
44 b3f61791 2004-03-21 devnull }
45 b3f61791 2004-03-21 devnull
46 b3f61791 2004-03-21 devnull static char*
47 b3f61791 2004-03-21 devnull from16(char *a, mpint *b)
48 b3f61791 2004-03-21 devnull {
49 b3f61791 2004-03-21 devnull char *p, *next;
50 b3f61791 2004-03-21 devnull int i;
51 b3f61791 2004-03-21 devnull mpdigit x;
52 b3f61791 2004-03-21 devnull
53 b3f61791 2004-03-21 devnull b->top = 0;
54 b3f61791 2004-03-21 devnull for(p = a; *p; p++)
55 b3f61791 2004-03-21 devnull if(tab.t16[*(uchar*)p] == INVAL)
56 b3f61791 2004-03-21 devnull break;
57 b3f61791 2004-03-21 devnull mpbits(b, (p-a)*4);
58 b3f61791 2004-03-21 devnull b->top = 0;
59 b3f61791 2004-03-21 devnull next = p;
60 b3f61791 2004-03-21 devnull while(p > a){
61 b3f61791 2004-03-21 devnull x = 0;
62 b3f61791 2004-03-21 devnull for(i = 0; i < Dbits; i += 4){
63 b3f61791 2004-03-21 devnull if(p <= a)
64 b3f61791 2004-03-21 devnull break;
65 b3f61791 2004-03-21 devnull x |= tab.t16[*(uchar*)--p]<<i;
66 b3f61791 2004-03-21 devnull }
67 b3f61791 2004-03-21 devnull b->p[b->top++] = x;
68 b3f61791 2004-03-21 devnull }
69 b3f61791 2004-03-21 devnull return next;
70 b3f61791 2004-03-21 devnull }
71 b3f61791 2004-03-21 devnull
72 b3f61791 2004-03-21 devnull static ulong mppow10[] = {
73 b3f61791 2004-03-21 devnull 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000
74 b3f61791 2004-03-21 devnull };
75 b3f61791 2004-03-21 devnull
76 b3f61791 2004-03-21 devnull static char*
77 b3f61791 2004-03-21 devnull from10(char *a, mpint *b)
78 b3f61791 2004-03-21 devnull {
79 b3f61791 2004-03-21 devnull ulong x, y;
80 b3f61791 2004-03-21 devnull mpint *pow, *r;
81 b3f61791 2004-03-21 devnull int i;
82 b3f61791 2004-03-21 devnull
83 b3f61791 2004-03-21 devnull pow = mpnew(0);
84 b3f61791 2004-03-21 devnull r = mpnew(0);
85 b3f61791 2004-03-21 devnull
86 b3f61791 2004-03-21 devnull b->top = 0;
87 b3f61791 2004-03-21 devnull for(;;){
88 b3f61791 2004-03-21 devnull // do a billion at a time in native arithmetic
89 b3f61791 2004-03-21 devnull x = 0;
90 b3f61791 2004-03-21 devnull for(i = 0; i < 9; i++){
91 b3f61791 2004-03-21 devnull y = tab.t10[*(uchar*)a];
92 b3f61791 2004-03-21 devnull if(y == INVAL)
93 b3f61791 2004-03-21 devnull break;
94 b3f61791 2004-03-21 devnull a++;
95 b3f61791 2004-03-21 devnull x *= 10;
96 b3f61791 2004-03-21 devnull x += y;
97 b3f61791 2004-03-21 devnull }
98 b3f61791 2004-03-21 devnull if(i == 0)
99 b3f61791 2004-03-21 devnull break;
100 b3f61791 2004-03-21 devnull
101 b3f61791 2004-03-21 devnull // accumulate into mpint
102 b3f61791 2004-03-21 devnull uitomp(mppow10[i], pow);
103 b3f61791 2004-03-21 devnull uitomp(x, r);
104 b3f61791 2004-03-21 devnull mpmul(b, pow, b);
105 b3f61791 2004-03-21 devnull mpadd(b, r, b);
106 b3f61791 2004-03-21 devnull if(i != 9)
107 b3f61791 2004-03-21 devnull break;
108 b3f61791 2004-03-21 devnull }
109 b3f61791 2004-03-21 devnull mpfree(pow);
110 b3f61791 2004-03-21 devnull mpfree(r);
111 b3f61791 2004-03-21 devnull return a;
112 b3f61791 2004-03-21 devnull }
113 b3f61791 2004-03-21 devnull
114 b3f61791 2004-03-21 devnull static char*
115 b3f61791 2004-03-21 devnull from64(char *a, mpint *b)
116 b3f61791 2004-03-21 devnull {
117 b3f61791 2004-03-21 devnull char *buf = a;
118 b3f61791 2004-03-21 devnull uchar *p;
119 b3f61791 2004-03-21 devnull int n, m;
120 b3f61791 2004-03-21 devnull
121 b3f61791 2004-03-21 devnull for(; tab.t64[*(uchar*)a] != INVAL; a++)
122 b3f61791 2004-03-21 devnull ;
123 b3f61791 2004-03-21 devnull n = a-buf;
124 b3f61791 2004-03-21 devnull mpbits(b, n*6);
125 b3f61791 2004-03-21 devnull p = malloc(n);
126 b3f61791 2004-03-21 devnull if(p == nil)
127 b3f61791 2004-03-21 devnull return a;
128 b3f61791 2004-03-21 devnull m = dec64(p, n, buf, n);
129 b3f61791 2004-03-21 devnull betomp(p, m, b);
130 b3f61791 2004-03-21 devnull free(p);
131 b3f61791 2004-03-21 devnull return a;
132 b3f61791 2004-03-21 devnull }
133 b3f61791 2004-03-21 devnull
134 b3f61791 2004-03-21 devnull static char*
135 b3f61791 2004-03-21 devnull from32(char *a, mpint *b)
136 b3f61791 2004-03-21 devnull {
137 b3f61791 2004-03-21 devnull char *buf = a;
138 b3f61791 2004-03-21 devnull uchar *p;
139 b3f61791 2004-03-21 devnull int n, m;
140 b3f61791 2004-03-21 devnull
141 b3f61791 2004-03-21 devnull for(; tab.t64[*(uchar*)a] != INVAL; a++)
142 b3f61791 2004-03-21 devnull ;
143 b3f61791 2004-03-21 devnull n = a-buf;
144 b3f61791 2004-03-21 devnull mpbits(b, n*5);
145 b3f61791 2004-03-21 devnull p = malloc(n);
146 b3f61791 2004-03-21 devnull if(p == nil)
147 b3f61791 2004-03-21 devnull return a;
148 b3f61791 2004-03-21 devnull m = dec32(p, n, buf, n);
149 b3f61791 2004-03-21 devnull betomp(p, m, b);
150 b3f61791 2004-03-21 devnull free(p);
151 b3f61791 2004-03-21 devnull return a;
152 b3f61791 2004-03-21 devnull }
153 b3f61791 2004-03-21 devnull
154 b3f61791 2004-03-21 devnull mpint*
155 b3f61791 2004-03-21 devnull strtomp(char *a, char **pp, int base, mpint *b)
156 b3f61791 2004-03-21 devnull {
157 b3f61791 2004-03-21 devnull int sign;
158 b3f61791 2004-03-21 devnull char *e;
159 b3f61791 2004-03-21 devnull
160 b3f61791 2004-03-21 devnull if(b == nil)
161 b3f61791 2004-03-21 devnull b = mpnew(0);
162 b3f61791 2004-03-21 devnull
163 b3f61791 2004-03-21 devnull if(tab.inited == 0)
164 b3f61791 2004-03-21 devnull init();
165 b3f61791 2004-03-21 devnull
166 b3f61791 2004-03-21 devnull while(*a==' ' || *a=='\t')
167 b3f61791 2004-03-21 devnull a++;
168 b3f61791 2004-03-21 devnull
169 b3f61791 2004-03-21 devnull sign = 1;
170 b3f61791 2004-03-21 devnull for(;; a++){
171 b3f61791 2004-03-21 devnull switch(*a){
172 b3f61791 2004-03-21 devnull case '-':
173 b3f61791 2004-03-21 devnull sign *= -1;
174 b3f61791 2004-03-21 devnull continue;
175 b3f61791 2004-03-21 devnull }
176 b3f61791 2004-03-21 devnull break;
177 b3f61791 2004-03-21 devnull }
178 b3f61791 2004-03-21 devnull
179 b3f61791 2004-03-21 devnull switch(base){
180 b3f61791 2004-03-21 devnull case 10:
181 b3f61791 2004-03-21 devnull e = from10(a, b);
182 b3f61791 2004-03-21 devnull break;
183 b3f61791 2004-03-21 devnull default:
184 b3f61791 2004-03-21 devnull case 16:
185 b3f61791 2004-03-21 devnull e = from16(a, b);
186 b3f61791 2004-03-21 devnull break;
187 b3f61791 2004-03-21 devnull case 32:
188 b3f61791 2004-03-21 devnull e = from32(a, b);
189 b3f61791 2004-03-21 devnull break;
190 b3f61791 2004-03-21 devnull case 64:
191 b3f61791 2004-03-21 devnull e = from64(a, b);
192 b3f61791 2004-03-21 devnull break;
193 b3f61791 2004-03-21 devnull }
194 b3f61791 2004-03-21 devnull
195 b3f61791 2004-03-21 devnull // if no characters parsed, there wasn't a number to convert
196 b3f61791 2004-03-21 devnull if(e == a)
197 b3f61791 2004-03-21 devnull return nil;
198 b3f61791 2004-03-21 devnull
199 b3f61791 2004-03-21 devnull mpnorm(b);
200 b3f61791 2004-03-21 devnull b->sign = sign;
201 b3f61791 2004-03-21 devnull if(pp != nil)
202 b3f61791 2004-03-21 devnull *pp = e;
203 b3f61791 2004-03-21 devnull
204 b3f61791 2004-03-21 devnull return b;
205 b3f61791 2004-03-21 devnull }