diff options
51 files changed, 1051 insertions, 377 deletions
@@ -1,3 +1,117 @@ +1997-04-02 16:28 Ulrich Drepper <drepper@cygnus.com> + + * grp/fgetgrent.c: Don't use fixed buffer length. Allow dynamic + adjustment if the underlying function say it is too small. + * pwd/fgetpwent.c: Likewise. + * shadow/fgetspent.c: Likewise. + * shadow/sgetspent.c: Likewise. + + * grp/fgetgrent_r.c (__fgetgrent_r): If `parse_result' returns -1 + this means there was not enough room for the gr_mem array. + + * nss/nss_files/files-XXX.c: Leave loop and return error if + `parse_result' returns -1. + + * nss/nss_files/files-parse.c (parse_line): Return -1 if parsing + of trailing list fails because of low memory. + (parse_list): Rewrite. The logic was completly incorrect since + the checks for overflowing the array were not executed when + needed. + + * shadow/sgetspent_r.c: Only a return value > 0 from parse_line + signals success. + + * nss/getXXbyYY.c: Make sure NULL is returned if we ran out of memory. + * nss/getXXent.c: Likewise. + + * stdlib/strtod.c (SET_MANTISSA): Make sure that at least one bit + is set in mantissa. + * stdlib/strtof.c: Likewise. + * stdlib/strtold.c: Likewise. + * wcsmbs/wcstof.c: Likewise. + * wcsmbs/wcstold.c: Likewise. + + * sysdeps/libm-ieee754/s_nan.c: Use strtod is parameter is not empty + string. + * sysdeps/libm-ieee754/s_nanf.c: Likewise. + * sysdeps/libm-ieee754/s_nanld.c: Likewise. + +1997-04-02 13:56 Ulrich Drepper <drepper@cygnus.com> + + * manual/errno.texi: Add description of strerror_r. + +1997-04-01 19:07 H.J. Lu (hjl@gnu.ai.mit.edu) + + * manual/errno.texi: Add ENOMEDIUM and EMEDIUMTYPE. + +1997-04-02 13:55 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/gnu/errlist.awk: The Texinfo file is named errno.texi. + +1997-03-30 10:59 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/m68k/fpu/s_cexp.c: New file. + * sysdeps/m68k/fpu/s_cexpf.c: New file. + * sysdeps/m68k/fpu/s_cexpl.c: New file. + * sysdeps/m68k/fpu/s_nearbyint.c: New file. + * sysdeps/m68k/fpu/s_nearbyintf.c: New file. + * sysdeps/m68k/fpu/s_nearbyintl.c: New file. + * sysdeps/m68k/fpu/s_trunc.c: New file. + * sysdeps/m68k/fpu/s_truncf.c: New file. + * sysdeps/m68k/fpu/s_truncl.c: New file. + + * sysdeps/m68k/fpu/s_modf.c: Rewritten. + * sysdeps/m68k/fpu/s_modff.c: Adapted. + * sysdeps/m68k/fpu/s_modfl.c: Likewise. + + * sysdeps/m68k/fpu/e_atan2.c: Use __signbit inline. + * sysdeps/m68k/fpu/e_pow.c: Likewise. Write 0.0/0.0 for NaN. Fix + typo in test for `y = 0.5'. + + * sysdeps/m68k/fpu/__math.h: Define __trunc, __signbit, + __nearbyint. Remove __modf. + + * sysdeps/m68k/Makefile (CFLAGS-s_copysignl.c) [$(subdir)=math]: + Define for gcc bug workaround. + + * math/libm-test.c (log2_test): Add epsilon for long double to + "log2 (e)" and "log2 (16)". + (modf_test): Fix test name. + (sqrt_test): Add missing FUNC. + +1997-03-29 16:24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sunrpc/Makefile (CFLAGS-xrquota.c): Fix typo in variable name. + +1997-03-28 20:56 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * stdlib/stdlib.h: Declare __clearenv. + +1997-03-28 18:03 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/libm-ieee754/s_asinhl.c: Fix Ulrich Dreppers mangling of + the last change. + +1997-03-28 17:55 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * configure.in: Call AC_CANONICAL_BUILD before referencing + $build. Fix test for BUILD_CC. + +1997-04-02 01:29 Philip Blundell <pjb27@cam.ac.uk> + + * sysdeps/libm-ieee754/s_log2f.c (__log2f): Fix typo. + +1997-03-31 18:53 Philip Blundell <pjb27@cam.ac.uk> + + * sysdeps/unix/sysv/linux/net/route.h: Add new IPv6 definitions. + +1997-04-01 14:08 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/i386/memset.c: Fix typo. + * sysdeps/stub/fchmod.c: Fix typo. + * sysdeps/stub/fchdir.c: Fix typo. + Reported by Fila Kolodny <fila@ibi.com>. + 1997-04-01 00:37 Ulrich Drepper <drepper@cygnus.com> * math/Makefile: Prevent inlining for test-{float,double,longdouble}. @@ -77,6 +77,13 @@ please let me know. [Q21] ``On Linux I've got problems with the declarations in Linux kernel headers.'' + +[Q22] ``When I try to compile code which uses IPv6 header and + definitions on my Linux 2.x.y system I am in trouble. + Nothing seems to work.'' + +[Q23] ``When compiling GNU libc I get lots of errors saying functions + in glibc are duplicated in libgcc.'' ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ [Q1] ``What systems does the GNU C Library run on?'' @@ -637,6 +644,37 @@ results because of type conflicts. ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +[Q22] ``When I try to compile code which uses IPv6 header and + definitions on my Linux 2.x.y system I am in trouble. + Nothing seems to work.'' + +[A22] {UD} The problem is that the IPv6 development still has not reached +a point where it is stable. There are still lots of incompatible changes +made and the libc headers have to follow. + +Currently (as of 970401) according to Philip Blundell <pjb27@cam.ac.uk> +the required kernel version is 2.1.30. + + +~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +[Q23] ``When compiling GNU libc I get lots of errors saying functions + in glibc are duplicated in libgcc.'' + +[A23] {EY} This is *exactly* the same problem that I was having. The +problem was due to the fact that the autoconfigure didn't correctly +detect that linker flag --no-whole-archive was supported in my linker. +In my case it was because I had run ./configure with bogus CFLAGS, and +the test failed. + +One thing that is particularly annoying about this problem is that +once this is misdetected, running configure again won't fix it unless +you first delete config.cache. + +{UD} Starting with glibc-2.0.3 there should be a better test to avoid +some problems of this kind. The setting of CFLAGS is checked at the +very beginning and if it is not usable `configure' will bark. + +~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Answers were given by: {UD} Ulrich Drepper, <drepper@cygnus.com> @@ -644,6 +682,7 @@ Answers were given by: {RM} Roland McGrath, <roland@gnu.ai.mit.edu> {HJL} H.J. Lu, <hjl@gnu.ai.mit.edu> {AJ} Andreas Jaeger, <aj@arthur.pfalz.de> +{EY} Eric Youngdale, <eric@andante.jic.com> Local Variables: mode:text @@ -1290,11 +1290,31 @@ else test "${CFLAGS+set}" = set || CFLAGS="-g" fi +echo $ac_n "checking build system type""... $ac_c" 1>&6 +echo "configure:1295: checking build system type" >&5 + +build_alias=$build +case "$build_alias" in +NONE) + case $nonopt in + NONE) build_alias=$host_alias ;; + *) build_alias=$nonopt ;; + esac ;; +esac + +build=`$ac_config_sub $build_alias` +build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$build" 1>&6 + if test $host != $build; then - # Extract the first word of "gcc cc", so it can be a program name with args. -set dummy gcc cc; ac_word=$2 + for ac_prog in gcc cc +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1298: checking for $ac_word" >&5 +echo "configure:1318: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1305,7 +1325,7 @@ else for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then - ac_cv_prog_BUILD_CC="" + ac_cv_prog_BUILD_CC="$ac_prog" break fi done @@ -1319,9 +1339,12 @@ else echo "$ac_t""no" 1>&6 fi +test -n "$BUILD_CC" && break +done + fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1325: checking how to run the C preprocessor" >&5 +echo "configure:1348: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1336,13 +1359,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext <<EOF -#line 1340 "configure" +#line 1363 "configure" #include "confdefs.h" #include <assert.h> Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1346: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1369: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1353,13 +1376,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext <<EOF -#line 1357 "configure" +#line 1380 "configure" #include "confdefs.h" #include <assert.h> Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1363: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1386: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1381,24 +1404,6 @@ else fi echo "$ac_t""$CPP" 1>&6 -echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:1386: checking build system type" >&5 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`$ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - if test $host != $build; then ac_tool_prefix=${host_alias}- else @@ -1408,7 +1413,7 @@ fi # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1412: checking for $ac_word" >&5 +echo "configure:1417: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1439,7 +1444,7 @@ fi # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1443: checking for $ac_word" >&5 +echo "configure:1448: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1470,7 +1475,7 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1474: checking for $ac_word" >&5 +echo "configure:1479: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1505,7 +1510,7 @@ fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1509: checking for $ac_word" >&5 +echo "configure:1514: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1546,7 +1551,7 @@ if test "$BASH" = no; then # Extract the first word of "ksh", so it can be a program name with args. set dummy ksh; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1550: checking for $ac_word" >&5 +echo "configure:1555: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1588,7 +1593,7 @@ fi echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6 -echo "configure:1592: checking for signed size_t type" >&5 +echo "configure:1597: checking for signed size_t type" >&5 if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1612,12 +1617,12 @@ EOF fi echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6 -echo "configure:1616: checking for libc-friendly stddef.h" >&5 +echo "configure:1621: checking for libc-friendly stddef.h" >&5 if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1621 "configure" +#line 1626 "configure" #include "confdefs.h" #define __need_size_t #define __need_wchar_t @@ -1632,7 +1637,7 @@ size_t size; wchar_t wchar; if (&size == NULL || &wchar == NULL) abort (); ; return 0; } EOF -if { (eval echo configure:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1641: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_friendly_stddef=yes else @@ -1651,7 +1656,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly." fi echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6 -echo "configure:1655: checking whether we need to use -P to assemble .S files" >&5 +echo "configure:1660: checking whether we need to use -P to assemble .S files" >&5 if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1674,7 +1679,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives." fi echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6 -echo "configure:1678: checking for assembler global-symbol directive" >&5 +echo "configure:1683: checking for assembler global-symbol directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1704,7 +1709,7 @@ EOF fi echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6 -echo "configure:1708: checking for .set assembler directive" >&5 +echo "configure:1713: checking for .set assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1738,7 +1743,7 @@ EOF fi echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6 -echo "configure:1742: checking for .symver assembler directive" >&5 +echo "configure:1747: checking for .symver assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_symver_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1757,7 +1762,7 @@ fi echo "$ac_t""$libc_cv_asm_symver_directive" 1>&6 echo $ac_n "checking for ld --version-script""... $ac_c" 1>&6 -echo "configure:1761: checking for ld --version-script" >&5 +echo "configure:1766: checking for ld --version-script" >&5 if eval "test \"`echo '$''{'libc_cv_ld_version_script_option'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1774,7 +1779,7 @@ VERS { EOF if ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.s 1>&5 2>&5; then if { ac_try='${CC-cc} $CFLAGS --shared -o conftest.so conftest.o - -Wl,--version-script,conftest.map'; { (eval echo configure:1778: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; + -Wl,--version-script,conftest.map'; { (eval echo configure:1783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_version_script_option=yes else @@ -1804,7 +1809,7 @@ fi if test $elf = yes; then echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6 -echo "configure:1808: checking for .previous assembler directive" >&5 +echo "configure:1813: checking for .previous assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1812,7 +1817,7 @@ else .section foo_section .previous EOF - if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1816: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1821: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_asm_previous_directive=yes else libc_cv_asm_previous_directive=no @@ -1828,7 +1833,7 @@ EOF else echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6 -echo "configure:1832: checking for .popsection assembler directive" >&5 +echo "configure:1837: checking for .popsection assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1836,7 +1841,7 @@ else .pushsection foo_section .popsection EOF - if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1845: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_asm_popsection_directive=yes else libc_cv_asm_popsection_directive=no @@ -1856,12 +1861,12 @@ fi if test $elf != yes; then echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6 -echo "configure:1860: checking for .init and .fini sections" >&5 +echo "configure:1865: checking for .init and .fini sections" >&5 if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1865 "configure" +#line 1870 "configure" #include "confdefs.h" int main() { @@ -1870,7 +1875,7 @@ asm (".section .init"); asm (".text"); ; return 0; } EOF -if { (eval echo configure:1874: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1879: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_have_initfini=yes else @@ -1895,19 +1900,19 @@ if test $elf = yes; then libc_cv_asm_underscores=no else echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 -echo "configure:1899: checking for _ prefix on C symbol names" >&5 +echo "configure:1904: checking for _ prefix on C symbol names" >&5 if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1904 "configure" +#line 1909 "configure" #include "confdefs.h" asm ("_glibc_foobar:"); int main() { glibc_foobar (); ; return 0; } EOF -if { (eval echo configure:1911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* libc_cv_asm_underscores=yes else @@ -1934,7 +1939,7 @@ if test $elf = yes; then libc_cv_asm_weakext_directive=no else echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6 -echo "configure:1938: checking for assembler .weak directive" >&5 +echo "configure:1943: checking for assembler .weak directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1957,7 +1962,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6 if test $libc_cv_asm_weak_directive = no; then echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6 -echo "configure:1961: checking for assembler .weakext directive" >&5 +echo "configure:1966: checking for assembler .weakext directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1994,7 +1999,7 @@ EOF fi echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6 -echo "configure:1998: checking for ld --no-whole-archive" >&5 +echo "configure:2003: checking for ld --no-whole-archive" >&5 if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2005,7 +2010,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -Wl,--no-whole-archive - -o conftest conftest.c'; { (eval echo configure:2009: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c'; { (eval echo configure:2014: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_no_whole_archive=yes else libc_cv_ld_no_whole_archive=no @@ -2016,7 +2021,7 @@ fi echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6 -echo "configure:2020: checking for gcc -fno-exceptions" >&5 +echo "configure:2025: checking for gcc -fno-exceptions" >&5 if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2027,7 +2032,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -fno-exceptions - -o conftest conftest.c'; { (eval echo configure:2031: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c'; { (eval echo configure:2036: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_gcc_no_exceptions=yes else libc_cv_gcc_no_exceptions=no @@ -2079,7 +2084,7 @@ if test "$uname" = generic; then fi echo $ac_n "checking OS release for uname""... $ac_c" 1>&6 -echo "configure:2083: checking OS release for uname" >&5 +echo "configure:2088: checking OS release for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2101,7 +2106,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6 uname_release="$libc_cv_uname_release" echo $ac_n "checking OS version for uname""... $ac_c" 1>&6 -echo "configure:2105: checking OS version for uname" >&5 +echo "configure:2110: checking OS version for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2123,7 +2128,7 @@ else fi echo $ac_n "checking stdio selection""... $ac_c" 1>&6 -echo "configure:2127: checking stdio selection" >&5 +echo "configure:2132: checking stdio selection" >&5 case $stdio in libio) cat >> confdefs.h <<\EOF @@ -2329,13 +2334,13 @@ s%@INSTALL_DATA@%$INSTALL_DATA%g s%@LN_S@%$LN_S%g s%@MSGFMT@%$MSGFMT%g s%@CC@%$CC%g -s%@BUILD_CC@%$BUILD_CC%g -s%@CPP@%$CPP%g s%@build@%$build%g s%@build_alias@%$build_alias%g s%@build_cpu@%$build_cpu%g s%@build_vendor@%$build_vendor%g s%@build_os@%$build_os%g +s%@BUILD_CC@%$BUILD_CC%g +s%@CPP@%$CPP%g s%@AR@%$AR%g s%@RANLIB@%$RANLIB%g s%@BASH@%$BASH%g diff --git a/configure.in b/configure.in index 1cf1290..3a0f1a2 100644 --- a/configure.in +++ b/configure.in @@ -360,8 +360,9 @@ AC_PROG_LN_S AC_CHECK_PROGS(MSGFMT, msgfmt gmsgfmt, :) AC_PROG_CC +AC_CANONICAL_BUILD if test $host != $build; then - AC_CHECK_PROG(BUILD_CC, gcc cc) + AC_CHECK_PROGS(BUILD_CC, gcc cc) fi AC_PROG_CPP AC_CHECK_TOOL(AR, ar) diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c index 9873ba1..0b461ad 100644 --- a/grp/fgetgrent.c +++ b/grp/fgetgrent.c @@ -16,20 +16,60 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <errno.h> #include <grp.h> -#include <stdio.h> +#include <libc-lock.h> +#include <stdlib.h> +/* We need to protect the dynamic buffer handling. */ +__libc_lock_define_initialized (static, lock); + /* Read one entry from the given stream. */ struct group * fgetgrent (FILE *stream) { - static char buffer[BUFSIZ]; + static char *buffer; + static size_t buffer_size; static struct group resbuf; struct group *result; + int save; + + /* Get lock. */ + __libc_lock_lock (lock); + + /* Allocate buffer if not yet available. */ + if (buffer == NULL) + { + buffer_size = NSS_BUFLEN_GROUP; + buffer = malloc (buffer_size); + } + + while (buffer != NULL + && __fgetgrent_r (stream, &resbuf, buffer, buffer_size, &result) != 0 + && errno == ERANGE) + { + char *new_buf; + buffer_size += NSS_BUFLEN_GROUP; + new_buf = realloc (buffer, buffer_size); + if (new_buf == NULL) + { + /* We are out of memory. Free the current buffer so that the + process gets a chance for a normal termination. */ + save = errno; + free (buffer); + __set_errno (save); + } + buffer = new_buf; + } + + if (buffer == NULL) + result = NULL; - if (__fgetgrent_r (stream, &resbuf, buffer, sizeof buffer, &result) != 0) - return NULL; + /* Release lock. Preserve error value. */ + save = errno; + __libc_lock_unlock (lock); + __set_errno (save); return result; } diff --git a/grp/fgetgrent_r.c b/grp/fgetgrent_r.c index dd74cfc..44298c5 100644 --- a/grp/fgetgrent_r.c +++ b/grp/fgetgrent_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -56,6 +56,7 @@ __fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen, struct group **result) { char *p; + int parse_result; do { @@ -69,10 +70,18 @@ __fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen, /* Skip leading blanks. */ while (isspace (*p)) ++p; - } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ + } while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ /* Parse the line. If it is invalid, loop to get the next line of the file to parse. */ - ! parse_line (p, resbuf, (void *) buffer, buflen)); + || ! (parse_result = parse_line (p, resbuf, + (void *) buffer, buflen))); + + if (parse_result == -1) + { + /* The parser ran out of space. */ + *result = NULL; + return errno; + } *result = resbuf; return 0; diff --git a/manual/errno.texi b/manual/errno.texi index e346dd5..bba8208 100644 --- a/manual/errno.texi +++ b/manual/errno.texi @@ -1186,6 +1186,18 @@ They are not yet documented.} @comment errno ???/121 @end deftypevr +@comment errno.h +@comment Linux???: No medium found +@deftypevr Macro int ENOMEDIUM +@comment errno ???/??? +@end deftypevr + +@comment errno.h +@comment Linux???: Wrong medium type +@deftypevr Macro int EMEDIUMTYPE +@comment errno ???/??? +@end deftypevr + @node Error Messages, , Error Codes, Error Reporting @section Error Messages @@ -1214,6 +1226,25 @@ overwritten. (But it's guaranteed that no library function ever calls The function @code{strerror} is declared in @file{string.h}. @end deftypefun +@comment string.h +@comment GNU +@deftypefun {char *} strerror_r (int @var{errnum}, char *@var{buf}, size_t @var{n}) +The @code{strerror_r} function works like @code{strerror} but instead of +returning the error message in a statically allocated buffer shared by +all threads in the process, it writes the message string in the user +supplied buffer starting at @var{buf} with the length of @var{n} bytes. + +At most @var{n} characters are written (including the NUL byte) so it is +up to the user to select the buffer large enough. + +This function should always be used in multi-threaded programs since +there is no way to guarantee the string returned by @code{strerror} +really belongs to the last call of the current thread. + +This function @code{strerror_r} is a GNU extension and it is declared in +@file{string.h}. +@end deftypefun + @comment stdio.h @comment ISO @deftypefun void perror (const char *@var{message}) diff --git a/math/libm-test.c b/math/libm-test.c index 1271177..a7a53cb 100644 --- a/math/libm-test.c +++ b/math/libm-test.c @@ -901,9 +901,10 @@ log2_test (void) check_isinfp ("log2 (+inf) == +inf", FUNC(log2) (plus_infty)); - check ("log2 (e) == M_LOG2E", FUNC(log2) (M_E), M_LOG2E); + check_eps ("log2 (e) == M_LOG2E", FUNC(log2) (M_E), M_LOG2E, + CHOOSE (1e-18L, 0, 0)); check ("log2 (2) == 1", FUNC(log2) (2.0), 1); - check ("log2 (16) == 4", FUNC(log2) (16.0), 4); + check_eps ("log2 (16) == 4", FUNC(log2) (16.0), 4, CHOOSE (1e-18L, 0, 0)); check ("log2 (256) == 8", FUNC(log2) (256.0), 8); } @@ -944,7 +945,7 @@ modf_test (void) result = FUNC(modf) (nan_value, &intpart); check_isnan ("modf (NaN, &x) returns NaN", result); - check_isnan ("modf (-inf, &x) sets x to NaN", intpart); + check_isnan ("modf (NaN, &x) sets x to NaN", intpart); result = FUNC(modf) (0, &intpart); check ("modf (0, &x) returns 0", result, 0); @@ -1498,7 +1499,7 @@ sqrt_test (void) check_isinfp ("sqrt (+inf) == +inf", FUNC(sqrt) (plus_infty)); x = random_value (0, 10000); - check_ext ("sqrt (x*x) == x", sqrt (x*x), x, x); + check_ext ("sqrt (x*x) == x", FUNC(sqrt) (x*x), x, x); check ("sqrt (4) == 2", FUNC(sqrt) (4), 2); } diff --git a/nss/getXXbyYY.c b/nss/getXXbyYY.c index 542072b..f81df05 100644 --- a/nss/getXXbyYY.c +++ b/nss/getXXbyYY.c @@ -122,6 +122,9 @@ FUNCTION_NAME (ADD_PARAMS) buffer = new_buf; } + if (buffer == NULL) + result = NULL; + #ifdef HANDLE_DIGITS_DOTS done: #endif diff --git a/nss/getXXent.c b/nss/getXXent.c index f180171..eeb03df 100644 --- a/nss/getXXent.c +++ b/nss/getXXent.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -69,7 +69,7 @@ GETFUNC_NAME (void) static char *buffer; static size_t buffer_size; static LOOKUP_TYPE resbuf; - LOOKUP_TYPE *result = NULL; + LOOKUP_TYPE *result; int save; /* Get lock. */ @@ -103,6 +103,9 @@ GETFUNC_NAME (void) buffer = new_buf; } + if (buffer == NULL) + result = NULL; + /* Release lock. Preserve error value. */ save = errno; __libc_lock_unlock (lock); diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index d3ff520..7472496 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -1,5 +1,5 @@ /* Common code for file-based databases in nss_files module. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -146,6 +146,7 @@ internal_getent (struct STRUCTURE *result, char *p; struct parser_data *data = (void *) buffer; int linebuflen = buffer + buflen - data->linebuffer; + int parse_result; if (buflen < (int) sizeof *data + 1) { @@ -182,10 +183,10 @@ internal_getent (struct STRUCTURE *result, while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ /* Parse the line. If it is invalid, loop to get the next line of the file to parse. */ - || ! parse_line (p, result, data, buflen)); + || ! (parse_result = parse_line (p, result, data, buflen))); /* Filled in RESULT with the next entry from the database file. */ - return NSS_STATUS_SUCCESS; + return parse_result == -1 ? NSS_STATUS_TRYAGAIN : NSS_STATUS_SUCCESS; } diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c index 2e84d76..acf673d 100644 --- a/nss/nss_files/files-parse.c +++ b/nss/nss_files/files-parse.c @@ -1,5 +1,5 @@ /* Common code for file-based database parsers in nss_files module. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -152,7 +152,7 @@ parse_line (char *line, struct STRUCTURE *result, \ if (list) \ result->TRAILING_LIST_MEMBER = list; \ else \ - return 0; \ + return -1; /* -1 indicates we ran out of space. */ \ } static inline char ** @@ -189,29 +189,26 @@ parse_list (char *line, struct parser_data *data, size_t datalen) if (*line == '\0') break; + /* Skip leading white space. This might not be portable but useful. */ + while (isspace (*line)) + ++line; + elt = line; while (1) { - if (TRAILING_LIST_SEPARATOR_P (*line)) - { - *p++ = elt; - *line = '\0'; - do - ++line; - while (isspace (*line)); - elt = line; - } - else if (*line == '\0') + if (*line == '\0' || TRAILING_LIST_SEPARATOR_P (*line)) { - /* End of the line. */ + /* End of the next entry. */ if (line > elt) - /* Last element. */ + /* We really found some data. */ *p++ = elt; - *line = '\0'; + + /* Terminate string if necessary. */ + if (*line != '\0') + *line++ = '\0'; break; } - else - ++line; + ++line; } } *p = NULL; diff --git a/pwd/fgetpwent.c b/pwd/fgetpwent.c index 2f7db94..63f62fc 100644 --- a/pwd/fgetpwent.c +++ b/pwd/fgetpwent.c @@ -16,20 +16,60 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <errno.h> +#include <libc-lock.h> #include <pwd.h> -#include <stdio.h> +#include <stdlib.h> +/* We need to protect the dynamic buffer handling. */ +__libc_lock_define_initialized (static, lock); + /* Read one entry from the given stream. */ struct passwd * fgetpwent (FILE *stream) { - static char buffer[BUFSIZ]; + static char *buffer; + static size_t buffer_size; static struct passwd resbuf; struct passwd *result; + int save; + + /* Get lock. */ + __libc_lock_lock (lock); + + /* Allocate buffer if not yet available. */ + if (buffer == NULL) + { + buffer_size = NSS_BUFLEN_PASSWD; + buffer = malloc (buffer_size); + } + + while (buffer != NULL + && __fgetpwent_r (stream, &resbuf, buffer, buffer_size, &result) != 0 + && errno == ERANGE) + { + char *new_buf; + buffer_size += NSS_BUFLEN_PASSWD; + new_buf = realloc (buffer, buffer_size); + if (new_buf == NULL) + { + /* We are out of memory. Free the current buffer so that the + process gets a chance for a normal termination. */ + save = errno; + free (buffer); + __set_errno (save); + } + buffer = new_buf; + } + + if (buffer == NULL) + result = NULL; - if (__fgetpwent_r (stream, &resbuf, buffer, sizeof buffer, &result) != 0) - return NULL; + /* Release lock. Preserve error value. */ + save = errno; + __libc_lock_unlock (lock); + __set_errno (save); return result; } diff --git a/shadow/fgetspent.c b/shadow/fgetspent.c index 6fe813b..bd54c7e 100644 --- a/shadow/fgetspent.c +++ b/shadow/fgetspent.c @@ -16,18 +16,63 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <errno.h> +#include <libc-lock.h> #include <shadow.h> -#include <stdio.h> +#include <stdlib.h> +/* A reasonable size for a buffer to start with. */ +#define BUFLEN_SPWD 1024 + +/* We need to protect the dynamic buffer handling. */ +__libc_lock_define_initialized (static, lock); + /* Read one shadow entry from the given stream. */ struct spwd * fgetspent (FILE *stream) { - static char buffer[BUFSIZ]; + static char *buffer; + static size_t buffer_size; static struct spwd resbuf; struct spwd *result; + int save; + + /* Get lock. */ + __libc_lock_lock (lock); + + /* Allocate buffer if not yet available. */ + if (buffer == NULL) + { + buffer_size = BUFLEN_SPWD; + buffer = malloc (buffer_size); + } + + while (buffer != NULL + && __fgetspent_r (stream, &resbuf, buffer, buffer_size, &result) != 0 + && errno == ERANGE) + { + char *new_buf; + buffer_size += BUFLEN_SPWD; + new_buf = realloc (buffer, buffer_size); + if (new_buf == NULL) + { + /* We are out of memory. Free the current buffer so that the + process gets a chance for a normal termination. */ + save = errno; + free (buffer); + __set_errno (save); + } + buffer = new_buf; + } + + if (buffer == NULL) + result = NULL; + + /* Release lock. Preserve error value. */ + save = errno; + __libc_lock_unlock (lock); + __set_errno (save); - return __fgetspent_r (stream, &resbuf, buffer, sizeof buffer, &result) - ? NULL : result; + return result; } diff --git a/shadow/sgetspent.c b/shadow/sgetspent.c index 05d997c..ecfe01e 100644 --- a/shadow/sgetspent.c +++ b/shadow/sgetspent.c @@ -16,33 +16,63 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <errno.h> +#include <libc-lock.h> #include <shadow.h> -#include <stdio.h> #include <stdlib.h> -#include <string.h> -#define MAX(a, b) ((a) > (b) ? (a) : (b)) +/* A reasonable size for a buffer to start with. */ +#define BUFLEN_SPWD 1024 + +/* We need to protect the dynamic buffer handling. */ +__libc_lock_define_initialized (static, lock); /* Read one shadow entry from the given stream. */ struct spwd * sgetspent (const char *string) { + static char *buffer; + static size_t buffer_size; static struct spwd resbuf; - static int max_size = 0; - static char *buffer = NULL; struct spwd *result; - int len; + int save; + + /* Get lock. */ + __libc_lock_lock (lock); - len = strlen (string) + 1; - if (len > max_size) + /* Allocate buffer if not yet available. */ + if (buffer == NULL) { - max_size = MAX (128, len + 32); - buffer = realloc (buffer, max_size); - if (buffer == NULL) - return NULL; + buffer_size = BUFLEN_SPWD; + buffer = malloc (buffer_size); } - return __sgetspent_r (string, &resbuf, buffer, max_size, &result) - ? NULL : result; + while (buffer != NULL + && __sgetspent_r (string, &resbuf, buffer, buffer_size, &result) != 0 + && errno == ERANGE) + { + char *new_buf; + buffer_size += BUFLEN_SPWD; + new_buf = realloc (buffer, buffer_size); + if (new_buf == NULL) + { + /* We are out of memory. Free the current buffer so that the + process gets a chance for a normal termination. */ + save = errno; + free (buffer); + __set_errno (save); + } + buffer = new_buf; + } + + if (buffer == NULL) + result = NULL; + + /* Release lock. Preserve error value. */ + save = errno; + __libc_lock_unlock (lock); + __set_errno (save); + + return result; } diff --git a/shadow/sgetspent_r.c b/shadow/sgetspent_r.c index fb7d015..8aa5a9b 100644 --- a/shadow/sgetspent_r.c +++ b/shadow/sgetspent_r.c @@ -90,8 +90,9 @@ int __sgetspent_r (const char *string, struct spwd *resbuf, char *buffer, size_t buflen, struct spwd **result) { - *result = parse_line (strncpy (buffer, string, buflen), resbuf, NULL, 0) - ? resbuf : NULL; + int parse_result = parse_line (strncpy (buffer, string, buflen), + resbuf, NULL, 0); + *result = parse_result > 0 ? resbuf : NULL; return *result == NULL ? errno : 0; } diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index 6fad54e..cc86d38 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -437,6 +437,7 @@ extern void unsetenv __P ((__const char *__name)); /* The `clearenv' was planned to be added to POSIX.1 but probably never made it. Nevertheless the POSIX.9 standard (POSIX bindings for Fortran 77) requires this function. */ +extern int __clearenv __P ((void)); extern int clearenv __P ((void)); #endif diff --git a/stdlib/strtod.c b/stdlib/strtod.c index 760ecd2..e0c9b08 100644 --- a/stdlib/strtod.c +++ b/stdlib/strtod.c @@ -34,6 +34,8 @@ # define SET_MANTISSA(flt, mant) \ do { union ieee754_double u; \ u.d = (flt); \ + if ((mant & 0xfffffffffffffULL) == 0) \ + mant = 0x8000000000000ULL; \ u.ieee.mantissa0 = ((mant) >> 32) & 0xfffff; \ u.ieee.mantissa1 = (mant) & 0xffffffff; \ } while (0) @@ -627,7 +629,8 @@ INTERNAL (STRTOF) (nptr, endptr, group) expp = cp; /* Read exponent. */ - if (TOLOWER (c) == (base == 16 ? L_('p') : L_('e'))) + if ((base == 16 && TOLOWER (c) == L_('p')) + || (base != 16 && TOLOWER (c) == L_('e'))) { int exp_negative = 0; diff --git a/stdlib/strtof.c b/stdlib/strtof.c index 0a0046d..026b5ee 100644 --- a/stdlib/strtof.c +++ b/stdlib/strtof.c @@ -9,6 +9,8 @@ #define SET_MANTISSA(flt, mant) \ do { union ieee754_float u; \ u.f = (flt); \ + if ((mant & 0x7fffff) == 0) \ + mant = 0x400000; \ u.ieee.mantissa = (mant) & 0x7fffff; \ (flt) = u.f; \ } while (0) diff --git a/stdlib/strtold.c b/stdlib/strtold.c index 1dc0ac3..9747232 100644 --- a/stdlib/strtold.c +++ b/stdlib/strtold.c @@ -9,7 +9,9 @@ #define SET_MANTISSA(flt, mant) \ do { union ieee854_long_double u; \ u.d = (flt); \ - u.ieee.mantissa0 = ((mant) >> 32) & 0x7fffffff; \ + if ((mant & 0x7fffffffffffffffULL) == 0) \ + mant = 0x4000000000000000ULL; \ + u.ieee.mantissa0 = (((mant) >> 32) & 0x7fffffff) | 0x80000000; \ u.ieee.mantissa1 = (mant) & 0xffffffff; \ (flt) = u.d; \ } while (0) diff --git a/sunrpc/Makefile b/sunrpc/Makefile index 9feff64..5effc5e 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -104,7 +104,7 @@ CFLAGS-xmount.c = -Wno-unused CFLAGS-xrusers.c = -Wno-unused CFLAGS-xspray.c = -Wno-unused CFLAGS-xnfs_prot.c = -Wno-unused -CFLAGS-xrquote.c = -Wno-unused +CFLAGS-xrquota.c = -Wno-unused include ../Rules diff --git a/sysdeps/gnu/errlist.awk b/sysdeps/gnu/errlist.awk index a640fe5..87444db 100644 --- a/sysdeps/gnu/errlist.awk +++ b/sysdeps/gnu/errlist.awk @@ -16,7 +16,7 @@ # not, write to the Free Software Foundation, Inc., 675 Mass Ave, # Cambridge, MA 02139, USA. -# errno.texinfo contains lines like: +# errno.texi contains lines like: # @comment errno.h # @comment POSIX.1: Function not implemented # @deftypevr Macro int ENOSYS diff --git a/sysdeps/gnu/errlist.c b/sysdeps/gnu/errlist.c index 700b69f..f998747 100644 --- a/sysdeps/gnu/errlist.c +++ b/sysdeps/gnu/errlist.c @@ -797,6 +797,14 @@ TRANS This error code has no purpose. */ /* */ [EREMOTEIO] = N_("Remote I/O error"), #endif +#ifdef ENOMEDIUM +/* */ + [ENOMEDIUM] = N_("No medium found"), +#endif +#ifdef EMEDIUMTYPE +/* */ + [EMEDIUMTYPE] = N_("Wrong medium type"), +#endif }; const int _sys_nerr = sizeof _sys_errlist / sizeof _sys_errlist[0]; diff --git a/sysdeps/i386/memset.c b/sysdeps/i386/memset.c index e1e12fb..454c738 100644 --- a/sysdeps/i386/memset.c +++ b/sysdeps/i386/memset.c @@ -23,7 +23,7 @@ #ifdef __GNUC__ -vod * +void * memset (void *dstpp, int c, size_t len) { unsigned long int dstp = (unsigned long int) dstpp; diff --git a/sysdeps/libm-ieee754/s_asinhl.c b/sysdeps/libm-ieee754/s_asinhl.c index d5b3077..6eb434c 100644 --- a/sysdeps/libm-ieee754/s_asinhl.c +++ b/sysdeps/libm-ieee754/s_asinhl.c @@ -65,6 +65,6 @@ huge= 1.000000000000000000e+4900L; t = x*x; w =__log1pl(fabsl(x)+t/(one+__ieee754_sqrtl(one+t))); } - if(hx>0x8000) return -w; else return w; + if(hx&0x8000) return -w; else return w; } weak_alias (__asinhl, asinhl) diff --git a/sysdeps/libm-ieee754/s_log2f.c b/sysdeps/libm-ieee754/s_log2f.c index c204e22..6415c37 100644 --- a/sysdeps/libm-ieee754/s_log2f.c +++ b/sysdeps/libm-ieee754/s_log2f.c @@ -69,7 +69,7 @@ static float zero = 0.0; if((0x007fffff&(15+ix))<16) { /* |f| < 2**-20 */ if(f==zero) return dk; R = f*f*((float)0.5-(float)0.33333333333333333*f); - return dk-(R-f);} + return dk-(R-f); } s = f/((float)2.0+f); z = s*s; diff --git a/sysdeps/libm-ieee754/s_nan.c b/sysdeps/libm-ieee754/s_nan.c index 0d065d5c..35d9264 100644 --- a/sysdeps/libm-ieee754/s_nan.c +++ b/sysdeps/libm-ieee754/s_nan.c @@ -18,31 +18,25 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided - as the argument to this function but I have no clue what this means. - Perhaps it is a description of the bits set in the mantissa. */ #include <math.h> -#ifdef HANDLE_TAGP -# include <stdlib.h> -# include <string.h> -#else -# include <ieee754.h> -#endif +#include <stdlib.h> +#include <string.h> +#include <ieee754.h> double __nan (const char *tagp) { -#ifdef HANDLE_TAGP - /* If we ever should have use of the TAGP parameter we will use the - strtod function to analyze it. */ - char buf[6 + strlen (tagp)]; - sprintf (buf, "NAN(%s)", tagp); - return strtod (buf, NULL); -#else static const union ieee754_double nan_value = - { ieee: { mantissa1: 0x1, mantissa0: 0x0, exponent: 0x7ff, negative: 0 } }; + { ieee: { mantissa1: 0, mantissa0: 0x80000, exponent: 0x7ff, negative: 0 } }; + + if (tagp[0] != '\0') + { + char buf[6 + strlen (tagp)]; + sprintf (buf, "NAN(%s)", tagp); + return strtod (buf, NULL); + } + return nan_value.d; -#endif } weak_alias (__nan, nan) diff --git a/sysdeps/libm-ieee754/s_nanf.c b/sysdeps/libm-ieee754/s_nanf.c index 660f30d..8e6e3fc 100644 --- a/sysdeps/libm-ieee754/s_nanf.c +++ b/sysdeps/libm-ieee754/s_nanf.c @@ -18,31 +18,25 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided - as the argument to this function but I have no clue what this means. - Perhaps it is a description of the bits set in the mantissa. */ #include <math.h> -#ifdef HANDLE_TAGP -# include <stdlib.h> -# include <string.h> -#else -# include <ieee754.h> -#endif +#include <stdlib.h> +#include <string.h> +#include <ieee754.h> float __nanf (const char *tagp) { -#ifdef HANDLE_TAGP - /* If we ever should have use of the TAGP parameter we will use the - strtod function to analyze it. */ - char buf[6 + strlen (tagp)]; - sprintf (buf, "NAN(%s)", tagp); - return strtof (buf, NULL); -#else static const union ieee754_float nan_value = - { ieee: { mantissa: 0x1, exponent: 0xff, negative: 0 } }; + { ieee: { mantissa: 0x400000, exponent: 0xff, negative: 0 } }; + + if (tagp[0] != '\0') + { + char buf[6 + strlen (tagp)]; + sprintf (buf, "NAN(%s)", tagp); + return strtof (buf, NULL); + } + return nan_value.f; -#endif } weak_alias (__nanf, nanf) diff --git a/sysdeps/libm-ieee754/s_nanl.c b/sysdeps/libm-ieee754/s_nanl.c index 4ade804..1cd026e 100644 --- a/sysdeps/libm-ieee754/s_nanl.c +++ b/sysdeps/libm-ieee754/s_nanl.c @@ -18,32 +18,26 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided - as the argument to this function but I have no clue what this means. - Perhaps it is a description of the bits set in the mantissa. */ #include <math.h> -#ifdef HANDLE_TAGP -# include <stdlib.h> -# include <string.h> -#else -# include <ieee754.h> -#endif +#include <stdlib.h> +#include <string.h> +#include <ieee754.h> long double __nanl (const char *tagp) { -#ifdef HANDLE_TAGP - /* If we ever should have use of the TAGP parameter we will use the - strtod function to analyze it. */ - char buf[6 + strlen (tagp)]; - sprintf (buf, "NAN(%s)", tagp); - return strtold (buf, NULL); -#else static const union ieee854_long_double nan_value = - { ieee: { mantissa1: 0x1, mantissa0: 0x80000000, + { ieee: { mantissa1: 0, mantissa0: 0xc0000000, exponent: 0x7fff, negative: 0 } }; + + if (tagp[0] != '\0') + { + char buf[6 + strlen (tagp)]; + sprintf (buf, "NAN(%s)", tagp); + return strtold (buf, NULL); + } + return nan_value.d; -#endif } weak_alias (__nanl, nanl) diff --git a/sysdeps/m68k/Makefile b/sysdeps/m68k/Makefile index fc79d36..0f811bc 100644 --- a/sysdeps/m68k/Makefile +++ b/sysdeps/m68k/Makefile @@ -34,3 +34,8 @@ long-double-fcts = yes ifeq ($(subdir),elf) CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused endif + +ifeq ($(subdir),math) +# Avoid a bug in gcc +CFLAGS-s_copysignl.c += -mnobitfield +endif diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h index d618701..9b52b32 100644 --- a/sysdeps/m68k/fpu/__math.h +++ b/sysdeps/m68k/fpu/__math.h @@ -89,6 +89,7 @@ __inline_mathop(__significand, getman) __inline_mathop(__log2, log2) __inline_mathop(__exp2, twotox) +__inline_mathop(__trunc, intrz) #if !defined __NO_MATH_INLINES && defined __OPTIMIZE__ @@ -111,6 +112,7 @@ __inline_mathop(significand, getman) #ifdef __USE_ISOC9X __inline_mathop(log2, log2) __inline_mathop(exp2, twotox) +__inline_mathop(trunc, intrz) #endif #endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ @@ -155,108 +157,123 @@ __internal_inline_functions (long double,l) /* The rest of the functions are available to the user. */ -#define __inline_functions(float_type, s) \ -__m81_inline float_type \ -__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr) \ -{ \ - float_type __mantissa, __exponent; \ - int __iexponent; \ - if (__value == 0.0) \ - { \ - *__expptr = 0; \ - return __value; \ - } \ - __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \ - __iexponent = (int) __exponent + 1; \ - *__expptr = __iexponent; \ - __asm("fscale%.l %2, %0" : "=f" (__mantissa) \ - : "0" (__value), "dmi" (-__iexponent)); \ - return __mantissa; \ -} \ - \ -__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) \ -{ \ - float_type __result; \ - unsigned long int __ctrl_reg; \ - __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ - /* Set rounding towards negative infinity. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" ((__ctrl_reg & ~0x10) | 0x20)); \ - /* Convert X to an integer, using -Inf rounding. */ \ - __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ - /* Restore the previous rounding mode. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" (__ctrl_reg)); \ - return __result; \ -} \ - \ -__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) \ -{ \ - float_type __result; \ - unsigned long int __ctrl_reg; \ - __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ - /* Set rounding towards positive infinity. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" (__ctrl_reg | 0x30)); \ - /* Convert X to an integer, using +Inf rounding. */ \ - __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ - /* Restore the previous rounding mode. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" (__ctrl_reg)); \ - return __result; \ -} \ - \ -__m81_inline float_type \ -__m81_u(__CONCAT(__modf,s))(float_type __value, float_type *__iptr) \ -{ \ - float_type __modf_int; \ - __asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value)); \ - *__iptr = __modf_int; \ - return __value - __modf_int; \ -} \ - \ -__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) \ -{ \ - /* There is no branch-condition for infinity, \ - so we must extract and examine the condition codes manually. */ \ - unsigned long int __fpsr; \ - __asm("ftst%.x %1\n" \ - "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ - return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0; \ -} \ - \ -__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) \ -{ \ - char __result; \ - __asm("ftst%.x %1\n" \ - "fsun %0" : "=dm" (__result) : "f" (__value)); \ - return __result; \ -} \ - \ -__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) \ -{ \ - /* There is no branch-condition for infinity, so we must extract and \ - examine the condition codes manually. */ \ - unsigned long int __fpsr; \ - __asm ("ftst%.x %1\n" \ - "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ - return (__fpsr & (3 << 24)) == 0; \ -} \ - \ -__m81_defun (int, __CONCAT(__ilogb,s), (float_type __x)) \ -{ \ - float_type __result; \ - if (__x == 0.0) \ - return 0x80000001; \ - __asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x)); \ - return (int) __result; \ -} \ - \ -__m81_defun (float_type, __CONCAT(__scalbn,s), (float_type __x, int __n)) \ -{ \ - float_type __result; \ - __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \ - return __result; \ +#define __inline_functions(float_type, s) \ +__m81_inline float_type \ +__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr) \ +{ \ + float_type __mantissa, __exponent; \ + int __iexponent; \ + if (__value == 0.0) \ + { \ + *__expptr = 0; \ + return __value; \ + } \ + __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \ + __iexponent = (int) __exponent + 1; \ + *__expptr = __iexponent; \ + __asm("fscale%.l %2, %0" : "=f" (__mantissa) \ + : "0" (__value), "dmi" (-__iexponent)); \ + return __mantissa; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) \ +{ \ + float_type __result; \ + unsigned long int __ctrl_reg; \ + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ + /* Set rounding towards negative infinity. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" ((__ctrl_reg & ~0x10) | 0x20)); \ + /* Convert X to an integer, using -Inf rounding. */ \ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + /* Restore the previous rounding mode. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg)); \ + return __result; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) \ +{ \ + float_type __result; \ + unsigned long int __ctrl_reg; \ + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ + /* Set rounding towards positive infinity. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg | 0x30)); \ + /* Convert X to an integer, using +Inf rounding. */ \ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + /* Restore the previous rounding mode. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg)); \ + return __result; \ +} \ + \ +__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) \ +{ \ + /* There is no branch-condition for infinity, \ + so we must extract and examine the condition codes manually. */ \ + unsigned long int __fpsr; \ + __asm("ftst%.x %1\n" \ + "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ + return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0; \ +} \ + \ +__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) \ +{ \ + char __result; \ + __asm("ftst%.x %1\n" \ + "fsun %0" : "=dm" (__result) : "f" (__value)); \ + return __result; \ +} \ + \ +__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) \ +{ \ + /* There is no branch-condition for infinity, so we must extract and \ + examine the condition codes manually. */ \ + unsigned long int __fpsr; \ + __asm ("ftst%.x %1\n" \ + "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ + return (__fpsr & (3 << 24)) == 0; \ +} \ + \ +__m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) \ +{ \ + /* There is no branch-condition for the sign bit, so we must extract \ + and examine the condition codes manually. */ \ + unsigned long int __fpsr; \ + __asm ("ftst%.x %1\n" \ + "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ + return (__fpsr >> 27) & 1; \ +} \ + \ +__m81_defun (int, __CONCAT(__ilogb,s), (float_type __x)) \ +{ \ + float_type __result; \ + if (__x == 0.0) \ + return 0x80000001; \ + __asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + return (int) __result; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__scalbn,s), (float_type __x, int __n)) \ +{ \ + float_type __result; \ + __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \ + return __result; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) \ +{ \ + float_type __result; \ + unsigned long int __ctrl_reg; \ + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ + /* Temporarily disable the inexact exception. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg & ~0x200)); \ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg)); \ + return __result; \ } /* This defines the three variants of the inline functions. */ @@ -286,8 +303,6 @@ __inline_forward(double,frexp, (double __value, int *__expptr), (__value, __expptr)) __inline_forward_c(double,floor, (double __x), (__x)) __inline_forward_c(double,ceil, (double __x), (__x)) -__inline_forward(double,modf, (double __value, double *__iptr), - (__value, __iptr)) #ifdef __USE_MISC __inline_forward_c(int,isinf, (double __value), (__value)) __inline_forward_c(int,finite, (double __value), (__value)) @@ -299,6 +314,9 @@ __inline_forward_c(int,isnan, (double __value), (__value)) #endif __inline_forward_c(int,ilogb, (double __value), (__value)) #endif +#ifdef __USE_ISOC9X +__inline_forward_c(double,nearbyint, (double __value), (__value)) +#endif #if defined __USE_MISC || defined __USE_ISOC9X @@ -306,8 +324,6 @@ __inline_forward(float,frexpf, (float __value, int *__expptr), (__value, __expptr)) __inline_forward_c(float,floorf, (float __x), (__x)) __inline_forward_c(float,ceilf, (float __x), (__x)) -__inline_forward(float,modff, (float __value, float *__iptr), - (__value, __iptr)) #ifdef __USE_MISC __inline_forward_c(int,isinff, (float __value), (__value)) __inline_forward_c(int,finitef, (float __value), (__value)) @@ -315,14 +331,14 @@ __inline_forward_c(float,scalbnf, (float __x, int __n), (__x, __n)) __inline_forward_c(int,isnanf, (float __value), (__value)) __inline_forward_c(int,ilogbf, (float __value), (__value)) #endif +#ifdef __USE_ISOC9X +__inline_forward_c(float,nearbyintf, (float __value), (__value)) +#endif __inline_forward(long double,frexpl, (long double __value, int *__expptr), (__value, __expptr)) __inline_forward_c(long double,floorl, (long double __x), (__x)) __inline_forward_c(long double,ceill, (long double __x), (__x)) -__inline_forward(long double,modfl, - (long double __value, long double *__iptr), - (__value, __iptr)) #ifdef __USE_MISC __inline_forward_c(int,isinfl, (long double __value), (__value)) __inline_forward_c(int,finitel, (long double __value), (__value)) @@ -331,6 +347,9 @@ __inline_forward_c(long double,scalbnl, (long double __x, int __n), __inline_forward_c(int,isnanl, (long double __value), (__value)) __inline_forward_c(int,ilogbl, (long double __value), (__value)) #endif +#ifdef __USE_ISOC9X +__inline_forward_c(long double,nearbyintl, (long double __value), (__value)) +#endif #endif /* Use misc or ISO C9X */ diff --git a/sysdeps/m68k/fpu/e_atan2.c b/sysdeps/m68k/fpu/e_atan2.c index 58d7555..c012070 100644 --- a/sysdeps/m68k/fpu/e_atan2.c +++ b/sysdeps/m68k/fpu/e_atan2.c @@ -27,10 +27,12 @@ #define float_type double #endif -#define __CONCATX(a,b) __CONCAT(a,b) +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) float_type -__CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x) +s(__ieee754_atan2) (float_type y, float_type x) { float_type pi, pi_2, z; @@ -40,41 +42,41 @@ __CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x) z = x + y; else if (y == 0) { - if (signbit (x)) - z = signbit (y) ? -pi : pi; + if (m81(__signbit) (x)) + z = m81(__signbit) (y) ? -pi : pi; else z = y; } - else if (__m81_u(__CONCATX(__isinf,SUFF)) (x)) + else if (m81(__isinf) (x)) { - if (__m81_u(__CONCATX(__isinf,SUFF)) (y)) + if (m81(__isinf) (y)) { float_type pi_4; - __asm ("fscale%.w %#-1, %0" : "=f" (pi_4) : "0" (pi_2)); + __asm ("fscale%.w %#-2, %0" : "=f" (pi_4) : "0" (pi)); z = x > 0 ? pi_4 : 3 * pi_4; } else z = x > 0 ? 0 : pi; - if (signbit (y)) + if (m81(__signbit) (y)) z = -z; } - else if (__m81_u(__CONCATX(__isinf,SUFF)) (y)) + else if (m81(__isinf) (y)) z = y > 0 ? pi_2 : -pi_2; else if (x > 0) { if (y > 0) { if (x > y) - z = __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = m81(__atan) (y / x); else - z = pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = pi_2 - m81(__atan) (x / y); } else { if (x > -y) - z = __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = m81(__atan) (y / x); else - z = -pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = -pi_2 - m81(__atan) (x / y); } } else @@ -82,16 +84,16 @@ __CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x) if (y < 0) { if (-x > y) - z = -pi + __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = -pi + m81(__atan) (y / x); else - z = -pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = -pi_2 - m81(__atan) (x / y); } else { if (-x > y) - z = pi + __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = pi + m81(__atan) (y / x); else - z = pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = pi_2 - m81(__atan) (x / y); } } return z; diff --git a/sysdeps/m68k/fpu/e_pow.c b/sysdeps/m68k/fpu/e_pow.c index 970e8b8..284f1bf 100644 --- a/sysdeps/m68k/fpu/e_pow.c +++ b/sysdeps/m68k/fpu/e_pow.c @@ -27,10 +27,12 @@ #define float_type double #endif -#define __CONCATX(a,b) __CONCAT(a,b) +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) float_type -__CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) +s(__ieee754_pow) (float_type x, float_type y) { float_type z; float_type ax; @@ -40,24 +42,24 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) if (x != x || y != y) return x + y; - if (__m81_u(__CONCATX(__isinf,SUFF)) (y)) + if (m81(__isinf) (y)) { - ax = __CONCATX(fabs,SUFF) (x); + ax = s(fabs) (x); if (ax == 1) - return y - y; + return 0.0/0.0; if (ax > 1) return y > 0 ? y : 0; else return y < 0 ? -y : 0; } - if (__CONCATX(fabs,SUFF) (y) == 1) + if (s(fabs) (y) == 1) return y > 0 ? x : 1 / x; if (y == 2) return x * x; - if (y == 0 && x >= 0) - return __m81_u(__CONCATX(__ieee754_sqrt,SUFF)) (x); + if (y == 0.5 && x >= 0) + return m81(__ieee754_sqrt) (x); if (x == 10.0) { @@ -70,19 +72,19 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) return z; } - ax = __CONCATX(fabs,SUFF) (x); - if (__m81_u(__CONCATX(__isinf,SUFF)) (x) || x == 0 || ax == 1) + ax = s(fabs) (x); + if (m81(__isinf) (x) || x == 0 || ax == 1) { z = ax; if (y < 0) z = 1 / z; - if (signbit (x)) + if (m81(__signbit) (x)) { - float_type temp = __m81_u (__CONCATX(__rint,SUFF)) (y); + float_type temp = m81(__rint) (y); if (y != temp) { if (x == -1) - z = (z - z) / (z - z); + z = 0.0/0.0; } else { @@ -105,12 +107,11 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) if (x < 0.0) { - float_type temp = __m81_u (__CONCATX(__rint,SUFF)) (y); + float_type temp = m81(__rint) (y); if (y == temp) { long long i = (long long) y; - z = (__m81_u(__CONCATX(__ieee754_exp,SUFF)) - (y * __m81_u(__CONCATX(__ieee754_log,SUFF)) (-x))); + z = m81(__ieee754_exp) (y * m81(__ieee754_log) (-x)); if (sizeof (float_type) == sizeof (float)) { long i = (long) y; @@ -126,10 +127,9 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) } } else - z = (x - x) / (x - x); + z = 0.0/0.0; } else - z = (__m81_u(__CONCATX(__ieee754_exp,SUFF)) - (y * __m81_u(__CONCATX(__ieee754_log,SUFF)) (x))); + z = m81(__ieee754_exp) (y * m81(__ieee754_log) (x)); return z; } diff --git a/sysdeps/m68k/fpu/s_cexp.c b/sysdeps/m68k/fpu/s_cexp.c new file mode 100644 index 0000000..d5c7645 --- /dev/null +++ b/sysdeps/m68k/fpu/s_cexp.c @@ -0,0 +1,92 @@ +/* Complex exponential function. m68k fpu version + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define __LIBC_M81_MATH_INLINES +#include <complex.h> +#include <math.h> + +#ifndef SUFF +#define SUFF +#endif +#ifndef huge_val +#define huge_val HUGE_VAL +#endif +#ifndef float_type +#define float_type double +#endif + +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) + +__complex__ float_type +s(__cexp) (__complex__ float_type x) +{ + __complex__ float_type retval; + float_type sin_ix, cos_ix; + + if (m81(__finite) (__real__ x)) + { + if (m81(__finite) (__imag__ x)) + { + float_type exp_val = s(__exp) (__real__ x); + + __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix) + : "f" (__imag__ x)); + __real__ retval = exp_val * cos_ix; + __imag__ retval = exp_val * sin_ix; + } + else + /* If the imaginary part is +-inf or NaN and the real part is + not +-inf the result is NaN + iNaN. */ + __real__ retval = __imag__ retval = 0.0/0.0; + } + else if (m81(__isinf) (__real__ x)) + { + if (m81(__finite) (__imag__ x)) + { + if (m81(__signbit) (__real__ x) == 0 && __imag__ x == 0.0) + retval = huge_val; + else + { + float_type value = m81(__signbit) (__real__ x) ? 0.0 : huge_val; + + __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix) + : "f" (__imag__ x)); + __real__ retval = value * cos_ix; + __imag__ retval = value * sin_ix; + } + } + else if (m81(__signbit) (__real__ x) == 0) + { + __real__ retval = huge_val; + __imag__ retval = 0.0/0.0; + } + else + retval = 0.0; + } + else + /* If the real part is NaN the result is NaN + iNaN. */ + __real__ retval = __imag__ retval = 0.0/0.0; + + return retval; +} +#define weak_aliasx(a,b) weak_alias(a,b) +weak_aliasx (s(__cexp), s(cexp)) diff --git a/sysdeps/m68k/fpu/s_cexpf.c b/sysdeps/m68k/fpu/s_cexpf.c new file mode 100644 index 0000000..db9f174 --- /dev/null +++ b/sysdeps/m68k/fpu/s_cexpf.c @@ -0,0 +1,4 @@ +#define SUFF f +#define huge_val HUGE_VALF +#define float_type float +#include <s_cexp.c> diff --git a/sysdeps/m68k/fpu/s_cexpl.c b/sysdeps/m68k/fpu/s_cexpl.c new file mode 100644 index 0000000..7367070 --- /dev/null +++ b/sysdeps/m68k/fpu/s_cexpl.c @@ -0,0 +1,4 @@ +#define SUFF l +#define huge_val HUGE_VALL +#define float_type long double +#include <s_cexp.c> diff --git a/sysdeps/m68k/fpu/s_modf.c b/sysdeps/m68k/fpu/s_modf.c index 6428afc..ad0334f 100644 --- a/sysdeps/m68k/fpu/s_modf.c +++ b/sysdeps/m68k/fpu/s_modf.c @@ -19,22 +19,35 @@ #define __LIBC_M81_MATH_INLINES #include <math.h> -#ifndef FUNC -#define FUNC modf +#ifndef SUFF +#define SUFF #endif #ifndef float_type #define float_type double #endif -#define __CONCATX(a,b) __CONCAT(a,b) +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) float_type -__CONCATX(__,FUNC) (x, iptr) - float_type x; - float_type *iptr; +s(__modf) (float_type x, float_type *iptr) { - return __m81_u(__CONCATX(__,FUNC))(x, iptr); + float_type x_int, result; + __asm ("fintrz%.x %1, %0" : "=f" (x_int) : "f" (x)); + *iptr = x_int; + if (m81(__isinf) (x)) + { + result = 0; + if (x < 0) + result = -result; + } + else if (x == 0) + result = x; + else + result = x - x_int; + return result; } #define weak_aliasx(a,b) weak_alias(a,b) -weak_aliasx(__CONCATX(__,FUNC), FUNC) +weak_aliasx(s(__modf), s(modf)) diff --git a/sysdeps/m68k/fpu/s_modff.c b/sysdeps/m68k/fpu/s_modff.c index 37bff00..0c44d7c 100644 --- a/sysdeps/m68k/fpu/s_modff.c +++ b/sysdeps/m68k/fpu/s_modff.c @@ -1,3 +1,3 @@ -#define FUNC modff +#define SUFF f #define float_type float #include <s_modf.c> diff --git a/sysdeps/m68k/fpu/s_modfl.c b/sysdeps/m68k/fpu/s_modfl.c index 51327dd..c7075b3 100644 --- a/sysdeps/m68k/fpu/s_modfl.c +++ b/sysdeps/m68k/fpu/s_modfl.c @@ -1,3 +1,3 @@ -#define FUNC modfl +#define SUFF l #define float_type long double #include <s_modf.c> diff --git a/sysdeps/m68k/fpu/s_nearbyint.c b/sysdeps/m68k/fpu/s_nearbyint.c new file mode 100644 index 0000000..b87f5e2 --- /dev/null +++ b/sysdeps/m68k/fpu/s_nearbyint.c @@ -0,0 +1,2 @@ +#define FUNC nearbyint +#include <s_atan.c> diff --git a/sysdeps/m68k/fpu/s_nearbyintf.c b/sysdeps/m68k/fpu/s_nearbyintf.c new file mode 100644 index 0000000..70d08ab --- /dev/null +++ b/sysdeps/m68k/fpu/s_nearbyintf.c @@ -0,0 +1,2 @@ +#define FUNC nearbyintf +#include <s_atanf.c> diff --git a/sysdeps/m68k/fpu/s_nearbyintl.c b/sysdeps/m68k/fpu/s_nearbyintl.c new file mode 100644 index 0000000..230cd77 --- /dev/null +++ b/sysdeps/m68k/fpu/s_nearbyintl.c @@ -0,0 +1,2 @@ +#define FUNC nearbyintl +#include <s_atanl.c> diff --git a/sysdeps/m68k/fpu/s_trunc.c b/sysdeps/m68k/fpu/s_trunc.c new file mode 100644 index 0000000..96f29a7 --- /dev/null +++ b/sysdeps/m68k/fpu/s_trunc.c @@ -0,0 +1,2 @@ +#define FUNC trunc +#include <s_atan.c> diff --git a/sysdeps/m68k/fpu/s_truncf.c b/sysdeps/m68k/fpu/s_truncf.c new file mode 100644 index 0000000..44dca74 --- /dev/null +++ b/sysdeps/m68k/fpu/s_truncf.c @@ -0,0 +1,2 @@ +#define FUNC truncf +#include <s_atanf.c> diff --git a/sysdeps/m68k/fpu/s_truncl.c b/sysdeps/m68k/fpu/s_truncl.c new file mode 100644 index 0000000..8d35777 --- /dev/null +++ b/sysdeps/m68k/fpu/s_truncl.c @@ -0,0 +1,2 @@ +#define FUNC truncl +#include <s_atanl.c> diff --git a/sysdeps/powerpc/strlen.s b/sysdeps/powerpc/strlen.s new file mode 100644 index 0000000..eb6a88e --- /dev/null +++ b/sysdeps/powerpc/strlen.s @@ -0,0 +1,145 @@ + # Optimized strlen implementation for PowerPC. + # Copyright (C) 1997 Free Software Foundation, Inc. + # This file is part of the GNU C Library. + # + # The GNU C Library is free software; you can redistribute it and/or + # modify it under the terms of the GNU Library General Public License as + # published by the Free Software Foundation; either version 2 of the + # License, or (at your option) any later version. + # + # The GNU C Library is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # Library General Public License for more details. + # + # You should have received a copy of the GNU Library General Public + # License along with the GNU C Library; see the file COPYING.LIB. If not, + # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. + + # The algorithm here uses the following techniques: + # + # 1) Given a word 'x', we can test to see if it contains any 0 bytes + # by subtracting 0x01010101, and seeing if any of the high bits of each + # byte changed from 0 to 1. This works because the least significant + # 0 byte must have had no incoming carry (otherwise it's not the least + # significant), so it is 0x00 - 0x01 == 0xff. For all other + # byte values, either they have the high bit set initially, or when + # 1 is subtracted you get a value in the range 0x00-0x7f, none of which + # have their high bit set. The expression here is + # (x + 0xfefefeff) & ~(x | 0x7f7f7f7f), which gives 0x00000000 when + # there were no 0x00 bytes in the word. + # + # 2) Given a word 'x', we can test to see _which_ byte was zero by + # calculating ~(((x & 0x7f7f7f7f) + 0x7f7f7f7f) | x | 0x7f7f7f7f). + # This produces 0x80 in each byte that was zero, and 0x00 in all + # the other bytes. The '| 0x7f7f7f7f' clears the low 7 bits in each + # byte, and the '| x' part ensures that bytes with the high bit set + # produce 0x00. The addition will carry into the high bit of each byte + # iff that byte had one of its low 7 bits set. We can then just see + # which was the most significant bit set and divide by 8 to find how + # many to add to the index. + # This is from the book 'The PowerPC Compiler Writer's Guide', + # by Steve Hoxey, Faraydon Karim, Bill Hay and Hank Warren. + # + # We deal with strings not aligned to a word boundary by taking the + # first word and ensuring that bytes not part of the string + # are treated as nonzero. To allow for memory latency, we unroll the + # loop a few times, being careful to ensure that we do not read ahead + # across cache line boundaries. + # + # Questions to answer: + # 1) How long are strings passed to strlen? If they're often really long, + # we should probably use cache management instructions and/or unroll the + # loop more. If they're often quite short, it might be better to use + # fact (2) in the inner loop than have to recalculate it. + # 2) How popular are bytes with the high bit set? If they are very rare, + # on some processors it might be useful to use the simpler expression + # ~((x - 0x01010101) | 0x7f7f7f7f) (that is, on processors with only one + # ALU), but this fails when any character has its high bit set. + + # Some notes on register usage: Under the SVR4 ABI, we can use registers + # 0 and 3 through 12 (so long as we don't call any procedures) without + # saving them. We can also use registers 14 through 31 if we save them. + # We can't use r1 (it's the stack pointer), nor r2 or r13 because the user + # program may expect them to be hold their usual value if we get sent + # a signal. Integer parameters are passed in r3 through r10. + # We can use condition registers cr0, cr1, cr5, cr6, and cr7 without saving + # them, the others we must save. + + .section ".text" + .align 3 + .globl strlen + .type strlen,@function +strlen: + # On entry, r3 points to the string, and it's left that way. + # We use r6 to store 0x01010101, and r7 to store 0x7f7f7f7f. + # r4 is used to keep the current index into the string; r5 holds + # the number of padding bits we prepend to the string to make it + # start at a word boundary. r8 holds the 'current' word. + # r9-12 are temporaries. r0 is used as a temporary and for discarded + # results. + clrrwi 4,3,2 + lis 6,0xfeff + lis 7,0x7f7f + rlwinm 10,3,0,29,29 + lwz 8,0(4) + addi 7,7,0x7f7f + rlwinm 5,3,3,27,28 + cmpwi 1,10,0 + li 9,-1 + # That's the setup done, now do the first pair of words. + # We make an exception and use method (2) on the first two words, to reduce + # overhead. + srw 9,9,5 + and 0,7,8 + or 10,7,8 + add 0,0,7 + nor 0,10,0 + and. 8,0,9 + bne done0 + # Handle second word of pair. Put addi between branches to avoid hurting + # branch prediction. + addi 6,6,0xfffffeff + + bne 1,loop + lwzu 8,4(4) + and 0,7,8 + or 10,7,8 + add 0,0,7 + nor. 0,10,0 + bne done0 + + # The loop. + +loop: lwz 8,4(4) + lwzu 9,8(4) + add 0,6,8 + nor 10,7,8 + and. 0,0,10 + add 11,6,9 + nor 12,7,9 + bne done1 + and. 0,11,12 + beq loop + + and 0,7,9 + or 10,7,9 + b done2 + +done1: addi 4,4,-4 + and 0,7,9 + or 10,7,9 +done2: add 0,0,7 + nor 0,10,0 + + # When we get to here, r4 points to the first word in the string that + # contains a zero byte, and the most significant set bit in r8 is in that + # byte. +done0: cntlzw 11,8 + subf 0,3,4 + srwi 11,11,3 + add 3,0,11 + blr +0: + .size strlen,0b-strlen diff --git a/sysdeps/stub/fchdir.c b/sysdeps/stub/fchdir.c index 8eb7700..b18dcc7 100644 --- a/sysdeps/stub/fchdir.c +++ b/sysdeps/stub/fchdir.c @@ -1,20 +1,20 @@ -/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <errno.h> #include <stddef.h> @@ -25,7 +25,7 @@ int fchdir (fd) int fd; { - __set_errno (ENOSYS(; + __set_errno (ENOSYS); return -1; } diff --git a/sysdeps/stub/fchmod.c b/sysdeps/stub/fchmod.c index f8c5c80..eba768f 100644 --- a/sysdeps/stub/fchmod.c +++ b/sysdeps/stub/fchmod.c @@ -1,20 +1,20 @@ -/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <errno.h> #include <stddef.h> @@ -29,7 +29,7 @@ __fchmod (fd, mode) { if (fd < 0) { - __set_errno (EINVAL(; + __set_errno (EINVAL); return -1; } diff --git a/sysdeps/unix/sysv/linux/net/route.h b/sysdeps/unix/sysv/linux/net/route.h index d60a3ca..3518dc5 100644 --- a/sysdeps/unix/sysv/linux/net/route.h +++ b/sysdeps/unix/sysv/linux/net/route.h @@ -25,6 +25,7 @@ #include <sys/socket.h> #include <sys/types.h> +#include <netinet/in.h> /* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */ @@ -50,6 +51,21 @@ struct rtentry #define rt_mss rt_mtu +struct in6_rtmsg + { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + unsigned long int rtmsg_type; + unsigned short int rtmsg_dst_len; + unsigned short int rtmsg_src_len; + unsigned long int rtmsg_metric; + unsigned long int rtmsg_info; + unsigned long int rtmsg_flags; + int rtmsg_ifindex; + }; + + #define RTF_UP 0x0001 /* Route usable. */ #define RTF_GATEWAY 0x0002 /* Destination is a gateway. */ @@ -68,17 +84,17 @@ struct rtentry #define RTF_THROW 0x2000 /* Go to next class. */ #define RTF_NOPMTUDISC 0x4000 /* Do not send packets with DF. */ -/* Bad idea. IPv6 should not use broken IPv4 interface. */ - -#define RTF_ADDRCONF 0x0800 /* Announced on link prefix. */ -#define RTF_INVALID 0x1000 -#define RTF_DCACHE 0x2000 -#define RTF_DEFAULT 0x4000 /* Route is a default route. */ -#define RTF_NEXTHOP 0x8000 /* Non gateway route with nexthop. */ +/* for IPv6 */ +#define RTF_DEFAULT 0x00010000 /* default - learned via ND */ +#define RTF_ALLONLINK 0x00020000 /* fallback, no routers on link */ +#define RTF_ADDRCONF 0x00040000 /* addrconf route - RA */ +#define RTF_LINKRT 0x00100000 /* link specific - device match */ +#define RTF_NONEXTHOP 0x00200000 /* route with no nexthop */ -#define RTF_MAGIC 0x10000 /* Route added/deleted automatically, - when interface changes its state. */ +#define RTF_CACHE 0x01000000 /* cache entry */ +#define RTF_FLOW 0x02000000 /* flow significant route */ +#define RTF_POLICY 0x04000000 /* policy route */ #define RTCF_VALVE 0x00200000 #define RTCF_MASQ 0x00400000 diff --git a/wcsmbs/wcstof.c b/wcsmbs/wcstof.c index ef1448b..f410e4c 100644 --- a/wcsmbs/wcstof.c +++ b/wcsmbs/wcstof.c @@ -30,6 +30,8 @@ #define SET_MANTISSA(flt, mant) \ do { union ieee754_float u; \ u.f = (flt); \ + if ((mant & 0x7fffff) == 0) \ + mant = 0x400000; \ u.ieee.mantissa = (mant) & 0x7fffff; \ (flt) = u.f; \ } while (0) diff --git a/wcsmbs/wcstold.c b/wcsmbs/wcstold.c index c94d47e..1a3f0d2 100644 --- a/wcsmbs/wcstold.c +++ b/wcsmbs/wcstold.c @@ -30,7 +30,9 @@ #define SET_MANTISSA(flt, mant) \ do { union ieee854_long_double u; \ u.d = (flt); \ - u.ieee.mantissa0 = ((mant) >> 32) & 0x7fffffff; \ + if ((mant & 0x7fffffffffffffffULL) == 0) \ + mant = 0x4000000000000000ULL; \ + u.ieee.mantissa0 = (((mant) >> 32) & 0x7fffffff) | 0x80000000; \ u.ieee.mantissa1 = (mant) & 0xffffffff; \ (flt) = u.d; \ } while (0) |