mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-17 13:00:43 +08:00
Update.
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>.
This commit is contained in:
parent
5929563ff2
commit
22d57dd369
114
ChangeLog
114
ChangeLog
@ -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}.
|
||||
|
39
FAQ
39
FAQ
@ -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?''
|
||||
@ -636,6 +643,37 @@ glibc has defined a replacement. Otherwise you might get undefined
|
||||
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:
|
||||
@ -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
|
||||
|
131
configure
vendored
131
configure
vendored
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
if (__fgetgrent_r (stream, &resbuf, buffer, sizeof buffer, &result) != 0)
|
||||
return NULL;
|
||||
/* 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;
|
||||
|
||||
/* Release lock. Preserve error value. */
|
||||
save = errno;
|
||||
__libc_lock_unlock (lock);
|
||||
__set_errno (save);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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})
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -122,6 +122,9 @@ FUNCTION_NAME (ADD_PARAMS)
|
||||
buffer = new_buf;
|
||||
}
|
||||
|
||||
if (buffer == NULL)
|
||||
result = NULL;
|
||||
|
||||
#ifdef HANDLE_DIGITS_DOTS
|
||||
done:
|
||||
#endif
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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))
|
||||
if (*line == '\0' || TRAILING_LIST_SEPARATOR_P (*line))
|
||||
{
|
||||
*p++ = elt;
|
||||
*line = '\0';
|
||||
do
|
||||
++line;
|
||||
while (isspace (*line));
|
||||
elt = line;
|
||||
}
|
||||
else if (*line == '\0')
|
||||
{
|
||||
/* 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;
|
||||
|
@ -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;
|
||||
|
||||
if (__fgetpwent_r (stream, &resbuf, buffer, sizeof buffer, &result) != 0)
|
||||
return NULL;
|
||||
/* 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;
|
||||
|
||||
/* Release lock. Preserve error value. */
|
||||
save = errno;
|
||||
__libc_lock_unlock (lock);
|
||||
__set_errno (save);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
return __fgetspent_r (stream, &resbuf, buffer, sizeof buffer, &result)
|
||||
? NULL : result;
|
||||
/* 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 result;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
len = strlen (string) + 1;
|
||||
if (len > max_size)
|
||||
/* Get lock. */
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -796,6 +796,14 @@ TRANS This error code has no purpose. */
|
||||
#ifdef EREMOTEIO
|
||||
/* */
|
||||
[EREMOTEIO] = N_("Remote I/O error"),
|
||||
#endif
|
||||
#ifdef ENOMEDIUM
|
||||
/* */
|
||||
[ENOMEDIUM] = N_("No medium found"),
|
||||
#endif
|
||||
#ifdef EMEDIUMTYPE
|
||||
/* */
|
||||
[EMEDIUMTYPE] = N_("Wrong medium type"),
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
#ifdef __GNUC__
|
||||
|
||||
vod *
|
||||
void *
|
||||
memset (void *dstpp, int c, size_t len)
|
||||
{
|
||||
unsigned long int dstp = (unsigned long int) dstpp;
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
92
sysdeps/m68k/fpu/s_cexp.c
Normal file
92
sysdeps/m68k/fpu/s_cexp.c
Normal file
@ -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))
|
4
sysdeps/m68k/fpu/s_cexpf.c
Normal file
4
sysdeps/m68k/fpu/s_cexpf.c
Normal file
@ -0,0 +1,4 @@
|
||||
#define SUFF f
|
||||
#define huge_val HUGE_VALF
|
||||
#define float_type float
|
||||
#include <s_cexp.c>
|
4
sysdeps/m68k/fpu/s_cexpl.c
Normal file
4
sysdeps/m68k/fpu/s_cexpl.c
Normal file
@ -0,0 +1,4 @@
|
||||
#define SUFF l
|
||||
#define huge_val HUGE_VALL
|
||||
#define float_type long double
|
||||
#include <s_cexp.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))
|
||||
|
@ -1,3 +1,3 @@
|
||||
#define FUNC modff
|
||||
#define SUFF f
|
||||
#define float_type float
|
||||
#include <s_modf.c>
|
||||
|
@ -1,3 +1,3 @@
|
||||
#define FUNC modfl
|
||||
#define SUFF l
|
||||
#define float_type long double
|
||||
#include <s_modf.c>
|
||||
|
2
sysdeps/m68k/fpu/s_nearbyint.c
Normal file
2
sysdeps/m68k/fpu/s_nearbyint.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define FUNC nearbyint
|
||||
#include <s_atan.c>
|
2
sysdeps/m68k/fpu/s_nearbyintf.c
Normal file
2
sysdeps/m68k/fpu/s_nearbyintf.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define FUNC nearbyintf
|
||||
#include <s_atanf.c>
|
2
sysdeps/m68k/fpu/s_nearbyintl.c
Normal file
2
sysdeps/m68k/fpu/s_nearbyintl.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define FUNC nearbyintl
|
||||
#include <s_atanl.c>
|
2
sysdeps/m68k/fpu/s_trunc.c
Normal file
2
sysdeps/m68k/fpu/s_trunc.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define FUNC trunc
|
||||
#include <s_atan.c>
|
2
sysdeps/m68k/fpu/s_truncf.c
Normal file
2
sysdeps/m68k/fpu/s_truncf.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define FUNC truncf
|
||||
#include <s_atanf.c>
|
2
sysdeps/m68k/fpu/s_truncl.c
Normal file
2
sysdeps/m68k/fpu/s_truncl.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define FUNC truncl
|
||||
#include <s_atanl.c>
|
145
sysdeps/powerpc/strlen.s
Normal file
145
sysdeps/powerpc/strlen.s
Normal file
@ -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
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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. */
|
||||
/* 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_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. */
|
||||
#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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user