Project

General

Profile

Bug #3700 » util.c.patch

util.c patch - pweldon (Peter Weldon), 08/16/2010 01:38 PM

View differences:

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;
(2-2/2)