Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_fixcpp/sys/src/ape/lib/ap/stdio/_fconv.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Common routines for _dtoa and strtod */
2
 
3
#include "fconv.h"
4
 
5
#ifdef DEBUG
6
#include <stdio.h>
7
#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
8
#endif
9
 
10
 double
11
_tens[] = {
12
		1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
13
		1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
14
		1e20, 1e21, 1e22
15
#ifdef VAX
16
		, 1e23, 1e24
17
#endif
18
		};
19
 
20
 
21
#ifdef IEEE_Arith
22
double _bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
23
double _tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
24
#else
25
#ifdef IBM
26
double _bigtens[] = { 1e16, 1e32, 1e64 };
27
double _tinytens[] = { 1e-16, 1e-32, 1e-64 };
28
#else
29
double _bigtens[] = { 1e16, 1e32 };
30
double _tinytens[] = { 1e-16, 1e-32 };
31
#endif
32
#endif
33
 
34
 static Bigint *freelist[Kmax+1];
35
 
36
 Bigint *
37
_Balloc(int k)
38
{
39
	int x;
40
	Bigint *rv;
41
 
42
	if (rv = freelist[k]) {
43
		freelist[k] = rv->next;
44
		}
45
	else {
46
		x = 1 << k;
47
		rv = (Bigint *)malloc(sizeof(Bigint) + (x-1)*sizeof(long));
48
		rv->k = k;
49
		rv->maxwds = x;
50
		}
51
	rv->sign = rv->wds = 0;
52
	return rv;
53
	}
54
 
55
 void
56
_Bfree(Bigint *v)
57
{
58
	if (v) {
59
		v->next = freelist[v->k];
60
		freelist[v->k] = v;
61
		}
62
	}
63
 
64
 
65
 Bigint *
66
_multadd(Bigint *b, int m, int a)	/* multiply by m and add a */
67
{
68
	int i, wds;
69
	unsigned long *x, y;
70
#ifdef Pack_32
71
	unsigned long xi, z;
72
#endif
73
	Bigint *b1;
74
 
75
	wds = b->wds;
76
	x = b->x;
77
	i = 0;
78
	do {
79
#ifdef Pack_32
80
		xi = *x;
81
		y = (xi & 0xffff) * m + a;
82
		z = (xi >> 16) * m + (y >> 16);
83
		a = (int)(z >> 16);
84
		*x++ = (z << 16) + (y & 0xffff);
85
#else
86
		y = *x * m + a;
87
		a = (int)(y >> 16);
88
		*x++ = y & 0xffff;
89
#endif
90
		}
91
		while(++i < wds);
92
	if (a) {
93
		if (wds >= b->maxwds) {
94
			b1 = Balloc(b->k+1);
95
			Bcopy(b1, b);
96
			Bfree(b);
97
			b = b1;
98
			}
99
		b->x[wds++] = a;
100
		b->wds = wds;
101
		}
102
	return b;
103
	}
104
 
105
 int
106
_hi0bits(register unsigned long x)
107
{
108
	register int k = 0;
109
 
110
	if (!(x & 0xffff0000)) {
111
		k = 16;
112
		x <<= 16;
113
		}
114
	if (!(x & 0xff000000)) {
115
		k += 8;
116
		x <<= 8;
117
		}
118
	if (!(x & 0xf0000000)) {
119
		k += 4;
120
		x <<= 4;
121
		}
122
	if (!(x & 0xc0000000)) {
123
		k += 2;
124
		x <<= 2;
125
		}
126
	if (!(x & 0x80000000)) {
127
		k++;
128
		if (!(x & 0x40000000))
129
			return 32;
130
		}
131
	return k;
132
	}
133
 
134
 static int
135
lo0bits(unsigned long *y)
136
{
137
	register int k;
138
	register unsigned long x = *y;
139
 
140
	if (x & 7) {
141
		if (x & 1)
142
			return 0;
143
		if (x & 2) {
144
			*y = x >> 1;
145
			return 1;
146
			}
147
		*y = x >> 2;
148
		return 2;
149
		}
150
	k = 0;
151
	if (!(x & 0xffff)) {
152
		k = 16;
153
		x >>= 16;
154
		}
155
	if (!(x & 0xff)) {
156
		k += 8;
157
		x >>= 8;
158
		}
159
	if (!(x & 0xf)) {
160
		k += 4;
161
		x >>= 4;
162
		}
163
	if (!(x & 0x3)) {
164
		k += 2;
165
		x >>= 2;
166
		}
167
	if (!(x & 1)) {
168
		k++;
169
		x >>= 1;
170
		if (!x & 1)
171
			return 32;
172
		}
173
	*y = x;
174
	return k;
175
	}
176
 
177
 Bigint *
178
_i2b(int i)
179
{
180
	Bigint *b;
181
 
182
	b = Balloc(1);
183
	b->x[0] = i;
184
	b->wds = 1;
185
	return b;
186
	}
187
 
188
 Bigint *
189
_mult(Bigint *a, Bigint *b)
190
{
191
	Bigint *c;
192
	int k, wa, wb, wc;
193
	unsigned long carry, y, z;
194
	unsigned long *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
195
#ifdef Pack_32
196
	unsigned long z2;
197
#endif
198
 
199
	if (a->wds < b->wds) {
200
		c = a;
201
		a = b;
202
		b = c;
203
		}
204
	k = a->k;
205
	wa = a->wds;
206
	wb = b->wds;
207
	wc = wa + wb;
208
	if (wc > a->maxwds)
209
		k++;
210
	c = Balloc(k);
211
	for(x = c->x, xa = x + wc; x < xa; x++)
212
		*x = 0;
213
	xa = a->x;
214
	xae = xa + wa;
215
	xb = b->x;
216
	xbe = xb + wb;
217
	xc0 = c->x;
218
#ifdef Pack_32
219
	for(; xb < xbe; xb++, xc0++) {
220
		if (y = *xb & 0xffff) {
221
			x = xa;
222
			xc = xc0;
223
			carry = 0;
224
			do {
225
				z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
226
				carry = z >> 16;
227
				z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
228
				carry = z2 >> 16;
229
				Storeinc(xc, z2, z);
230
				}
231
				while(x < xae);
232
			*xc = carry;
233
			}
234
		if (y = *xb >> 16) {
235
			x = xa;
236
			xc = xc0;
237
			carry = 0;
238
			z2 = *xc;
239
			do {
240
				z = (*x & 0xffff) * y + (*xc >> 16) + carry;
241
				carry = z >> 16;
242
				Storeinc(xc, z, z2);
243
				z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
244
				carry = z2 >> 16;
245
				}
246
				while(x < xae);
247
			*xc = z2;
248
			}
249
		}
250
#else
251
	for(; xb < xbe; xc0++) {
252
		if (y = *xb++) {
253
			x = xa;
254
			xc = xc0;
255
			carry = 0;
256
			do {
257
				z = *x++ * y + *xc + carry;
258
				carry = z >> 16;
259
				*xc++ = z & 0xffff;
260
				}
261
				while(x < xae);
262
			*xc = carry;
263
			}
264
		}
265
#endif
266
	for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
267
	c->wds = wc;
268
	return c;
269
	}
270
 
271
 static Bigint *p5s;
272
 
273
 Bigint *
274
_pow5mult(Bigint *b, int k)
275
{
276
	Bigint *b1, *p5, *p51;
277
	int i;
278
	static int p05[3] = { 5, 25, 125 };
279
 
280
	if (i = k & 3)
281
		b = multadd(b, p05[i-1], 0);
282
 
283
	if (!(k >>= 2))
284
		return b;
285
	if (!(p5 = p5s)) {
286
		/* first time */
287
		p5 = p5s = i2b(625);
288
		p5->next = 0;
289
		}
290
	for(;;) {
291
		if (k & 1) {
292
			b1 = mult(b, p5);
293
			Bfree(b);
294
			b = b1;
295
			}
296
		if (!(k >>= 1))
297
			break;
298
		if (!(p51 = p5->next)) {
299
			p51 = p5->next = mult(p5,p5);
300
			p51->next = 0;
301
			}
302
		p5 = p51;
303
		}
304
	return b;
305
	}
306
 
307
 Bigint *
308
_lshift(Bigint *b, int k)
309
{
310
	int i, k1, n, n1;
311
	Bigint *b1;
312
	unsigned long *x, *x1, *xe, z;
313
 
314
#ifdef Pack_32
315
	n = k >> 5;
316
#else
317
	n = k >> 4;
318
#endif
319
	k1 = b->k;
320
	n1 = n + b->wds + 1;
321
	for(i = b->maxwds; n1 > i; i <<= 1)
322
		k1++;
323
	b1 = Balloc(k1);
324
	x1 = b1->x;
325
	for(i = 0; i < n; i++)
326
		*x1++ = 0;
327
	x = b->x;
328
	xe = x + b->wds;
329
#ifdef Pack_32
330
	if (k &= 0x1f) {
331
		k1 = 32 - k;
332
		z = 0;
333
		do {
334
			*x1++ = *x << k | z;
335
			z = *x++ >> k1;
336
			}
337
			while(x < xe);
338
		if (*x1 = z)
339
			++n1;
340
		}
341
#else
342
	if (k &= 0xf) {
343
		k1 = 16 - k;
344
		z = 0;
345
		do {
346
			*x1++ = *x << k  & 0xffff | z;
347
			z = *x++ >> k1;
348
			}
349
			while(x < xe);
350
		if (*x1 = z)
351
			++n1;
352
		}
353
#endif
354
	else do
355
		*x1++ = *x++;
356
		while(x < xe);
357
	b1->wds = n1 - 1;
358
	Bfree(b);
359
	return b1;
360
	}
361
 
362
 int
363
_cmp(Bigint *a, Bigint *b)
364
{
365
	unsigned long *xa, *xa0, *xb, *xb0;
366
	int i, j;
367
 
368
	i = a->wds;
369
	j = b->wds;
370
#ifdef DEBUG
371
	if (i > 1 && !a->x[i-1])
372
		Bug("cmp called with a->x[a->wds-1] == 0");
373
	if (j > 1 && !b->x[j-1])
374
		Bug("cmp called with b->x[b->wds-1] == 0");
375
#endif
376
	if (i -= j)
377
		return i;
378
	xa0 = a->x;
379
	xa = xa0 + j;
380
	xb0 = b->x;
381
	xb = xb0 + j;
382
	for(;;) {
383
		if (*--xa != *--xb)
384
			return *xa < *xb ? -1 : 1;
385
		if (xa <= xa0)
386
			break;
387
		}
388
	return 0;
389
	}
390
 
391
 Bigint *
392
_diff(Bigint *a, Bigint *b)
393
{
394
	Bigint *c;
395
	int i, wa, wb;
396
	long borrow, y;	/* We need signed shifts here. */
397
	unsigned long *xa, *xae, *xb, *xbe, *xc;
398
#ifdef Pack_32
399
	long z;
400
#endif
401
 
402
	i = cmp(a,b);
403
	if (!i) {
404
		c = Balloc(0);
405
		c->wds = 1;
406
		c->x[0] = 0;
407
		return c;
408
		}
409
	if (i < 0) {
410
		c = a;
411
		a = b;
412
		b = c;
413
		i = 1;
414
		}
415
	else
416
		i = 0;
417
	c = Balloc(a->k);
418
	c->sign = i;
419
	wa = a->wds;
420
	xa = a->x;
421
	xae = xa + wa;
422
	wb = b->wds;
423
	xb = b->x;
424
	xbe = xb + wb;
425
	xc = c->x;
426
	borrow = 0;
427
#ifdef Pack_32
428
	do {
429
		y = (*xa & 0xffff) - (*xb & 0xffff) + borrow;
430
		borrow = y >> 16;
431
		Sign_Extend(borrow, y);
432
		z = (*xa++ >> 16) - (*xb++ >> 16) + borrow;
433
		borrow = z >> 16;
434
		Sign_Extend(borrow, z);
435
		Storeinc(xc, z, y);
436
		}
437
		while(xb < xbe);
438
	while(xa < xae) {
439
		y = (*xa & 0xffff) + borrow;
440
		borrow = y >> 16;
441
		Sign_Extend(borrow, y);
442
		z = (*xa++ >> 16) + borrow;
443
		borrow = z >> 16;
444
		Sign_Extend(borrow, z);
445
		Storeinc(xc, z, y);
446
		}
447
#else
448
	do {
449
		y = *xa++ - *xb++ + borrow;
450
		borrow = y >> 16;
451
		Sign_Extend(borrow, y);
452
		*xc++ = y & 0xffff;
453
		}
454
		while(xb < xbe);
455
	while(xa < xae) {
456
		y = *xa++ + borrow;
457
		borrow = y >> 16;
458
		Sign_Extend(borrow, y);
459
		*xc++ = y & 0xffff;
460
		}
461
#endif
462
	while(!*--xc)
463
		wa--;
464
	c->wds = wa;
465
	return c;
466
	}
467
 
468
 Bigint *
469
_d2b(double darg, int *e, int *bits)
470
{
471
	Bigint *b;
472
	int de, i, k;
473
	unsigned long *x, y, z;
474
	Dul d;
475
#ifdef VAX
476
	unsigned long d0, d1;
477
	d.d = darg;
478
	d0 = word0(d) >> 16 | word0(d) << 16;
479
	d1 = word1(d) >> 16 | word1(d) << 16;
480
#else
481
	d.d = darg;
482
#define d0 word0(d)
483
#define d1 word1(d)
484
#endif
485
 
486
#ifdef Pack_32
487
	b = Balloc(1);
488
#else
489
	b = Balloc(2);
490
#endif
491
	x = b->x;
492
 
493
	z = d0 & Frac_mask;
494
	d0 &= 0x7fffffff;	/* clear sign bit, which we ignore */
495
#ifdef Sudden_Underflow
496
	de = (int)(d0 >> Exp_shift);
497
#ifndef IBM
498
	z |= Exp_msk11;
499
#endif
500
#else
501
	if (de = (int)(d0 >> Exp_shift))
502
		z |= Exp_msk1;
503
#endif
504
#ifdef Pack_32
505
	if (y = d1) {
506
		if (k = lo0bits(&y)) {
507
			x[0] = y | z << 32 - k;
508
			z >>= k;
509
			}
510
		else
511
			x[0] = y;
512
		i = b->wds = (x[1] = z) ? 2 : 1;
513
		}
514
	else {
515
#ifdef DEBUG
516
		if (!z)
517
			Bug("Zero passed to d2b");
518
#endif
519
		k = lo0bits(&z);
520
		x[0] = z;
521
		i = b->wds = 1;
522
		k += 32;
523
		}
524
#else
525
	if (y = d1) {
526
		if (k = lo0bits(&y))
527
			if (k >= 16) {
528
				x[0] = y | z << 32 - k & 0xffff;
529
				x[1] = z >> k - 16 & 0xffff;
530
				x[2] = z >> k;
531
				i = 2;
532
				}
533
			else {
534
				x[0] = y & 0xffff;
535
				x[1] = y >> 16 | z << 16 - k & 0xffff;
536
				x[2] = z >> k & 0xffff;
537
				x[3] = z >> k+16;
538
				i = 3;
539
				}
540
		else {
541
			x[0] = y & 0xffff;
542
			x[1] = y >> 16;
543
			x[2] = z & 0xffff;
544
			x[3] = z >> 16;
545
			i = 3;
546
			}
547
		}
548
	else {
549
#ifdef DEBUG
550
		if (!z)
551
			Bug("Zero passed to d2b");
552
#endif
553
		k = lo0bits(&z);
554
		if (k >= 16) {
555
			x[0] = z;
556
			i = 0;
557
			}
558
		else {
559
			x[0] = z & 0xffff;
560
			x[1] = z >> 16;
561
			i = 1;
562
			}
563
		k += 32;
564
		}
565
	while(!x[i])
566
		--i;
567
	b->wds = i + 1;
568
#endif
569
#ifndef Sudden_Underflow
570
	if (de) {
571
#endif
572
#ifdef IBM
573
		*e = (de - Bias - (P-1) << 2) + k;
574
		*bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
575
#else
576
		*e = de - Bias - (P-1) + k;
577
		*bits = P - k;
578
#endif
579
#ifndef Sudden_Underflow
580
		}
581
	else {
582
		*e = de - Bias - (P-1) + 1 + k;
583
#ifdef Pack_32
584
		*bits = 32*i - hi0bits(x[i-1]);
585
#else
586
		*bits = (i+2)*16 - hi0bits(x[i]);
587
#endif
588
		}
589
#endif
590
	return b;
591
	}
592
#undef d0
593
#undef d1