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:
Ulrich Drepper 1997-04-02 14:47:34 +00:00
parent 5929563ff2
commit 22d57dd369
51 changed files with 1051 additions and 377 deletions

114
ChangeLog
View File

@ -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
View File

@ -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
View File

@ -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

View File

@ -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)

View File

@ -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;
}

View File

@ -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;

View File

@ -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})

View File

@ -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);
}

View File

@ -122,6 +122,9 @@ FUNCTION_NAME (ADD_PARAMS)
buffer = new_buf;
}
if (buffer == NULL)
result = NULL;
#ifdef HANDLE_DIGITS_DOTS
done:
#endif

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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
};

View File

@ -23,7 +23,7 @@
#ifdef __GNUC__
vod *
void *
memset (void *dstpp, int c, size_t len)
{
unsigned long int dstp = (unsigned long int) dstpp;

View File

@ -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)

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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 */

View File

@ -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;

View File

@ -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
View 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))

View File

@ -0,0 +1,4 @@
#define SUFF f
#define huge_val HUGE_VALF
#define float_type float
#include <s_cexp.c>

View File

@ -0,0 +1,4 @@
#define SUFF l
#define huge_val HUGE_VALL
#define float_type long double
#include <s_cexp.c>

View File

@ -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))

View File

@ -1,3 +1,3 @@
#define FUNC modff
#define SUFF f
#define float_type float
#include <s_modf.c>

View File

@ -1,3 +1,3 @@
#define FUNC modfl
#define SUFF l
#define float_type long double
#include <s_modf.c>

View File

@ -0,0 +1,2 @@
#define FUNC nearbyint
#include <s_atan.c>

View File

@ -0,0 +1,2 @@
#define FUNC nearbyintf
#include <s_atanf.c>

View File

@ -0,0 +1,2 @@
#define FUNC nearbyintl
#include <s_atanl.c>

View File

@ -0,0 +1,2 @@
#define FUNC trunc
#include <s_atan.c>

View File

@ -0,0 +1,2 @@
#define FUNC truncf
#include <s_atanf.c>

View File

@ -0,0 +1,2 @@
#define FUNC truncl
#include <s_atanl.c>

145
sysdeps/powerpc/strlen.s Normal file
View 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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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)

View File

@ -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)