Bug #3700 » util.c.patch
| util.c (working copy) | ||
|---|---|---|
|
static char *
|
||
|
nrv_alloc(const char *s, char **rve, size_t n)
|
||
|
{
|
||
|
char *rv, *t;
|
||
|
char *rv;
|
||
|
t = rv = rv_alloc(n);
|
||
|
while ((*t = *s++) != 0) t++;
|
||
|
rv = rv_alloc(n);
|
||
|
memcpy(rv,s,n);
|
||
|
if (rve)
|
||
|
*rve = t;
|
||
|
*rve = rv + n - 1;
|
||
|
return rv;
|
||
|
}
|
||
|
#define rv_strdup(s, rve) nrv_alloc(s, rve, strlen(s)+1)
|
||
|
#define rv_strdup(s, rve) nrv_alloc(s, rve, sizeof(s))
|
||
|
#ifndef MULTIPLE_THREADS
|
||
|
/* freedtoa(s) must be used to free values s returned by dtoa
|
||
| ... | ... | |
|
* calculation.
|
||
|
*/
|
||
|
#define INFSTR "Infinity"
|
||
|
#define NANSTR "NaN"
|
||
|
#define ZEROSTR "0"
|
||
|
char *
|
||
|
ruby_dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
||
|
{
|
||
| ... | ... | |
|
*decpt = 9999;
|
||
|
#ifdef IEEE_Arith
|
||
|
if (!word1(d) && !(word0(d) & 0xfffff))
|
||
|
return rv_strdup("Infinity", rve);
|
||
|
return rv_strdup(INFSTR, rve);
|
||
|
#endif
|
||
|
return rv_strdup("NaN", rve);
|
||
|
return rv_strdup(NANSTR, rve);
|
||
|
}
|
||
|
#endif
|
||
|
#ifdef IBM
|
||
| ... | ... | |
|
#endif
|
||
|
if (!dval(d)) {
|
||
|
*decpt = 1;
|
||
|
return rv_strdup("0", rve);
|
||
|
return rv_strdup(ZEROSTR, rve);
|
||
|
}
|
||
|
#ifdef SET_INEXACT
|
||
| ... | ... | |
|
#define DBL_MANH_SIZE 20
|
||
|
#define DBL_MANL_SIZE 32
|
||
|
#define INFSTR "Infinity"
|
||
|
#define NANSTR "NaN"
|
||
|
#define DBL_ADJ (DBL_MAX_EXP - 2)
|
||
|
#define SIGFIGS ((DBL_MANT_DIG + 3) / 4 + 1)
|
||
|
#define dexp_get(u) ((int)(word0(u) >> Exp_shift) & ~Exp_msk1)
|
||
| ... | ... | |
|
if (isinf(d)) { /* FP_INFINITE */
|
||
|
*decpt = INT_MAX;
|
||
|
return (nrv_alloc(INFSTR, rve, sizeof(INFSTR) - 1));
|
||
|
return (rv_strdup(INFSTR, rve));
|
||
|
}
|
||
|
else if (isnan(d)) { /* FP_NAN */
|
||
|
*decpt = INT_MAX;
|
||
|
return (nrv_alloc(NANSTR, rve, sizeof(NANSTR) - 1));
|
||
|
return (rv_strdup(NANSTR, rve));
|
||
|
}
|
||
|
else if (d == 0.0) { /* FP_ZERO */
|
||
|
*decpt = 1;
|
||
|
return (nrv_alloc("0", rve, 1));
|
||
|
return (rv_strdup(ZEROSTR, rve));
|
||
|
}
|
||
|
else if (dexp_get(u)) { /* FP_NORMAL */
|
||
|
*decpt = dexp_get(u) - DBL_ADJ;
|
||
- « Previous
- 1
- 2
- Next »