00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 #ifdef _SMALL_PRINTF
00107 #ifndef SMALL_SCANF
00108 #define SMALL_SCANF
00109 #endif
00110 #endif
00111
00112
00113 #include <_ansi.h>
00114 #include <reent.h>
00115 #include <string.h>
00116 #include "small_mprec.h"
00117
00118 double
00119 _DEFUN (_strtod_r, (ptr, s00, se),
00120 struct _reent *ptr _AND
00121 _CONST char *s00 _AND
00122 char **se)
00123 {
00124 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, e1, esign, i, j,
00125 k, nd, nd0, nf, nz, nz0, sign;
00126 long e;
00127 _CONST char *s, *s0, *s1;
00128 double aadj, aadj1, adj;
00129 long L;
00130 unsigned long z;
00131 __ULong y;
00132 union double_union rv, rv0;
00133
00134 _Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
00135
00136 #ifdef SMALL_SCANF
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 #define BUF_SIZE 32
00151 #define BUF_LSHIFT_SIZE 40
00152
00153 _Bigint tab_bb[BUF_LSHIFT_SIZE],tab_bb1[BUF_SIZE],tab_bd[BUF_SIZE],tab_bd0[BUF_SIZE],tab_bs[BUF_LSHIFT_SIZE], tab_delta[BUF_LSHIFT_SIZE];
00154 _Bigint tab_bblshift[BUF_LSHIFT_SIZE],tab_bslshift[BUF_LSHIFT_SIZE], tab_deltalshift[BUF_LSHIFT_SIZE],tab_bdlshift[BUF_LSHIFT_SIZE];
00155 #endif
00156
00157 sign = nz0 = nz = 0;
00158 rv.d = 0.;
00159 for (s = s00;; s++)
00160 switch (*s)
00161 {
00162 case '-':
00163 sign = 1;
00164
00165 case '+':
00166 if (*++s)
00167 goto break2;
00168
00169 case 0:
00170 s = s00;
00171 goto ret;
00172 case '\t':
00173 case '\n':
00174 case '\v':
00175 case '\f':
00176 case '\r':
00177 case ' ':
00178 continue;
00179 default:
00180 goto break2;
00181 }
00182 break2:
00183 if (*s == '0')
00184 {
00185 nz0 = 1;
00186 while (*++s == '0');
00187 if (!*s)
00188 goto ret;
00189 }
00190 s0 = s;
00191 y = z = 0;
00192 for (nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
00193 if (nd < 9)
00194 y = 10 * y + c - '0';
00195 else if (nd < 16)
00196 z = 10 * z + c - '0';
00197 nd0 = nd;
00198 if (c == '.')
00199 {
00200 c = *++s;
00201 if (!nd)
00202 {
00203 for (; c == '0'; c = *++s)
00204 nz++;
00205 if (c > '0' && c <= '9')
00206 {
00207 s0 = s;
00208 nf += nz;
00209 nz = 0;
00210 goto have_dig;
00211 }
00212 goto dig_done;
00213 }
00214 for (; c >= '0' && c <= '9'; c = *++s)
00215 {
00216 have_dig:
00217 nz++;
00218 if (c -= '0')
00219 {
00220 nf += nz;
00221 for (i = 1; i < nz; i++)
00222 if (nd++ < 9)
00223 y *= 10;
00224 else if (nd <= DBL_DIG + 1)
00225 z *= 10;
00226 if (nd++ < 9)
00227 y = 10 * y + c;
00228 else if (nd <= DBL_DIG + 1)
00229 z = 10 * z + c;
00230 nz = 0;
00231 }
00232 }
00233 }
00234 dig_done:
00235 e = 0;
00236 if (c == 'e' || c == 'E')
00237 {
00238 if (!nd && !nz && !nz0)
00239 {
00240 s = s00;
00241 goto ret;
00242 }
00243 s00 = s;
00244 esign = 0;
00245 switch (c = *++s)
00246 {
00247 case '-':
00248 esign = 1;
00249 case '+':
00250 c = *++s;
00251 }
00252 if (c >= '0' && c <= '9')
00253 {
00254 while (c == '0')
00255 c = *++s;
00256 if (c > '0' && c <= '9')
00257 {
00258 e = c - '0';
00259 s1 = s;
00260 while ((c = *++s) >= '0' && c <= '9')
00261 e = 10 * e + c - '0';
00262 if (s - s1 > 8)
00263
00264
00265
00266 e = 9999999L;
00267 if (esign)
00268 e = -e;
00269 }
00270 else
00271 e = 0;
00272 }
00273 else
00274 s = s00;
00275 }
00276 if (!nd)
00277 {
00278 if (!nz && !nz0)
00279 s = s00;
00280 goto ret;
00281 }
00282 e1 = e -= nf;
00283
00284
00285
00286
00287
00288
00289 if (!nd0)
00290 nd0 = nd;
00291 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
00292 rv.d = y;
00293 if (k > 9)
00294 #ifndef SMALL_SCANF
00295 rv.d = tens[k - 9] * rv.d + z;
00296 #else
00297 rv.d = small_tens[k - 9] * rv.d + z;
00298 #endif
00299 bd0 = 0;
00300 if (nd <= DBL_DIG
00301 #ifndef RND_PRODQUOT
00302 && FLT_ROUNDS == 1
00303 #endif
00304 )
00305 {
00306 if (!e)
00307 goto ret;
00308 if (e > 0)
00309 {
00310 if (e <= Ten_pmax)
00311 {
00312 #ifdef VAX
00313 goto vax_ovfl_check;
00314 #else
00315 #ifndef SMALL_SCANF
00316 rounded_product (rv.d, tens[e]);
00317 #else
00318 rounded_product (rv.d, small_tens[e]);
00319 #endif
00320 goto ret;
00321 #endif
00322 }
00323 i = DBL_DIG - nd;
00324 if (e <= Ten_pmax + i)
00325 {
00326
00327
00328
00329 e -= i;
00330 #ifndef SMALL_SCANF
00331 rv.d *= tens[i];
00332 #else
00333 rv.d *= small_tens[i];
00334 #endif
00335 #ifdef VAX
00336
00337
00338
00339 vax_ovfl_check:
00340 word0 (rv) -= P * Exp_msk1;
00341 #ifndef SMALL_SCANF
00342 rounded_product (rv.d, tens[e]);
00343 #else
00344 rounded_product (rv.d, small_tens[e]);
00345 #endif
00346 if ((word0 (rv) & Exp_mask)
00347 > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P))
00348 goto ovfl;
00349 word0 (rv) += P * Exp_msk1;
00350 #else
00351 #ifndef SMALL_SCANF
00352 rounded_product (rv.d, tens[e]);
00353 #else
00354 rounded_product (rv.d, small_tens[e]);
00355 #endif
00356 #endif
00357 goto ret;
00358 }
00359 }
00360 #ifndef Inaccurate_Divide
00361 else if (e >= -Ten_pmax)
00362 {
00363 #ifndef SMALL_SCANF
00364 rounded_quotient (rv.d, tens[-e]);
00365 #else
00366 rounded_quotient (rv.d, small_tens[-e]);
00367 #endif
00368 goto ret;
00369 }
00370 #endif
00371 }
00372 e1 += nd - k;
00373
00374
00375
00376 if (e1 > 0)
00377 {
00378 if ((i = e1 & 15) != 0)
00379 #ifndef SMALL_SCANF
00380 rv.d *= tens[i];
00381 #else
00382 rv.d *= small_tens[i];
00383 #endif
00384 if (e1 &= ~15)
00385 {
00386 if (e1 > DBL_MAX_10_EXP)
00387 {
00388 ovfl:
00389 ptr->_errno = ERANGE;
00390 #ifdef _HAVE_STDC
00391 rv.d = HUGE_VAL;
00392 #else
00393
00394 #ifdef IEEE_Arith
00395 word0 (rv) = Exp_mask;
00396 #ifndef _DOUBLE_IS_32BITS
00397 word1 (rv) = 0;
00398 #endif
00399 #else
00400 word0 (rv) = Big0;
00401 #ifndef _DOUBLE_IS_32BITS
00402 word1 (rv) = Big1;
00403 #endif
00404 #endif
00405 #endif
00406 if (bd0)
00407 goto retfree;
00408 goto ret;
00409 }
00410 if (e1 >>= 4)
00411 {
00412 for (j = 0; e1 > 1; j++, e1 >>= 1)
00413 if (e1 & 1)
00414 #ifndef SMALL_SCANF
00415 rv.d *= bigtens[j];
00416 #else
00417 rv.d *= small_bigtens[j];
00418 #endif
00419
00420
00421 word0 (rv) -= P * Exp_msk1;
00422 #ifndef SMALL_SCANF
00423 rv.d *= bigtens[j];
00424 #else
00425 rv.d *= small_bigtens[j];
00426 #endif
00427
00428 if ((z = word0 (rv) & Exp_mask)
00429 > Exp_msk1 * (DBL_MAX_EXP + Bias - P))
00430 goto ovfl;
00431 if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P))
00432 {
00433
00434
00435 word0 (rv) = Big0;
00436 #ifndef _DOUBLE_IS_32BITS
00437 word1 (rv) = Big1;
00438 #endif
00439 }
00440 else
00441 word0 (rv) += P * Exp_msk1;
00442 }
00443
00444 }
00445 }
00446 else if (e1 < 0)
00447 {
00448 e1 = -e1;
00449 if ((i = e1 & 15) != 0)
00450 #ifndef SMALL_SCANF
00451 rv.d /= tens[i];
00452 #else
00453 rv.d /= small_tens[i];
00454 #endif
00455 if (e1 &= ~15)
00456 {
00457 e1 >>= 4;
00458 if (e1 >= 1 << n_bigtens)
00459 goto undfl;
00460 for (j = 0; e1 > 1; j++, e1 >>= 1)
00461 if (e1 & 1)
00462 #ifndef SMALL_SCANF
00463 rv.d *= tinytens[j];
00464
00465 rv0.d = rv.d;
00466 rv.d *=tinytens[j];
00467 #else
00468 rv.d *= small_tinytens[j];
00469
00470 rv0.d = rv.d;
00471 rv.d *= small_tinytens[j];
00472 #endif
00473 if (!rv.d)
00474 {
00475 rv.d = 2. * rv0.d;
00476 #ifndef SMALL_SCANF
00477 rv.d *= tinytens[j];
00478 #else
00479 rv.d *= small_tinytens[j];
00480 #endif
00481 if (!rv.d)
00482 {
00483 undfl:
00484 rv.d = 0.;
00485 ptr->_errno = ERANGE;
00486 if (bd0)
00487 goto retfree;
00488 goto ret;
00489 }
00490 #ifndef _DOUBLE_IS_32BITS
00491 word0 (rv) = Tiny0;
00492 word1 (rv) = Tiny1;
00493 #else
00494 word0 (rv) = Tiny1;
00495 #endif
00496
00497
00498
00499 }
00500 }
00501 }
00502
00503
00504
00505
00506 #ifndef SMALL_SCANF
00507 bd0 = s2b (ptr, s0, nd0, nd, y);
00508 #else
00509 bd0 = small_s2b(ptr,s0, nd0, nd, y, &tab_bd0[0]);
00510 #endif
00511
00512 for (;;)
00513 {
00514 #ifndef SMALL_SCANF
00515 bd = Balloc (ptr, bd0->_k);
00516 #else
00517 bd = &tab_bd[0];
00518 bd->_k = bd0->_k;
00519 bd->_maxwds = 1 << (bd0->_k);
00520 bd->_sign = bd->_wds =0;
00521
00522 #endif
00523 Bcopy (bd, bd0);
00524 #ifndef SMALL_SCANF
00525 bb = d2b (ptr, rv.d, &bbe, &bbbits);
00526 bs = i2b (ptr, 1);
00527 #else
00528 bb = small_d2b (ptr, rv.d, &bbe, &bbbits, &tab_bb[0]);
00529 bs = small_i2b (ptr, 1, &tab_bs[0]);
00530 #endif
00531 if (e >= 0)
00532 {
00533 bb2 = bb5 = 0;
00534 bd2 = bd5 = e;
00535 }
00536 else
00537 {
00538 bb2 = bb5 = -e;
00539 bd2 = bd5 = 0;
00540 }
00541 if (bbe >= 0)
00542 bb2 += bbe;
00543 else
00544 bd2 -= bbe;
00545 bs2 = bb2;
00546 #ifdef Sudden_Underflow
00547 #ifdef IBM
00548 j = 1 + 4 * P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
00549 #else
00550 j = P + 1 - bbbits;
00551 #endif
00552 #else
00553 i = bbe + bbbits - 1;
00554 if (i < Emin)
00555 j = bbe + (P - Emin);
00556 else
00557 j = P + 1 - bbbits;
00558 #endif
00559 bb2 += j;
00560 bd2 += j;
00561 i = bb2 < bd2 ? bb2 : bd2;
00562 if (i > bs2)
00563 i = bs2;
00564 if (i > 0)
00565 {
00566 bb2 -= i;
00567 bd2 -= i;
00568 bs2 -= i;
00569 }
00570 if (bb5 > 0)
00571 {
00572 #ifndef SMALL_SCANF
00573 bs = pow5mult (ptr, bs, bb5);
00574 bb1 = mult (ptr, bs, bb);
00575 Bfree (ptr, bb);
00576 bb = bb1;
00577 #else
00578 if (bs == &tab_bs[0]){
00579 bs = small_pow5mult (ptr, bs, bb5,&tab_bslshift[0]);
00580 }
00581 else{
00582 bs = small_pow5mult (ptr, bs, bb5,&tab_bs[0]);
00583 }
00584 bb1 = small_mult (ptr, bs, bb,&tab_bb1[0]);
00585 bb = bb1;
00586 #endif
00587
00588 }
00589
00590 #ifndef SMALL_SCANF
00591 if (bb2 > 0)
00592 bb = lshift (ptr, bb, bb2);
00593 if (bd5 > 0)
00594 bd = pow5mult (ptr, bd, bd5);
00595 if (bd2 > 0)
00596 bd = lshift (ptr, bd, bd2);
00597 if (bs2 > 0)
00598 bs = lshift (ptr, bs, bs2);
00599 delta = diff (ptr, bb, bd);
00600 dsign = delta->_sign;
00601 delta->_sign = 0;
00602 i = cmp (delta, bs);
00603 #else
00604 if (bb2 > 0){
00605 if (bb == &tab_bb[0] ){
00606 bb = small_lshift (ptr, bb, bb2,&tab_bblshift[0]);
00607 }
00608 else {
00609 bb = small_lshift (ptr, bb, bb2,&tab_bblshift[0]);
00610 }
00611 }
00612 if (bd5 > 0){
00613 if (bd == &tab_bd[0]){
00614 bd = small_pow5mult (ptr, bd, bd5, &tab_bdlshift[0]);
00615 }
00616 else{
00617 bd = small_pow5mult (ptr, bd, bd5, &tab_bd[0]);
00618 }
00619 }
00620 if (bd2 > 0){
00621 if (bd == &tab_bd[0] ){
00622 bd = small_lshift (ptr, bb, bd2,&tab_bdlshift[0]);
00623 }
00624 else {
00625 bd = small_lshift (ptr, bd, bd2,&tab_bd[0]);
00626 }
00627 }
00628 if (bs2 > 0){
00629 if ( bs == &tab_bs[0] ){
00630 bs = small_lshift (ptr, bs, bs2,&tab_bslshift[0]);
00631 }
00632 else{
00633 bs = small_lshift (ptr, bs, bs2,&tab_bs[0]);
00634 }
00635 }
00636
00637 delta = small_diff (ptr, bb, bd,&tab_delta[0]);
00638 dsign = delta->_sign;
00639 delta->_sign = 0;
00640 i = small_cmp (delta, bs);
00641
00642 #endif
00643 if (i < 0)
00644 {
00645
00646
00647
00648 if (dsign || word1 (rv) || word0 (rv) & Bndry_mask)
00649 break;
00650
00651 #ifndef SMALL_SCANF
00652 delta = lshift (ptr, delta, Log2P);
00653 if (cmp (delta, bs) > 0)
00654 goto drop_down;
00655 #else
00656 if (delta == &tab_delta[0]){
00657 delta = small_lshift (ptr, delta, Log2P,&tab_deltalshift[0]);
00658 }
00659 else{
00660 delta = small_lshift (ptr, delta, Log2P,&tab_delta[0]);
00661 }
00662 if (small_cmp (delta, bs) > 0)
00663 goto drop_down;
00664 #endif
00665 break;
00666 }
00667 if (i == 0)
00668 {
00669
00670 if (dsign)
00671 {
00672 if ((word0 (rv) & Bndry_mask1) == Bndry_mask1
00673 && word1 (rv) == 0xffffffff)
00674 {
00675
00676 word0 (rv) = (word0 (rv) & Exp_mask)
00677 + Exp_msk1
00678 #ifdef IBM
00679 | Exp_msk1 >> 4
00680 #endif
00681 ;
00682 #ifndef _DOUBLE_IS_32BITS
00683 word1 (rv) = 0;
00684 #endif
00685 break;
00686 }
00687 }
00688 else if (!(word0 (rv) & Bndry_mask) && !word1 (rv))
00689 {
00690 drop_down:
00691
00692 #ifdef Sudden_Underflow
00693 L = word0 (rv) & Exp_mask;
00694 #ifdef IBM
00695 if (L < Exp_msk1)
00696 #else
00697 if (L <= Exp_msk1)
00698 #endif
00699 goto undfl;
00700 L -= Exp_msk1;
00701 #else
00702 L = (word0 (rv) & Exp_mask) - Exp_msk1;
00703 #endif
00704 word0 (rv) = L | Bndry_mask1;
00705 #ifndef _DOUBLE_IS_32BITS
00706 word1 (rv) = 0xffffffff;
00707 #endif
00708 #ifdef IBM
00709 goto cont;
00710 #else
00711 break;
00712 #endif
00713 }
00714 #ifndef ROUND_BIASED
00715 if (!(word1 (rv) & LSB))
00716 break;
00717 #endif
00718 if (dsign)
00719 #ifndef SMALL_SCANF
00720 rv.d += ulp (rv.d);
00721 #else
00722 rv.d += small_ulp (rv.d);
00723 #endif
00724 #ifndef ROUND_BIASED
00725 else
00726 {
00727 #ifndef SMALL_SCANF
00728 rv.d -= ulp (rv.d);
00729 #else
00730 rv.d -= small_ulp (rv.d);
00731 #endif
00732 #ifndef Sudden_Underflow
00733 if (!rv.d)
00734 goto undfl;
00735 #endif
00736 }
00737 #endif
00738 break;
00739 }
00740
00741 #ifndef SMALL_SCANF
00742 if ((aadj = ratio (delta, bs)) <= 2.)
00743 {
00744 #else
00745 if ((aadj = small_ratio (delta, bs)) <= 2.)
00746 {
00747 #endif
00748 if (dsign)
00749 aadj = aadj1 = 1.;
00750 else if (word1 (rv) || word0 (rv) & Bndry_mask)
00751 {
00752 #ifndef Sudden_Underflow
00753 if (word1 (rv) == Tiny1 && !word0 (rv))
00754 goto undfl;
00755 #endif
00756 aadj = 1.;
00757 aadj1 = -1.;
00758 }
00759 else
00760 {
00761
00762
00763
00764 if (aadj < 2. / FLT_RADIX)
00765 aadj = 1. / FLT_RADIX;
00766 else
00767 aadj *= 0.5;
00768 aadj1 = -aadj;
00769 }
00770 }
00771 else
00772 {
00773 aadj *= 0.5;
00774 aadj1 = dsign ? aadj : -aadj;
00775 #ifdef Check_FLT_ROUNDS
00776 switch (FLT_ROUNDS)
00777 {
00778 case 2:
00779 aadj1 -= 0.5;
00780 break;
00781 case 0:
00782 case 3:
00783 aadj1 += 0.5;
00784 }
00785 #else
00786 if (FLT_ROUNDS == 0)
00787 aadj1 += 0.5;
00788 #endif
00789 }
00790 y = word0 (rv) & Exp_mask;
00791
00792
00793
00794 if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1))
00795 {
00796 rv0.d = rv.d;
00797 word0 (rv) -= P * Exp_msk1;
00798 #ifndef SMALL_SCANF
00799 adj = aadj1 * ulp (rv.d);
00800 #else
00801 adj = aadj1 * small_ulp (rv.d);
00802 #endif
00803 rv.d += adj;
00804 if ((word0 (rv) & Exp_mask) >=
00805 Exp_msk1 * (DBL_MAX_EXP + Bias - P))
00806 {
00807 if (word0 (rv0) == Big0 && word1 (rv0) == Big1)
00808 goto ovfl;
00809 #ifdef _DOUBLE_IS_32BITS
00810 word0 (rv) = Big1;
00811 #else
00812 word0 (rv) = Big0;
00813 word1 (rv) = Big1;
00814 #endif
00815 goto cont;
00816 }
00817 else
00818 word0 (rv) += P * Exp_msk1;
00819 }
00820 else
00821 {
00822 #ifdef Sudden_Underflow
00823 if ((word0 (rv) & Exp_mask) <= P * Exp_msk1)
00824 {
00825 rv0.d = rv.d;
00826 word0 (rv) += P * Exp_msk1;
00827 #ifndef SMALL_SCANF
00828 adj = aadj1 * ulp (rv.d);
00829 #else
00830 adj = aadj1 * small_ulp (rv.d);
00831 #endif
00832 rv.d += adj;
00833 #ifdef IBM
00834 if ((word0 (rv) & Exp_mask) < P * Exp_msk1)
00835 #else
00836 if ((word0 (rv) & Exp_mask) <= P * Exp_msk1)
00837 #endif
00838 {
00839 if (word0 (rv0) == Tiny0
00840 && word1 (rv0) == Tiny1)
00841 goto undfl;
00842 word0 (rv) = Tiny0;
00843 word1 (rv) = Tiny1;
00844 goto cont;
00845 }
00846 else
00847 word0 (rv) -= P * Exp_msk1;
00848 }
00849 else
00850 {
00851 #ifndef SMALL_SCANF
00852 adj = aadj1 * ulp (rv.d);
00853 #else
00854 adj = aadj1 * small_ulp (rv.d);
00855 #endif
00856 rv.d += adj;
00857 }
00858 #else
00859
00860
00861
00862
00863
00864
00865
00866 if (y <= (P - 1) * Exp_msk1 && aadj >= 1.)
00867 {
00868 aadj1 = (double) (int) (aadj + 0.5);
00869 if (!dsign)
00870 aadj1 = -aadj1;
00871 }
00872 #ifndef SMALL_SCANF
00873 adj = aadj1 * ulp (rv.d);
00874 #else
00875 adj = aadj1 * small_ulp (rv.d);
00876 rv.d += adj;
00877 #endif
00878 #endif
00879 }
00880 z = word0 (rv) & Exp_mask;
00881 if (y == z)
00882 {
00883
00884 L = aadj;
00885 aadj -= L;
00886
00887 if (dsign || word1 (rv) || word0 (rv) & Bndry_mask)
00888 {
00889 if (aadj < .4999999 || aadj > .5000001)
00890 break;
00891 }
00892 else if (aadj < .4999999 / FLT_RADIX)
00893 break;
00894 }
00895 cont:
00896 #ifndef SMALL_SCANF
00897 Bfree (ptr, bb);
00898 Bfree (ptr, bd);
00899 Bfree (ptr, bs);
00900 Bfree (ptr, delta);
00901 #else
00902 ;
00903 #endif
00904 }
00905 retfree:
00906 #ifndef SMALL_SCANF
00907 Bfree (ptr, bb);
00908 Bfree (ptr, bd);
00909 Bfree (ptr, bs);
00910 Bfree (ptr, bd0);
00911 Bfree (ptr, delta);
00912 #endif
00913 ret:
00914 if (se)
00915 *se = (char *) s;
00916 return sign ? -rv.d : rv.d;
00917 }
00918
00919 #ifndef NO_REENT
00920
00921 double
00922 _DEFUN (strtod, (s00, se),
00923 _CONST char *s00 _AND char **se)
00924 {
00925 return _strtod_r (_REENT, s00, se);
00926 }
00927
00928 float
00929 _DEFUN (strtof, (s00, se),
00930 _CONST char *s00 _AND
00931 char **se)
00932 {
00933 return (float)_strtod_r (_REENT, s00, se);
00934 }
00935
00936 #endif