diff options
Diffstat (limited to 'lib/libc')
| -rw-r--r-- | lib/libc/stdio/vfprintf.c | 24 | ||||
| -rw-r--r-- | lib/libc/stdlib/netbsd_strtod.c | 45 | ||||
| -rw-r--r-- | lib/libc/stdlib/strtod.c | 44 | 
3 files changed, 44 insertions, 69 deletions
| diff --git a/lib/libc/stdio/vfprintf.c b/lib/libc/stdio/vfprintf.c index f8eb9ca3a981..5d588d5de6bd 100644 --- a/lib/libc/stdio/vfprintf.c +++ b/lib/libc/stdio/vfprintf.c @@ -264,7 +264,7 @@ __uqtoa(val, endp, base, octzero, xdigs)  #define	BUF		(MAXEXP+MAXFRACT+1)	/* + decimal point */  #define	DEFPREC		6 -static char *cvt __P((double, int, int, char *, int *, int, int *)); +static char *cvt __P((double, int, int, char *, int *, int, int *, char **));  static int exponent __P((char *, int, int));  #else /* no FLOATING_POINT */ @@ -310,6 +310,7 @@ vfprintf(fp, fmt0, ap)  	int expsize;		/* character count for expstr */  	int ndig;		/* actual number of digits returned by cvt */  	char expstr[7];		/* buffer for exponent string */ +	char *dtoaresult;	/* buffer allocated by dtoa */  #endif  	u_long	ulval;		/* integer arguments %[diouxX] */  	u_quad_t uqval;		/* %q integers */ @@ -418,6 +419,9 @@ vfprintf(fp, fmt0, ap)          } +#ifdef FLOATING_POINT +	dtoaresult = NULL; +#endif  	FLOCKFILE(fp);  	/* sorry, fprintf(read_only_file, "") returns EOF, not 0 */  	if (cantwrite(fp)) { @@ -608,8 +612,12 @@ fp_begin:		if (prec == -1)  				break;  			}  			flags |= FPT; +			if (dtoaresult != NULL) { +				free(dtoaresult); +				dtoaresult = NULL; +			}  			cp = cvt(_double, prec, flags, &softsign, -				&expt, ch, &ndig); +				&expt, ch, &ndig, &dtoaresult);  			if (ch == 'g' || ch == 'G') {  				if (expt <= -4 || expt > prec)  					ch = (ch == 'g') ? 'e' : 'E'; @@ -865,6 +873,10 @@ number:			if ((dprec = prec) >= 0)  done:  	FLUSH();  error: +#ifdef FLOATING_POINT +	if (dtoaresult != NULL) +		free(dtoaresult); +#endif  	if (__sferror(fp))  		ret = EOF;  	FUNLOCKFILE(fp); @@ -1203,13 +1215,14 @@ __grow_type_table (nextarg, typetable, tablesize)  #ifdef FLOATING_POINT -extern char *__dtoa __P((double, int, int, int *, int *, char **)); +extern char *__dtoa __P((double, int, int, int *, int *, char **, char **));  static char * -cvt(value, ndigits, flags, sign, decpt, ch, length) +cvt(value, ndigits, flags, sign, decpt, ch, length, dtoaresultp)  	double value;  	int ndigits, flags, *decpt, ch, *length;  	char *sign; +	char **dtoaresultp;  {  	int mode, dsgn;  	char *digits, *bp, *rve; @@ -1231,7 +1244,8 @@ cvt(value, ndigits, flags, sign, decpt, ch, length)  		*sign = '-';  	} else  		*sign = '\000'; -	digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve); +	digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve, +			dtoaresultp);  	if ((ch != 'g' && ch != 'G') || flags & ALT) {  		/* print trailing zeros */  		bp = digits + ndigits; diff --git a/lib/libc/stdlib/netbsd_strtod.c b/lib/libc/stdlib/netbsd_strtod.c index a402b688f0cf..b48f8279662c 100644 --- a/lib/libc/stdlib/netbsd_strtod.c +++ b/lib/libc/stdlib/netbsd_strtod.c @@ -142,7 +142,7 @@ __RCSID("$NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp $");  #include "memory.h"  #endif  #endif -char *__dtoa __P((double, int, int, int *, int *, char **)); +char *__dtoa __P((double, int, int, int *, int *, char **, char **));  #ifdef MALLOC  #ifdef KR_headers @@ -382,8 +382,6 @@ Bigint {   typedef struct Bigint Bigint; - static Bigint *freelist[Kmax+1]; -   static Bigint *  Balloc  #ifdef KR_headers @@ -395,15 +393,10 @@ Balloc  	int x;  	Bigint *rv; -	if ((rv = freelist[k]) != NULL) { -		freelist[k] = rv->next; -		} -	else { -		x = 1 << k; -		rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long)); -		rv->k = k; -		rv->maxwds = x; -		} +	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;  	} @@ -416,10 +409,7 @@ Bfree  	(Bigint *v)  #endif  { -	if (v) { -		v->next = freelist[v->k]; -		freelist[v->k] = v; -		} +	free(v);  	}  #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ @@ -1900,10 +1890,11 @@ quorem   char *  __dtoa  #ifdef KR_headers -	(d, mode, ndigits, decpt, sign, rve) -	double d; int mode, ndigits, *decpt, *sign; char **rve; +	(d, mode, ndigits, decpt, sign, rve, resultp) +	double d; int mode, ndigits, *decpt, *sign; char **rve, **resultp;  #else -	(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) +	(double d, int mode, int ndigits, int *decpt, int *sign, char **rve, +	 char **resultp)  #endif  {   /*	Arguments ndigits, decpt, sign are similar to those @@ -1953,15 +1944,6 @@ __dtoa  	Bigint *mlo = NULL; /* pacify gcc */  	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 */ @@ -2123,11 +2105,8 @@ __dtoa  			if (i <= 0)  				i = 1;  		} -	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; +	*resultp = (char *) malloc(i + 1); +	s = s0 = *resultp;  	if (ilim >= 0 && ilim <= Quick_max && try_quick) { diff --git a/lib/libc/stdlib/strtod.c b/lib/libc/stdlib/strtod.c index 27fb49985f94..361100c99cb6 100644 --- a/lib/libc/stdlib/strtod.c +++ b/lib/libc/stdlib/strtod.c @@ -29,6 +29,8 @@   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF   * SUCH DAMAGE. + * + * $FreeBSD$   */  #if defined(LIBC_SCCS) && !defined(lint) @@ -369,8 +371,6 @@ Bigint {   typedef struct Bigint Bigint; - static Bigint *freelist[Kmax+1]; -   static Bigint *  Balloc  #ifdef KR_headers @@ -382,14 +382,10 @@ Balloc  	int x;  	Bigint *rv; -	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; -	} +	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;  } @@ -402,10 +398,7 @@ Bfree  	(Bigint *v)  #endif  { -	if (v) { -		v->next = freelist[v->k]; -		freelist[v->k] = v; -	} +	free(v);  }  #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ @@ -1839,10 +1832,11 @@ quorem  char *  __dtoa  #ifdef KR_headers -	(d, mode, ndigits, decpt, sign, rve) -	double d; int mode, ndigits, *decpt, *sign; char **rve; +	(d, mode, ndigits, decpt, sign, rve, resultp) +	double d; int mode, ndigits, *decpt, *sign; char **rve, **resultp;  #else -	(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) +	(double d, int mode, int ndigits, int *decpt, int *sign, char **rve, +	 char **resultp)  #endif  {   /*	Arguments ndigits, decpt, sign are similar to those @@ -1890,15 +1884,6 @@ __dtoa  	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 */ @@ -2057,11 +2042,8 @@ __dtoa  			if (i <= 0)  				i = 1;  	} -	j = sizeof(unsigned long); -	for (result_k = 0; sizeof(Bigint) - sizeof(unsigned long) + j < i; -		j <<= 1) result_k++; -	result = Balloc(result_k); -	s = s0 = (char *)result; +	*resultp = (char *) malloc(i + 1); +	s = s0 = *resultp;  	if (ilim >= 0 && ilim <= Quick_max && try_quick) { | 
