summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/Makefile7
-rw-r--r--lib/libc/alpha/arith.h13
-rw-r--r--lib/libc/alpha/stdlib/gdtoa.mk4
-rw-r--r--lib/libc/amd64/arith.h8
-rw-r--r--lib/libc/amd64/stdlib/gdtoa.mk5
-rw-r--r--lib/libc/gdtoa/Makefile.inc16
-rw-r--r--lib/libc/gdtoa/glue.c10
-rw-r--r--lib/libc/gdtoa/machdep_ldisQ.c45
-rw-r--r--lib/libc/gdtoa/machdep_ldisd.c43
-rw-r--r--lib/libc/gdtoa/machdep_ldisx.c45
-rw-r--r--lib/libc/i386/arith.h8
-rw-r--r--lib/libc/i386/stdlib/gdtoa.mk5
-rw-r--r--lib/libc/ia64/arith.h30
-rw-r--r--lib/libc/ia64/stdlib/gdtoa.mk5
-rw-r--r--lib/libc/powerpc/arith.h9
-rw-r--r--lib/libc/powerpc/stdlib/gdtoa.mk5
-rw-r--r--lib/libc/sparc64/arith.h12
-rw-r--r--lib/libc/sparc64/stdlib/gdtoa.mk5
-rw-r--r--lib/libc/stdio/vfprintf.c19
-rw-r--r--lib/libc/stdlib/Makefile.inc2
20 files changed, 286 insertions, 10 deletions
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
OpenPOWER on IntegriCloud