Loading...
stdlib.subproj/strtod.c Libc-186 Libc-167
--- 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) {