30 register const char *s = start;
31 register unsigned long retval = 0;
33 while (len-- && *s >=
'0' && *s <=
'7') {
37 *retlen = (int)(s - start);
44 static const char hexdigit[] =
"0123456789abcdef0123456789ABCDEF";
45 register const char *s = start;
46 register unsigned long retval = 0;
49 while (len-- && *s && (tmp =
strchr(hexdigit, *s))) {
51 retval |= (tmp - hexdigit) & 15;
54 *retlen = (int)(s - start);
60 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
62 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
63 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
64 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
65 25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
66 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
67 25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
68 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
69 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
70 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
71 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
72 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
73 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
74 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
79 ruby_scan_digits(
const char *str, ssize_t len,
int base,
size_t *retlen,
int *overflow)
82 const char *start = str;
83 unsigned long ret = 0, x;
84 unsigned long mul_overflow = (~(
unsigned long)0) / base;
95 if (d == -1 || base <= d) {
98 if (mul_overflow < ret)
105 }
while (len < 0 || --len);
106 *retlen = (str-1) - start;
117 const char *subject_found = str;
119 if (base == 1 || 36 < base) {
124 while ((c = *str) &&
ISSPACE(c))
137 subject_found = str+1;
138 if (base == 0 || base == 16) {
139 if (str[1] ==
'x' || str[1] ==
'X') {
144 b = base == 0 ? 8 : 16;
154 b = base == 0 ? 10 : base;
160 subject_found = str+len;
163 *endptr = (
char*)subject_found;
171 ret = (
unsigned long)(-(
long)ret);
179 #include <sys/types.h> 180 #include <sys/stat.h> 184 #if defined(HAVE_FCNTL_H) 189 # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 196 #define mmcount (16 / SIZEOF_LONG) 197 #define A ((mmtype*)a) 198 #define B ((mmtype*)b) 199 #define C ((mmtype*)c) 200 #define D ((mmtype*)d) 202 #define mmstep (sizeof(mmtype) * mmcount) 203 #define mmprepare(base, size) do {\ 204 if (((VALUE)(base) % sizeof(mmtype)) == 0 && ((size) % sizeof(mmtype)) == 0) \ 205 if ((size) >= mmstep) mmkind = 1;\ 208 high = ((size) / mmstep) * mmstep;\ 209 low = ((size) % mmstep);\ 212 #define mmarg mmkind, size, high, low 213 #define mmargdecl int mmkind, size_t size, size_t high, size_t low 222 register char *
t = a + high;
224 s =
A[0];
A[0] =
B[0];
B[0] = s;
225 s =
A[1];
A[1] =
B[1];
B[1] = s;
227 s =
A[2];
A[2] =
B[2];
B[2] = s;
229 s =
A[3];
A[3] =
B[3];
B[3] = s;
236 if (low != 0) { s =
A[0];
A[0] =
B[0];
B[0] = s;
238 if (low >= 2 *
sizeof(
mmtype)) { s =
A[1];
A[1] =
B[1];
B[1] = s;
240 if (low >= 3 *
sizeof(
mmtype)) {s =
A[2];
A[2] =
B[2];
B[2] = s;}
247 register char *
t = a +
size, s;
248 do {s = *a; *a++ = *b; *b++ = s;}
while (a <
t);
251 #define mmswap(a,b) mmswap_((a),(b),mmarg) 260 register char *
t = a + high;
262 s =
A[0];
A[0] =
B[0];
B[0] =
C[0];
C[0] = s;
263 s =
A[1];
A[1] =
B[1];
B[1] =
C[1];
C[1] = s;
265 s =
A[2];
A[2] =
B[2];
B[2] =
C[2];
C[2] = s;
267 s =
A[3];
A[3] =
B[3];
B[3] =
C[3];
C[3] = s;
274 if (low != 0) { s =
A[0];
A[0] =
B[0];
B[0] =
C[0];
C[0] = s;
276 if (low >= 2 *
sizeof(
mmtype)) { s =
A[1];
A[1] =
B[1];
B[1] =
C[1];
C[1] = s;
278 if (low == 3 *
sizeof(
mmtype)) {s =
A[2];
A[2] =
B[2];
B[2] =
C[2];
C[2] = s;}
285 register char *
t = a +
size, s;
286 do {s = *a; *a++ = *b; *b++ = *c; *c++ = s;}
while (a <
t);
289 #define mmrot3(a,b,c) mmrot3_((a),(b),(c),mmarg) 301 #define PUSH(ll,rr) do { top->LL = (ll); top->RR = (rr); ++top; } while (0) 302 #define POP(ll,rr) do { --top; (ll) = top->LL; (rr) = top->RR; } while (0) 304 #define med3(a,b,c) ((*cmp)((a),(b),d)<0 ? \ 305 ((*cmp)((b),(c),d)<0 ? (b) : ((*cmp)((a),(c),d)<0 ? (c) : (a))) : \ 306 ((*cmp)((b),(c),d)>0 ? (b) : ((*cmp)((a),(c),d)<0 ? (a) : (c)))) 308 typedef int (
cmpfunc_t)(
const void*,
const void*,
void*);
312 register char *l, *r, *m;
313 register int t, eq_l, eq_r;
315 char *
R = (
char*)base +
size*(nel-1);
323 if (nel <= 1)
return;
328 if (stack ==
top)
return;
339 m = l +
size * (n >> 1);
347 register char *p1 = l + n;
348 register char *p2 = p1 + n;
349 register char *p3 = p2 + n;
350 m1 =
med3(p1, p2, p3);
354 m3 =
med3(p1, p2, p3);
365 if ((
t = (*
cmp)(l,m,d)) < 0) {
366 if ((
t = (*
cmp)(m,r,d)) < 0) {
367 if (chklim && nel >= chklim) {
370 for (p=l; p<r; p+=size) if ((*cmp)(p,p+size,d) > 0)
goto fail;
376 if ((*
cmp)(l,r,d) <= 0) {
mmswap(m,r);
goto loopA;}
377 mmrot3(r,m,l);
goto loopA;
383 if ((
t = (*
cmp)(m,r,d)) > 0) {
384 if (chklim && nel >= chklim) {
387 for (p=l; p<r; p+=
size)
if ((*
cmp)(p,p+
size,d) < 0)
goto fail2;
391 fail2:
mmswap(l,r);
goto loopA;
394 if ((*
cmp)(l,r,d) <= 0) {
mmswap(l,m);
goto loopB;}
395 mmrot3(l,m,r);
goto loopA;
400 if ((
t = (*
cmp)(m,r,d)) < 0) {
goto loopA;}
401 if (
t > 0) {
mmswap(l,r);
goto loopB;}
405 if ((l +=
size) == r)
goto nxt;
406 if (l == m)
continue;
407 if ((
t = (*
cmp)(l,m,d)) > 0) {
mmswap(l,r); l = L;
goto loopA;}
408 if (
t < 0) {
mmswap(L,l); l = L;
goto loopB;}
411 loopA: eq_l = 1; eq_r = 1;
414 if ((l +=
size) == r)
416 if (l == m)
continue;
417 if ((
t = (*
cmp)(l,m,d)) > 0) {eq_r = 0;
break;}
421 if (l == (r -=
size))
423 if (r == m) {m = l;
break;}
424 if ((
t = (*
cmp)(r,m,d)) < 0) {eq_l = 0;
break;}
430 loopB: eq_l = 1; eq_r = 1;
433 if (l == (r -=
size))
435 if (r == m)
continue;
436 if ((
t = (*
cmp)(r,m,d)) < 0) {eq_l = 0;
break;}
440 if ((l +=
size) == r)
442 if (l == m) {m = r;
break;}
443 if ((
t = (*
cmp)(l,m,d)) > 0) {eq_r = 0;
break;}
452 if (l-L <
R-r) {
PUSH(r,
R);
R = l;}
453 else {
PUSH(L,l); L = r;}
455 else if (eq_r == 0) L = r;
464 size_t len =
strlen(str) + 1;
467 memcpy(tmp, str, len);
472 #ifdef __native_client__ 489 if (
errno != ERANGE) {
498 # define PATH_MAX 8192 676 #ifdef WORDS_BIGENDIAN 677 #define IEEE_BIG_ENDIAN 679 #define IEEE_LITTLE_ENDIAN 684 #undef IEEE_BIG_ENDIAN 685 #undef IEEE_LITTLE_ENDIAN 688 #if defined(__arm__) && !defined(__VFP_FP__) 689 #define IEEE_BIG_ENDIAN 690 #undef IEEE_LITTLE_ENDIAN 698 #define ULong unsigned int 699 #elif SIZEOF_LONG == 4 700 #define Long long int 701 #define ULong unsigned long int 705 #define Llong LONG_LONG 710 #define Bug(x) {fprintf(stderr, "%s\n", (x)); exit(EXIT_FAILURE);} 721 extern void *
MALLOC(
size_t);
723 #define MALLOC malloc 726 extern void FREE(
void*);
731 #ifndef Omit_Private_Memory 733 #define PRIVATE_MEM 2304 735 #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) 740 #undef Avoid_Underflow 741 #ifdef IEEE_BIG_ENDIAN 744 #ifdef IEEE_LITTLE_ENDIAN 752 #define DBL_MAX_10_EXP 308 753 #define DBL_MAX_EXP 1024 759 #define DBL_MAX_10_EXP 75 760 #define DBL_MAX_EXP 63 762 #define DBL_MAX 7.2370055773322621e+75 767 #define DBL_MAX_10_EXP 38 768 #define DBL_MAX_EXP 127 770 #define DBL_MAX 1.7014118346046923e+38 774 #define LONG_MAX 2147483647 792 #if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1 796 typedef union {
double d; ULong L[2]; }
U;
801 # ifdef IEEE_LITTLE_ENDIAN 802 # define word0(x) (((ULong *)&(x))[1]) 803 # define word1(x) (((ULong *)&(x))[0]) 805 # define word0(x) (((ULong *)&(x))[0]) 806 # define word1(x) (((ULong *)&(x))[1]) 810 # ifdef IEEE_LITTLE_ENDIAN 811 # define word0(x) ((x).L[1]) 812 # define word1(x) ((x).L[0]) 814 # define word0(x) ((x).L[0]) 815 # define word1(x) ((x).L[1]) 817 # define dval(x) ((x).d) 824 #if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) + defined(__arm__) 825 #define Storeinc(a,b,c) (((unsigned short *)(a))[1] = (unsigned short)(b), \ 826 ((unsigned short *)(a))[0] = (unsigned short)(c), (a)++) 828 #define Storeinc(a,b,c) (((unsigned short *)(a))[0] = (unsigned short)(b), \ 829 ((unsigned short *)(a))[1] = (unsigned short)(c), (a)++) 840 #define Exp_shift1 20 841 #define Exp_msk1 0x100000 842 #define Exp_msk11 0x100000 843 #define Exp_mask 0x7ff00000 847 #define Exp_1 0x3ff00000 848 #define Exp_11 0x3ff00000 850 #define Frac_mask 0xfffff 851 #define Frac_mask1 0xfffff 854 #define Bndry_mask 0xfffff 855 #define Bndry_mask1 0xfffff 857 #define Sign_bit 0x80000000 863 #ifndef NO_IEEE_Scale 864 #define Avoid_Underflow 866 #undef Sudden_Underflow 872 #define Flt_Rounds FLT_ROUNDS 878 #ifdef Honor_FLT_ROUNDS 879 #define Rounding rounding 880 #undef Check_FLT_ROUNDS 881 #define Check_FLT_ROUNDS 883 #define Rounding Flt_Rounds 887 #undef Check_FLT_ROUNDS 888 #undef Honor_FLT_ROUNDS 890 #undef Sudden_Underflow 891 #define Sudden_Underflow 896 #define Exp_shift1 24 897 #define Exp_msk1 0x1000000 898 #define Exp_msk11 0x1000000 899 #define Exp_mask 0x7f000000 902 #define Exp_1 0x41000000 903 #define Exp_11 0x41000000 905 #define Frac_mask 0xffffff 906 #define Frac_mask1 0xffffff 909 #define Bndry_mask 0xefffff 910 #define Bndry_mask1 0xffffff 912 #define Sign_bit 0x80000000 914 #define Tiny0 0x100000 923 #define Exp_msk1 0x80 924 #define Exp_msk11 0x800000 925 #define Exp_mask 0x7f80 928 #define Exp_1 0x40800000 929 #define Exp_11 0x4080 931 #define Frac_mask 0x7fffff 932 #define Frac_mask1 0xffff007f 935 #define Bndry_mask 0xffff007f 936 #define Bndry_mask1 0xffff007f 938 #define Sign_bit 0x8000 952 #define rounded_product(a,b) ((a) = rnd_prod((a), (b))) 953 #define rounded_quotient(a,b) ((a) = rnd_quot((a), (b))) 954 extern double rnd_prod(
double,
double), rnd_quot(
double,
double);
956 #define rounded_product(a,b) ((a) *= (b)) 957 #define rounded_quotient(a,b) ((a) /= (b)) 960 #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) 961 #define Big1 0xffffffff 967 #define FFFFFFFF 0xffffffffUL 981 #define Llong long long 984 #define ULLong unsigned Llong 988 #define MULTIPLE_THREADS 1 990 #ifndef MULTIPLE_THREADS 991 #define ACQUIRE_DTOA_LOCK(n) 992 #define FREE_DTOA_LOCK(n) 994 #define ACQUIRE_DTOA_LOCK(n) 995 #define FREE_DTOA_LOCK(n) 1015 #ifndef Omit_Private_Memory 1025 #ifdef Omit_Private_Memory 1028 len = (
sizeof(
Bigint) + (
x-1)*
sizeof(ULong) +
sizeof(
double) - 1)
1060 #define Bcopy(x,y) memcpy((char *)&(x)->sign, (char *)&(y)->sign, \ 1061 (y)->wds*sizeof(Long) + 2*sizeof(int)) 1090 y = (xi & 0xffff) * m + carry;
1091 z = (xi >> 16) * m + (y >> 16);
1093 *
x++ = (z << 16) + (y & 0xffff);
1100 }
while (++i <
wds);
1108 b->
x[
wds++] = (ULong)carry;
1115 s2b(
const char *s,
int nd0,
int nd, ULong y9)
1122 for (
k = 0, y = 1;
x > y; y <<= 1,
k++) ;
1129 b->
x[0] = y9 & 0xffff;
1130 b->
wds = (b->
x[1] = y9 >> 16) ? 2 : 1;
1137 b =
multadd(b, 10, *s++ -
'0');
1138 }
while (++i < nd0);
1144 b =
multadd(b, 10, *s++ -
'0');
1153 if (!(
x & 0xffff0000)) {
1157 if (!(
x & 0xff000000)) {
1161 if (!(
x & 0xf0000000)) {
1165 if (!(
x & 0xc0000000)) {
1169 if (!(
x & 0x80000000)) {
1171 if (!(
x & 0x40000000))
1181 register ULong
x = *y;
1194 if (!(
x & 0xffff)) {
1236 ULong *
x, *xa, *xae, *xb, *xbe, *xc, *xc0;
1259 for (
x = c->
x, xa =
x + wc;
x < xa;
x++)
1267 for (; xb < xbe; xc0++) {
1268 if ((y = *xb++) != 0) {
1273 z = *
x++ * (
ULLong)y + *xc + carry;
1282 for (; xb < xbe; xb++, xc0++) {
1283 if (y = *xb & 0xffff) {
1288 z = (*
x & 0xffff) * y + (*xc & 0xffff) + carry;
1290 z2 = (*
x++ >> 16) * y + (*xc >> 16) + carry;
1296 if (y = *xb >> 16) {
1302 z = (*
x & 0xffff) * y + (*xc >> 16) + carry;
1305 z2 = (*
x++ >> 16) * y + (*xc & 0xffff) + carry;
1312 for (; xb < xbe; xc0++) {
1318 z = *
x++ * y + *xc + carry;
1327 for (xc0 = c->
x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
1339 static int p05[3] = { 5, 25, 125 };
1341 if ((i =
k & 3) != 0)
1348 #ifdef MULTIPLE_THREADS 1368 if (!(p51 = p5->
next)) {
1369 #ifdef MULTIPLE_THREADS 1371 if (!(p51 = p5->
next)) {
1391 ULong *
x, *x1, *xe, z;
1399 n1 = n + b->
wds + 1;
1400 for (i = b->
maxwds; n1 > i; i <<= 1)
1404 for (i = 0; i < n; i++)
1413 *x1++ = *
x <<
k | z;
1424 *x1++ = *
x <<
k & 0xffff | z;
1443 ULong *xa, *xa0, *xb, *xb0;
1449 if (i > 1 && !a->
x[i-1])
1450 Bug(
"cmp called with a->x[a->wds-1] == 0");
1451 if (j > 1 && !b->
x[j-1])
1452 Bug(
"cmp called with b->x[b->wds-1] == 0");
1462 return *xa < *xb ? -1 : 1;
1474 ULong *xa, *xae, *xb, *xbe, *xc;
1511 y = (
ULLong)*xa++ - *xb++ - borrow;
1512 borrow = y >> 32 & (ULong)1;
1517 borrow = y >> 32 & (ULong)1;
1523 y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
1524 borrow = (y & 0x10000) >> 16;
1525 z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
1526 borrow = (z & 0x10000) >> 16;
1530 y = (*xa & 0xffff) - borrow;
1531 borrow = (y & 0x10000) >> 16;
1532 z = (*xa++ >> 16) - borrow;
1533 borrow = (z & 0x10000) >> 16;
1538 y = *xa++ - *xb++ - borrow;
1539 borrow = (y & 0x10000) >> 16;
1544 borrow = (y & 0x10000) >> 16;
1563 #ifndef Avoid_Underflow 1564 #ifndef Sudden_Underflow 1573 #ifndef Avoid_Underflow 1574 #ifndef Sudden_Underflow 1579 word0(a) = 0x80000 >> L;
1585 word1(a) = L >= 31 ? 1 : 1 << 31 - L;
1596 ULong *xa, *xa0, w, y, z;
1610 if (!y) Bug(
"zero y in b2d");
1617 w = xa > xa0 ? *--xa : 0;
1621 z = xa > xa0 ? *--xa : 0;
1623 d0 =
Exp_1 | y << k | z >> (32 -
k);
1624 y = xa > xa0 ? *--xa : 0;
1625 d1 = z << k | y >> (32 -
k);
1633 z = xa > xa0 ? *--xa : 0;
1635 w = xa > xa0 ? *--xa : 0;
1636 y = xa > xa0 ? *--xa : 0;
1640 z = xa > xa0 ? *--xa : 0;
1641 w = xa > xa0 ? *--xa : 0;
1643 d0 =
Exp_1 | y << k + 16 | z << k | w >> 16 -
k;
1644 y = xa > xa0 ? *--xa : 0;
1645 d1 = w <<
k + 16 | y <<
k;
1659 d2b(
double d_,
int *e,
int *bits)
1665 #ifndef Sudden_Underflow 1689 #ifdef Sudden_Underflow 1699 if ((y =
d1) != 0) {
1701 x[0] = y | z << (32 -
k);
1706 #ifndef Sudden_Underflow 1709 b->
wds = (
x[1] = z) ? 2 : 1;
1714 Bug(
"Zero passed to d2b");
1718 #ifndef Sudden_Underflow 1728 x[0] = y | z << 32 -
k & 0xffff;
1729 x[1] = z >>
k - 16 & 0xffff;
1735 x[1] = y >> 16 | z << 16 -
k & 0xffff;
1736 x[2] = z >>
k & 0xffff;
1751 Bug(
"Zero passed to d2b");
1769 #ifndef Sudden_Underflow 1773 *e = (de -
Bias - (
P-1) << 2) +
k;
1776 *e = de -
Bias - (
P-1) +
k;
1779 #ifndef Sudden_Underflow 1782 *e = de -
Bias - (
P-1) + 1 +
k;
1804 k = ka - kb + 32*(a->
wds - b->
wds);
1806 k = ka - kb + 16*(a->
wds - b->
wds);
1833 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1834 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1844 static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1845 #ifdef Avoid_Underflow 1846 9007199254740992.*9007199254740992.e-256
1854 #define Scale_Bit 0x10 1858 bigtens[] = { 1e16, 1e32, 1e64 };
1859 static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
1863 static const double tinytens[] = { 1e-16, 1e-32 };
1875 #define NAN_WORD0 0x7ff80000 1883 match(
const char **sp,
char *
t)
1886 const char *s = *sp;
1889 if ((c = *++s) >=
'A' && c <=
'Z')
1900 hexnan(
double *rvp,
const char **sp)
1904 int havedig, udx0, xshift;
1907 havedig = xshift = 0;
1910 while (c = *(
const unsigned char*)++s) {
1911 if (c >=
'0' && c <=
'9')
1913 else if (c >=
'a' && c <=
'f')
1915 else if (c >=
'A' && c <=
'F')
1917 else if (c <=
' ') {
1918 if (udx0 && havedig) {
1924 else if ( c ==
')' && havedig) {
1937 x[0] = (
x[0] << 4) | (
x[1] >> 28);
1938 x[1] = (
x[1] << 4) | c;
1940 if ((
x[0] &= 0xfffff) ||
x[1]) {
1951 #ifdef Avoid_Underflow 1954 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1955 e, e1, esign, i, j,
k, nd, nd0, nf, nz, nz0,
sign;
1956 const char *s, *s0, *s1;
1961 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1963 int inexact, oldinexact;
1965 #ifdef Honor_FLT_ROUNDS 1973 sign = nz0 = nz = 0;
1998 if (s[1] ==
'x' || s[1] ==
'X') {
1999 static const char hexdigit[] =
"0123456789abcdef0123456789ABCDEF";
2005 if (!*++s || !(s1 =
strchr(hexdigit, *s)))
goto ret0;
2007 while (*++s ==
'0');
2008 s1 =
strchr(hexdigit, *s);
2012 adj += aadj * ((s1 - hexdigit) & 15);
2015 }
while (*++s && (s1 =
strchr(hexdigit, *s)));
2020 if (!*++s || !(s1 =
strchr(hexdigit, *s)))
goto ret0;
2027 for (; *s && (s1 =
strchr(hexdigit, *s)); ++s) {
2028 adj += aadj * ((s1 - hexdigit) & 15);
2029 if ((aadj /= 16) == 0.0) {
2030 while (
strchr(hexdigit, *++s));
2039 if (*s ==
'P' || *s ==
'p') {
2040 dsign = 0x2C - *++s;
2041 if (abs(dsign) == 1) s++;
2046 if (c <
'0' ||
'9' < c)
goto ret0;
2053 if (nd + dsign * nd0 > 2095) {
2054 while (
'0' <= c && c <=
'9') c = *++s;
2057 }
while (
'0' <= c && c <=
'9');
2061 if (dsign)
goto ret0;
2063 dval(rv) = ldexp(adj, nd0);
2067 while (*++s ==
'0') ;
2073 for (nd = nf = 0; (c = *s) >=
'0' && c <=
'9'; nd++, s++)
2080 s1 = localeconv()->decimal_point;
2103 for (; c ==
'0'; c = *++s)
2105 if (c >
'0' && c <=
'9') {
2113 for (; c >=
'0' && c <=
'9'; c = *++s) {
2116 if (nf >
DBL_DIG * 4)
continue;
2119 for (i = 1; i < nz; i++)
2134 if (c ==
'e' || c ==
'E') {
2135 if (!nd && !nz && !nz0) {
2146 if (c >=
'0' && c <=
'9') {
2149 if (c >
'0' && c <=
'9') {
2152 while ((c = *++s) >=
'0' && c <=
'9')
2154 if (s - s1 > 8 || L > 19999)
2177 if (
match(&s,
"nf")) {
2179 if (!
match(&s,
"inity"))
2181 word0(rv) = 0x7ff00000;
2188 if (
match(&s,
"an")) {
2189 word0(rv) = NAN_WORD0;
2190 word1(rv) = NAN_WORD1;
2219 oldinexact = get_inexact();
2223 bd0 = bb = bd = bs = delta = 0;
2225 #ifndef RND_PRODQUOT
2226 #ifndef Honor_FLT_ROUNDS
2236 goto vax_ovfl_check;
2238 #ifdef Honor_FLT_ROUNDS 2254 #ifdef Honor_FLT_ROUNDS 2280 #ifndef Inaccurate_Divide 2282 #ifdef Honor_FLT_ROUNDS 2300 oldinexact = get_inexact();
2302 #ifdef Avoid_Underflow 2305 #ifdef Honor_FLT_ROUNDS 2308 rounding = rounding == 2 ? 0 : 2;
2319 if ((i = e1 & 15) != 0)
2329 #ifdef Honor_FLT_ROUNDS 2358 for (j = 0; e1 > 1; j++, e1 >>= 1)
2379 if ((i = e1 & 15) != 0)
2384 #ifdef Avoid_Underflow 2387 for (j = 0; e1 > 0; j++, e1 >>= 1)
2398 word0(rv) &= 0xffffffff << (j-32);
2401 word1(rv) &= 0xffffffff << j;
2404 for (j = 0; e1 > 1; j++, e1 >>= 1)
2424 #ifndef Avoid_Underflow 2439 bd0 =
s2b(s0, nd0, nd, y);
2444 bb =
d2b(
dval(rv), &bbe, &bbbits);
2460 #ifdef Honor_FLT_ROUNDS 2464 #ifdef Avoid_Underflow 2472 #ifdef Sudden_Underflow 2474 j = 1 + 4*
P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
2489 #ifdef Avoid_Underflow 2492 i = bb2 < bd2 ? bb2 : bd2;
2514 delta =
diff(bb, bd);
2515 dsign = delta->
sign;
2518 #ifdef Honor_FLT_ROUNDS 2519 if (rounding != 1) {
2522 if (!delta->
x[0] && delta->
wds <= 1) {
2540 #ifdef Avoid_Underflow 2547 if (
cmp(delta, bs) <= 0)
2552 #ifdef Avoid_Underflow 2557 #ifdef Sudden_Underflow 2571 adj =
ratio(delta, bs);
2574 if (adj <= 0x7ffffffe) {
2578 if (!((rounding>>1) ^ dsign))
2583 #ifdef Avoid_Underflow 2587 #ifdef Sudden_Underflow 2623 if (!delta->
x[0] && delta->
wds <= 1)
2628 if (!delta->
x[0] && delta->
wds <= 1) {
2636 if (
cmp(delta, bs) > 0)
2647 ? (0xffffffff & (0xffffffff << (2*
P+1-(y>>
Exp_shift)))) :
2658 #ifdef Avoid_Underflow 2667 #ifdef Sudden_Underflow 2672 #ifdef Avoid_Underflow 2681 #ifdef Avoid_Underflow 2697 word1(rv) = 0xffffffff;
2704 #ifndef ROUND_BIASED 2710 #ifndef ROUND_BIASED 2713 #ifndef Sudden_Underflow 2718 #ifdef Avoid_Underflow 2724 if ((aadj =
ratio(delta, bs)) <= 2.) {
2726 aadj =
dval(aadj1) = 1.;
2728 #ifndef Sudden_Underflow 2743 dval(aadj1) = -aadj;
2748 dval(aadj1) = dsign ? aadj : -aadj;
2749 #ifdef Check_FLT_ROUNDS 2784 #ifdef Avoid_Underflow 2786 if (aadj <= 0x7fffffff) {
2787 if ((z = (
int)aadj) <= 0)
2790 dval(aadj1) = dsign ? aadj : -aadj;
2797 #ifdef Sudden_Underflow 2831 dval(aadj1) = (double)(
int)(aadj + 0.5);
2842 #ifdef Avoid_Underflow 2851 if (aadj < .4999999 || aadj > .5000001)
2872 else if (!oldinexact)
2875 #ifdef Avoid_Underflow 2910 ULong *bx, *bxe, q, *sx, *sxe;
2912 ULLong borrow, carry, y, ys;
2914 ULong borrow, carry, y, ys;
2923 Bug(
"oversize b in quorem");
2931 q = *bxe / (*sxe + 1);
2934 Bug(
"oversized quotient in quorem");
2941 ys = *sx++ * (
ULLong)q + carry;
2943 y = *bx - (ys &
FFFFFFFF) - borrow;
2944 borrow = y >> 32 & (ULong)1;
2949 ys = (si & 0xffff) * q + carry;
2950 zs = (si >> 16) * q + (ys >> 16);
2952 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2953 borrow = (y & 0x10000) >> 16;
2954 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2955 borrow = (z & 0x10000) >> 16;
2958 ys = *sx++ * q + carry;
2960 y = *bx - (ys & 0xffff) - borrow;
2961 borrow = (y & 0x10000) >> 16;
2965 }
while (sx <= sxe);
2968 while (--bxe > bx && !*bxe)
2973 if (
cmp(b,
S) >= 0) {
2983 y = *bx - (ys &
FFFFFFFF) - borrow;
2984 borrow = y >> 32 & (ULong)1;
2989 ys = (si & 0xffff) + carry;
2990 zs = (si >> 16) + (ys >> 16);
2992 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2993 borrow = (y & 0x10000) >> 16;
2994 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2995 borrow = (z & 0x10000) >> 16;
3000 y = *bx - (ys & 0xffff) - borrow;
3001 borrow = (y & 0x10000) >> 16;
3005 }
while (sx <= sxe);
3009 while (--bxe > bx && !*bxe)
3017 #ifndef MULTIPLE_THREADS 3018 static char *dtoa_result;
3021 #ifndef MULTIPLE_THREADS 3025 return dtoa_result =
xmalloc(i);
3028 #define rv_alloc(i) xmalloc(i) 3037 while ((*
t = *s++) != 0)
t++;
3043 #define rv_strdup(s, rve) nrv_alloc((s), (rve), strlen(s)+1) 3045 #ifndef MULTIPLE_THREADS 3134 int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
3135 j, j1,
k, k0, k_check, leftright, m2, m5, s2, s5,
3136 spec_case, try_quick;
3138 #ifndef Sudden_Underflow 3142 Bigint *b, *b1, *delta, *mlo = 0, *mhi = 0, *
S;
3146 #ifdef Honor_FLT_ROUNDS 3150 int inexact, oldinexact;
3155 #ifndef MULTIPLE_THREADS 3157 freedtoa(dtoa_result);
3170 #if defined(IEEE_Arith) + defined(VAX) 3174 if (
word0(d) == 0x8000)
3195 try_quick = oldinexact = get_inexact();
3198 #ifdef Honor_FLT_ROUNDS 3201 rounding = rounding == 2 ? 0 : 2;
3208 b =
d2b(
dval(d), &be, &bbits);
3209 #ifdef Sudden_Underflow 3249 #ifndef Sudden_Underflow 3255 i = bbits + be + (
Bias + (
P-1) - 1);
3256 x = i > 32 ?
word0(d) << (64 - i) |
word1(d) >> (i - 32)
3257 :
word1(d) << (32 - i);
3260 i -= (
Bias + (
P-1) - 1) + 1;
3264 ds = (
dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
3266 if (ds < 0. && ds !=
k)
3293 if (mode < 0 || mode > 9)
3297 #ifdef Check_FLT_ROUNDS 3322 ilim = ilim1 = i = ndigits;
3328 i = ndigits +
k + 1;
3336 #ifdef Honor_FLT_ROUNDS 3337 if (mode > 1 && rounding != 1)
3341 if (ilim >= 0 && ilim <=
Quick_max && try_quick) {
3359 for (; j; j >>= 1, i++)
3366 else if ((j1 = -
k) != 0) {
3368 for (j = j1 >> 4; j; j >>= 1, i++)
3374 if (k_check &&
dval(d) < 1. && ilim > 0) {
3393 #ifndef No_leftright 3402 *s++ =
'0' + (int)L;
3417 for (i = 1;; i++,
dval(d) *= 10.) {
3418 L = (Long)(
dval(d));
3419 if (!(
dval(d) -= L))
3421 *s++ =
'0' + (int)L;
3425 else if (
dval(d) < 0.5 -
dval(eps)) {
3426 while (*--s ==
'0') ;
3433 #ifndef No_leftright 3448 if (ndigits < 0 && ilim <= 0) {
3450 if (ilim < 0 ||
dval(d) <= 5*ds)
3454 for (i = 1;; i++,
dval(d) *= 10.) {
3455 L = (Long)(
dval(d) / ds);
3457 #ifdef Check_FLT_ROUNDS 3464 *s++ =
'0' + (int)L;
3472 #ifdef Honor_FLT_ROUNDS 3476 case 2:
goto bump_up;
3480 if (
dval(d) > ds || (
dval(d) == ds && (L & 1))) {
3500 #ifndef Sudden_Underflow 3501 denorm ? be + (
Bias + (
P-1) - 1 + 1) :
3504 1 + 4*
P - 3 - bbits + ((bbits + be - 1) & 3);
3512 if (m2 > 0 && s2 > 0) {
3513 i = m2 < s2 ? m2 : s2;
3526 if ((j = b5 - m5) != 0)
3539 if ((mode < 2 || leftright)
3540 #ifdef Honor_FLT_ROUNDS
3545 #ifndef Sudden_Underflow
3564 if ((i = ((s5 ? 32 -
hi0bits(
S->x[
S->wds-1]) : 1) + s2) & 0x1f) != 0)
3567 if ((i = ((s5 ? 32 -
hi0bits(
S->x[
S->wds-1]) : 1) + s2) & 0xf) != 0)
3595 if (ilim <= 0 && (mode == 3 || mode == 5)) {
3628 delta =
diff(
S, mhi);
3629 j1 = delta->
sign ? 1 :
cmp(b, delta);
3631 #ifndef ROUND_BIASED 3632 if (j1 == 0 && mode != 1 && !(
word1(d) & 1)
3633 #ifdef Honor_FLT_ROUNDS
3642 else if (!b->
x[0] && b->
wds <= 1)
3649 if (j < 0 || (j == 0 && mode != 1
3650 #ifndef ROUND_BIASED
3654 if (!b->
x[0] && b->
wds <= 1) {
3660 #ifdef Honor_FLT_ROUNDS 3663 case 0:
goto accept_dig;
3664 case 2:
goto keep_dig;
3670 if ((j1 > 0 || (j1 == 0 && (dig & 1))) && dig++ ==
'9')
3678 #ifdef Honor_FLT_ROUNDS 3690 #ifdef Honor_FLT_ROUNDS 3698 mlo = mhi =
multadd(mhi, 10, 0);
3707 *s++ = dig =
quorem(b,
S) +
'0';
3708 if (!b->
x[0] && b->
wds <= 1) {
3721 #ifdef Honor_FLT_ROUNDS 3723 case 0:
goto trimzeros;
3724 case 2:
goto roundoff;
3729 if (j > 0 || (j == 0 && (dig & 1))) {
3740 while (*--s ==
'0') ;
3746 if (mlo && mlo != mhi)
3759 else if (!oldinexact)
3777 for (; *str; str = end) {
3778 while (
ISSPACE(*str) || *str ==
',') str++;
3781 while (*end && !
ISSPACE(*end) && *end !=
',') end++;
3782 len = (int)(end - str);
3783 (*func)(str, len, arg);
3813 #define DBL_MANH_SIZE 20 3814 #define DBL_MANL_SIZE 32 3815 #define DBL_ADJ (DBL_MAX_EXP - 2) 3816 #define SIGFIGS ((DBL_MANT_DIG + 3) / 4 + 1) 3817 #define dexp_get(u) ((int)(word0(u) >> Exp_shift) & ~Exp_msk1) 3818 #define dexp_set(u,v) (word0(u) = (((int)(word0(u)) & ~Exp_mask) | ((v) << Exp_shift))) 3819 #define dmanh_get(u) ((uint32_t)(word0(u) & Frac_mask)) 3820 #define dmanl_get(u) ((uint32_t)word1(u)) 3869 else if (
isnan(d)) {
3873 else if (d == 0.0) {
3881 u.
d *= 5.363123171977039e+154 ;
3892 bufsize = (ndigits > 0) ? ndigits :
SIGFIGS;
3896 if (
SIGFIGS > ndigits && ndigits > 0) {
3908 for (s = s0 + 1; s < s0 + bufsize; s++) {
3916 for (ndigits =
SIGFIGS; s0[ndigits - 1] ==
'0'; ndigits--)
static int lo0bits(ULong *y)
size_t strlen(const char *)
#define ACQUIRE_DTOA_LOCK(n)
static Bigint * Balloc(int k)
int() cmpfunc_t(const void *, const void *, void *)
#define rv_strdup(s, rve)
static Bigint * pow5mult(Bigint *b, int k)
unsigned long ruby_scan_hex(const char *start, size_t len, size_t *retlen)
static const char ZEROSTR[]
SSL_METHOD *(* func)(void)
static void mmrot3_(register char *a, register char *b, register char *c, mmargdecl)
static double ulp(double x_)
#define Storeinc(a, b, c)
static int hi0bits(register ULong x)
static Bigint * lshift(Bigint *b, int k)
static const char NANSTR[]
static double private_mem[PRIVATE_mem]
static char * nrv_alloc(const char *s, char **rve, size_t n)
static int quorem(Bigint *b, Bigint *S)
RUBY_EXTERN int isinf(double)
static Bigint * s2b(const char *s, int nd0, int nd, ULong y9)
static double * pmem_next
double ruby_strtod(const char *s00, char **se)
static const double tens[]
#define rounded_product(a, b)
static const char INFSTR[]
void ruby_qsort(void *base, const size_t nel, const size_t size, cmpfunc_t *cmp, void *d)
unsigned char buf[MIME_BUF_SIZE]
static const double bigtens[]
static int cmp(Bigint *a, Bigint *b)
const signed char ruby_digit36_to_number_table[]
#define rounded_quotient(a, b)
static Bigint * multadd(Bigint *b, int m, int a)
char * strchr(char *, char)
static double b2d(Bigint *a, int *e)
void rb_sys_fail(const char *mesg)
unsigned long ruby_scan_oct(const char *start, size_t len, size_t *retlen)
#define IEEE_LITTLE_ENDIAN
static Bigint * d2b(double d_, int *e, int *bits)
char * ruby_hdtoa(double d, const char *xdigs, int ndigits, int *decpt, int *sign, char **rve)
unsigned long ruby_scan_digits(const char *str, ssize_t len, int base, size_t *retlen, int *overflow)
#define FREE_DTOA_LOCK(n)
#define mmprepare(base, size)
static void mmswap_(register char *a, register char *b, mmargdecl)
static Bigint * diff(Bigint *a, Bigint *b)
static double ratio(Bigint *a, Bigint *b)
static void Bfree(Bigint *v)
unsigned long ruby_strtoul(const char *str, char **endptr, int base)
void ruby_each_words(const char *str, void(*func)(const char *, int, void *), void *arg)
static const double tinytens[]
static Bigint * freelist[Kmax+1]
static int match(VALUE str, VALUE pat, VALUE hash, int(*cb)(VALUE, VALUE))
char * ruby_strdup(const char *str)
static Bigint * i2b(int i)
static Bigint * mult(Bigint *a, Bigint *b)
char * ruby_dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve)