Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/gdtoa/gdtoa.c
39475 views
1
/****************************************************************
2
3
The author of this software is David M. Gay.
4
5
Copyright (C) 1998, 1999 by Lucent Technologies
6
All Rights Reserved
7
8
Permission to use, copy, modify, and distribute this software and
9
its documentation for any purpose and without fee is hereby
10
granted, provided that the above copyright notice appear in all
11
copies and that both that the copyright notice and this
12
permission notice and warranty disclaimer appear in supporting
13
documentation, and that the name of Lucent or any of its entities
14
not be used in advertising or publicity pertaining to
15
distribution of the software without specific, written prior
16
permission.
17
18
LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
19
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
20
IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
21
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
23
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
25
THIS SOFTWARE.
26
27
****************************************************************/
28
29
/* Please send bug reports to David M. Gay (dmg at acm dot org,
30
* with " at " changed at "@" and " dot " changed to "."). */
31
32
#include "gdtoaimp.h"
33
34
static Bigint *
35
#ifdef KR_headers
36
bitstob(bits, nbits, bbits) ULong *bits; int nbits; int *bbits;
37
#else
38
bitstob(ULong *bits, int nbits, int *bbits)
39
#endif
40
{
41
int i, k;
42
Bigint *b;
43
ULong *be, *x, *x0;
44
45
i = ULbits;
46
k = 0;
47
while(i < nbits) {
48
i <<= 1;
49
k++;
50
}
51
#ifndef Pack_32
52
if (!k)
53
k = 1;
54
#endif
55
b = Balloc(k);
56
be = bits + ((nbits - 1) >> kshift);
57
x = x0 = b->x;
58
do {
59
*x++ = *bits & ALL_ON;
60
#ifdef Pack_16
61
*x++ = (*bits >> 16) & ALL_ON;
62
#endif
63
} while(++bits <= be);
64
i = x - x0;
65
while(!x0[--i])
66
if (!i) {
67
b->wds = 0;
68
*bbits = 0;
69
goto ret;
70
}
71
b->wds = i + 1;
72
*bbits = i*ULbits + 32 - hi0bits(b->x[i]);
73
ret:
74
return b;
75
}
76
77
/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
78
*
79
* Inspired by "How to Print Floating-Point Numbers Accurately" by
80
* Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
81
*
82
* Modifications:
83
* 1. Rather than iterating, we use a simple numeric overestimate
84
* to determine k = floor(log10(d)). We scale relevant
85
* quantities using O(log2(k)) rather than O(k) multiplications.
86
* 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
87
* try to generate digits strictly left to right. Instead, we
88
* compute with fewer bits and propagate the carry if necessary
89
* when rounding the final digit up. This is often faster.
90
* 3. Under the assumption that input will be rounded nearest,
91
* mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
92
* That is, we allow equality in stopping tests when the
93
* round-nearest rule will give the same floating-point value
94
* as would satisfaction of the stopping test with strict
95
* inequality.
96
* 4. We remove common factors of powers of 2 from relevant
97
* quantities.
98
* 5. When converting floating-point integers less than 1e16,
99
* we use floating-point arithmetic rather than resorting
100
* to multiple-precision integers.
101
* 6. When asked to produce fewer than 15 digits, we first try
102
* to get by with floating-point arithmetic; we resort to
103
* multiple-precision integer arithmetic only if we cannot
104
* guarantee that the floating-point calculation has given
105
* the correctly rounded result. For k requested digits and
106
* "uniformly" distributed input, the probability is
107
* something like 10^(k-15) that we must resort to the Long
108
* calculation.
109
*/
110
111
char *
112
gdtoa
113
#ifdef KR_headers
114
(fpi, be, bits, kindp, mode, ndigits, decpt, rve)
115
FPI *fpi; int be; ULong *bits;
116
int *kindp, mode, ndigits, *decpt; char **rve;
117
#else
118
(FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits, int *decpt, char **rve)
119
#endif
120
{
121
/* Arguments ndigits and decpt are similar to the second and third
122
arguments of ecvt and fcvt; trailing zeros are suppressed from
123
the returned string. If not null, *rve is set to point
124
to the end of the return value. If d is +-Infinity or NaN,
125
then *decpt is set to 9999.
126
be = exponent: value = (integer represented by bits) * (2 to the power of be).
127
128
mode:
129
0 ==> shortest string that yields d when read in
130
and rounded to nearest.
131
1 ==> like 0, but with Steele & White stopping rule;
132
e.g. with IEEE P754 arithmetic , mode 0 gives
133
1e23 whereas mode 1 gives 9.999999999999999e22.
134
2 ==> max(1,ndigits) significant digits. This gives a
135
return value similar to that of ecvt, except
136
that trailing zeros are suppressed.
137
3 ==> through ndigits past the decimal point. This
138
gives a return value similar to that from fcvt,
139
except that trailing zeros are suppressed, and
140
ndigits can be negative.
141
4-9 should give the same return values as 2-3, i.e.,
142
4 <= mode <= 9 ==> same return as mode
143
2 + (mode & 1). These modes are mainly for
144
debugging; often they run slower but sometimes
145
faster than modes 2-3.
146
4,5,8,9 ==> left-to-right digit generation.
147
6-9 ==> don't try fast floating-point estimate
148
(if applicable).
149
150
Values of mode other than 0-9 are treated as mode 0.
151
152
Sufficient space is allocated to the return value
153
to hold the suppressed trailing zeros.
154
*/
155
156
int bbits, b2, b5, be0, dig, i, ieps, ilim, ilim0, ilim1, inex;
157
int j, j1, k, k0, k_check, kind, leftright, m2, m5, nbits;
158
int rdir, s2, s5, spec_case, try_quick;
159
Long L;
160
Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S;
161
double d2, ds;
162
char *s, *s0;
163
U d, eps;
164
165
#ifndef MULTIPLE_THREADS
166
if (dtoa_result) {
167
freedtoa(dtoa_result);
168
dtoa_result = 0;
169
}
170
#endif
171
inex = 0;
172
kind = *kindp &= ~STRTOG_Inexact;
173
switch(kind & STRTOG_Retmask) {
174
case STRTOG_Zero:
175
goto ret_zero;
176
case STRTOG_Normal:
177
case STRTOG_Denormal:
178
break;
179
case STRTOG_Infinite:
180
*decpt = -32768;
181
return nrv_alloc("Infinity", rve, 8);
182
case STRTOG_NaN:
183
*decpt = -32768;
184
return nrv_alloc("NaN", rve, 3);
185
default:
186
return 0;
187
}
188
b = bitstob(bits, nbits = fpi->nbits, &bbits);
189
be0 = be;
190
if ( (i = trailz(b)) !=0) {
191
rshift(b, i);
192
be += i;
193
bbits -= i;
194
}
195
if (!b->wds) {
196
Bfree(b);
197
ret_zero:
198
*decpt = 1;
199
return nrv_alloc("0", rve, 1);
200
}
201
202
dval(&d) = b2d(b, &i);
203
i = be + bbits - 1;
204
word0(&d) &= Frac_mask1;
205
word0(&d) |= Exp_11;
206
#ifdef IBM
207
if ( (j = 11 - hi0bits(word0(&d) & Frac_mask)) !=0)
208
dval(&d) /= 1 << j;
209
#endif
210
211
/* log(x) ~=~ log(1.5) + (x-1.5)/1.5
212
* log10(x) = log(x) / log(10)
213
* ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
214
* log10(&d) = (i-Bias)*log(2)/log(10) + log10(d2)
215
*
216
* This suggests computing an approximation k to log10(&d) by
217
*
218
* k = (i - Bias)*0.301029995663981
219
* + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
220
*
221
* We want k to be too large rather than too small.
222
* The error in the first-order Taylor series approximation
223
* is in our favor, so we just round up the constant enough
224
* to compensate for any error in the multiplication of
225
* (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
226
* and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
227
* adding 1e-13 to the constant term more than suffices.
228
* Hence we adjust the constant term to 0.1760912590558.
229
* (We could get a more accurate k by invoking log10,
230
* but this is probably not worthwhile.)
231
*/
232
#ifdef IBM
233
i <<= 2;
234
i += j;
235
#endif
236
ds = (dval(&d)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
237
238
/* correct assumption about exponent range */
239
if ((j = i) < 0)
240
j = -j;
241
if ((j -= 1077) > 0)
242
ds += j * 7e-17;
243
244
k = (int)ds;
245
if (ds < 0. && ds != k)
246
k--; /* want k = floor(ds) */
247
k_check = 1;
248
#ifdef IBM
249
j = be + bbits - 1;
250
if ( (j1 = j & 3) !=0)
251
dval(&d) *= 1 << j1;
252
word0(&d) += j << Exp_shift - 2 & Exp_mask;
253
#else
254
word0(&d) += (be + bbits - 1) << Exp_shift;
255
#endif
256
if (k >= 0 && k <= Ten_pmax) {
257
if (dval(&d) < tens[k])
258
k--;
259
k_check = 0;
260
}
261
j = bbits - i - 1;
262
if (j >= 0) {
263
b2 = 0;
264
s2 = j;
265
}
266
else {
267
b2 = -j;
268
s2 = 0;
269
}
270
if (k >= 0) {
271
b5 = 0;
272
s5 = k;
273
s2 += k;
274
}
275
else {
276
b2 -= k;
277
b5 = -k;
278
s5 = 0;
279
}
280
if (mode < 0 || mode > 9)
281
mode = 0;
282
try_quick = 1;
283
if (mode > 5) {
284
mode -= 4;
285
try_quick = 0;
286
}
287
else if (i >= -4 - Emin || i < Emin)
288
try_quick = 0;
289
leftright = 1;
290
ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */
291
/* silence erroneous "gcc -Wall" warning. */
292
switch(mode) {
293
case 0:
294
case 1:
295
i = (int)(nbits * .30103) + 3;
296
ndigits = 0;
297
break;
298
case 2:
299
leftright = 0;
300
/* no break */
301
case 4:
302
if (ndigits <= 0)
303
ndigits = 1;
304
ilim = ilim1 = i = ndigits;
305
break;
306
case 3:
307
leftright = 0;
308
/* no break */
309
case 5:
310
i = ndigits + k + 1;
311
ilim = i;
312
ilim1 = i - 1;
313
if (i <= 0)
314
i = 1;
315
}
316
s = s0 = rv_alloc(i);
317
318
if ( (rdir = fpi->rounding - 1) !=0) {
319
if (rdir < 0)
320
rdir = 2;
321
if (kind & STRTOG_Neg)
322
rdir = 3 - rdir;
323
}
324
325
/* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */
326
327
if (ilim >= 0 && ilim <= Quick_max && try_quick && !rdir
328
#ifndef IMPRECISE_INEXACT
329
&& k == 0
330
#endif
331
) {
332
333
/* Try to get by with floating-point arithmetic. */
334
335
i = 0;
336
d2 = dval(&d);
337
#ifdef IBM
338
if ( (j = 11 - hi0bits(word0(&d) & Frac_mask)) !=0)
339
dval(&d) /= 1 << j;
340
#endif
341
k0 = k;
342
ilim0 = ilim;
343
ieps = 2; /* conservative */
344
if (k > 0) {
345
ds = tens[k&0xf];
346
j = k >> 4;
347
if (j & Bletch) {
348
/* prevent overflows */
349
j &= Bletch - 1;
350
dval(&d) /= bigtens[n_bigtens-1];
351
ieps++;
352
}
353
for(; j; j >>= 1, i++)
354
if (j & 1) {
355
ieps++;
356
ds *= bigtens[i];
357
}
358
}
359
else {
360
ds = 1.;
361
if ( (j1 = -k) !=0) {
362
dval(&d) *= tens[j1 & 0xf];
363
for(j = j1 >> 4; j; j >>= 1, i++)
364
if (j & 1) {
365
ieps++;
366
dval(&d) *= bigtens[i];
367
}
368
}
369
}
370
if (k_check && dval(&d) < 1. && ilim > 0) {
371
if (ilim1 <= 0)
372
goto fast_failed;
373
ilim = ilim1;
374
k--;
375
dval(&d) *= 10.;
376
ieps++;
377
}
378
dval(&eps) = ieps*dval(&d) + 7.;
379
word0(&eps) -= (P-1)*Exp_msk1;
380
if (ilim == 0) {
381
S = mhi = 0;
382
dval(&d) -= 5.;
383
if (dval(&d) > dval(&eps))
384
goto one_digit;
385
if (dval(&d) < -dval(&eps))
386
goto no_digits;
387
goto fast_failed;
388
}
389
#ifndef No_leftright
390
if (leftright) {
391
/* Use Steele & White method of only
392
* generating digits needed.
393
*/
394
dval(&eps) = ds*0.5/tens[ilim-1] - dval(&eps);
395
for(i = 0;;) {
396
L = (Long)(dval(&d)/ds);
397
dval(&d) -= L*ds;
398
*s++ = '0' + (int)L;
399
if (dval(&d) < dval(&eps)) {
400
if (dval(&d))
401
inex = STRTOG_Inexlo;
402
goto ret1;
403
}
404
if (ds - dval(&d) < dval(&eps))
405
goto bump_up;
406
if (++i >= ilim)
407
break;
408
dval(&eps) *= 10.;
409
dval(&d) *= 10.;
410
}
411
}
412
else {
413
#endif
414
/* Generate ilim digits, then fix them up. */
415
dval(&eps) *= tens[ilim-1];
416
for(i = 1;; i++, dval(&d) *= 10.) {
417
if ( (L = (Long)(dval(&d)/ds)) !=0)
418
dval(&d) -= L*ds;
419
*s++ = '0' + (int)L;
420
if (i == ilim) {
421
ds *= 0.5;
422
if (dval(&d) > ds + dval(&eps))
423
goto bump_up;
424
else if (dval(&d) < ds - dval(&eps)) {
425
if (dval(&d))
426
inex = STRTOG_Inexlo;
427
goto clear_trailing0;
428
}
429
break;
430
}
431
}
432
#ifndef No_leftright
433
}
434
#endif
435
fast_failed:
436
s = s0;
437
dval(&d) = d2;
438
k = k0;
439
ilim = ilim0;
440
}
441
442
/* Do we have a "small" integer? */
443
444
if (be >= 0 && k <= Int_max) {
445
/* Yes. */
446
ds = tens[k];
447
if (ndigits < 0 && ilim <= 0) {
448
S = mhi = 0;
449
if (ilim < 0 || dval(&d) <= 5*ds)
450
goto no_digits;
451
goto one_digit;
452
}
453
for(i = 1;; i++, dval(&d) *= 10.) {
454
L = dval(&d) / ds;
455
dval(&d) -= L*ds;
456
#ifdef Check_FLT_ROUNDS
457
/* If FLT_ROUNDS == 2, L will usually be high by 1 */
458
if (dval(&d) < 0) {
459
L--;
460
dval(&d) += ds;
461
}
462
#endif
463
*s++ = '0' + (int)L;
464
if (dval(&d) == 0.)
465
break;
466
if (i == ilim) {
467
if (rdir) {
468
if (rdir == 1)
469
goto bump_up;
470
inex = STRTOG_Inexlo;
471
goto ret1;
472
}
473
dval(&d) += dval(&d);
474
#ifdef ROUND_BIASED
475
if (dval(&d) >= ds)
476
#else
477
if (dval(&d) > ds || (dval(&d) == ds && L & 1))
478
#endif
479
{
480
bump_up:
481
inex = STRTOG_Inexhi;
482
while(*--s == '9')
483
if (s == s0) {
484
k++;
485
*s = '0';
486
break;
487
}
488
++*s++;
489
}
490
else {
491
inex = STRTOG_Inexlo;
492
clear_trailing0:
493
while(*--s == '0'){}
494
++s;
495
}
496
break;
497
}
498
}
499
goto ret1;
500
}
501
502
m2 = b2;
503
m5 = b5;
504
mhi = mlo = 0;
505
if (leftright) {
506
i = nbits - bbits;
507
if (be - i++ < fpi->emin && mode != 3 && mode != 5) {
508
/* denormal */
509
i = be - fpi->emin + 1;
510
if (mode >= 2 && ilim > 0 && ilim < i)
511
goto small_ilim;
512
}
513
else if (mode >= 2) {
514
small_ilim:
515
j = ilim - 1;
516
if (m5 >= j)
517
m5 -= j;
518
else {
519
s5 += j -= m5;
520
b5 += j;
521
m5 = 0;
522
}
523
if ((i = ilim) < 0) {
524
m2 -= i;
525
i = 0;
526
}
527
}
528
b2 += i;
529
s2 += i;
530
mhi = i2b(1);
531
}
532
if (m2 > 0 && s2 > 0) {
533
i = m2 < s2 ? m2 : s2;
534
b2 -= i;
535
m2 -= i;
536
s2 -= i;
537
}
538
if (b5 > 0) {
539
if (leftright) {
540
if (m5 > 0) {
541
mhi = pow5mult(mhi, m5);
542
b1 = mult(mhi, b);
543
Bfree(b);
544
b = b1;
545
}
546
if ( (j = b5 - m5) !=0)
547
b = pow5mult(b, j);
548
}
549
else
550
b = pow5mult(b, b5);
551
}
552
S = i2b(1);
553
if (s5 > 0)
554
S = pow5mult(S, s5);
555
556
/* Check for special case that d is a normalized power of 2. */
557
558
spec_case = 0;
559
if (mode < 2) {
560
if (bbits == 1 && be0 > fpi->emin + 1) {
561
/* The special case */
562
b2++;
563
s2++;
564
spec_case = 1;
565
}
566
}
567
568
/* Arrange for convenient computation of quotients:
569
* shift left if necessary so divisor has 4 leading 0 bits.
570
*
571
* Perhaps we should just compute leading 28 bits of S once
572
* and for all and pass them and a shift to quorem, so it
573
* can do shifts and ors to compute the numerator for q.
574
*/
575
i = ((s5 ? hi0bits(S->x[S->wds-1]) : ULbits - 1) - s2 - 4) & kmask;
576
m2 += i;
577
if ((b2 += i) > 0)
578
b = lshift(b, b2);
579
if ((s2 += i) > 0)
580
S = lshift(S, s2);
581
if (k_check) {
582
if (cmp(b,S) < 0) {
583
k--;
584
b = multadd(b, 10, 0); /* we botched the k estimate */
585
if (leftright)
586
mhi = multadd(mhi, 10, 0);
587
ilim = ilim1;
588
}
589
}
590
if (ilim <= 0 && mode > 2) {
591
if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
592
/* no digits, fcvt style */
593
no_digits:
594
k = -1 - ndigits;
595
inex = STRTOG_Inexlo;
596
goto ret;
597
}
598
one_digit:
599
inex = STRTOG_Inexhi;
600
*s++ = '1';
601
k++;
602
goto ret;
603
}
604
if (leftright) {
605
if (m2 > 0)
606
mhi = lshift(mhi, m2);
607
608
/* Compute mlo -- check for special case
609
* that d is a normalized power of 2.
610
*/
611
612
mlo = mhi;
613
if (spec_case) {
614
mhi = Balloc(mhi->k);
615
Bcopy(mhi, mlo);
616
mhi = lshift(mhi, 1);
617
}
618
619
for(i = 1;;i++) {
620
dig = quorem(b,S) + '0';
621
/* Do we yet have the shortest decimal string
622
* that will round to d?
623
*/
624
j = cmp(b, mlo);
625
delta = diff(S, mhi);
626
j1 = delta->sign ? 1 : cmp(b, delta);
627
Bfree(delta);
628
#ifndef ROUND_BIASED
629
if (j1 == 0 && !mode && !(bits[0] & 1) && !rdir) {
630
if (dig == '9')
631
goto round_9_up;
632
if (j <= 0) {
633
if (b->wds > 1 || b->x[0])
634
inex = STRTOG_Inexlo;
635
}
636
else {
637
dig++;
638
inex = STRTOG_Inexhi;
639
}
640
*s++ = dig;
641
goto ret;
642
}
643
#endif
644
if (j < 0 || (j == 0 && !mode
645
#ifndef ROUND_BIASED
646
&& !(bits[0] & 1)
647
#endif
648
)) {
649
if (rdir && (b->wds > 1 || b->x[0])) {
650
if (rdir == 2) {
651
inex = STRTOG_Inexlo;
652
goto accept;
653
}
654
while (cmp(S,mhi) > 0) {
655
*s++ = dig;
656
mhi1 = multadd(mhi, 10, 0);
657
if (mlo == mhi)
658
mlo = mhi1;
659
mhi = mhi1;
660
b = multadd(b, 10, 0);
661
dig = quorem(b,S) + '0';
662
}
663
if (dig++ == '9')
664
goto round_9_up;
665
inex = STRTOG_Inexhi;
666
goto accept;
667
}
668
if (j1 > 0) {
669
b = lshift(b, 1);
670
j1 = cmp(b, S);
671
#ifdef ROUND_BIASED
672
if (j1 >= 0 /*)*/
673
#else
674
if ((j1 > 0 || (j1 == 0 && dig & 1))
675
#endif
676
&& dig++ == '9')
677
goto round_9_up;
678
inex = STRTOG_Inexhi;
679
}
680
if (b->wds > 1 || b->x[0])
681
inex = STRTOG_Inexlo;
682
accept:
683
*s++ = dig;
684
goto ret;
685
}
686
if (j1 > 0 && rdir != 2) {
687
if (dig == '9') { /* possible if i == 1 */
688
round_9_up:
689
*s++ = '9';
690
inex = STRTOG_Inexhi;
691
goto roundoff;
692
}
693
inex = STRTOG_Inexhi;
694
*s++ = dig + 1;
695
goto ret;
696
}
697
*s++ = dig;
698
if (i == ilim)
699
break;
700
b = multadd(b, 10, 0);
701
if (mlo == mhi)
702
mlo = mhi = multadd(mhi, 10, 0);
703
else {
704
mlo = multadd(mlo, 10, 0);
705
mhi = multadd(mhi, 10, 0);
706
}
707
}
708
}
709
else
710
for(i = 1;; i++) {
711
*s++ = dig = quorem(b,S) + '0';
712
if (i >= ilim)
713
break;
714
b = multadd(b, 10, 0);
715
}
716
717
/* Round off last digit */
718
719
if (rdir) {
720
if (rdir == 2 || (b->wds <= 1 && !b->x[0]))
721
goto chopzeros;
722
goto roundoff;
723
}
724
b = lshift(b, 1);
725
j = cmp(b, S);
726
#ifdef ROUND_BIASED
727
if (j >= 0)
728
#else
729
if (j > 0 || (j == 0 && dig & 1))
730
#endif
731
{
732
roundoff:
733
inex = STRTOG_Inexhi;
734
while(*--s == '9')
735
if (s == s0) {
736
k++;
737
*s++ = '1';
738
goto ret;
739
}
740
++*s++;
741
}
742
else {
743
chopzeros:
744
if (b->wds > 1 || b->x[0])
745
inex = STRTOG_Inexlo;
746
while(*--s == '0'){}
747
++s;
748
}
749
ret:
750
Bfree(S);
751
if (mhi) {
752
if (mlo && mlo != mhi)
753
Bfree(mlo);
754
Bfree(mhi);
755
}
756
ret1:
757
Bfree(b);
758
*s = 0;
759
*decpt = k + 1;
760
if (rve)
761
*rve = s;
762
*kindp |= inex;
763
return s0;
764
}
765
766