Loading...
--- Libc/Libc-186/stdlib.subproj/strtod.c
+++ Libc/Libc-167/stdlib.subproj/strtod.c
@@ -386,7 +386,7 @@
#ifdef __cplusplus
extern "C" double strtod(const char *s00, char **se);
extern "C" char *__dtoa(double d, int mode, int ndigits,
- int *decpt, int *sign, char **rve, char **resultp);
+ int *decpt, int *sign, char **rve);
#endif
struct
@@ -398,6 +398,8 @@
typedef struct Bigint Bigint;
+ static Bigint *freelist[Kmax+1];
+
static Bigint *
Balloc
#ifdef KR_headers
@@ -409,13 +411,18 @@
int x;
Bigint *rv;
- x = 1 << k;
- rv = (Bigint *)malloc(sizeof(Bigint) + (x-1)*sizeof(Long));
- rv->k = k;
- rv->maxwds = x;
+ if (rv = freelist[k]) {
+ freelist[k] = rv->next;
+ }
+ else {
+ x = 1 << k;
+ rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long));
+ rv->k = k;
+ rv->maxwds = x;
+ }
rv->sign = rv->wds = 0;
return rv;
-}
+ }
static void
Bfree
@@ -425,8 +432,11 @@
(Bigint *v)
#endif
{
- free(v);
-}
+ if (v) {
+ v->next = freelist[v->k];
+ freelist[v->k] = v;
+ }
+ }
#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
y->wds*sizeof(Long) + 2*sizeof(int))
@@ -1906,9 +1916,9 @@
__dtoa
#ifdef KR_headers
(d, mode, ndigits, decpt, sign, rve)
- double d; int mode, ndigits, *decpt, *sign; char **rve, char **resultp;
-#else
- (double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
+ double d; int mode, ndigits, *decpt, *sign; char **rve;
+#else
+ (double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
#endif
{
/* Arguments ndigits, decpt, sign are similar to those
@@ -1956,6 +1966,15 @@
Bigint *b, *b1, *delta, *mlo, *mhi, *S;
double d2, ds, eps;
char *s, *s0;
+ static Bigint *result;
+ static int result_k;
+
+ if (result) {
+ result->k = result_k;
+ result->maxwds = 1 << result_k;
+ Bfree(result);
+ result = 0;
+ }
if (word0(d) & Sign_bit) {
/* set sign for everything, including 0's and NaNs */
@@ -2117,8 +2136,11 @@
if (i <= 0)
i = 1;
}
- *resultp = (char *) malloc(i + 1);
- s = s0 = *resultp;
+ j = sizeof(ULong);
+ for(result_k = 0; sizeof(Bigint) - sizeof(ULong) + j <= i;
+ j <<= 1) result_k++;
+ result = Balloc(result_k);
+ s = s0 = (char *)result;
if (ilim >= 0 && ilim <= Quick_max && try_quick) {