diff options
-rw-r--r-- | include/stdlib.h | 6 | ||||
-rw-r--r-- | lib/libc/Makefile | 7 | ||||
-rw-r--r-- | lib/libc/alpha/arith.h | 13 | ||||
-rw-r--r-- | lib/libc/alpha/stdlib/gdtoa.mk | 4 | ||||
-rw-r--r-- | lib/libc/amd64/arith.h | 8 | ||||
-rw-r--r-- | lib/libc/amd64/stdlib/gdtoa.mk | 5 | ||||
-rw-r--r-- | lib/libc/gdtoa/Makefile.inc | 16 | ||||
-rw-r--r-- | lib/libc/gdtoa/glue.c | 10 | ||||
-rw-r--r-- | lib/libc/gdtoa/machdep_ldisQ.c | 45 | ||||
-rw-r--r-- | lib/libc/gdtoa/machdep_ldisd.c | 43 | ||||
-rw-r--r-- | lib/libc/gdtoa/machdep_ldisx.c | 45 | ||||
-rw-r--r-- | lib/libc/i386/arith.h | 8 | ||||
-rw-r--r-- | lib/libc/i386/stdlib/gdtoa.mk | 5 | ||||
-rw-r--r-- | lib/libc/ia64/arith.h | 30 | ||||
-rw-r--r-- | lib/libc/ia64/stdlib/gdtoa.mk | 5 | ||||
-rw-r--r-- | lib/libc/powerpc/arith.h | 9 | ||||
-rw-r--r-- | lib/libc/powerpc/stdlib/gdtoa.mk | 5 | ||||
-rw-r--r-- | lib/libc/sparc64/arith.h | 12 | ||||
-rw-r--r-- | lib/libc/sparc64/stdlib/gdtoa.mk | 5 | ||||
-rw-r--r-- | lib/libc/stdio/vfprintf.c | 19 | ||||
-rw-r--r-- | lib/libc/stdlib/Makefile.inc | 2 |
21 files changed, 289 insertions, 13 deletions
diff --git a/include/stdlib.h b/include/stdlib.h index f7fd3a7..b553744 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -107,10 +107,10 @@ int rand(void); void *realloc(void *, size_t); void srand(unsigned); double strtod(const char * __restrict, char ** __restrict); -/* float strtof(const char * __restrict, char ** __restrict); */ +float strtof(const char * __restrict, char ** __restrict); long strtol(const char * __restrict, char ** __restrict, int); -/* long double - strtold(const char * __restrict, char ** __restrict); */ +long double + strtold(const char * __restrict, char ** __restrict); unsigned long strtoul(const char * __restrict, char ** __restrict, int); int system(const char *); diff --git a/lib/libc/Makefile b/lib/libc/Makefile index ae10f73..a6b8989 100644 --- a/lib/libc/Makefile +++ b/lib/libc/Makefile @@ -24,6 +24,13 @@ MDASM= MIASM= NOASM= +# XXX Pull in contrib/netlib/gdtoa, but keep the filenames local to +# gdtoa out of libc. +.PATH: ${.CURDIR}/../../contrib/netlib/gdtoa +.include "${.CURDIR}/gdtoa/Makefile.inc" +.PATH: +.PATH: ${.CURDIR}/gdtoa + # # If there is a machine dependent makefile, use it: # diff --git a/lib/libc/alpha/arith.h b/lib/libc/alpha/arith.h new file mode 100644 index 0000000..de6c33d --- /dev/null +++ b/lib/libc/alpha/arith.h @@ -0,0 +1,13 @@ +/* + * MD header for contrib/netlib/gdtoa + * + * $FreeBSD$ + */ + +#define IEEE_8087 +#define Arith_Kind_ASL 1 +#define Long int +#define Intcast (int)(long) +#define Double_Align +#define X64_bit_pointers +#define Sudden_Underflow diff --git a/lib/libc/alpha/stdlib/gdtoa.mk b/lib/libc/alpha/stdlib/gdtoa.mk new file mode 100644 index 0000000..c631f64 --- /dev/null +++ b/lib/libc/alpha/stdlib/gdtoa.mk @@ -0,0 +1,4 @@ +# $FreeBSD$ + +# On Alpha, long double is just double precision. +MDSRCS+=machdep_ldisd.c diff --git a/lib/libc/amd64/arith.h b/lib/libc/amd64/arith.h new file mode 100644 index 0000000..d1bcfb6 --- /dev/null +++ b/lib/libc/amd64/arith.h @@ -0,0 +1,8 @@ +/* + * MD header for contrib/gdtoa + * + * $FreeBSD$ + */ + +#define IEEE_8087 +#define Arith_Kind_ASL 1 diff --git a/lib/libc/amd64/stdlib/gdtoa.mk b/lib/libc/amd64/stdlib/gdtoa.mk new file mode 100644 index 0000000..50f2f0d --- /dev/null +++ b/lib/libc/amd64/stdlib/gdtoa.mk @@ -0,0 +1,5 @@ +# $FreeBSD$ + +# Long double is 80 bits +GDTOASRCS+=strtopx.c +MDSRCS+=machdep_ldisx.c diff --git a/lib/libc/gdtoa/Makefile.inc b/lib/libc/gdtoa/Makefile.inc new file mode 100644 index 0000000..c2c58e1 --- /dev/null +++ b/lib/libc/gdtoa/Makefile.inc @@ -0,0 +1,16 @@ +# $FreeBSD$ + +CFLAGS+=-I${.CURDIR}/../../contrib/gdtoa +MISRCS+=glue.c +GDTOASRCS=dmisc.c dtoa.c gdtoa.c gethex.c gmisc.c \ + hd_init.c hexnan.c misc.c smisc.c \ + strtoIg.c strtod.c strtodg.c strtof.c strtord.c sum.c ulp.c +.if exists(${.CURDIR}/${MACHINE_ARCH}/stdlib/gdtoa.mk) +.include "${.CURDIR}/${MACHINE_ARCH}/stdlib/gdtoa.mk" +.endif +.for src in ${GDTOASRCS} +MISRCS+=gdtoa_${src} +CLEANFILES+=gdtoa_${src} +gdtoa_${src}: + ln -sf ${.CURDIR}/../../contrib/gdtoa/${src} ${.TARGET} +.endfor diff --git a/lib/libc/gdtoa/glue.c b/lib/libc/gdtoa/glue.c new file mode 100644 index 0000000..b587412 --- /dev/null +++ b/lib/libc/gdtoa/glue.c @@ -0,0 +1,10 @@ +/* + * Machine-independent glue to integrate David Gay's gdtoa + * package into libc. + * + * $FreeBSD$ + */ + +#include "spinlock.h" + +spinlock_t __gdtoa_locks[2]; diff --git a/lib/libc/gdtoa/machdep_ldisQ.c b/lib/libc/gdtoa/machdep_ldisQ.c new file mode 100644 index 0000000..447b07f --- /dev/null +++ b/lib/libc/gdtoa/machdep_ldisQ.c @@ -0,0 +1,45 @@ +/*- + * Copyright (c) 2003 David Schultz <das@FreeBSD.ORG> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * 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. + */ + +/* + * Machine-dependent glue to integrate David Gay's gdtoa + * package into libc for architectures where a long double + * uses quad precision, such as sparc64. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include "gdtoaimp.h" + +long double +strtold(const char * __restrict s, char ** __restrict sp) +{ + long double result; + + strtopQ(s, sp, result); + return result; +} diff --git a/lib/libc/gdtoa/machdep_ldisd.c b/lib/libc/gdtoa/machdep_ldisd.c new file mode 100644 index 0000000..e2dbb60 --- /dev/null +++ b/lib/libc/gdtoa/machdep_ldisd.c @@ -0,0 +1,43 @@ +/*- + * Copyright (c) 2003 David Schultz <das@FreeBSD.ORG> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * 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. + */ + +/* + * Machine-dependent glue to integrate David Gay's gdtoa + * package into libc for architectures where a long double + * is the same as a double, such as the Alpha. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include "gdtoaimp.h" + +long double +strtold(const char * __restrict s, char ** __restrict sp) +{ + + return strtod(s, sp); +} diff --git a/lib/libc/gdtoa/machdep_ldisx.c b/lib/libc/gdtoa/machdep_ldisx.c new file mode 100644 index 0000000..1920c39 --- /dev/null +++ b/lib/libc/gdtoa/machdep_ldisx.c @@ -0,0 +1,45 @@ +/*- + * Copyright (c) 2003 David Schultz <das@FreeBSD.ORG> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * 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. + */ + +/* + * Machine-dependent glue to integrate David Gay's gdtoa + * package into libc for architectures where a long double + * is an IEEE extended precision number. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include "gdtoaimp.h" + +long double +strtold(const char * __restrict s, char ** __restrict sp) +{ + long double result; + + strtopx(s, sp, result); + return result; +} diff --git a/lib/libc/i386/arith.h b/lib/libc/i386/arith.h new file mode 100644 index 0000000..d1bcfb6 --- /dev/null +++ b/lib/libc/i386/arith.h @@ -0,0 +1,8 @@ +/* + * MD header for contrib/gdtoa + * + * $FreeBSD$ + */ + +#define IEEE_8087 +#define Arith_Kind_ASL 1 diff --git a/lib/libc/i386/stdlib/gdtoa.mk b/lib/libc/i386/stdlib/gdtoa.mk new file mode 100644 index 0000000..50f2f0d --- /dev/null +++ b/lib/libc/i386/stdlib/gdtoa.mk @@ -0,0 +1,5 @@ +# $FreeBSD$ + +# Long double is 80 bits +GDTOASRCS+=strtopx.c +MDSRCS+=machdep_ldisx.c diff --git a/lib/libc/ia64/arith.h b/lib/libc/ia64/arith.h new file mode 100644 index 0000000..9102826 --- /dev/null +++ b/lib/libc/ia64/arith.h @@ -0,0 +1,30 @@ +/* + * MD header for contrib/gdtoa + * + * $FreeBSD$ + */ + +#include <machine/endian.h> + +#if _BYTE_ORDER == _LITTLE_ENDIAN + +#define IEEE_8087 +#define Arith_Kind_ASL 1 +#define Long int +#define Intcast (int)(long) +#define Double_Align +#define X64_bit_pointers + +#else /* _BYTE_ORDER == _LITTLE_ENDIAN */ + +#define IEEE_MC68k +#define Arith_Kind_ASL 2 +#define Long int +#define Intcast (int)(long) +#define Double_Align +#define X64_bit_pointers +#ifdef gcc_bug /* XXX Why does arithchk report sudden underflow here? */ +#define Sudden_Underflow +#endif + +#endif diff --git a/lib/libc/ia64/stdlib/gdtoa.mk b/lib/libc/ia64/stdlib/gdtoa.mk new file mode 100644 index 0000000..50f2f0d --- /dev/null +++ b/lib/libc/ia64/stdlib/gdtoa.mk @@ -0,0 +1,5 @@ +# $FreeBSD$ + +# Long double is 80 bits +GDTOASRCS+=strtopx.c +MDSRCS+=machdep_ldisx.c diff --git a/lib/libc/powerpc/arith.h b/lib/libc/powerpc/arith.h new file mode 100644 index 0000000..9f4cfe4 --- /dev/null +++ b/lib/libc/powerpc/arith.h @@ -0,0 +1,9 @@ +/* + * MD header for contrib/gdtoa + * + * $FreeBSD$ + */ + +#define IEEE_MC68k +#define Arith_Kind_ASL 2 +#define Double_Align diff --git a/lib/libc/powerpc/stdlib/gdtoa.mk b/lib/libc/powerpc/stdlib/gdtoa.mk new file mode 100644 index 0000000..f951a8d --- /dev/null +++ b/lib/libc/powerpc/stdlib/gdtoa.mk @@ -0,0 +1,5 @@ +# $FreeBSD$ + +# Long double is quad precision +GDTOASRCS+=strtopQ.c +MDSRCS+=machdep_ldisQ.c diff --git a/lib/libc/sparc64/arith.h b/lib/libc/sparc64/arith.h new file mode 100644 index 0000000..c954a9c --- /dev/null +++ b/lib/libc/sparc64/arith.h @@ -0,0 +1,12 @@ +/* + * MD header for contrib/gdtoa + * + * $FreeBSD$ + */ + +#define IEEE_MC68k +#define Arith_Kind_ASL 2 +#define Long int +#define Intcast (int)(long) +#define Double_Align +#define X64_bit_pointers diff --git a/lib/libc/sparc64/stdlib/gdtoa.mk b/lib/libc/sparc64/stdlib/gdtoa.mk new file mode 100644 index 0000000..f951a8d --- /dev/null +++ b/lib/libc/sparc64/stdlib/gdtoa.mk @@ -0,0 +1,5 @@ +# $FreeBSD$ + +# Long double is quad precision +GDTOASRCS+=strtopQ.c +MDSRCS+=machdep_ldisQ.c diff --git a/lib/libc/stdio/vfprintf.c b/lib/libc/stdio/vfprintf.c index b0084c8..460d416 100644 --- a/lib/libc/stdio/vfprintf.c +++ b/lib/libc/stdio/vfprintf.c @@ -413,7 +413,10 @@ vfprintf(FILE * __restrict fp, const char * __restrict fmt0, va_list ap) #define BUF ((MAXEXP*2)+MAXFRACT+1) /* + decimal point */ #define DEFPREC 6 -static char *cvt(double, int, int, char *, int *, int, int *, char **); +extern char *__dtoa(double, int, int, int *, int *, char **); +extern void __freedtoa(char *s); + +static char *cvt(double, int, int, char *, int *, int, int *); static int exponent(char *, int, int); #else /* no FLOATING_POINT */ @@ -840,11 +843,11 @@ fp_begin: if (prec == -1) } flags |= FPT; if (dtoaresult != NULL) { - free(dtoaresult); + __freedtoa(dtoaresult); dtoaresult = NULL; } - cp = cvt(_double, prec, flags, &softsign, - &expt, ch, &ndig, &dtoaresult); + dtoaresult = cp = cvt(_double, prec, flags, &softsign, + &expt, ch, &ndig); if (ch == 'g' || ch == 'G') { if (expt <= -4 || expt > prec) ch = (ch == 'g') ? 'e' : 'E'; @@ -1138,7 +1141,7 @@ done: error: #ifdef FLOATING_POINT if (dtoaresult != NULL) - free(dtoaresult); + __freedtoa(dtoaresult); #endif if (convbuf != NULL) free(convbuf); @@ -1508,11 +1511,9 @@ __grow_type_table (int nextarg, enum typeid **typetable, int *tablesize) #ifdef FLOATING_POINT -extern char *__dtoa(double, int, int, int *, int *, char **, char **); - static char * cvt(double value, int ndigits, int flags, char *sign, int *decpt, - int ch, int *length, char **dtoaresultp) + int ch, int *length) { int mode, dsgn; char *digits, *bp, *rve; @@ -1529,7 +1530,7 @@ cvt(double value, int ndigits, int flags, char *sign, int *decpt, ndigits++; mode = 2; /* ndigits significant digits */ } - digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve, dtoaresultp); + digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve); *sign = dsgn != 0; if ((ch != 'g' && ch != 'G') || flags & ALT) { /* print trailing zeros */ diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc index 92c3d29..265aae1 100644 --- a/lib/libc/stdlib/Makefile.inc +++ b/lib/libc/stdlib/Makefile.inc @@ -9,7 +9,7 @@ MISRCS+=_Exit.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \ getsubopt.c grantpt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c \ insque.c labs.c ldiv.c llabs.c lldiv.c lsearch.c malloc.c merge.c \ putenv.c qsort.c qsort_r.c radixsort.c rand.c random.c reallocf.c \ - realpath.c remque.c setenv.c strfmon.c strhash.c strtod.c strtoimax.c \ + realpath.c remque.c setenv.c strfmon.c strhash.c strtoimax.c \ strtol.c strtoll.c strtoq.c strtoul.c strtoull.c strtoumax.c strtouq.c \ system.c tdelete.c tfind.c tsearch.c twalk.c |