1997-09-25 00:23  Ulrich Drepper  <drepper@cygnus.com>

	* elf/dl-profile.c: Correct implementation.

	* io/ftwtest-sh: Don't depend on TMPDIR == /tmp.

	* locale/setlocale.c: Rewrite a bit for more clarity.

	* math/Makefile (libm-calls): Add w_exp2.
	* math/math_private.h: Add prototypes for __ieee754_exp2{,f,l}.
	* sysdeps/libm-i387/s_exp2.S: Change name to __ieee754_exp2.
	* sysdeps/libm-i387/s_exp2f.S: Likewise.
	* sysdeps/libm-i387/s_exp2l.S: Likewise.
	* sysdeps/libm-ieee754/k_standard.c: Add error cases for exp2.

	* string/bits/string2.h (__strcpy_small): Optimize.
	(__stpcpy_small): Likewise.
	(strncpy): Use variable for dest argument since it's used more than
	once.
	(strncat): Likewise.
	(strcmp): Add optimization for this function.
	* sysdeps/i386/i486/string.h (strlen): Correctly use __builtin_strlen.
	(__strcpy_small): Optimize.
	(__stpcpy_small): Likewise.
	(__stpcpy_c): Correctly use __mempcpy_* macros.
	(__mempcpy_by2, __mempcpy_by4, __mempcpy_byn): Return pointer to
	byte following last copied.
	(strncat): Use variable for dest argument since it's used more than
	once.
	(strcmp): Add optimization for this function.

	* sysdeps/i386/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE): Use
	.text and .previous to select correct section.

1997-09-23 19:56  Philip Blundell  <Philip.Blundell@pobox.com>

	* configure.in: Add `--disable-versioning' option to suppress the
	use of symbol versions even if binutils claims to support it.

1997-09-24 20:10  Philip Blundell  <Philip.Blundell@pobox.com>

	* csu/Makefile (before-compile): Don't try to build abi-tags.h if
	not using ELF.

1997-09-21  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/sofini.c [HAVE_DWARF2_UNWIND_INFO]: Supply termination for
	the frame unwind info section.

	* elf/soinit.c [HAVE_DWARF2_UNWIND_INFO]: Register and unregister
	the frame unwind info.

	* config.h.in (HAVE_DWARF2_UNWIND_INFO): Add #undef.

	* configure.in: Check whether gcc supports DWARF2 unwind info.

	* libc.map: Export frame handling tables.

1997-09-10 06:56  Geoff Keating  <geoffk@ozemail.com.au>

	* sysdeps/unix/sysv/linux/powerpc/bits/kernel_termios.h:
	Use the size of the kernel's termios structure for ioctls.

	* sysdeps/powerpc/dl-machine.h: Prepare for library profiling.

	* sysdeps/powerpc/bits/mathinline.h: Add slightly slower versions
	of the C9X FP comparison macros. Delete 'fabs' and 'sqrt' inline
	routines, because gcc has them as internals.

	* sysdeps/powerpc/Makefile (pic-ccflags): Define this instead of
	CFLAGS-.os.

	* sysdeps/powerpc/bzero.S: New file.
	* sysdeps/powerpc/strcat.c: New file.
	* sysdeps/powerpc/strcpy.S: New file.
	* sysdeps/powerpc/stpcpy.S: New file.

	* math/Makefile: Add atest_exp2, test-reduce.
	* math/atest_exp2.c: New file.
	* math/test-reduce.c: New file.
	* sysdeps/libm-ieee754/Dist: New file.
	* sysdeps/libm-ieee754/s_exp2.c: New file.
	* sysdeps/libm-ieee754/s_exp2f.c: New file.
	* sysdeps/libm-ieee754/t_exp2.h: New file.
	* sysdeps/libm-ieee754/t_exp2f.h: New file.
	* math/libm-test.c (exp2_test): Add some more tests.

	* Rules: Use empty.os instead of empty.o, since it gets linked into
	libc.so...
	* configure.in: Add --disable-static to disable building .a files.
	* config.make.in: Substitute the new variable.
	* Makeconfig: Don't build .o files if not building .a files.

	* elf/dl-runtime.c (fixup): Factor out call to elf_machine_relplt.
	(profile_fixup): Likewise.

1997-09-23  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* posix/globtest.c (main): Change to directory passed as first
	argument.

	* posix/globtest.sh: Don't cd before running the program, instead
	pass testdir as argument, so that $common_objpfx remains valid.

1997-09-23 18:01  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* nis/nis_call.c (__do_niscall2): Fix multiple Server support.

	* nis/nis_findserver.c: Save latest working sockaddr_in.

1997-09-17 22:07  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* configure.in: Automatically determine whether as and ld are the
	GNU versions.
	(options):  --with-gnu-{as,ld,binutils} replaced by
	single option --with-binutils=PATH specifying a -B option to gcc.
	* aclocal.m4: Two new macros defined, LIBC_PROG_FOO_GNU and
	LIBC_PROG_BINUTILS.

	* configure.in: Allow the user to force configuration for
	unsupported platforms with an undocumented option.

1997-09-22 16:55  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* sunrpc/get_myaddr.c (get_myaddress): Avoid loopback interfaces,
	return loopback address only if there is no other interface.

	* nis/Makefile: Add nis_callback libnsl-routines.

	* nis/nis_add.c: Use new __do_niscall* interface.
	* nis/nis_cache.c: Likewise.
	* nis/nis_checkpoint.c: Likewise.
	* nis/nis_lookup.c: Likewise.
	* nis/nis_mkdir.c: Likewise.
	* nis/nis_modify.c: Likewise.
	* nis/nis_ping.c: Likewise.
	* nis/nis_remove.c: Likewise.
	* nis/nis_rmdir.c: Likewise.
	* nis/nis_server.c: Likewise.
	* nis/nis_util.c: Likewise.

	* nis/rpcsvc/nis.h: Make C++ safe.

	* nis/nss_nisplus/nisplus-publickey.c (getsecretkey): Fix use
	of variables.

	* nis/nis_findserv.c: Make thread safe.

	* nis/nis_call.c: Add support for callback, Fix use of variables.
	* nis/nis_table.c: Add support for callback, FOLLOW_PATH and
	ALL_RESULTS.
	* nis/nis_callback.c: New, callback functions.
	* nis/nis_intern.h: Add callback declarations.

1997-09-20  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* string/bits/string2.h: Fix logic in preprocessor directive.
	(__strsep_1c, __strsep_g): Don't declare __retval as pointing to
	const, to save a cast and a possible warning.

1997-09-22 04:12  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/i386/i486/atomicity.h (exchange_and_add): Really address
	memory in xadd not %1.

1997-09-21 13:56  Ulrich Drepper  <drepper@cygnus.com>

	* manual/maint.texi (Supported Configurations): Add SPARC64 to
	list of supported platforms.
This commit is contained in:
Ulrich Drepper 1997-09-24 23:03:42 +00:00
parent 2604afb1b2
commit 650425ceb4
73 changed files with 3703 additions and 1109 deletions

170
ChangeLog
View File

@ -1,3 +1,173 @@
1997-09-25 00:23 Ulrich Drepper <drepper@cygnus.com>
* elf/dl-profile.c: Correct implementation.
* io/ftwtest-sh: Don't depend on TMPDIR == /tmp.
* locale/setlocale.c: Rewrite a bit for more clarity.
* math/Makefile (libm-calls): Add w_exp2.
* math/math_private.h: Add prototypes for __ieee754_exp2{,f,l}.
* sysdeps/libm-i387/s_exp2.S: Change name to __ieee754_exp2.
* sysdeps/libm-i387/s_exp2f.S: Likewise.
* sysdeps/libm-i387/s_exp2l.S: Likewise.
* sysdeps/libm-ieee754/k_standard.c: Add error cases for exp2.
* string/bits/string2.h (__strcpy_small): Optimize.
(__stpcpy_small): Likewise.
(strncpy): Use variable for dest argument since it's used more than
once.
(strncat): Likewise.
(strcmp): Add optimization for this function.
* sysdeps/i386/i486/string.h (strlen): Correctly use __builtin_strlen.
(__strcpy_small): Optimize.
(__stpcpy_small): Likewise.
(__stpcpy_c): Correctly use __mempcpy_* macros.
(__mempcpy_by2, __mempcpy_by4, __mempcpy_byn): Return pointer to
byte following last copied.
(strncat): Use variable for dest argument since it's used more than
once.
(strcmp): Add optimization for this function.
* sysdeps/i386/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE): Use
.text and .previous to select correct section.
1997-09-23 19:56 Philip Blundell <Philip.Blundell@pobox.com>
* configure.in: Add `--disable-versioning' option to suppress the
use of symbol versions even if binutils claims to support it.
1997-09-24 20:10 Philip Blundell <Philip.Blundell@pobox.com>
* csu/Makefile (before-compile): Don't try to build abi-tags.h if
not using ELF.
1997-09-21 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* elf/sofini.c [HAVE_DWARF2_UNWIND_INFO]: Supply termination for
the frame unwind info section.
* elf/soinit.c [HAVE_DWARF2_UNWIND_INFO]: Register and unregister
the frame unwind info.
* config.h.in (HAVE_DWARF2_UNWIND_INFO): Add #undef.
* configure.in: Check whether gcc supports DWARF2 unwind info.
* libc.map: Export frame handling tables.
1997-09-10 06:56 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/unix/sysv/linux/powerpc/bits/kernel_termios.h:
Use the size of the kernel's termios structure for ioctls.
* sysdeps/powerpc/dl-machine.h: Prepare for library profiling.
* sysdeps/powerpc/bits/mathinline.h: Add slightly slower versions
of the C9X FP comparison macros. Delete 'fabs' and 'sqrt' inline
routines, because gcc has them as internals.
* sysdeps/powerpc/Makefile (pic-ccflags): Define this instead of
CFLAGS-.os.
* sysdeps/powerpc/bzero.S: New file.
* sysdeps/powerpc/strcat.c: New file.
* sysdeps/powerpc/strcpy.S: New file.
* sysdeps/powerpc/stpcpy.S: New file.
* math/Makefile: Add atest_exp2, test-reduce.
* math/atest_exp2.c: New file.
* math/test-reduce.c: New file.
* sysdeps/libm-ieee754/Dist: New file.
* sysdeps/libm-ieee754/s_exp2.c: New file.
* sysdeps/libm-ieee754/s_exp2f.c: New file.
* sysdeps/libm-ieee754/t_exp2.h: New file.
* sysdeps/libm-ieee754/t_exp2f.h: New file.
* math/libm-test.c (exp2_test): Add some more tests.
* Rules: Use empty.os instead of empty.o, since it gets linked into
libc.so...
* configure.in: Add --disable-static to disable building .a files.
* config.make.in: Substitute the new variable.
* Makeconfig: Don't build .o files if not building .a files.
* elf/dl-runtime.c (fixup): Factor out call to elf_machine_relplt.
(profile_fixup): Likewise.
1997-09-23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* posix/globtest.c (main): Change to directory passed as first
argument.
* posix/globtest.sh: Don't cd before running the program, instead
pass testdir as argument, so that $common_objpfx remains valid.
1997-09-23 18:01 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* nis/nis_call.c (__do_niscall2): Fix multiple Server support.
* nis/nis_findserver.c: Save latest working sockaddr_in.
1997-09-17 22:07 Zack Weinberg <zack@rabi.phys.columbia.edu>
* configure.in: Automatically determine whether as and ld are the
GNU versions.
(options): --with-gnu-{as,ld,binutils} replaced by
single option --with-binutils=PATH specifying a -B option to gcc.
* aclocal.m4: Two new macros defined, LIBC_PROG_FOO_GNU and
LIBC_PROG_BINUTILS.
* configure.in: Allow the user to force configuration for
unsupported platforms with an undocumented option.
1997-09-22 16:55 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* sunrpc/get_myaddr.c (get_myaddress): Avoid loopback interfaces,
return loopback address only if there is no other interface.
* nis/Makefile: Add nis_callback libnsl-routines.
* nis/nis_add.c: Use new __do_niscall* interface.
* nis/nis_cache.c: Likewise.
* nis/nis_checkpoint.c: Likewise.
* nis/nis_lookup.c: Likewise.
* nis/nis_mkdir.c: Likewise.
* nis/nis_modify.c: Likewise.
* nis/nis_ping.c: Likewise.
* nis/nis_remove.c: Likewise.
* nis/nis_rmdir.c: Likewise.
* nis/nis_server.c: Likewise.
* nis/nis_util.c: Likewise.
* nis/rpcsvc/nis.h: Make C++ safe.
* nis/nss_nisplus/nisplus-publickey.c (getsecretkey): Fix use
of variables.
* nis/nis_findserv.c: Make thread safe.
* nis/nis_call.c: Add support for callback, Fix use of variables.
* nis/nis_table.c: Add support for callback, FOLLOW_PATH and
ALL_RESULTS.
* nis/nis_callback.c: New, callback functions.
* nis/nis_intern.h: Add callback declarations.
1997-09-20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* string/bits/string2.h: Fix logic in preprocessor directive.
(__strsep_1c, __strsep_g): Don't declare __retval as pointing to
const, to save a cast and a possible warning.
1997-09-22 04:12 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/i386/i486/atomicity.h (exchange_and_add): Really address
memory in xadd not %1.
1997-09-21 13:56 Ulrich Drepper <drepper@cygnus.com>
* manual/maint.texi (Supported Configurations): Add SPARC64 to
list of supported platforms.
1997-09-21 03:19 Ulrich Drepper <drepper@cygnus.com>
* libio/libio.h: More libstdc++ cleanups. Define _IO_USE_DTOA if

View File

@ -533,9 +533,12 @@ endif
# The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
# to pass different flags for each flavor.
libtypes = $(foreach o,$(object-suffixes),$(libtype$o))
object-suffixes := .o
all-object-suffixes := .o .os .op .og .ob
object-suffixes :=
ifeq (yes,$(build-static))
libtype.o := lib%.a
object-suffixes += .o
endif
ifeq (yes,$(build-shared))
# Under --enable-shared, we will build a shared library of PIC objects.
# The PIC object files are named foo.os.

7
Rules
View File

@ -81,7 +81,7 @@ $(common-objpfx)dummy.c:
echo 'void __dummy__ (void) { }' > $@
$(common-objpfx)empty.c:
cp -f /dev/null $@
common-generated := $(common-generated) dummy.o dummy.c empty.c empty.o
common-generated := $(common-generated) dummy.o dummy.c empty.c empty.os
# This makes all the auxiliary and test programs.
@ -166,7 +166,10 @@ endif
ifdef static-only-routines
# These routines are to be omitted from the shared library object,
# so we replace the PIC objects for them with the empty object file.
$(static-only-routines:%=$(objpfx)%.os): %.os: $(common-objpfx)empty.o
$(static-only-routines:%=$(objpfx)%.os): %.os: $(common-objpfx)empty.os
rm -f $@
ln $< $@
$(common-objpfx)empty.os: $(common-objpfx)empty.c $(before-compile)
$(compile-command.c)
endif

28
aclocal.m4 vendored
View File

@ -90,3 +90,31 @@ AC_MSG_RESULT($ac_cv_prog_cc_cross)
AC_SUBST(cross_linkable)
cross_compiling=$ac_cv_prog_cc_cross
])
AC_DEFUN(LIBC_PROG_FOO_GNU,
[# Most GNU programs take a -v and spit out some text including
# the word 'GNU'. Some try to read stdin, so give them /dev/null.
if $1 -v </dev/null 2>&1 | grep -q GNU; then
$2
else
$3
fi])
AC_DEFUN(LIBC_PROG_BINUTILS,
[# Was a --with-binutils option given?
if test -n "$path_binutils"; then
# Make absolute; ensure a single trailing slash.
path_binutils=`(cd $path_binutils; pwd) | sed 's%/*$%/%'`
CC="$CC -B$with_binutils"
fi
AS=`$CC -print-file-name=as`
LD=`$CC -print-file-name=ld`
# Determine whether we are using GNU binutils.
AC_CACHE_CHECK(whether $AS is GNU as, libc_cv_prog_as_gnu,
[LIBC_PROG_FOO_GNU($AS, libc_cv_prog_as_gnu=yes, libc_cv_prog_as_gnu=no)])
gnu_as=$libc_cv_prog_as_gnu
AC_CACHE_CHECK(whether $LD is GNU ld, libc_cv_prog_ld_gnu,
[LIBC_PROG_FOO_GNU($LD, libc_cv_prog_ld_gnu=yes, libc_cv_prog_ld_gnu=no)])
gnu_ld=$libc_cv_prog_ld_gnu])

View File

@ -49,6 +49,9 @@
/* Define if static NSS modules are wanted. */
#undef DO_STATIC_NSS
/* Define if gcc uses DWARF2 unwind information for exception support. */
#undef HAVE_DWARF2_UNWIND_INFO
/*
*/

View File

@ -37,6 +37,7 @@ have-ksh = @libc_cv_have_ksh@
# Configuration options.
gnu-as = @gnu_as@
gnu-ld = @gnu_ld@
build-static = @static@
build-shared = @shared@
build-profile = @profile@
build-omitfp = @omitfp@

299
configure vendored
View File

@ -5,6 +5,10 @@
# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.12
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
@ -23,11 +27,8 @@ ac_help="$ac_help
ac_help="$ac_help
--with-fp if using floating-point hardware [default=yes]"
ac_help="$ac_help
--with-gnu-binutils if using GNU binutils (as and ld)"
ac_help="$ac_help
--with-gnu-ld if using GNU ld (in the binutils package)"
ac_help="$ac_help
--with-gnu-as if using GNU as (in the binutils package)"
--with-binutils=PATH specify location of binutils (as and ld)
path_binutils=$withval"
ac_help="$ac_help
--with-elf if using the ELF object format"
ac_help="$ac_help
@ -35,6 +36,8 @@ ac_help="$ac_help
ac_help="$ac_help
--disable-sanity-checks really do not use threads (should not be used
except in special situations) [default=yes]"
ac_help="$ac_help
--enable-static build static library [default=yes]"
ac_help="$ac_help
--enable-shared build shared library [default=yes if GNU ld & ELF]"
ac_help="$ac_help
@ -43,6 +46,9 @@ ac_help="$ac_help
--enable-omitfp build undebuggable optimized library [default=no]"
ac_help="$ac_help
--enable-bounded build with runtime bounds checking [default=no]"
ac_help="$ac_help
--disable-versioning do not include versioning information in the
library objects [default=yes if supported]"
ac_help="$ac_help
--enable-add-ons=DIR... configure and build named extra directories"
ac_help="$ac_help
@ -604,31 +610,12 @@ else
with_fp=yes
fi
# Check whether --with-gnu-binutils or --without-gnu-binutils was given.
if test "${with_gnu_binutils+set}" = set; then
withval="$with_gnu_binutils"
gnu_binutils=$withval
else
gnu_binutils=no
# Check whether --with-binutils or --without-binutils was given.
if test "${with_binutils+set}" = set; then
withval="$with_binutils"
path_binutils=''
fi
# Check whether --with-gnu-ld or --without-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then
withval="$with_gnu_ld"
gnu_ld=$withval
else
gnu_ld=no
fi
# Check whether --with-gnu-as or --without-gnu-as was given.
if test "${with_gnu_as+set}" = set; then
withval="$with_gnu_as"
gnu_as=$withval
else
gnu_as=no
fi
test $gnu_binutils = yes && gnu_as=yes gnu_ld=yes
# Check whether --with-elf or --without-elf was given.
if test "${with_elf+set}" = set; then
withval="$with_elf"
@ -660,6 +647,14 @@ else
fi
# Check whether --enable-static or --disable-static was given.
if test "${enable_static+set}" = set; then
enableval="$enable_static"
static=$enableval
else
static=yes
fi
# Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
enableval="$enable_shared"
@ -692,6 +687,14 @@ else
bounded=no
fi
# Check whether --enable-versioning or --disable-versioning was given.
if test "${enable_versioning+set}" = set; then
enableval="$enable_versioning"
enable_versioning=$enableval
else
enable_versioning=yes
fi
# Check whether --enable-add-ons or --disable-add-ons was given.
if test "${enable_add_ons+set}" = set; then
@ -751,7 +754,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
echo "configure:755: checking host system type" >&5
echo "configure:758: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@ -789,19 +792,25 @@ esac
### I put this here to prevent those annoying emails from people who cannot
### read and try to compile glibc on unsupported platforms. --drepper
###
case "$host_os" in
linux* | gnu*)
;;
*)
echo "*** The GNU C library is currently not available for this platform."
echo "*** So far nobody cared to port it and if there is no volunteer it"
echo "*** might never happen. So, if you have interest to see glibc on"
echo "*** this platform visit"
echo "*** http://www.gnu.ai.mit.edu/software/libc/porting.html"
echo "*** and join the group of porters"
exit 1
;;
esac
### By using the undocumented --enable-hacker-mode option for configure
### one can skip this test to make the configuration not fail for unsupported
### platforms.
###
if test -z "$enable_hacker_mode"; then
case "$host_os" in
linux* | gnu*)
;;
*)
echo "*** The GNU C library is currently not available for this platform."
echo "*** So far nobody cared to port it and if there is no volunteer it"
echo "*** might never happen. So, if you have interest to see glibc on"
echo "*** this platform visit"
echo "*** http://www.gnu.ai.mit.edu/software/libc/porting.html"
echo "*** and join the group of porters"
exit 1
;;
esac
fi
# We keep the original values in `$config_*' and never modify them, so we
# can write them unchanged into config.make. Everything else uses
@ -857,7 +866,7 @@ esac
# This can take a while to compute.
sysdep_dir=$srcdir/sysdeps
echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6
echo "configure:861: checking sysdep dirs" >&5
echo "configure:870: checking sysdep dirs" >&5
# Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1.
os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`"
@ -1058,7 +1067,7 @@ echo "$ac_t""sysdeps/generic sysdeps/stub" 1>&6
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
echo "configure:1062: checking for a BSD compatible install" >&5
echo "configure:1071: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -1112,7 +1121,7 @@ if test "$INSTALL" = "${srcdir}/install-sh -c"; then
INSTALL='\$(..)./install-sh -c'
fi
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
echo "configure:1116: checking whether ln -s works" >&5
echo "configure:1125: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1137,7 +1146,7 @@ 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:1141: checking for $ac_word" >&5
echo "configure:1150: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1170,7 +1179,7 @@ test -n "$MSGFMT" || MSGFMT=":"
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1174: checking for $ac_word" >&5
echo "configure:1183: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1199,7 +1208,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1203: checking for $ac_word" >&5
echo "configure:1212: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1247,7 +1256,7 @@ fi
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:1251: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
echo "configure:1260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@ -1257,11 +1266,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF
#line 1261 "configure"
#line 1270 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
if { (eval echo configure:1274: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
@ -1284,13 +1293,13 @@ else
cross_linkable=yes
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:1288: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "configure:1297: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:1294: checking whether we are using GNU C" >&5
echo "configure:1303: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1299,7 +1308,7 @@ else
yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1303: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1312: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@ -1316,7 +1325,7 @@ if test $ac_cv_prog_gcc = yes; then
yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1320: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1329: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
if test -z "$CFLAGS"; then
CFLAGS="-g -O2"
fi
@ -1328,7 +1337,7 @@ else
fi
echo $ac_n "checking build system type""... $ac_c" 1>&6
echo "configure:1332: checking build system type" >&5
echo "configure:1341: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@ -1351,7 +1360,7 @@ 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:1355: checking for $ac_word" >&5
echo "configure:1364: 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
@ -1382,7 +1391,7 @@ done
fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:1386: checking how to run the C preprocessor" >&5
echo "configure:1395: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@ -1397,13 +1406,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 1401 "configure"
#line 1410 "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:1407: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1416: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
@ -1414,13 +1423,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
#line 1418 "configure"
#line 1427 "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:1424: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1433: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
@ -1442,6 +1451,49 @@ else
fi
echo "$ac_t""$CPP" 1>&6
# Was a --with-binutils option given?
if test -n "$path_binutils"; then
# Make absolute; ensure a single trailing slash.
path_binutils=`(cd $path_binutils; pwd) | sed 's%/*$%/%'`
CC="$CC -B$with_binutils"
fi
AS=`$CC -print-file-name=as`
LD=`$CC -print-file-name=ld`
# Determine whether we are using GNU binutils.
echo $ac_n "checking whether $AS is GNU as""... $ac_c" 1>&6
echo "configure:1466: checking whether $AS is GNU as" >&5
if eval "test \"`echo '$''{'libc_cv_prog_as_gnu'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Most GNU programs take a -v and spit out some text including
# the word 'GNU'. Some try to read stdin, so give them /dev/null.
if $AS -v </dev/null 2>&1 | grep -q GNU; then
libc_cv_prog_as_gnu=yes
else
libc_cv_prog_as_gnu=no
fi
fi
echo "$ac_t""$libc_cv_prog_as_gnu" 1>&6
gnu_as=$libc_cv_prog_as_gnu
echo $ac_n "checking whether $LD is GNU ld""... $ac_c" 1>&6
echo "configure:1483: checking whether $LD is GNU ld" >&5
if eval "test \"`echo '$''{'libc_cv_prog_ld_gnu'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Most GNU programs take a -v and spit out some text including
# the word 'GNU'. Some try to read stdin, so give them /dev/null.
if $LD -v </dev/null 2>&1 | grep -q GNU; then
libc_cv_prog_ld_gnu=yes
else
libc_cv_prog_ld_gnu=no
fi
fi
echo "$ac_t""$libc_cv_prog_ld_gnu" 1>&6
gnu_ld=$libc_cv_prog_ld_gnu
if test $host != $build; then
ac_tool_prefix=${host_alias}-
else
@ -1451,7 +1503,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:1455: checking for $ac_word" >&5
echo "configure:1507: 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
@ -1482,7 +1534,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:1486: checking for $ac_word" >&5
echo "configure:1538: 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
@ -1513,7 +1565,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:1517: checking for $ac_word" >&5
echo "configure:1569: 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
@ -1548,7 +1600,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:1552: checking for $ac_word" >&5
echo "configure:1604: 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
@ -1589,7 +1641,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:1593: checking for $ac_word" >&5
echo "configure:1645: 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
@ -1631,7 +1683,7 @@ fi
echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6
echo "configure:1635: checking for signed size_t type" >&5
echo "configure:1687: 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
@ -1655,12 +1707,12 @@ EOF
fi
echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6
echo "configure:1659: checking for libc-friendly stddef.h" >&5
echo "configure:1711: 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 1664 "configure"
#line 1716 "configure"
#include "confdefs.h"
#define __need_size_t
#define __need_wchar_t
@ -1675,7 +1727,7 @@ size_t size; wchar_t wchar;
if (&size == NULL || &wchar == NULL) abort ();
; return 0; }
EOF
if { (eval echo configure:1679: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_friendly_stddef=yes
else
@ -1694,7 +1746,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:1698: checking whether we need to use -P to assemble .S files" >&5
echo "configure:1750: 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
@ -1717,7 +1769,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:1721: checking for assembler global-symbol directive" >&5
echo "configure:1773: 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
@ -1747,7 +1799,7 @@ EOF
fi
echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6
echo "configure:1751: checking for .set assembler directive" >&5
echo "configure:1803: 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
@ -1781,7 +1833,7 @@ EOF
fi
echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6
echo "configure:1785: checking for .symver assembler directive" >&5
echo "configure:1837: 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
@ -1800,7 +1852,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:1804: checking for ld --version-script" >&5
echo "configure:1856: 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
@ -1819,7 +1871,7 @@ EOF
if { ac_try='${CC-cc} $CFLAGS -shared -o conftest.so conftest.o
-nostartfiles -nostdlib
-Wl,--version-script,conftest.map
1>&5'; { (eval echo configure:1823: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
1>&5'; { (eval echo configure:1875: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
then
libc_cv_ld_version_script_option=yes
else
@ -1836,7 +1888,8 @@ fi
echo "$ac_t""$libc_cv_ld_version_script_option" 1>&6
if test $libc_cv_asm_symver_directive = yes &&
test $libc_cv_ld_version_script_option = yes; then
test $libc_cv_ld_version_script_option = yes &&
test $enable_versioning = yes; then
VERSIONING=yes
cat >> confdefs.h <<\EOF
#define DO_VERSIONING 1
@ -1849,7 +1902,7 @@ fi
if test $elf = yes; then
echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6
echo "configure:1853: checking for .previous assembler directive" >&5
echo "configure:1906: 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
@ -1857,7 +1910,7 @@ else
.section foo_section
.previous
EOF
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1861: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1914: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_asm_previous_directive=yes
else
libc_cv_asm_previous_directive=no
@ -1873,7 +1926,7 @@ EOF
else
echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6
echo "configure:1877: checking for .popsection assembler directive" >&5
echo "configure:1930: 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
@ -1881,7 +1934,7 @@ else
.pushsection foo_section
.popsection
EOF
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1885: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1938: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_asm_popsection_directive=yes
else
libc_cv_asm_popsection_directive=no
@ -1901,12 +1954,12 @@ fi
if test $elf != yes; then
echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
echo "configure:1905: checking for .init and .fini sections" >&5
echo "configure:1958: 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 1910 "configure"
#line 1963 "configure"
#include "confdefs.h"
int main() {
@ -1915,7 +1968,7 @@ asm (".section .init");
asm (".text");
; return 0; }
EOF
if { (eval echo configure:1919: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1972: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_have_initfini=yes
else
@ -1943,19 +1996,19 @@ if test $elf = yes; then
else
if test $ac_cv_prog_cc_works = yes; then
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
echo "configure:1947: checking for _ prefix on C symbol names" >&5
echo "configure:2000: 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 1952 "configure"
#line 2005 "configure"
#include "confdefs.h"
asm ("_glibc_foobar:");
int main() {
glibc_foobar ();
; return 0; }
EOF
if { (eval echo configure:1959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
if { (eval echo configure:2012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
libc_cv_asm_underscores=yes
else
@ -1970,17 +2023,17 @@ fi
echo "$ac_t""$libc_cv_asm_underscores" 1>&6
else
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
echo "configure:1974: checking for _ prefix on C symbol names" >&5
echo "configure:2027: 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 1979 "configure"
#line 2032 "configure"
#include "confdefs.h"
void underscore_test(void) {
return; }
EOF
if { (eval echo configure:1984: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:2037: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if grep _underscore_test conftest* >/dev/null; then
rm -f conftest*
libc_cv_asm_underscores=yes
@ -2013,7 +2066,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:2017: checking for assembler .weak directive" >&5
echo "configure:2070: 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
@ -2036,7 +2089,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:2040: checking for assembler .weakext directive" >&5
echo "configure:2093: 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
@ -2073,7 +2126,7 @@ EOF
fi
echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
echo "configure:2077: checking for ld --no-whole-archive" >&5
echo "configure:2130: 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
@ -2084,7 +2137,7 @@ __throw () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -Wl,--no-whole-archive
-o conftest conftest.c 1>&5'; { (eval echo configure:2088: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
-o conftest conftest.c 1>&5'; { (eval echo configure:2141: \"$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
@ -2095,7 +2148,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:2099: checking for gcc -fno-exceptions" >&5
echo "configure:2152: 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
@ -2106,7 +2159,7 @@ __throw () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -fno-exceptions
-o conftest conftest.c 1>&5'; { (eval echo configure:2110: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
-o conftest conftest.c 1>&5'; { (eval echo configure:2163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_no_exceptions=yes
else
libc_cv_gcc_no_exceptions=no
@ -2116,6 +2169,48 @@ fi
echo "$ac_t""$libc_cv_gcc_no_exceptions" 1>&6
echo $ac_n "checking for DWARF2 unwind info support""... $ac_c" 1>&6
echo "configure:2174: checking for DWARF2 unwind info support" >&5
if eval "test \"`echo '$''{'libc_cv_gcc_dwarf2_unwind_info'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.c <<EOF
#line 2179 "configure"
static char __EH_FRAME_BEGIN__;
_start ()
{
__register_frame (__EH_FRAME_BEGIN__);
__deregister_frame (__EH_FRAME_BEGIN__);
}
int __eh_pc;
__throw () {}
/* FIXME: this is fragile. */
malloc () {}
strcmp () {}
strlen () {}
memcpy () {}
memset () {}
free () {}
abort () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles
-o conftest conftest.c -lgcc >&5'; { (eval echo configure:2199: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_dwarf2_unwind_info=yes
else
libc_cv_gcc_dwarf2_unwind_info=no
fi
rm -f conftest*
fi
echo "$ac_t""$libc_cv_gcc_dwarf2_unwind_info" 1>&6
if test $libc_cv_gcc_dwarf2_unwind_info = yes; then
cat >> confdefs.h <<\EOF
#define HAVE_DWARF2_UNWIND_INFO 1
EOF
fi
### End of automated tests.
### Now run sysdeps configure fragments.
@ -2158,7 +2253,7 @@ if test "$uname" = "sysdeps/generic"; then
fi
echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
echo "configure:2162: checking OS release for uname" >&5
echo "configure:2257: 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
@ -2180,7 +2275,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:2184: checking OS version for uname" >&5
echo "configure:2279: 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
@ -2202,7 +2297,7 @@ else
fi
echo $ac_n "checking stdio selection""... $ac_c" 1>&6
echo "configure:2206: checking stdio selection" >&5
echo "configure:2301: checking stdio selection" >&5
case $stdio in
libio) cat >> confdefs.h <<\EOF
@ -2214,7 +2309,7 @@ esac
echo "$ac_t""$stdio" 1>&6
echo $ac_n "checking ldap selection""... $ac_c" 1>&6
echo "configure:2218: checking ldap selection" >&5
echo "configure:2313: checking ldap selection" >&5
case $add_ons in
*ldap*)
@ -2252,6 +2347,7 @@ EOF
fi
if test $shared = default; then
if test $gnu_ld = yes; then
shared=$elf
@ -2453,6 +2549,7 @@ s%@has_ldconfig@%$has_ldconfig%g
s%@gnu_ld@%$gnu_ld%g
s%@gnu_as@%$gnu_as%g
s%@elf@%$elf%g
s%@static@%$static%g
s%@shared@%$shared%g
s%@profile@%$profile%g
s%@omitfp@%$omitfp%g

View File

@ -36,16 +36,9 @@ dnl Arguments to specify presence of other packages/features.
AC_ARG_WITH(fp, dnl
[ --with-fp if using floating-point hardware [default=yes]],
with_fp=$withval, with_fp=yes)
AC_ARG_WITH(gnu-binutils, dnl
--with-gnu-binutils if using GNU binutils (as and ld),
gnu_binutils=$withval, gnu_binutils=no)
AC_ARG_WITH(gnu-ld, dnl
--with-gnu-ld if using GNU ld (in the binutils package),
gnu_ld=$withval, gnu_ld=no)
AC_ARG_WITH(gnu-as, dnl
--with-gnu-as if using GNU as (in the binutils package),
gnu_as=$withval, gnu_as=no)
test $gnu_binutils = yes && gnu_as=yes gnu_ld=yes
AC_ARG_WITH(binutils, dnl
--with-binutils=PATH specify location of binutils (as and ld)
path_binutils=$withval, path_binutils='')
AC_ARG_WITH(elf, dnl
--with-elf if using the ELF object format,
elf=$withval, elf=no)
@ -64,8 +57,11 @@ AC_ARG_ENABLE(sanity-checks, dnl
except in special situations) [default=yes]],
enable_sanity=$enableval, enable_sanity=yes)
dnl Arguments to enable or disable building the shared, profiled, and
dnl -fomit-frame-pointer libraries.
dnl Arguments to enable or disable building the static, shared, profiled,
dnl and -fomit-frame-pointer libraries.
AC_ARG_ENABLE(static, dnl
[ --enable-static build static library [default=yes]],
static=$enableval, static=yes)
AC_ARG_ENABLE(shared, dnl
[ --enable-shared build shared library [default=yes if GNU ld & ELF]],
shared=$enableval, shared=default)
@ -78,6 +74,10 @@ AC_ARG_ENABLE(omitfp, dnl
AC_ARG_ENABLE(bounded, dnl
[ --enable-bounded build with runtime bounds checking [default=no]],
bounded=$enableval, bounded=no)
AC_ARG_ENABLE(versioning, dnl
[ --disable-versioning do not include versioning information in the
library objects [default=yes if supported]],
enable_versioning=$enableval, enable_versioning=yes)
dnl Generic infrastructure for drop-in additions to libc.
AC_ARG_ENABLE(add-ons, dnl
@ -120,19 +120,25 @@ esac
### I put this here to prevent those annoying emails from people who cannot
### read and try to compile glibc on unsupported platforms. --drepper
###
case "$host_os" in
linux* | gnu*)
;;
*)
echo "*** The GNU C library is currently not available for this platform."
echo "*** So far nobody cared to port it and if there is no volunteer it"
echo "*** might never happen. So, if you have interest to see glibc on"
echo "*** this platform visit"
echo "*** http://www.gnu.ai.mit.edu/software/libc/porting.html"
echo "*** and join the group of porters"
exit 1
;;
esac
### By using the undocumented --enable-hacker-mode option for configure
### one can skip this test to make the configuration not fail for unsupported
### platforms.
###
if test -z "$enable_hacker_mode"; then
case "$host_os" in
linux* | gnu*)
;;
*)
echo "*** The GNU C library is currently not available for this platform."
echo "*** So far nobody cared to port it and if there is no volunteer it"
echo "*** might never happen. So, if you have interest to see glibc on"
echo "*** this platform visit"
echo "*** http://www.gnu.ai.mit.edu/software/libc/porting.html"
echo "*** and join the group of porters"
exit 1
;;
esac
fi
# We keep the original values in `$config_*' and never modify them, so we
# can write them unchanged into config.make. Everything else uses
@ -401,6 +407,7 @@ if test $host != $build; then
fi
AC_SUBST(cross_compiling)
AC_PROG_CPP
LIBC_PROG_BINUTILS
AC_CHECK_TOOL(AR, ar)
AC_CHECK_TOOL(RANLIB, ranlib, :)
@ -568,7 +575,8 @@ else
fi
rm -f conftest*])
if test $libc_cv_asm_symver_directive = yes &&
test $libc_cv_ld_version_script_option = yes; then
test $libc_cv_ld_version_script_option = yes &&
test $enable_versioning = yes; then
VERSIONING=yes
AC_DEFINE(DO_VERSIONING)
else
@ -749,6 +757,39 @@ fi
rm -f conftest*])
AC_SUBST(libc_cv_gcc_no_exceptions)dnl
AC_CACHE_CHECK(for DWARF2 unwind info support, libc_cv_gcc_dwarf2_unwind_info,
[cat > conftest.c <<EOF
#line __oline__ "configure"
static char __EH_FRAME_BEGIN__[];
_start ()
{
__register_frame (__EH_FRAME_BEGIN__);
__deregister_frame (__EH_FRAME_BEGIN__);
}
int __eh_pc;
__throw () {}
/* FIXME: this is fragile. */
malloc () {}
strcmp () {}
strlen () {}
memcpy () {}
memset () {}
free () {}
abort () {}
EOF
dnl No \ in command here because it ends up inside ''.
if AC_TRY_COMMAND([${CC-cc} $CFLAGS
-nostdlib -nostartfiles
-o conftest conftest.c -lgcc >&AC_FD_CC]); then
libc_cv_gcc_dwarf2_unwind_info=yes
else
libc_cv_gcc_dwarf2_unwind_info=no
fi
rm -f conftest*])
if test $libc_cv_gcc_dwarf2_unwind_info = yes; then
AC_DEFINE(HAVE_DWARF2_UNWIND_INFO)
fi
### End of automated tests.
### Now run sysdeps configure fragments.
@ -876,6 +917,7 @@ if test $elf = yes; then
AC_DEFINE(HAVE_ELF)
fi
AC_SUBST(static)
AC_SUBST(shared)
if test $shared = default; then
if test $gnu_ld = yes; then

View File

@ -32,7 +32,9 @@ csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o)
extra-objs = start.o gmon-start.o \
$(start-installed-name) g$(start-installed-name) \
$(csu-dummies)
ifeq ($(elf),yes)
before-compile = $(objpfx)abi-tag.h
endif
omit-deps = $(patsubst %.o,%,$(start-installed-name) g$(start-installed-name) \
$(csu-dummies))
install-lib = $(start-installed-name) g$(start-installed-name) \

View File

@ -30,6 +30,7 @@
#include <sys/gmon.h>
#include <sys/gmon_out.h>
#include <sys/mman.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <atomicity.h>
@ -97,7 +98,7 @@
?? ?? ?? ?? <- ToPC#CGN
0038+(2*CN+2)*A+(CN-1)*4+K ?? ?? ?? ?? <- Count#CGN
We put (for now? no basic block information in the file since this would
We put (for now?) no basic block information in the file since this would
introduce rase conditions among all the processes who want to write them.
`K' is the number of count entries which is computed as
@ -140,10 +141,10 @@ static uint32_t narcs;
currently in the mmaped file. At no point of time this has to be the
same as NARCS. If it is equal all entries from the file are in our
lists. */
static uint32_t *narcsp;
static volatile uint32_t *narcsp;
/* Description of the currently profiled object. */
static long int state;
static long int state = GMON_PROF_OFF;
static volatile uint16_t *kcount;
static size_t kcountsize;
@ -260,13 +261,24 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
fd = __open (filename, O_RDWR | O_CREAT, 0666);
if (fd == -1)
/* We cannot write the profiling data so don't do anthing. */
return;
{
/* We cannot write the profiling data so don't do anthing. */
char buf[400];
_dl_sysdep_message (filename, ": cannot open file: ",
_strerror_internal (errno, buf, sizeof buf),
"\n", NULL);
return;
}
if (fstat (fd, &st) < 0 || !S_ISREG (st.st_mode))
{
/* Not stat'able or not a regular file => don't use it. */
close (fd);
char buf[400];
int errnum = errno;
__close (fd);
_dl_sysdep_message (filename, ": cannot stat file: ",
_strerror_internal (errnum, buf, sizeof buf),
"\n", NULL);
return;
}
@ -286,9 +298,9 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
cannot_create:
errnum = errno;
__close (fd);
_dl_sysdep_error (filename, ": cannot create file: ",
_strerror_internal (errnum, buf, sizeof buf),
"\n", NULL);
_dl_sysdep_message (filename, ": cannot create file: ",
_strerror_internal (errnum, buf, sizeof buf),
"\n", NULL);
return;
}
@ -304,9 +316,9 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
if (addr != NULL)
__munmap ((void *) addr, expected_size);
_dl_sysdep_error (filename,
": file is no correct profile data file for `",
_dl_profile, "'\n", NULL);
_dl_sysdep_message (filename,
": file is no correct profile data file for `",
_dl_profile, "'\n", NULL);
return;
}
@ -317,9 +329,9 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
char buf[400];
int errnum = errno;
__close (fd);
_dl_sysdep_error (filename, ": cannot map file: ",
_strerror_internal (errnum, buf, sizeof buf),
"\n", NULL);
_dl_sysdep_message (filename, ": cannot map file: ",
_strerror_internal (errnum, buf, sizeof buf),
"\n", NULL);
return;
}
@ -332,10 +344,8 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
+ sizeof (struct gmon_hist_hdr));
/* Compute pointer to array of the arc information. */
data = (struct here_cg_arc_record *) ((char *) kcount + kcountsize
+ 2 * sizeof (uint32_t));
narcsp = (uint32_t *) (hist + sizeof (uint32_t)
+ sizeof (struct gmon_hist_hdr) + sizeof (uint32_t));
narcsp = (uint32_t *) ((char *) kcount + kcountsize + sizeof (uint32_t));
data = (struct here_cg_arc_record *) ((char *) narcsp + sizeof (uint32_t));
if (st.st_size == 0)
{
@ -346,8 +356,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
memcpy (hist + sizeof (uint32_t), &hist_hdr,
sizeof (struct gmon_hist_hdr));
*(uint32_t *) (hist + sizeof (uint32_t) + sizeof (struct gmon_hist_hdr)
+ kcountsize) = GMON_TAG_CG_ARC;
narcsp[-1] = GMON_TAG_CG_ARC;
}
else
{
@ -356,18 +365,16 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
|| *(uint32_t *) hist != GMON_TAG_TIME_HIST
|| memcmp (hist + sizeof (uint32_t), &hist_hdr,
sizeof (struct gmon_hist_hdr)) != 0
|| (*(uint32_t *) (hist + sizeof (uint32_t)
+ sizeof (struct gmon_hist_hdr) + kcountsize)
!= GMON_TAG_CG_ARC))
|| narcsp[-1] != GMON_TAG_CG_ARC)
goto wrong_format;
}
/* Allocate memory for the froms data and the pointer to the tos records. */
tos = (uint16_t *) calloc (tossize + fromssize, 1);
if (froms == NULL)
if (tos == NULL)
{
__munmap ((void *) addr, expected_size);
_dl_sysdep_fatal ("Out of memory while initializing profiler", NULL);
_dl_sysdep_fatal ("Out of memory while initializing profiler\n", NULL);
/* NOTREACHED */
}
@ -381,13 +388,12 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
Loading the entries in reverse order should help to get the most
frequently used entries at the front of the list. */
for (idx = narcs = *narcsp; idx > 0; )
for (idx = narcs = MIN (*narcsp, fromlimit); idx > 0; )
{
size_t to_index;
size_t newfromidx;
--idx;
to_index = ((data[idx].self_pc - lowpc)
/ (hashfraction * sizeof (*tos)));
to_index = (data[idx].self_pc / (hashfraction * sizeof (*tos)));
newfromidx = fromidx++;
froms[newfromidx].here = &data[idx];
froms[newfromidx].link = tos[to_index];
@ -458,18 +464,18 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
fromp = &froms[fromp->link];
while (fromp->link != 0 && fromp->here->from_pc != frompc);
if (fromp->link == 0)
if (fromp->here->from_pc != frompc)
{
topcindex = &fromp->link;
check_new_or_add:
/* Our entry is not among the entries we read so far from the
data file. Now see whether we have to update the list. */
while (narcs != *narcsp)
while (narcs != *narcsp && narcs < fromlimit)
{
size_t to_index;
size_t newfromidx;
to_index = ((data[narcs].self_pc - lowpc)
to_index = (data[narcs].self_pc
/ (hashfraction * sizeof (*tos)));
newfromidx = fromidx++;
froms[newfromidx].here = &data[narcs];
@ -481,22 +487,22 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
/* If we still have no entry stop searching and insert. */
if (*topcindex == 0)
{
fromidx = 1 + exchange_and_add (narcsp, 1);
++narcs;
size_t newarc = 1 + exchange_and_add (narcsp, 1);
/* In rare cases it could happen that all entries in FROMS are
occupied. So we cannot count this anymore. */
if (fromidx >= fromlimit)
if (newarc >= fromlimit)
goto done;
*topcindex = fromindex;
fromp = &froms[fromindex];
fromp = &froms[fromp->link];
fromp = &froms[*topcindex = fromidx++];
fromp->here = &data[newarc];
data[newarc].from_pc = frompc;
data[newarc].self_pc = selfpc;
data[newarc].count = 0;
fromp->link = 0;
fromp->here->from_pc = frompc;
fromp->here->count = 0;
narcs++;
break;
}

View File

@ -130,6 +130,8 @@ fixup (
struct link_map **scope = _dl_object_relocation_scope (l);
{
const struct r_found_version *here_version;
/* This macro is used as a callback from the elf_machine_relplt code. */
#define RESOLVE(ref, version, flags) \
((version) != NULL && (version)->hash != 0 \
@ -147,13 +149,13 @@ fixup (
l->l_info[VERSYMIDX (DT_VERSYM)]->d_un.d_ptr);
ElfW(Half) ndx = version[ELFW(R_SYM) (reloc->r_info)];
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
&l->l_versions[ndx],
(void *) rel_addr);
here_version = &l->l_versions[ndx];
}
else
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
NULL, (void *) rel_addr);
here_version = NULL;
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
here_version, (void *) rel_addr);
}
*_dl_global_scope_end = NULL;
@ -194,6 +196,8 @@ profile_fixup (
struct link_map **scope = _dl_object_relocation_scope (l);
{
const struct r_found_version *here_version;
/* This macro is used as a callback from the elf_machine_relplt code. */
#define RESOLVE(ref, version, flags) \
((version) != NULL && (version)->hash != 0 \
@ -211,19 +215,20 @@ profile_fixup (
l->l_info[VERSYMIDX (DT_VERSYM)]->d_un.d_ptr);
ElfW(Half) ndx = version[ELFW(R_SYM) (reloc->r_info)];
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
&l->l_versions[ndx], (void *) &result);
here_version = &l->l_versions[ndx];
}
else
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
NULL, (void *) &result);
here_version = NULL;
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
here_version, (void *) &result);
}
*_dl_global_scope_end = NULL;
(*mcount_fct) (retaddr, result);
(*mcount_fct) (retaddr, ELF_FIXUP_RETURN_VALUE (l, result));
/* Return the address that was written by the relocation. */
return ELF_FIXUP_RETURN_VALUE(l, result);
return ELF_FIXUP_RETURN_VALUE (l, result);
}
#endif

View File

@ -7,3 +7,13 @@ static void (*const __CTOR_END__[1]) (void)
static void (*const __DTOR_END__[1]) (void)
__attribute__ ((unused, section (".dtors")))
= { 0 };
#ifdef HAVE_DWARF2_UNWIND_INFO
/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
this would be the 'length' field in a real FDE. */
typedef unsigned int ui32 __attribute__ ((mode (SI)));
static const ui32 __FRAME_END__[1]
__attribute__ ((unused, section (".eh_frame")))
= { 0 };
#endif

View File

@ -17,6 +17,13 @@ run_hooks (void (*const list[]) (void))
(**list) ();
}
#ifdef HAVE_DWARF2_UNWIND_INFO
static const char __EH_FRAME_BEGIN__[]
__attribute__ ((section (".eh_frame")))
= { };
extern void __register_frame (const void *);
extern void __deregister_frame (const void *);
#endif
/* This function will be called from _init in init-first.c. */
void
@ -24,6 +31,9 @@ __libc_global_ctors (void)
{
/* Call constructor functions. */
run_hooks (__CTOR_LIST__);
#ifdef HAVE_DWARF2_UNWIND_INFO
__register_frame (__EH_FRAME_BEGIN__);
#endif
}
@ -35,4 +45,7 @@ _fini (void)
{
/* Call destructor functions. */
run_hooks (__DTOR_LIST__);
#ifdef HAVE_DWARF2_UNWIND_INFO
__deregister_frame (__EH_FRAME_BEGIN__);
#endif
}

View File

@ -13,7 +13,7 @@ testprogram=$2
# First create our scenario:
tmp=${TMPDIR:-/tmp}
tmp=`echo ${TMPDIR:-/tmp} | sed 's|\(.\)/*$|\1|'`
tmpdir=$tmp/ftwtest.d
[ -f ${objpfx}elf/ld.so ] && ldso=${objpfx}elf/ld.so
@ -46,18 +46,18 @@ LD_LIBRARY_PATH=$objpfx $ldso $testprogram $tmpdir |
sort > $testout
cat <<EOF | cmp $testout - || exit 1
base = "/tmp/", file = "ftwtest.d", flag = FTW_D, level = 0
base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_D, level = 1
base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_D, level = 1
base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, level = 2
base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
base = "$tmp/", file = "ftwtest.d", flag = FTW_D, level = 0
base = "$tmp/ftwtest.d/", file = "bar", flag = FTW_D, level = 1
base = "$tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
base = "$tmp/ftwtest.d/", file = "foo", flag = FTW_D, level = 1
base = "$tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
base = "$tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, level = 2
base = "$tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
EOF
rm $testout
@ -65,18 +65,18 @@ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --depth $tmpdir |
sort > $testout
cat <<EOF | cmp $testout - || exit 1
base = "/tmp/", file = "ftwtest.d", flag = FTW_DP, level = 0
base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_DP, level = 1
base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_DP, level = 1
base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_DP, level = 2
base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_DP, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_DP, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
base = "$tmp/", file = "ftwtest.d", flag = FTW_DP, level = 0
base = "$tmp/ftwtest.d/", file = "bar", flag = FTW_DP, level = 1
base = "$tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
base = "$tmp/ftwtest.d/", file = "foo", flag = FTW_DP, level = 1
base = "$tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
base = "$tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_DP, level = 2
base = "$tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_DP, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_DP, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
EOF
rm $testout
@ -84,20 +84,20 @@ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --phys $tmpdir |
sort > $testout
cat <<EOF | cmp $testout - || exit 1
base = "/tmp/", file = "ftwtest.d", flag = FTW_D, level = 0
base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_D, level = 1
base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_D, level = 1
base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, level = 2
base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SL, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "link@2", flag = FTW_SL, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "link@3", flag = FTW_SL, level = 5
base = "$tmp/", file = "ftwtest.d", flag = FTW_D, level = 0
base = "$tmp/ftwtest.d/", file = "bar", flag = FTW_D, level = 1
base = "$tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
base = "$tmp/ftwtest.d/", file = "foo", flag = FTW_D, level = 1
base = "$tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
base = "$tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, level = 2
base = "$tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SL, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "link@2", flag = FTW_SL, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "link@3", flag = FTW_SL, level = 5
EOF
rm $testout
@ -108,18 +108,18 @@ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir $tmpdir |
sort > $testout
cat <<EOF | cmp $testout - || exit 1
base = "/tmp/", file = "ftwtest.d", flag = FTW_D, cwd = /tmp, level = 0
base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_D, cwd = /tmp/ftwtest.d, level = 1
base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, cwd = /tmp/ftwtest.d, level = 1
base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_D, cwd = /tmp/ftwtest.d, level = 1
base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_F, cwd = /tmp/ftwtest.d/bar, level = 2
base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, cwd = /tmp/ftwtest.d/foo, level = 2
base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, cwd = /tmp/ftwtest.d/foo/lvl1, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, cwd = /tmp/ftwtest.d/foo/lvl1, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, cwd = /tmp/ftwtest.d/foo/lvl1, level = 3
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, cwd = /tmp/ftwtest.d/foo/lvl1/lvl2, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, cwd = /tmp/ftwtest.d/foo/lvl1/lvl2, level = 4
base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, cwd = /tmp/ftwtest.d/foo/lvl1/lvl2/lvl3, level = 5
base = "$tmp/", file = "ftwtest.d", flag = FTW_D, cwd = $tmp, level = 0
base = "$tmp/ftwtest.d/", file = "bar", flag = FTW_D, cwd = $tmp/ftwtest.d, level = 1
base = "$tmp/ftwtest.d/", file = "baz", flag = FTW_F, cwd = $tmp/ftwtest.d, level = 1
base = "$tmp/ftwtest.d/", file = "foo", flag = FTW_D, cwd = $tmp/ftwtest.d, level = 1
base = "$tmp/ftwtest.d/bar/", file = "xo", flag = FTW_F, cwd = $tmp/ftwtest.d/bar, level = 2
base = "$tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, cwd = $tmp/ftwtest.d/foo, level = 2
base = "$tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, cwd = $tmp/ftwtest.d/foo/lvl1, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, cwd = $tmp/ftwtest.d/foo/lvl1, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, cwd = $tmp/ftwtest.d/foo/lvl1, level = 3
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, cwd = $tmp/ftwtest.d/foo/lvl1/lvl2, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, cwd = $tmp/ftwtest.d/foo/lvl1/lvl2, level = 4
base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, cwd = $tmp/ftwtest.d/foo/lvl1/lvl2/lvl3, level = 5
EOF
rm $testout

View File

@ -89,6 +89,10 @@ GLIBC_2.0 {
_rpc_dtablesize; _null_auth; _seterr_reply;
__res_randomid;
# Exception handling support functions from libgcc
__register_frame; __register_frame_table; __deregister_frame;
__frame_state_for;
# variables in normal name space
argp_err_exit_status; argp_program_bug_address; argp_program_version;
argp_program_version_hook;

View File

@ -361,7 +361,7 @@ setlocale (int category, const char *locale)
else
{
struct locale_data *newdata = NULL;
const char *newname = locale;
const char *newname[1] = { locale };
/* Protect global data. */
__libc_lock_lock (__libc_setlocale_lock);
@ -370,7 +370,7 @@ setlocale (int category, const char *locale)
{
/* Only actually load the data if anything will use it. */
newdata = _nl_find_locale (locale_path, locale_path_len, category,
&newname);
&newname[0]);
if (newdata == NULL)
goto abort_single;
@ -381,19 +381,19 @@ setlocale (int category, const char *locale)
}
/* Create new composite name. */
composite = new_composite_name (category, &newname);
composite = new_composite_name (category, newname);
if (composite == NULL)
{
/* Say that we don't have any data loaded. */
abort_single:
newname = NULL;
newname[0] = NULL;
}
else
{
if (_nl_current[category] != NULL)
setdata (category, newdata);
setname (category, newname);
setname (category, newname[0]);
setname (LC_ALL, composite);
}
@ -403,6 +403,6 @@ setlocale (int category, const char *locale)
/* Free the resources (the locale path variable. */
free (locale_path);
return (char *) newname;
return (char *) newname[0];
}
}

View File

@ -272,6 +272,7 @@ i@var{x}86-@var{anything}-gnu
i@var{x}86-@var{anything}-linux
m68k-@var{anything}-linux
powerpc-@var{anything}-linux
sparc64-@var{anything}-linux
@end smallexample
Former releases of this library (version 1.09.1 and perhaps earlier

View File

@ -51,7 +51,7 @@ libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod \
s_floor s_frexp s_ilogb s_ldexp s_log1p s_logb \
s_modf s_nextafter s_rint s_scalbn s_significand \
s_sin s_tan s_tanh w_acos w_acosh w_asin \
w_atan2 w_atanh w_cosh w_drem w_exp w_fmod w_gamma \
w_atan2 w_atanh w_cosh w_drem w_exp w_exp2 w_fmod w_gamma \
w_hypot w_j0 w_j1 w_jn w_lgamma w_lgamma_r \
w_log w_log10 w_pow w_remainder w_scalb w_sinh w_sqrt \
s_signbit s_fpclassify s_fmax s_fmin s_fdim s_nan s_trunc \
@ -78,7 +78,7 @@ distribute += $(long-c-yes:=.c)
# Rules for the test suite.
tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \
test-ifloat test-idouble test-matherr test-fenv \
atest-exp atest-sincos
atest-exp atest-sincos atest-exp2 # test-reduce
# We do the `long double' tests only if this data type is available and
# distrinct from `double'.
test-longdouble-yes = test-ldouble test-ildoubl
@ -93,8 +93,10 @@ LDLIBS-test-float = math/libm
LDLIBS-test-double = math/libm
LDLIBS-test-ldouble = math/libm
LDLIBS-test-matherr = math/libm
LDLIBS-test-reduce = math/libm
LDLIBS-atest-exp = math/libm
LDLIBS-atest-sincos = math/libm
LDLIBS-atest-exp2 = math/libm
distribute += libm-test.c

240
math/atest-exp2.c Normal file
View File

@ -0,0 +1,240 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <Geoff.Keating@anu.edu.au>, 1997.
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. */
#include <stdio.h>
#include <math.h>
#include <gmp.h>
#include <string.h>
#include <limits.h>
#include <assert.h>
#include <stdlib.h>
#define PRINT_ERRORS 0
#define TOL 80
#define N2 18
#define FRAC (32*4)
#define mpbpl (CHAR_BIT * sizeof (mp_limb_t))
#define SZ (FRAC / mpbpl + 1)
typedef mp_limb_t mp1[SZ], mp2[SZ * 2];
/* This string has 101 hex digits. */
static const char exp1[102] = "2" /* point */
"b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a7"
"84d9045190cfef324e7738926cfbe5f4bf8d8d8c31d763da07";
static const char exp_m1[102] = "0" /* point */
"5e2d58d8b3bcdf1abadec7829054f90dda9805aab56c773330"
"24b9d0a507daedb16400bf472b4215b8245b669d90d27a5aea";
static const char hexdig[] = "0123456789abcdef";
void
print_mpn_fp (const mp_limb_t *x, unsigned int dp, unsigned int base)
{
unsigned int i;
mp1 tx;
memcpy (tx, x, sizeof (mp1));
if (base == 16)
fputs ("0x", stdout);
assert (x[SZ-1] < base);
fputc (hexdig[x[SZ - 1]], stdout);
fputc ('.', stdout);
for (i = 0; i < dp; i++)
{
tx[SZ - 1] = 0;
mpn_mul_1 (tx, tx, SZ, base);
assert (tx[SZ - 1] < base);
fputc (hexdig[tx[SZ - 1]], stdout);
}
}
void
read_mpn_hex(mp_limb_t *x, const char *str)
{
int i;
memset (x, 0, sizeof (mp1));
for (i = -1; i < 100 && i < FRAC / 4; ++i)
x[(FRAC - i * 4 - 4) / mpbpl] |= (strchr (hexdig, str[i + 1]) - hexdig
<< (FRAC - i * 4 - 4) % mpbpl);
}
static mp_limb_t *get_log2(void) __attribute__((const));
static mp_limb_t *
get_log2(void)
{
static mp1 log2_m;
static int log2_m_inited = 0;
static const char log2[102] = "0" /* point */
"b17217f7d1cf79abc9e3b39803f2f6af40f343267298b62d8a"
"0d175b8baafa2be7b876206debac98559552fb4afa1b10ed2e";
if (!log2_m_inited)
{
read_mpn_hex (log2_m, log2);
log2_m_inited = 1;
}
return log2_m;
}
/* Compute e^x. */
void
exp_mpn (mp1 ex, mp1 x)
{
unsigned int n;
mp1 xp;
mp2 tmp;
mp_limb_t chk, round;
mp1 tol;
memset (xp, 0, sizeof (mp1));
memset (ex, 0, sizeof (mp1));
xp[FRAC / mpbpl] = 1 << FRAC % mpbpl;
memset (tol, 0, sizeof (mp1));
tol[(FRAC - TOL) / mpbpl] = 1 << (FRAC - TOL) % mpbpl;
n = 0;
do
{
/* Calculate sum(x^n/n!) until the next term is sufficiently small. */
mpn_mul_n (tmp, xp, x, SZ);
assert(tmp[SZ * 2 - 1] == 0);
if (n > 0)
round = mpn_divmod_1 (xp, tmp + FRAC / mpbpl, SZ, n);
chk = mpn_add_n (ex, ex, xp, SZ);
assert (chk == 0);
++n;
assert (n < 80); /* Catch too-high TOL. */
}
while (n < 10 || mpn_cmp (xp, tol, SZ) >= 0);
}
/* Calculate 2^x. */
void
exp2_mpn (mp1 ex, mp1 x)
{
mp2 tmp;
mpn_mul_n (tmp, x, get_log2 (), SZ);
assert(tmp[SZ * 2 - 1] == 0);
exp_mpn (ex, tmp + FRAC / mpbpl);
}
static int
mpn_bitsize(const mp_limb_t *SRC_PTR, mp_size_t SIZE)
{
int i, j;
for (i = SIZE - 1; i > 0; --i)
if (SRC_PTR[i] != 0)
break;
for (j = mpbpl - 1; j > 0; --j)
if ((SRC_PTR[i] & 1 << j) != 0)
break;
return i * 32 + j;
}
int
main (void)
{
mp1 ex, x, xt, e2, e3;
int i;
int errors = 0;
int failures = 0;
mp1 maxerror;
int maxerror_s = 0;
const double sf = pow (2, mpbpl);
/* assert(mpbpl == mp_bits_per_limb); */
assert(FRAC / mpbpl * mpbpl == FRAC);
memset (maxerror, 0, sizeof (mp1));
memset (xt, 0, sizeof (mp1));
xt[(FRAC - N2) / mpbpl] = 1 << (FRAC - N2) % mpbpl;
for (i = 0; i < (1 << N2); ++i)
{
int e2s, e3s, j;
double de2;
mpn_mul_1 (x, xt, SZ, i);
exp2_mpn (ex, x);
de2 = exp2 (i / (double) (1 << N2));
for (j = SZ - 1; j >= 0; --j)
{
e2[j] = (mp_limb_t) de2;
de2 = (de2 - e2[j]) * sf;
}
if (mpn_cmp (ex, e2, SZ) >= 0)
mpn_sub_n (e3, ex, e2, SZ);
else
mpn_sub_n (e3, e2, ex, SZ);
e2s = mpn_bitsize (e2, SZ);
e3s = mpn_bitsize (e3, SZ);
if (e3s > 1 && e2s - e3s < 54)
{
#if PRINT_ERRORS
printf ("%06x ", i * (0x100000 / (1 << N2)));
print_mpn_fp (ex, (FRAC / 4) + 1, 16);
putchar ('\n');
fputs (" ",stdout);
print_mpn_fp (e2, (FRAC / 4) + 1, 16);
putchar ('\n');
printf (" %c ",
e2s - e3s < 54 ? e2s - e3s == 53 ? 'e' : 'F' : 'P');
print_mpn_fp (e3, (FRAC / 4) + 1, 16);
putchar ('\n');
#endif
errors += (e2s - e3s == 53);
failures += (e2s - e3s < 53);
}
if (e3s >= maxerror_s
&& mpn_cmp (e3, maxerror, SZ) > 0)
{
memcpy (maxerror, e3, sizeof (mp1));
maxerror_s = e3s;
}
}
/* Check exp_mpn against precomputed value of exp(1). */
memset (x, 0, sizeof (mp1));
x[FRAC / mpbpl] = 1 << FRAC % mpbpl;
exp_mpn (ex, x);
read_mpn_hex (e2, exp1);
if (mpn_cmp (ex, e2, SZ) >= 0)
mpn_sub_n (e3, ex, e2, SZ);
else
mpn_sub_n (e3, e2, ex, SZ);
printf ("%d failures; %d errors; error rate %0.2f%%\n", failures, errors,
errors * 100.0 / (double) (1 << N2));
fputs ("maximum error: ", stdout);
print_mpn_fp (maxerror, (FRAC / 4) + 1, 16);
putchar ('\n');
fputs ("error in exp(1): ", stdout);
print_mpn_fp (e3, (FRAC / 4) + 1, 16);
putchar ('\n');
return failures == 0 ? 0 : 1;
}

View File

@ -1114,6 +1114,9 @@ exp2_test (void)
check_isinfp ("exp2 (+inf) == +inf", FUNC(exp2) (plus_infty));
check ("exp2 (-inf) == 0", FUNC(exp2) (minus_infty), 0);
check ("exp2 (10) == 1024", FUNC(exp2) (10), 1024);
check ("exp2 (-1) == 0.5", FUNC(exp2) (-1), 0.5);
check_isinfp ("exp2 (1e6) == +inf", FUNC(exp2) (1e6));
check ("exp2 (-1e6) == 0", FUNC(exp2) (-1e6), 0);
}

View File

@ -252,6 +252,7 @@ extern double __ieee754_atanh __P((double));
extern double __ieee754_asin __P((double));
extern double __ieee754_atan2 __P((double,double));
extern double __ieee754_exp __P((double));
extern double __ieee754_exp2 __P((double));
extern double __ieee754_cosh __P((double));
extern double __ieee754_fmod __P((double,double));
extern double __ieee754_pow __P((double,double));
@ -290,6 +291,7 @@ extern float __ieee754_atanhf __P((float));
extern float __ieee754_asinf __P((float));
extern float __ieee754_atan2f __P((float,float));
extern float __ieee754_expf __P((float));
extern float __ieee754_exp2f __P((float));
extern float __ieee754_coshf __P((float));
extern float __ieee754_fmodf __P((float,float));
extern float __ieee754_powf __P((float,float));
@ -327,6 +329,7 @@ extern long double __ieee754_atanhl __P((long double));
extern long double __ieee754_asinl __P((long double));
extern long double __ieee754_atan2l __P((long double,long double));
extern long double __ieee754_expl __P((long double));
extern long double __ieee754_exp2l __P((long double));
extern long double __ieee754_coshl __P((long double));
extern long double __ieee754_fmodl __P((long double,long double));
extern long double __ieee754_powl __P((long double,long double));

207
math/test-reduce.c Normal file
View File

@ -0,0 +1,207 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <Geoff.Keating@anu.edu.au>, 1997.
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. */
/* This is a generic program for comparing two precisions of a one-input
mathematical function. It is amazingly good at detecting when GCC
folds constants improperly. */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <math.h>
#include <ieee754.h>
#include <fenv.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TSMALL float
#define RSMALL(rfun) ({ unsigned rnum = (rfun); *(float *) &rnum; })
#define TBIG double
#define XDIFF (24)
#define REDUCE(x) \
({ union ieee754_float u = { x }; u.ieee.exponent = 0x80; x = u.f; })
#define ABS(x) fabs(x)
#define string_0(x) #x
#define string_1(x) string_0(x)
#define TBIG_NAME string_1(TBIG)
#define TSMALL_NAME string_1(TSMALL)
#define R_NEAREST 1
#define R_ZERO 2
#define R_UP 4
#define R_DOWN 8
#define R_ALL (R_NEAREST|R_ZERO|R_UP|R_DOWN)
static fenv_t rmodes[4];
static const char * const rmnames[4] =
{ "near","zero","+Inf","-Inf" };
static int quiet = 0;
#ifdef FE_ALL_INVALID
static const int invalid_exceptions = (FE_ALL_INVALID
| FE_INVALID | FE_DIVBYZERO);
#else
static const int invalid_exceptions = (FE_INVALID | FE_DIVBYZERO);
#endif
static int
checkit (char *fname,
TSMALL (*fsmall) (TSMALL), TBIG (*fbig) (TBIG),
unsigned smalltries, unsigned largetries)
{
unsigned int i, nerrors = 0, nwarn;
int tryone (TSMALL fval)
{
int rmode;
int excepts, exceptsb;
TSMALL fres;
TBIG fvalb, fresb, diff;
char warn;
fvalb = (TBIG) fval;
for (rmode = 0; rmode < 4; ++rmode)
{
fesetenv (rmodes + rmode);
fres = fsmall (fval);
excepts = fetestexcept (invalid_exceptions);
fesetenv (rmodes + rmode);
fresb = fbig (fvalb);
exceptsb = fetestexcept (invalid_exceptions);
if (excepts != exceptsb)
{
unsigned char *fvp = (unsigned char *) &fval;
size_t j;
printf ("%s(", fname);
for (j = 0; j < sizeof (TSMALL); j++)
printf ("%02x", fvp[j]);
printf ("),%s: exceptions %s: %08x, %s: %08x\n",
rmnames[rmode],
TBIG_NAME, exceptsb, TSMALL_NAME, excepts);
if (++nerrors > 10)
return 1;
}
diff = ABS (fres - (TSMALL) fresb);
if (fres == (TSMALL) fresb
|| isnan (fres) && isnan (fresb)
|| logb (fresb) - logb (diff) < XDIFF - 1)
continue;
if (logb (fresb) - logb (diff) < XDIFF)
{
if (++nwarn > 10 || quiet)
continue;
warn = 'w';
}
else
{
if (++nerrors > 10)
return 1;
warn = 'e';
}
{
TSMALL fresbs = (TSMALL) fresb;
unsigned char *fvp = (unsigned char *) &fval;
unsigned char *frp = (unsigned char *) &fres;
unsigned char *frpb = (unsigned char *) &fresb;
unsigned char *frpbs = (unsigned char *) &fresbs;
size_t j;
printf ("%s(",fname);
for (j = 0; j < sizeof (TSMALL); ++j)
printf ("%02x", fvp[j]);
printf ("),%s: %s ", rmnames[rmode], TBIG_NAME);
for (j = 0; j < sizeof (TBIG); ++j)
printf ("%02x", frpb[j]);
printf (" (");
for (j = 0; j < sizeof (TSMALL); ++j)
printf ("%02x", frpbs[j]);
printf ("), %s ", TSMALL_NAME);
for (j = 0; j < sizeof (TSMALL); ++j)
printf ("%02x", frp[j]);
printf (" %c\n", warn);
}
}
return 0;
}
nwarn = 0;
for (i = 0; i < smalltries; i++)
{
TSMALL fval;
fval = RSMALL (rand () ^ rand () << 16);
REDUCE (fval);
if (tryone (fval))
break;
}
printf ("%s-small: %d errors, %d (%0.2f%%) inaccuracies\n",
fname, nerrors, nwarn,
nwarn * 0.25 / ((double) smalltries));
nwarn = 0;
for (i = 0; i < largetries; ++i)
{
TSMALL fval;
fval = RSMALL (rand () ^ rand () << 16);
if (tryone (fval))
break;
}
printf ("%s-large: %d errors, %d (%0.2f%%) inaccuracies\n",
fname, nerrors, nwarn,
nwarn * 0.25 / ((double) largetries));
return nerrors == 0;
}
int
main (void)
{
int r;
_LIB_VERSION = _IEEE_;
/* Set up environments for rounding modes. */
fesetenv (FE_DFL_ENV);
fesetround (FE_TONEAREST);
fegetenv (rmodes + 0);
fesetround (FE_TOWARDSZERO);
fegetenv (rmodes + 1);
fesetround (FE_UPWARD);
fegetenv (rmodes + 2);
fesetround (FE_DOWNWARD);
fegetenv (rmodes + 3);
/* Seed the RNG. */
srand (time (0));
/* Do it. */
r = checkit ("exp2", exp2f, exp2, 1 << 20, 1 << 15);
r &= checkit ("exp", expf, exp, 1 << 20, 1 << 15);
return r ? 0 : 1;
}

View File

@ -1 +1 @@
NIS(YP)/NIS+ NSS modules 0.13 by Thorsten Kukuk
NIS(YP)/NIS+ NSS modules 0.14 by Thorsten Kukuk

View File

@ -51,7 +51,7 @@ libnsl-routines = yp_xdr ypclnt ypupdate_xdr \
nis_removemember nis_creategroup nis_destroygroup\
nis_print_group_entry nis_domain_of nis_domain_of_r\
nis_modify nis_remove nis_add nis_defaults lckcache\
nis_findserv
nis_findserv nis_callback
libnsl-map = libnsl.map
libnss_compat-routines := $(addprefix compat-,grp pwd spwd) nisplus-parser

View File

@ -1,11 +1,3 @@
* nis_addmember: Where checks for duplicate group members ? nisgrpadm or
nis_addmember ?
* nis_table.c: nis_list():
Missing flags: FOLLOW_PATH, ALL_RESULTS
callback: Don't simulate it, use server callback thread
* Missing flags:
- FOLLOW_PATH (nis_list, not supported)
- ALL_RESULTS (nis_list, not supported, needs server callback)

View File

@ -59,7 +59,8 @@ nis_add (const_nis_name name, const nis_object *obj)
if ((status = __do_niscall (req.ns_object.ns_object_val[0].zo_domain,
NIS_ADD, (xdrproc_t) xdr_ns_request,
(caddr_t) &req, (xdrproc_t) xdr_nis_result,
(caddr_t) res, MASTER_ONLY)) != RPC_SUCCESS)
(caddr_t) res, MASTER_ONLY,
NULL)) != RPC_SUCCESS)
res->status = status;
req.ns_object.ns_object_val[0].zo_name = p1;

View File

@ -143,7 +143,7 @@ __cache_refresh (nis_name name)
if (cache_clnt == NULL)
result = NIS_FAIL;
else if (clnt_call (cache_clnt, NIS_CACHE_REFRESH_ENTRY,
(xdrproc_t) xdr_wrapstring, (caddr_t) name,
(xdrproc_t) xdr_wrapstring, (caddr_t) &name,
(xdrproc_t) xdr_void, &clnt_res, TIMEOUT)
!= RPC_SUCCESS)
{

View File

@ -98,8 +98,7 @@ __bind_next (dir_binding *bind)
if (bind->server_used >= bind->server_len)
bind->server_used = 0;
for (j = bind->current_ep + 1;
j < bind->server_val[bind->server_used].ep.ep_len; ++j)
for (j = 0; j < bind->server_val[bind->server_used].ep.ep_len; ++j)
if (strcmp (bind->server_val[bind->server_used].ep.ep_val[j].family,
"inet") == 0)
if (strcmp (bind->server_val[bind->server_used].ep.ep_val[j].proto,
@ -280,7 +279,7 @@ __bind_create (const nis_server *serv_val, u_int serv_len, u_long flags)
nis_error
__do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
xdrproc_t xargs, caddr_t req, xdrproc_t xres, caddr_t resp,
u_long flags)
u_long flags, nis_cb *cb)
{
enum clnt_stat result;
nis_error retcode;
@ -315,63 +314,83 @@ __do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
{
switch (prog)
{
case NIS_IBLIST:
if ((((nis_result *)resp)->status == NIS_CBRESULTS) &&
(cb != NULL))
{
__nis_do_callback(dbp, &((nis_result *)resp)->cookie, cb);
break;
}
/* Yes, this is correct. If we doesn't have to start
a callback, look if we have to search another server */
case NIS_LOOKUP:
case NIS_ADD:
case NIS_MODIFY:
case NIS_REMOVE:
case NIS_IBLIST:
case NIS_IBADD:
case NIS_IBMODIFY:
case NIS_IBREMOVE:
case NIS_IBFIRST:
case NIS_IBNEXT:
if ((((nis_result *)xres)->status == NIS_NOTFOUND) ||
(((nis_result *)xres)->status == NIS_NOSUCHNAME) ||
(((nis_result *)xres)->status == NIS_NOT_ME))
if ((((nis_result *)resp)->status == NIS_NOTFOUND) ||
(((nis_result *)resp)->status == NIS_NOSUCHNAME) ||
(((nis_result *)resp)->status == NIS_NOT_ME))
{
if (__bind_next (dbp) == NIS_SUCCESS)
while (__bind_connect (dbp) != NIS_SUCCESS)
{
if (__bind_next (dbp) != NIS_SUCCESS)
{
__bind_destroy (dbp);
return NIS_SUCCESS;
}
}
{
while (__bind_connect (dbp) != NIS_SUCCESS)
{
if (__bind_next (dbp) != NIS_SUCCESS)
{
__bind_destroy (dbp);
return NIS_SUCCESS;
}
}
}
else
break; /* No more servers to search in */
goto again;
}
case NIS_FINDDIRECTORY:
if ((((fd_result *)xres)->status == NIS_NOTFOUND) ||
(((fd_result *)xres)->status == NIS_NOSUCHNAME) ||
(((fd_result *)xres)->status == NIS_NOT_ME))
if ((((fd_result *)resp)->status == NIS_NOTFOUND) ||
(((fd_result *)resp)->status == NIS_NOSUCHNAME) ||
(((fd_result *)resp)->status == NIS_NOT_ME))
{
if (__bind_next (dbp) == NIS_SUCCESS)
while (__bind_connect (dbp) != NIS_SUCCESS)
{
if (__bind_next (dbp) != NIS_SUCCESS)
{
__bind_destroy (dbp);
return NIS_SUCCESS;
}
}
{
while (__bind_connect (dbp) != NIS_SUCCESS)
{
if (__bind_next (dbp) != NIS_SUCCESS)
{
__bind_destroy (dbp);
return NIS_SUCCESS;
}
}
}
else
break; /* No more servers to search in */
goto again;
}
break;
case NIS_DUMPLOG: /* log_result */
case NIS_DUMP:
if ((((log_result *)xres)->lr_status == NIS_NOTFOUND) ||
(((log_result *)xres)->lr_status == NIS_NOSUCHNAME) ||
(((log_result *)xres)->lr_status == NIS_NOT_ME))
if ((((log_result *)resp)->lr_status == NIS_NOTFOUND) ||
(((log_result *)resp)->lr_status == NIS_NOSUCHNAME) ||
(((log_result *)resp)->lr_status == NIS_NOT_ME))
{
if (__bind_next (dbp) == NIS_SUCCESS)
while (__bind_connect (dbp) != NIS_SUCCESS)
{
if (__bind_next (dbp) != NIS_SUCCESS)
{
__bind_destroy (dbp);
return NIS_SUCCESS;
}
}
{
while (__bind_connect (dbp) != NIS_SUCCESS)
{
if (__bind_next (dbp) != NIS_SUCCESS)
{
__bind_destroy (dbp);
return NIS_SUCCESS;
}
}
}
else
break; /* No more servers to search in */
goto again;
}
break;
@ -523,7 +542,8 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags,
nis_error
__do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
caddr_t req, xdrproc_t xres, caddr_t resp, u_long flags)
caddr_t req, xdrproc_t xres, caddr_t resp, u_long flags,
nis_cb *cb)
{
nis_error retcode;
directory_obj *dir = NULL;
@ -561,7 +581,7 @@ __do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
retcode = __do_niscall2 (server, server_len, prog, xargs, req, xres, resp,
flags);
flags, cb);
nis_free_directory (dir);

339
nis/nis_callback.c Normal file
View File

@ -0,0 +1,339 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
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. */
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <syslog.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <rpcsvc/nis.h>
#include <bits/libc-lock.h>
#include "nis_intern.h"
extern void get_myaddress (struct sockaddr_in *addr);
/* Sorry, we are not able to make this threadsafe. Stupid. But some
functions doesn't send us a nis_result obj, so we don't have a
cookie. Maybe we could use keys for threads ? Have to learn more
about pthreads -- kukuk@vt.uni-paderborn.de */
#define CB_PROG ((u_long)100302)
#define CB_VERS ((u_long)1)
#define CBPROC_RECEIVE ((u_long)1)
#define CBPROC_FINISH ((u_long)2)
#define CBPROC_ERROR ((u_long)3)
typedef nis_object *obj_p;
struct cback_data
{
struct
{
u_int entries_len;
obj_p *entries_val;
}
entries;
};
typedef struct cback_data cback_data;
static nis_cb *data;
__libc_lock_define_initialized (static, callback)
static bool_t xdr_cback_data (XDR *, cback_data *);
static void
cb_prog_1 (struct svc_req *rqstp, SVCXPRT *transp)
{
union
{
cback_data cbproc_receive_1_arg;
nis_error cbproc_error_1_arg;
}
argument;
char *result;
xdrproc_t xdr_argument, xdr_result;
bool_t bool_result;
switch (rqstp->rq_proc)
{
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *) NULL);
return;
case CBPROC_RECEIVE:
{
char name[NIS_MAXNAMELEN + 1];
u_long i;
xdr_argument = (xdrproc_t) xdr_cback_data;
xdr_result = (xdrproc_t) xdr_bool;
memset (&argument, 0, sizeof (argument));
if (!svc_getargs (transp, xdr_argument, (caddr_t) & argument))
{
svcerr_decode (transp);
return;
}
bool_result = FALSE;
for (i = 0; i < argument.cbproc_receive_1_arg.entries.entries_len; ++i)
{
snprintf (name, NIS_MAXNAMELEN, "%s.%s",
argument.cbproc_receive_1_arg.entries.entries_val[i]->zo_name,
argument.cbproc_receive_1_arg.entries.entries_val[i]->zo_domain);
if ((data->callback)
(name, argument.cbproc_receive_1_arg.entries.entries_val[i],
data->userdata))
{
bool_result = TRUE;
data->nomore = 1;
data->result = NIS_SUCCESS;
break;
}
}
result = (char *) &bool_result;
}
break;
case CBPROC_FINISH:
xdr_argument = (xdrproc_t) xdr_void;
xdr_result = (xdrproc_t) xdr_void;
memset (&argument, 0, sizeof (argument));
if (!svc_getargs (transp, xdr_argument, (caddr_t) & argument))
{
svcerr_decode (transp);
return;
}
data->nomore = 1;
data->result = NIS_SUCCESS;
bool_result = TRUE; /* to make gcc happy, not necessary */
result = (char *) &bool_result;
break;
case CBPROC_ERROR:
xdr_argument = (xdrproc_t) xdr_nis_error;
xdr_result = (xdrproc_t) xdr_void;
memset (&argument, 0, sizeof (argument));
if (!svc_getargs (transp, xdr_argument, (caddr_t) & argument))
{
svcerr_decode (transp);
return;
}
data->nomore = 1;
data->result = argument.cbproc_error_1_arg;
bool_result = TRUE; /* to make gcc happy, not necessary */
result = (char *) &bool_result;
break;
default:
svcerr_noproc (transp);
return;
}
if (result != NULL && !svc_sendreply (transp, xdr_result, result))
svcerr_systemerr (transp);
if (!svc_freeargs (transp, xdr_argument, (caddr_t) & argument))
{
fputs (_ ("unable to free arguments"), stderr);
exit (1);
}
return;
}
static bool_t
xdr_obj_p (XDR * xdrs, obj_p *objp)
{
if (!xdr_pointer (xdrs, (char **) objp, sizeof (nis_object),
(xdrproc_t) xdr_nis_object))
return FALSE;
return TRUE;
}
static bool_t
xdr_cback_data (XDR *xdrs, cback_data *objp)
{
if (!xdr_array (xdrs, (char **) &objp->entries.entries_val,
(u_int *) & objp->entries.entries_len, ~0, sizeof (obj_p),
(xdrproc_t) xdr_obj_p))
return FALSE;
return TRUE;
}
static nis_error
internal_nis_do_callback (struct dir_binding *bptr, netobj *cookie,
struct nis_cb *cb)
{
/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = {25, 0};
#ifdef FD_SETSIZE
fd_set readfds;
#else
int readfds;
#endif /* def FD_SETSIZE */
struct timeval tv;
bool_t cb_is_running = FALSE;
data = cb;
for (;;)
{
#ifdef FD_SETSIZE
readfds = svc_fdset;
#else
readfds = svc_fds;
#endif /* def FD_SETSIZE */
tv.tv_sec = 25;
tv.tv_usec = 0;
switch (select (_rpc_dtablesize (), &readfds, NULL, NULL, &tv))
{
case -1:
if (errno == EINTR)
continue;
return NIS_CBERROR;
case 0:
/* See if callback 'thread' in the server is still alive. */
memset ((char *) &cb_is_running, 0, sizeof (cb_is_running));
if (clnt_call (bptr->clnt, NIS_CALLBACK, (xdrproc_t) xdr_netobj,
(caddr_t) cookie, (xdrproc_t) xdr_bool,
(caddr_t) & cb_is_running, TIMEOUT) != RPC_SUCCESS)
cb_is_running = FALSE;
if (cb_is_running == FALSE)
{
syslog (LOG_ERR, "NIS+: callback timed out");
return NIS_CBERROR;
}
break;
default:
svc_getreqset (&readfds);
if (data->nomore)
return data->result;
}
}
}
nis_error
__nis_do_callback (struct dir_binding *bptr, netobj *cookie,
struct nis_cb *cb)
{
nis_error result;
__libc_lock_lock (callback);
result = internal_nis_do_callback (bptr, cookie, cb);
__libc_lock_unlock (callback);
return result;
}
struct nis_cb *
__nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
const void *),
const void *userdata, u_long flags)
{
struct nis_cb *cb;
int sock = RPC_ANYSOCK;
struct sockaddr_in sin;
int len = sizeof (struct sockaddr_in);
char addr[NIS_MAXNAMELEN + 1];
unsigned short port;
cb = (struct nis_cb *) calloc (1, sizeof (struct nis_cb));
if (cb == NULL)
{
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
return NULL;
}
cb->serv = (nis_server *) calloc (1, sizeof (nis_server));
if (cb->serv == NULL)
{
free (cb);
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
return (NULL);
}
cb->serv->name = strdup (nis_local_host ());
cb->serv->ep.ep_val = (endpoint *) calloc (2, sizeof (endpoint));
cb->serv->ep.ep_len = 1;
cb->serv->ep.ep_val[0].family = strdup ("inet");
cb->callback = callback;
cb->userdata = userdata;
/* XXX Sometimes, we should add the public key of the user here ! */
cb->serv->key_type = NIS_PK_NONE;
cb->serv->pkey.n_bytes = NULL;
cb->serv->pkey.n_len = 0;
if (flags & USE_DGRAM)
{
cb->serv->ep.ep_val[0].proto = strdup ("udp");
cb->xprt = svcudp_bufcreate (sock, 100, 8192);
}
else
{
cb->serv->ep.ep_val[0].proto = strdup ("tcp");
cb->xprt = svctcp_create (sock, 100, 8192);
}
cb->sock = cb->xprt->xp_sock;
if (!svc_register (cb->xprt, CB_PROG, CB_VERS, cb_prog_1, 0))
{
xprt_unregister (cb->xprt);
svc_destroy (cb->xprt);
xdr_free ((xdrproc_t) xdr_nis_server, (char *) cb->serv);
free (cb->serv);
free (cb);
syslog (LOG_ERR, "NIS+: failed to register callback dispatcher");
return NULL;
}
if (getsockname (cb->sock, (struct sockaddr *) &sin, &len) == -1)
{
xprt_unregister (cb->xprt);
svc_destroy (cb->xprt);
xdr_free ((xdrproc_t) xdr_nis_server, (char *) cb->serv);
free (cb->serv);
free (cb);
syslog (LOG_ERR, "NIS+: failed to read local socket info");
return (NULL);
}
port = sin.sin_port;
get_myaddress (&sin);
snprintf (addr, sizeof (addr), "%s.%d.%d", inet_ntoa (sin.sin_addr),
port & 0x00FF, (port & 0xFF00) >> 8);
cb->serv->ep.ep_val[0].uaddr = strdup (addr);
return cb;
}
nis_error
__nis_destroy_callback (struct nis_cb *cb)
{
xprt_unregister (cb->xprt);
svc_destroy (cb->xprt);
close (cb->sock);
xdr_free ((xdrproc_t) xdr_nis_server, (char *) cb->serv);
free (cb->serv);
free (cb);
return NIS_SUCCESS;
}

View File

@ -53,7 +53,7 @@ nis_checkpoint(const_nis_name dirname)
if (__do_niscall2 (&res2->objects.objects_val[0].DI_data.do_servers.do_servers_val[i],
1, NIS_CHECKPOINT, (xdrproc_t) xdr_nis_name,
(caddr_t) &dirname, (xdrproc_t) xdr_cp_result,
(caddr_t) &cpres, 0) != RPC_SUCCESS)
(caddr_t) &cpres, 0, NULL) != RPC_SUCCESS)
res->status = NIS_RPCERROR;
else
{

View File

@ -91,8 +91,6 @@ nis_write_obj (const char *name, const nis_object *obj)
return FALSE;
xdrstdio_create (&xdrs, out, XDR_ENCODE);
/* XXX The following cast is bad! Shouldn't the XDR functions take
pointers to const objects? */
if (!xdr_nis_object (&xdrs, (nis_object *) obj))
return FALSE;

View File

@ -86,9 +86,10 @@ __pmap_getport (struct sockaddr_in *address, u_long program,
rpc_createerr.cf_stat = RPC_PMAPFAILURE;
clnt_geterr (client, &rpc_createerr.cf_error);
}
else if (port == 0)
else
{
rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
if (port == 0)
rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
}
CLNT_DESTROY (client);
}
@ -97,39 +98,7 @@ __pmap_getport (struct sockaddr_in *address, u_long program,
return port;
}
/* Transmit to NULLPROC, return immediately. */
static void *
nis_null_3_send (void *argp, CLIENT * clnt)
{
static char clnt_res;
struct timeval TIMEOUT = {0, 0};
memset ((char *) &clnt_res, 0, sizeof (clnt_res));
if (clnt_call (clnt, NULLPROC,
(xdrproc_t) xdr_void, (caddr_t) argp,
(xdrproc_t) xdr_void, (caddr_t) & clnt_res,
TIMEOUT) != RPC_SUCCESS)
return NULL;
return (void *) &clnt_res;
}
/* Receive request from NULLPROC asynchronously. */
static void *
nis_null_3_recv (void *argp, CLIENT * clnt)
{
static char clnt_res;
struct timeval TIMEOUT = {0, 0};
memset ((char *) &clnt_res, 0, sizeof (clnt_res));
if (clnt_call (clnt, NULLPROC,
(xdrproc_t) NULL, (caddr_t) argp,
(xdrproc_t) xdr_void, (caddr_t) & clnt_res,
TIMEOUT) != RPC_SUCCESS)
return NULL;
return (void *) &clnt_res;
}
/* This is now the public functions, which should find the fastest server */
/* This is now the public function, which should find the fastest server */
struct findserv_req
{
@ -142,13 +111,15 @@ struct findserv_req
long
__nis_findfastest (dir_binding * bind)
{
struct timeval TIMEOUT = {5, 0};
const struct timeval TIMEOUT50 = {5, 0};
const struct timeval TIMEOUT00 = {0, 0};
struct findserv_req **pings;
struct sockaddr_in sin;
struct sockaddr_in sin, saved_sin;
int found = -1;
uint32_t xid_seed, xid_lookup;
u_int32_t xid_seed, xid_lookup;
int sock, dontblock = 1;
CLIENT *clnt;
char clnt_res;
void *foo = NULL;
u_long i, j, pings_count, pings_max;
struct cu_data *cu;
@ -157,14 +128,16 @@ __nis_findfastest (dir_binding * bind)
for multihomed hosts */
pings_count = 0;
pings = malloc (sizeof (struct findserv_req *) * pings_max);
xid_seed = (uint32_t) (time (NULL) ^ getpid ());
xid_seed = (u_int32_t) (time (NULL) ^ getpid ());
memset (&sin, '\0', sizeof (sin));
sin.sin_family = AF_INET;
for (i = 0; i < bind->server_len; i++)
for (j = 0; j < bind->server_val[i].ep.ep_len; ++j)
if (strcmp (bind->server_val[i].ep.ep_val[j].family, "inet") == 0)
if (strcmp (bind->server_val[i].ep.ep_val[j].proto, "-") == 0)
if ((bind->server_val[i].ep.ep_val[j].proto == NULL) ||
(strcmp (bind->server_val[i].ep.ep_val[j].proto, "-") == 0) ||
(strlen (bind->server_val[i].ep.ep_val[j].proto) == 0))
{
sin.sin_addr.s_addr =
inetstr2int (bind->server_val[i].ep.ep_val[j].uaddr);
@ -184,6 +157,7 @@ __nis_findfastest (dir_binding * bind)
pings[pings_count] = calloc (1, sizeof (struct findserv_req));
memcpy ((char *) &pings[pings_count]->sin, (char *) &sin,
sizeof (sin));
memcpy ((char *)&saved_sin, (char *)&sin, sizeof(sin));
pings[pings_count]->xid = xid_seed;
pings[pings_count]->server_nr = i;
pings[pings_count]->server_ep = j;
@ -200,7 +174,7 @@ __nis_findfastest (dir_binding * bind)
/* Create RPC handle */
sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
clnt = clntudp_create (&sin, NIS_PROG, NIS_VERSION, TIMEOUT, &sock);
clnt = clntudp_create (&saved_sin, NIS_PROG, NIS_VERSION, TIMEOUT50, &sock);
if (clnt == NULL)
{
close (sock);
@ -211,8 +185,7 @@ __nis_findfastest (dir_binding * bind)
}
clnt->cl_auth = authunix_create_default ();
cu = (struct cu_data *) clnt->cl_private;
TIMEOUT.tv_sec = 0;
clnt_control (clnt, CLSET_TIMEOUT, (char *) &TIMEOUT);
clnt_control (clnt, CLSET_TIMEOUT, (char *) &TIMEOUT00);
ioctl (sock, FIONBIO, &dontblock);
/* Send to all servers the NULLPROC */
@ -220,13 +193,17 @@ __nis_findfastest (dir_binding * bind)
{
/* clntudp_call() will increment, subtract one */
*((u_int32_t *) (cu->cu_outbuf)) = pings[i]->xid - 1;
bcopy ((char *) &pings[i]->sin, (char *) &cu->cu_raddr,
sizeof (struct sockaddr_in));
nis_null_3_send (foo, clnt);
memcpy ((char *) &cu->cu_raddr, (char *) &pings[i]->sin,
sizeof (struct sockaddr_in));
/* Transmit to NULLPROC, return immediately. */
clnt_call (clnt, NULLPROC, (xdrproc_t) xdr_void, (caddr_t) foo,
(xdrproc_t) xdr_void, (caddr_t) & clnt_res, TIMEOUT00);
}
/* Receive reply */
nis_null_3_recv (foo, clnt);
/* Receive reply from NULLPROC asynchronously */
memset ((char *) &clnt_res, 0, sizeof (clnt_res));
clnt_call (clnt, NULLPROC, (xdrproc_t) NULL, (caddr_t) foo,
(xdrproc_t) xdr_void, (caddr_t) &clnt_res, TIMEOUT00);
xid_lookup = *((u_int32_t *) (cu->cu_inbuf));
for (i = 0; i < pings_count; i++)

View File

@ -42,16 +42,28 @@ struct dir_binding
};
typedef struct dir_binding dir_binding;
struct nis_cb
{
nis_server *serv;
SVCXPRT *xprt;
int sock;
int nomore;
nis_error result;
int (*callback) (const_nis_name, const nis_object *, const void *);
const void *userdata;
};
typedef struct nis_cb nis_cb;
extern unsigned long inetstr2int __P ((const char *str));
extern long __nis_findfastest __P ((dir_binding *bind));
extern nis_error __do_niscall2 __P ((const nis_server *serv, u_int serv_len,
u_long prog, xdrproc_t xargs, caddr_t req,
xdrproc_t xres, caddr_t resp,
u_long flags));
u_long flags, nis_cb *cb));
extern nis_error __do_niscall __P ((const_nis_name name, u_long prog,
xdrproc_t xargs, caddr_t req,
xdrproc_t xres, caddr_t resp,
u_long flags));
u_long flags, nis_cb *cb));
extern AUTH *authdes_pk_create __P ((const char *, const netobj *, u_int,
struct sockaddr *, des_block *));
@ -59,6 +71,14 @@ extern AUTH *authdes_pk_create __P ((const char *, const netobj *, u_int,
extern directory_obj *__cache_search __P ((const_nis_name name));
extern nis_error __cache_add __P ((fd_result *));
/* NIS+ callback */
extern nis_error __nis_do_callback __P ((struct dir_binding *bptr,
netobj *cookie, struct nis_cb *cb));
extern struct nis_cb *__nis_create_callback
__P ((int (*callback)(const_nis_name, const nis_object *, const void *),
const void *userdata, u_long flags));
extern nis_error __nis_destroy_callback __P ((struct nis_cb *cb));
__END_DECLS
#endif

View File

@ -63,7 +63,7 @@ nis_lookup (const_nis_name name, const u_long flags)
(xdrproc_t) xdr_ns_request,
(caddr_t) & req,
(xdrproc_t) xdr_nis_result,
(caddr_t) res, flags);
(caddr_t) res, flags, NULL);
if (status != NIS_SUCCESS)
res->status = status;

View File

@ -30,7 +30,7 @@ nis_mkdir (const_nis_name dir, const nis_server *server)
{
if (__do_niscall (dir, NIS_MKDIR, (xdrproc_t) xdr_nis_name,
(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
(caddr_t) &res, 0) != RPC_SUCCESS)
(caddr_t) &res, 0, NULL) != RPC_SUCCESS)
return NIS_RPCERROR;
}
else
@ -38,7 +38,7 @@ nis_mkdir (const_nis_name dir, const nis_server *server)
if (__do_niscall2 (server, 1, NIS_MKDIR,
(xdrproc_t) xdr_nis_name,
(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
(caddr_t) &res, 0) != RPC_SUCCESS)
(caddr_t) &res, 0, NULL) != RPC_SUCCESS)
return NIS_RPCERROR;
}

View File

@ -58,7 +58,8 @@ nis_modify (const_nis_name name, const nis_object *obj)
if ((status = __do_niscall (name, NIS_MODIFY, (xdrproc_t) xdr_ns_request,
(caddr_t) & req, (xdrproc_t) xdr_nis_result,
(caddr_t) res, MASTER_ONLY)) != RPC_SUCCESS)
(caddr_t) res, MASTER_ONLY,
NULL)) != RPC_SUCCESS)
res->status = status;
req.ns_object.ns_object_val[0].zo_name = p1;

View File

@ -60,7 +60,7 @@ nis_ping (const_nis_name dirname, u_long utime, const nis_object *dirobj)
__do_niscall2 (&obj->DI_data.do_servers.do_servers_val[i], 1,
NIS_PING, (xdrproc_t) xdr_ping_args,
(caddr_t) &args, (xdrproc_t) xdr_void,
(caddr_t) NULL, 0);
(caddr_t) NULL, 0, NULL);
if (res)
nis_freeresult (res);
}

View File

@ -46,7 +46,8 @@ nis_remove (const_nis_name name, const nis_object *obj)
if ((status = __do_niscall (name, NIS_REMOVE, (xdrproc_t) xdr_ns_request,
(caddr_t) & req, (xdrproc_t) xdr_nis_result,
(caddr_t) res, MASTER_ONLY)) != RPC_SUCCESS)
(caddr_t) res, MASTER_ONLY,
NULL)) != RPC_SUCCESS)
res->status = status;
nis_destroy_object (req.ns_object.ns_object_val);

View File

@ -30,7 +30,7 @@ nis_rmdir (const_nis_name dir, const nis_server *server)
{
if (__do_niscall (dir, NIS_RMDIR, (xdrproc_t) xdr_nis_name,
(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
(caddr_t) &res, 0) != RPC_SUCCESS)
(caddr_t) &res, 0, NULL) != RPC_SUCCESS)
return NIS_RPCERROR;
}
else
@ -38,7 +38,7 @@ nis_rmdir (const_nis_name dir, const nis_server *server)
if (__do_niscall2 (server, 1, NIS_RMDIR,
(xdrproc_t) xdr_nis_name,
(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
(caddr_t) &res, 0) != RPC_SUCCESS)
(caddr_t) &res, 0, NULL) != RPC_SUCCESS)
return NIS_RPCERROR;
}

View File

@ -39,7 +39,7 @@ nis_servstate (const nis_server *serv, const nis_tag *tags,
if (__do_niscall2 (serv, 1, NIS_SERVSTATE, (xdrproc_t) xdr_nis_taglist,
(caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
(caddr_t) &tagres, 0) != RPC_SUCCESS)
(caddr_t) &tagres, 0, NULL) != RPC_SUCCESS)
return NIS_RPCERROR;
*result = tagres.tags.tags_val;
@ -65,7 +65,7 @@ nis_stats (const nis_server *serv, const nis_tag *tags,
if (__do_niscall2 (serv, 1, NIS_STATUS, (xdrproc_t) xdr_nis_taglist,
(caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
(caddr_t) &tagres, 0) != RPC_SUCCESS)
(caddr_t) &tagres, 0, NULL) != RPC_SUCCESS)
return NIS_RPCERROR;
*result = tagres.tags.tags_val;

View File

@ -148,7 +148,7 @@ __create_ib_request (const_nis_name name, struct ib_request *ibreq,
ibreq->ibr_flags = (flags & (RETURN_RESULT | ADD_OVERWRITE | REM_MULTIPLE |
MOD_SAMEOBJ | ADD_RESERVED | REM_RESERVED |
MOD_EXCLUSIVE));
MOD_EXCLUSIVE | ALL_RESULTS));
ibreq->ibr_obj.ibr_obj_len = 0;
ibreq->ibr_obj.ibr_obj_val = NULL;
ibreq->ibr_cbhost.ibr_cbhost_len = 0;
@ -170,11 +170,12 @@ nis_list (const_nis_name name, u_long flags,
nis_result *res = NULL;
struct ib_request ibreq;
int status;
int count_links = 0; /* We will only follow 16 links! */
int count_links = 0; /* We will only follow NIS_MAXLINKS links! */
int done = 0;
nis_name *names;
nis_name namebuf[2] = {NULL, NULL};
int name_nr = 0;
nis_cb *cb = NULL;
res = calloc (1, sizeof (nis_result));
@ -197,95 +198,170 @@ nis_list (const_nis_name name, u_long flags,
ibreq.ibr_name = strdup (names[name_nr]);
}
else
names = namebuf;
while (!done)
{
names = namebuf;
names[name_nr] = ibreq.ibr_name;
}
cb = NULL;
if (flags & FOLLOW_PATH)
{
nis_result *lres;
u_long newflags = flags & ~FOLLOW_PATH;
char table_path[NIS_MAXPATH + 1];
char *ntable, *p;
u_long done = 0, failures = 0;
memset (res, '\0', sizeof (nis_result));
status = __do_niscall (ibreq.ibr_name, NIS_IBLIST,
(xdrproc_t) xdr_ib_request,
(caddr_t) &ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, flags);
if (status != NIS_SUCCESS)
res->status = status;
switch (res->status)
while (names[name_nr] != NULL && !done)
{
case NIS_PARTIAL:
case NIS_SUCCESS:
case NIS_S_SUCCESS:
if (__type_of(NIS_RES_OBJECT (res)) == LINK_OBJ &&
flags & FOLLOW_LINKS) /* We are following links */
lres = nis_lookup (names[name_nr], newflags);
if (lres == NULL || lres->status != NIS_SUCCESS)
{
/* if we hit the link limit, bail */
if (count_links > NIS_MAXLINKS)
res->status = lres->status;
nis_freeresult (lres);
++name_nr;
continue;
}
/* nis_lookup handles FOLLOW_LINKS,
so we must have a table object. */
if (__type_of (NIS_RES_OBJECT (lres)) != TABLE_OBJ)
{
nis_freeresult (lres);
res->status = NIS_INVALIDOBJ;
break;
}
/* Save the path, discard everything else. */
snprintf (table_path, NIS_MAXPATH, "%s:%s", names[name_nr],
NIS_RES_OBJECT (lres)->TA_data.ta_path);
nis_freeresult (lres);
free (res);
p = table_path;
while (((ntable = strsep (&p, ":")) != NULL) && !done)
{
/* Do the job recursive here! */
res = nis_list (name, newflags, callback, userdata);
if (res == NULL)
return NULL;
switch (res->status)
{
case NIS_SUCCESS:
case NIS_CBRESULTS:
if (!(flags & ALL_RESULTS))
done = 1;
break;
default:
if (flags & ALL_RESULTS)
failures++;
else
done = 1;
break;
}
}
if (res->status == NIS_SUCCESS && failures)
res->status = NIS_S_SUCCESS;
if (res->status == NIS_NOTFOUND && failures)
res->status = NIS_S_NOTFOUND;
break;
}
}
else
{
if (callback != NULL)
{
cb = __nis_create_callback (callback, userdata, flags);
ibreq.ibr_cbhost.ibr_cbhost_len = 1;
ibreq.ibr_cbhost.ibr_cbhost_val = cb->serv;
}
while (!done)
{
memset (res, '\0', sizeof (nis_result));
status = __do_niscall (ibreq.ibr_name, NIS_IBLIST,
(xdrproc_t) xdr_ib_request,
(caddr_t) & ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, flags, cb);
if (status != NIS_SUCCESS)
res->status = status;
switch (res->status)
{
case NIS_PARTIAL:
case NIS_SUCCESS:
case NIS_S_SUCCESS:
if (__type_of (NIS_RES_OBJECT (res)) == LINK_OBJ &&
flags & FOLLOW_LINKS) /* We are following links. */
{
/* If we hit the link limit, bail. */
if (count_links > NIS_MAXLINKS)
{
res->status = NIS_LINKNAMEERROR;
++done;
break;
}
if (count_links)
free (ibreq.ibr_name);
++count_links;
free (ibreq.ibr_name);
ibreq.ibr_name =
strdup (NIS_RES_OBJECT (res)->LI_data.li_name);
if (NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_len)
if (ibreq.ibr_srch.ibr_srch_len == 0)
{
ibreq.ibr_srch.ibr_srch_len =
NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_len;
ibreq.ibr_srch.ibr_srch_val =
NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_val;
}
nis_freeresult (res);
res = calloc (1, sizeof (nis_result));
}
else
++done;
break;
case NIS_CBRESULTS:
/* Calback is handled in nis_call.c (__do_niscall2). */
++done;
break;
case NIS_UNAVAIL:
/* NIS+ is not installed, or all servers are down. */
++done;
break;
default:
/* Try the next domainname if we don't follow a link. */
if (count_links)
{
free (ibreq.ibr_name);
res->status = NIS_LINKNAMEERROR;
++done;
break;
}
if (count_links)
free (ibreq.ibr_name);
++count_links;
free (ibreq.ibr_name);
ibreq.ibr_name = strdup (NIS_RES_OBJECT (res)->LI_data.li_name);
if (NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_len)
if (ibreq.ibr_srch.ibr_srch_len == 0)
{
ibreq.ibr_srch.ibr_srch_len =
NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_len;
ibreq.ibr_srch.ibr_srch_val =
NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_val;
}
nis_freeresult (res);
res = calloc (1, sizeof (nis_result));
}
else
++done;
break;
case NIS_CBRESULTS:
/* XXX Implement CALLBACK here ! */
++done;
break;
case NIS_UNAVAIL:
/* NIS+ is not installed, or all servers are down */
++done;
break;
default:
/* Try the next domainname if we don't follow a link */
if (count_links)
{
free (ibreq.ibr_name);
res->status = NIS_LINKNAMEERROR;
++done;
++name_nr;
if (names[name_nr] == NULL)
{
++done;
break;
}
ibreq.ibr_name = names[name_nr];
break;
}
++name_nr;
if (names[name_nr] == NULL)
{
++done;
break;
}
ibreq.ibr_name = names[name_nr];
break;
}
}
} /* End of not FOLLOW_PATH. */
if (names != namebuf)
nis_freenames (names);
nis_free_request (&ibreq);
if (callback != NULL &&
(res->status == NIS_SUCCESS || res->status == NIS_S_SUCCESS))
{
unsigned int i;
for (i = 0; i < res->objects.objects_len; ++i)
if ((*callback) (name, &(res->objects.objects_val)[i], userdata) != 0)
break;
}
if (cb)
__nis_destroy_callback (cb);
return res;
}
@ -298,8 +374,8 @@ nis_add_entry (const_nis_name name, const nis_object *obj,
nis_error status;
struct ib_request ibreq;
char *p1, *p2, *p3, *p4;
char buf1 [strlen (name) + 20];
char buf4 [strlen (name) + 20];
char buf1[strlen (name) + 20];
char buf4[strlen (name) + 20];
res = calloc (1, sizeof (nis_result));
@ -332,9 +408,9 @@ nis_add_entry (const_nis_name name, const nis_object *obj,
if ((status = __do_niscall (ibreq.ibr_name, NIS_IBADD,
(xdrproc_t) xdr_ib_request,
(caddr_t) &ibreq,
(caddr_t) & ibreq,
(xdrproc_t) xdr_nis_result,
(caddr_t) res, 0)) != NIS_SUCCESS)
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
res->status = status;
ibreq.ibr_obj.ibr_obj_val->zo_name = p1;
@ -355,8 +431,8 @@ nis_modify_entry (const_nis_name name, const nis_object *obj,
nis_error status;
struct ib_request ibreq;
char *p1, *p2, *p3, *p4;
char buf1 [strlen (name) + 20];
char buf4 [strlen (name) + 20];
char buf1[strlen (name) + 20];
char buf4[strlen (name) + 20];
res = calloc (1, sizeof (nis_result));
@ -390,7 +466,7 @@ nis_modify_entry (const_nis_name name, const nis_object *obj,
if ((status = __do_niscall (ibreq.ibr_name, NIS_IBMODIFY,
(xdrproc_t) xdr_ib_request,
(caddr_t) & ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, 0)) != NIS_SUCCESS)
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
res->status = status;
ibreq.ibr_obj.ibr_obj_val->zo_name = p1;
@ -429,7 +505,7 @@ nis_remove_entry (const_nis_name name, const nis_object *obj,
if ((status = __do_niscall (ibreq.ibr_name, NIS_IBREMOVE,
(xdrproc_t) xdr_ib_request,
(caddr_t) & ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, 0)) != NIS_SUCCESS)
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
res->status = status;
nis_free_request (&ibreq);
@ -454,8 +530,8 @@ nis_first_entry (const_nis_name name)
if ((status = __do_niscall (ibreq.ibr_name, NIS_IBFIRST,
(xdrproc_t) xdr_ib_request,
(caddr_t) &ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, 0)) != NIS_SUCCESS)
(caddr_t) & ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
res->status = status;
nis_free_request (&ibreq);
@ -493,8 +569,8 @@ nis_next_entry (const_nis_name name, const netobj *cookie)
if ((status = __do_niscall (ibreq.ibr_name, NIS_IBNEXT,
(xdrproc_t) xdr_ib_request,
(caddr_t) &ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, 0)) != NIS_SUCCESS)
(caddr_t) & ibreq, (xdrproc_t) xdr_nis_result,
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
res->status = status;
nis_free_request (&ibreq);

View File

@ -31,15 +31,15 @@ __nis_finddirectory (directory_obj *dir, const_nis_name name)
fd_args.dir_name = strdup (name);
fd_args.requester = nis_local_host();
fd_res = calloc (1, sizeof (fd_result));
if ((status = __do_niscall2 (dir->do_servers.do_servers_val,
dir->do_servers.do_servers_len,
if ((status = __do_niscall2 (dir->do_servers.do_servers_val,
dir->do_servers.do_servers_len,
NIS_FINDDIRECTORY, (xdrproc_t) xdr_fd_args,
(caddr_t) &fd_args, (xdrproc_t) xdr_fd_result,
(caddr_t) fd_res,
NO_AUTHINFO|USE_DGRAM)) != NIS_SUCCESS)
(caddr_t) fd_res,
NO_AUTHINFO|USE_DGRAM, NULL)) != NIS_SUCCESS)
fd_res->status = status;
return fd_res;
}
@ -59,15 +59,15 @@ __nis_hash (const void *keyarg, register size_t len)
register const u_char *key;
register size_t loop;
register u_int32_t h;
#define HASHC h = *key++ + 65599 * h
h = 0;
key = keyarg;
if (len > 0)
if (len > 0)
{
loop = (len + 8 - 1) >> 3;
switch (len & (8 - 1))
switch (len & (8 - 1))
{
case 0:
do {
@ -98,4 +98,3 @@ __nis_hash (const void *keyarg, register size_t len)
}
return (h);
}

View File

@ -162,8 +162,8 @@ _nss_nisplus_getsecretkey (const char *netname, char *skey, char *passwd)
len = ENTRY_LEN (res->objects.objects_val, 4);
memcpy (buf, ENTRY_VAL (res->objects.objects_val,4), len);
skey[len] = 0;
cptr = strchr (skey, ':');
buf[len] = '\0';
cptr = strchr (buf, ':');
if (cptr)
cptr[0] = '\0';
nis_freeresult (res);

View File

@ -28,10 +28,14 @@
* Mountain View, California 94043
*/
#ifndef _NIS_H_RPCGEN
#define _NIS_H_RPCGEN
#ifndef _RPCSVC_NIS_H
#define _RPCSVC_NIS_H 1
#include <features.h>
#include <rpc/rpc.h>
#include <rpcsvc/nis_tags.h>
__BEGIN_DECLS
/*
* nis.h
@ -48,8 +52,7 @@
* Makefile target nis.h)
*
*/
#include <rpcsvc/nis_tags.h>
#include <rpc/xdr.h>
#pragma ident "@(#)nis_object.x 1.7 92/07/14 SMI"
#ifndef __nis_object_h
@ -77,24 +80,10 @@ struct nis_attr {
} zattr_val;
};
typedef struct nis_attr nis_attr;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_attr(XDR *, nis_attr*);
#elif __STDC__
extern bool_t xdr_nis_attr(XDR *, nis_attr*);
#else /* Old Style C */
bool_t xdr_nis_attr();
#endif /* Old Style C */
extern bool_t xdr_nis_attr __P ((XDR *, nis_attr*));
typedef char *nis_name;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_name(XDR *, nis_name*);
#elif __STDC__
extern bool_t xdr_nis_name(XDR *, nis_name*);
#else /* Old Style C */
bool_t xdr_nis_name();
#endif /* Old Style C */
extern bool_t xdr_nis_name __P ((XDR *, nis_name*));
enum zotypes {
BOGUS_OBJ = 0,
@ -107,14 +96,7 @@ enum zotypes {
PRIVATE_OBJ = 7,
};
typedef enum zotypes zotypes;
#ifdef __cplusplus
extern "C" bool_t xdr_zotypes(XDR *, zotypes*);
#elif __STDC__
extern bool_t xdr_zotypes(XDR *, zotypes*);
#else /* Old Style C */
bool_t xdr_zotypes();
#endif /* Old Style C */
extern bool_t xdr_zotypes __P ((XDR *, zotypes*));
enum nstype {
UNKNOWN = 0,
@ -128,28 +110,14 @@ enum nstype {
CDS = 8,
};
typedef enum nstype nstype;
#ifdef __cplusplus
extern "C" bool_t xdr_nstype(XDR *, nstype*);
#elif __STDC__
extern bool_t xdr_nstype(XDR *, nstype*);
#else /* Old Style C */
bool_t xdr_nstype();
#endif /* Old Style C */
extern bool_t xdr_nstype __P ((XDR *, nstype*));
struct oar_mask {
u_long oa_rights;
zotypes oa_otype;
};
typedef struct oar_mask oar_mask;
#ifdef __cplusplus
extern "C" bool_t xdr_oar_mask(XDR *, oar_mask*);
#elif __STDC__
extern bool_t xdr_oar_mask(XDR *, oar_mask*);
#else /* Old Style C */
bool_t xdr_oar_mask();
#endif /* Old Style C */
extern bool_t xdr_oar_mask __P ((XDR *, oar_mask*));
struct endpoint {
char *uaddr;
@ -157,14 +125,7 @@ struct endpoint {
char *proto;
};
typedef struct endpoint endpoint;
#ifdef __cplusplus
extern "C" bool_t xdr_endpoint(XDR *, endpoint*);
#elif __STDC__
extern bool_t xdr_endpoint(XDR *, endpoint*);
#else /* Old Style C */
bool_t xdr_endpoint();
#endif /* Old Style C */
extern bool_t xdr_endpoint __P ((XDR *, endpoint*));
struct nis_server {
nis_name name;
@ -176,14 +137,7 @@ struct nis_server {
netobj pkey;
};
typedef struct nis_server nis_server;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_server(XDR *, nis_server*);
#elif __STDC__
extern bool_t xdr_nis_server(XDR *, nis_server*);
#else /* Old Style C */
bool_t xdr_nis_server();
#endif /* Old Style C */
extern bool_t xdr_nis_server __P ((XDR *, nis_server*));
struct directory_obj {
nis_name do_name;
@ -199,13 +153,7 @@ struct directory_obj {
} do_armask;
};
typedef struct directory_obj directory_obj;
#ifdef __cplusplus
extern "C" bool_t xdr_directory_obj(XDR *, directory_obj*);
#elif __STDC__
extern bool_t xdr_directory_obj(XDR *, directory_obj*);
#else /* Old Style C */
bool_t xdr_directory_obj();
#endif /* Old Style C */
extern bool_t xdr_directory_obj __P ((XDR *, directory_obj*));
#define EN_BINARY 1
#define EN_CRYPT 2
@ -221,14 +169,7 @@ struct entry_col {
} ec_value;
};
typedef struct entry_col entry_col;
#ifdef __cplusplus
extern "C" bool_t xdr_entry_col(XDR *, entry_col*);
#elif __STDC__
extern bool_t xdr_entry_col(XDR *, entry_col*);
#else /* Old Style C */
bool_t xdr_entry_col();
#endif /* Old Style C */
extern bool_t xdr_entry_col __P ((XDR *, entry_col*));
struct entry_obj {
char *en_type;
@ -238,14 +179,7 @@ struct entry_obj {
} en_cols;
};
typedef struct entry_obj entry_obj;
#ifdef __cplusplus
extern "C" bool_t xdr_entry_obj(XDR *, entry_obj*);
#elif __STDC__
extern bool_t xdr_entry_obj(XDR *, entry_obj*);
#else /* Old Style C */
bool_t xdr_entry_obj();
#endif /* Old Style C */
extern bool_t xdr_entry_obj __P ((XDR *, entry_obj*));
struct group_obj {
u_long gr_flags;
@ -255,14 +189,7 @@ struct group_obj {
} gr_members;
};
typedef struct group_obj group_obj;
#ifdef __cplusplus
extern "C" bool_t xdr_group_obj(XDR *, group_obj*);
#elif __STDC__
extern bool_t xdr_group_obj(XDR *, group_obj*);
#else /* Old Style C */
bool_t xdr_group_obj();
#endif /* Old Style C */
extern bool_t xdr_group_obj __P ((XDR *, group_obj*));
struct link_obj {
zotypes li_rtype;
@ -273,13 +200,7 @@ struct link_obj {
nis_name li_name;
};
typedef struct link_obj link_obj;
#ifdef __cplusplus
extern "C" bool_t xdr_link_obj(XDR *, link_obj*);
#elif __STDC__
extern bool_t xdr_link_obj(XDR *, link_obj*);
#else /* Old Style C */
bool_t xdr_link_obj();
#endif /* Old Style C */
extern bool_t xdr_link_obj __P ((XDR *, link_obj*));
#define TA_BINARY 1
#define TA_CRYPT 2
@ -295,14 +216,7 @@ struct table_col {
u_long tc_rights;
};
typedef struct table_col table_col;
#ifdef __cplusplus
extern "C" bool_t xdr_table_col(XDR *, table_col*);
#elif __STDC__
extern bool_t xdr_table_col(XDR *, table_col*);
#else /* Old Style C */
bool_t xdr_table_col();
#endif /* Old Style C */
extern bool_t xdr_table_col __P ((XDR *, table_col*));
struct table_obj {
char *ta_type;
@ -315,14 +229,7 @@ struct table_obj {
char *ta_path;
};
typedef struct table_obj table_obj;
#ifdef __cplusplus
extern "C" bool_t xdr_table_obj(XDR *, table_obj*);
#elif __STDC__
extern bool_t xdr_table_obj(XDR *, table_obj*);
#else /* Old Style C */
bool_t xdr_table_obj();
#endif /* Old Style C */
extern bool_t xdr_table_obj __P ((XDR *, table_obj*));
struct objdata {
zotypes zo_type;
@ -339,28 +246,14 @@ struct objdata {
} objdata_u;
};
typedef struct objdata objdata;
#ifdef __cplusplus
extern "C" bool_t xdr_objdata(XDR *, objdata*);
#elif __STDC__
extern bool_t xdr_objdata(XDR *, objdata*);
#else /* Old Style C */
bool_t xdr_objdata();
#endif /* Old Style C */
extern bool_t xdr_objdata __P ((XDR *, objdata*));
struct nis_oid {
u_long ctime;
u_long mtime;
};
typedef struct nis_oid nis_oid;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_oid(XDR *, nis_oid*);
#elif __STDC__
extern bool_t xdr_nis_oid(XDR *, nis_oid*);
#else /* Old Style C */
bool_t xdr_nis_oid();
#endif /* Old Style C */
extern bool_t xdr_nis_oid __P ((XDR *, nis_oid*));
struct nis_object {
nis_oid zo_oid;
@ -373,18 +266,10 @@ struct nis_object {
objdata zo_data;
};
typedef struct nis_object nis_object;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_object(XDR *, nis_object*);
#elif __STDC__
extern bool_t xdr_nis_object(XDR *, nis_object*);
#else /* Old Style C */
bool_t xdr_nis_object();
#endif /* Old Style C */
extern bool_t xdr_nis_object __P ((XDR *, nis_object*));
#endif /* if __nis_object_h */
enum nis_error {
NIS_SUCCESS = 0,
NIS_S_SUCCESS = 1,
@ -436,14 +321,7 @@ enum nis_error {
NIS_DUMPLATER = 47,
};
typedef enum nis_error nis_error;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_error(XDR *, nis_error*);
#elif __STDC__
extern bool_t xdr_nis_error(XDR *, nis_error*);
#else /* Old Style C */
bool_t xdr_nis_error();
#endif /* Old Style C */
extern bool_t xdr_nis_error __P ((XDR *, nis_error*));
struct nis_result {
nis_error status;
@ -458,14 +336,7 @@ struct nis_result {
u_long cticks;
};
typedef struct nis_result nis_result;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_result(XDR *, nis_result*);
#elif __STDC__
extern bool_t xdr_nis_result(XDR *, nis_result*);
#else /* Old Style C */
bool_t xdr_nis_result();
#endif /* Old Style C */
extern bool_t xdr_nis_result __P ((XDR *, nis_result*));
struct ns_request {
nis_name ns_name;
@ -475,14 +346,7 @@ struct ns_request {
} ns_object;
};
typedef struct ns_request ns_request;
#ifdef __cplusplus
extern "C" bool_t xdr_ns_request(XDR *, ns_request*);
#elif __STDC__
extern bool_t xdr_ns_request(XDR *, ns_request*);
#else /* Old Style C */
bool_t xdr_ns_request();
#endif /* Old Style C */
extern bool_t xdr_ns_request __P ((XDR *, ns_request*));
struct ib_request {
nis_name ibr_name;
@ -503,28 +367,14 @@ struct ib_request {
netobj ibr_cookie;
};
typedef struct ib_request ib_request;
#ifdef __cplusplus
extern "C" bool_t xdr_ib_request(XDR *, ib_request*);
#elif __STDC__
extern bool_t xdr_ib_request(XDR *, ib_request*);
#else /* Old Style C */
bool_t xdr_ib_request();
#endif /* Old Style C */
extern bool_t xdr_ib_request __P ((XDR *, ib_request*));
struct ping_args {
nis_name dir;
u_long stamp;
};
typedef struct ping_args ping_args;
#ifdef __cplusplus
extern "C" bool_t xdr_ping_args(XDR *, ping_args*);
#elif __STDC__
extern bool_t xdr_ping_args(XDR *, ping_args*);
#else /* Old Style C */
bool_t xdr_ping_args();
#endif /* Old Style C */
extern bool_t xdr_ping_args __P ((XDR *, ping_args*));
enum log_entry_t {
LOG_NOP = 0,
@ -538,14 +388,7 @@ enum log_entry_t {
UPD_STAMP = 8,
};
typedef enum log_entry_t log_entry_t;
#ifdef __cplusplus
extern "C" bool_t xdr_log_entry_t(XDR *, log_entry_t*);
#elif __STDC__
extern bool_t xdr_log_entry_t(XDR *, log_entry_t*);
#else /* Old Style C */
bool_t xdr_log_entry_t();
#endif /* Old Style C */
extern bool_t xdr_log_entry_t __P ((XDR *, log_entry_t*));
struct log_entry {
u_long le_time;
@ -559,14 +402,7 @@ struct log_entry {
nis_object le_object;
};
typedef struct log_entry log_entry;
#ifdef __cplusplus
extern "C" bool_t xdr_log_entry(XDR *, log_entry*);
#elif __STDC__
extern bool_t xdr_log_entry(XDR *, log_entry*);
#else /* Old Style C */
bool_t xdr_log_entry();
#endif /* Old Style C */
extern bool_t xdr_log_entry __P ((XDR *, log_entry*));
struct log_result {
nis_error lr_status;
@ -577,14 +413,7 @@ struct log_result {
} lr_entries;
};
typedef struct log_result log_result;
#ifdef __cplusplus
extern "C" bool_t xdr_log_result(XDR *, log_result*);
#elif __STDC__
extern bool_t xdr_log_result(XDR *, log_result*);
#else /* Old Style C */
bool_t xdr_log_result();
#endif /* Old Style C */
extern bool_t xdr_log_result __P ((XDR *, log_result*));
struct cp_result {
nis_error cp_status;
@ -592,28 +421,14 @@ struct cp_result {
u_long cp_dticks;
};
typedef struct cp_result cp_result;
#ifdef __cplusplus
extern "C" bool_t xdr_cp_result(XDR *, cp_result*);
#elif __STDC__
extern bool_t xdr_cp_result(XDR *, cp_result*);
#else /* Old Style C */
bool_t xdr_cp_result();
#endif /* Old Style C */
extern bool_t xdr_cp_result __P ((XDR *, cp_result*));
struct nis_tag {
u_long tag_type;
char *tag_val;
};
typedef struct nis_tag nis_tag;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_tag(XDR *, nis_tag*);
#elif __STDC__
extern bool_t xdr_nis_tag(XDR *, nis_tag*);
#else /* Old Style C */
bool_t xdr_nis_tag();
#endif /* Old Style C */
extern bool_t xdr_nis_tag __P ((XDR *, nis_tag*));
struct nis_taglist {
struct {
@ -622,14 +437,7 @@ struct nis_taglist {
} tags;
};
typedef struct nis_taglist nis_taglist;
#ifdef __cplusplus
extern "C" bool_t xdr_nis_taglist(XDR *, nis_taglist*);
#elif __STDC__
extern bool_t xdr_nis_taglist(XDR *, nis_taglist*);
#else /* Old Style C */
bool_t xdr_nis_taglist();
#endif /* Old Style C */
extern bool_t xdr_nis_taglist __P ((XDR *, nis_taglist*));
struct dump_args {
nis_name da_dir;
@ -640,28 +448,14 @@ struct dump_args {
} da_cbhost;
};
typedef struct dump_args dump_args;
#ifdef __cplusplus
extern "C" bool_t xdr_dump_args(XDR *, dump_args*);
#elif __STDC__
extern bool_t xdr_dump_args(XDR *, dump_args*);
#else /* Old Style C */
bool_t xdr_dump_args();
#endif /* Old Style C */
extern bool_t xdr_dump_args __P ((XDR *, dump_args*));
struct fd_args {
nis_name dir_name;
nis_name requester;
};
typedef struct fd_args fd_args;
#ifdef __cplusplus
extern "C" bool_t xdr_fd_args(XDR *, fd_args*);
#elif __STDC__
extern bool_t xdr_fd_args(XDR *, fd_args*);
#else /* Old Style C */
bool_t xdr_fd_args();
#endif /* Old Style C */
extern bool_t xdr_fd_args __P ((XDR *, fd_args*));
struct fd_result {
nis_error status;
@ -676,13 +470,7 @@ struct fd_result {
} signature;
};
typedef struct fd_result fd_result;
#ifdef __cplusplus
extern "C" bool_t xdr_fd_result(XDR *, fd_result*);
#elif __STDC__
extern bool_t xdr_fd_result(XDR *, fd_result*);
#else /* Old Style C */
bool_t xdr_fd_result();
#endif /* Old Style C */
extern bool_t xdr_fd_result __P ((XDR *, fd_result*));
/*
* Generic "hash" datastructures, used by all types of hashed data.
@ -762,14 +550,10 @@ typedef enum name_pos name_pos;
#define ENTRY_VAL(obj, col) (obj)->EN_data.en_cols.en_cols_val[col].ec_value.ec_value_val
#define ENTRY_LEN(obj, col) (obj)->EN_data.en_cols.en_cols_val[col].ec_value.ec_value_len
#ifdef __cplusplus
}
#endif
/* Prototypes, and extern declarations for the NIS library functions. */
#include <rpcsvc/nislib.h>
#endif /* __NIS_RPCGEN_H */
/* EDIT_START */
#endif
/*
* nis_3.h
@ -784,229 +568,79 @@ typedef enum name_pos name_pos;
*/
#ifndef __nis_3_h
#define __nis_3_h
#ifdef __cplusplus
extern "C" {
#endif
#define NIS_PROG ((u_long)100300)
extern struct rpcgen_table nis_prog_3_table[];
extern int nis_prog_3_nproc;
#define NIS_VERSION ((u_long)3)
#ifdef __cplusplus
#define NIS_LOOKUP ((u_long)1)
extern "C" nis_result * nis_lookup_3(ns_request *, CLIENT *);
extern "C" nis_result * nis_lookup_3_svc(ns_request *, struct svc_req *);
extern nis_result * nis_lookup_3 __P ((ns_request *, CLIENT *));
extern nis_result * nis_lookup_3_svc __P ((ns_request *, struct svc_req *));
#define NIS_ADD ((u_long)2)
extern "C" nis_result * nis_add_3(ns_request *, CLIENT *);
extern "C" nis_result * nis_add_3_svc(ns_request *, struct svc_req *);
extern nis_result * nis_add_3 __P ((ns_request *, CLIENT *));
extern nis_result * nis_add_3_svc __P ((ns_request *, struct svc_req *));
#define NIS_MODIFY ((u_long)3)
extern "C" nis_result * nis_modify_3(ns_request *, CLIENT *);
extern "C" nis_result * nis_modify_3_svc(ns_request *, struct svc_req *);
extern nis_result * nis_modify_3 __P ((ns_request *, CLIENT *));
extern nis_result * nis_modify_3_svc __P ((ns_request *, struct svc_req *));
#define NIS_REMOVE ((u_long)4)
extern "C" nis_result * nis_remove_3(ns_request *, CLIENT *);
extern "C" nis_result * nis_remove_3_svc(ns_request *, struct svc_req *);
extern nis_result * nis_remove_3 __P ((ns_request *, CLIENT *));
extern nis_result * nis_remove_3_svc __P ((ns_request *, struct svc_req *));
#define NIS_IBLIST ((u_long)5)
extern "C" nis_result * nis_iblist_3(ib_request *, CLIENT *);
extern "C" nis_result * nis_iblist_3_svc(ib_request *, struct svc_req *);
extern nis_result * nis_iblist_3 __P ((ib_request *, CLIENT *));
extern nis_result * nis_iblist_3_svc __P ((ib_request *, struct svc_req *));
#define NIS_IBADD ((u_long)6)
extern "C" nis_result * nis_ibadd_3(ib_request *, CLIENT *);
extern "C" nis_result * nis_ibadd_3_svc(ib_request *, struct svc_req *);
extern nis_result * nis_ibadd_3 __P ((ib_request *, CLIENT *));
extern nis_result * nis_ibadd_3_svc __P ((ib_request *, struct svc_req *));
#define NIS_IBMODIFY ((u_long)7)
extern "C" nis_result * nis_ibmodify_3(ib_request *, CLIENT *);
extern "C" nis_result * nis_ibmodify_3_svc(ib_request *, struct svc_req *);
extern nis_result * nis_ibmodify_3 __P ((ib_request *, CLIENT *));
extern nis_result * nis_ibmodify_3_svc __P ((ib_request *, struct svc_req *));
#define NIS_IBREMOVE ((u_long)8)
extern "C" nis_result * nis_ibremove_3(ib_request *, CLIENT *);
extern "C" nis_result * nis_ibremove_3_svc(ib_request *, struct svc_req *);
extern nis_result * nis_ibremove_3 __P ((ib_request *, CLIENT *));
extern nis_result * nis_ibremove_3_svc __P ((ib_request *, struct svc_req *));
#define NIS_IBFIRST ((u_long)9)
extern "C" nis_result * nis_ibfirst_3(ib_request *, CLIENT *);
extern "C" nis_result * nis_ibfirst_3_svc(ib_request *, struct svc_req *);
extern nis_result * nis_ibfirst_3 __P ((ib_request *, CLIENT *));
extern nis_result * nis_ibfirst_3_svc __P ((ib_request *, struct svc_req *));
#define NIS_IBNEXT ((u_long)10)
extern "C" nis_result * nis_ibnext_3(ib_request *, CLIENT *);
extern "C" nis_result * nis_ibnext_3_svc(ib_request *, struct svc_req *);
extern nis_result * nis_ibnext_3 __P ((ib_request *, CLIENT *));
extern nis_result * nis_ibnext_3_svc __P ((ib_request *, struct svc_req *));
#define NIS_FINDDIRECTORY ((u_long)12)
extern "C" fd_result * nis_finddirectory_3(fd_args *, CLIENT *);
extern "C" fd_result * nis_finddirectory_3_svc(fd_args *, struct svc_req *);
extern fd_result * nis_finddirectory_3 __P ((fd_args *, CLIENT *));
extern fd_result * nis_finddirectory_3_svc __P ((fd_args *,
struct svc_req *));
#define NIS_STATUS ((u_long)14)
extern "C" nis_taglist * nis_status_3(nis_taglist *, CLIENT *);
extern "C" nis_taglist * nis_status_3_svc(nis_taglist *, struct svc_req *);
extern nis_taglist * nis_status_3 __P ((nis_taglist *, CLIENT *));
extern nis_taglist * nis_status_3_svc __P ((nis_taglist *, struct svc_req *));
#define NIS_DUMPLOG ((u_long)15)
extern "C" log_result * nis_dumplog_3(dump_args *, CLIENT *);
extern "C" log_result * nis_dumplog_3_svc(dump_args *, struct svc_req *);
extern log_result * nis_dumplog_3 __P ((dump_args *, CLIENT *));
extern log_result * nis_dumplog_3_svc __P ((dump_args *, struct svc_req *));
#define NIS_DUMP ((u_long)16)
extern "C" log_result * nis_dump_3(dump_args *, CLIENT *);
extern "C" log_result * nis_dump_3_svc(dump_args *, struct svc_req *);
extern log_result * nis_dump_3 __P ((dump_args *, CLIENT *));
extern log_result * nis_dump_3_svc __P ((dump_args *, struct svc_req *));
#define NIS_CALLBACK ((u_long)17)
extern "C" bool_t * nis_callback_3(netobj *, CLIENT *);
extern "C" bool_t * nis_callback_3_svc(netobj *, struct svc_req *);
extern bool_t * nis_callback_3 __P ((netobj *, CLIENT *));
extern bool_t * nis_callback_3_svc __P ((netobj *, struct svc_req *));
#define NIS_CPTIME ((u_long)18)
extern "C" u_long * nis_cptime_3(nis_name *, CLIENT *);
extern "C" u_long * nis_cptime_3_svc(nis_name *, struct svc_req *);
extern u_long * nis_cptime_3 __P ((nis_name *, CLIENT *));
extern u_long * nis_cptime_3_svc __P ((nis_name *, struct svc_req *));
#define NIS_CHECKPOINT ((u_long)19)
extern "C" cp_result * nis_checkpoint_3(nis_name *, CLIENT *);
extern "C" cp_result * nis_checkpoint_3_svc(nis_name *, struct svc_req *);
extern cp_result * nis_checkpoint_3 __P ((nis_name *, CLIENT *));
extern cp_result * nis_checkpoint_3_svc __P ((nis_name *, struct svc_req *));
#define NIS_PING ((u_long)20)
extern "C" void * nis_ping_3(ping_args *, CLIENT *);
extern "C" void * nis_ping_3_svc(ping_args *, struct svc_req *);
extern void * nis_ping_3 __P ((ping_args *, CLIENT *));
extern void * nis_ping_3_svc __P ((ping_args *, struct svc_req *));
#define NIS_SERVSTATE ((u_long)21)
extern "C" nis_taglist * nis_servstate_3(nis_taglist *, CLIENT *);
extern "C" nis_taglist * nis_servstate_3_svc(nis_taglist *, struct svc_req *);
extern nis_taglist * nis_servstate_3 __P ((nis_taglist *, CLIENT *));
extern nis_taglist * nis_servstate_3_svc __P ((nis_taglist *,
struct svc_req *));
#define NIS_MKDIR ((u_long)22)
extern "C" nis_error * nis_mkdir_3(nis_name *, CLIENT *);
extern "C" nis_error * nis_mkdir_3_svc(nis_name *, struct svc_req *);
extern nis_error * nis_mkdir_3 __P ((nis_name *, CLIENT *));
extern nis_error * nis_mkdir_3_svc __P ((nis_name *, struct svc_req *));
#define NIS_RMDIR ((u_long)23)
extern "C" nis_error * nis_rmdir_3(nis_name *, CLIENT *);
extern "C" nis_error * nis_rmdir_3_svc(nis_name *, struct svc_req *);
extern nis_error * nis_rmdir_3 __P ((nis_name *, CLIENT *));
extern nis_error * nis_rmdir_3_svc __P ((nis_name *, struct svc_req *));
#define NIS_UPDKEYS ((u_long)24)
extern "C" nis_error * nis_updkeys_3(nis_name *, CLIENT *);
extern "C" nis_error * nis_updkeys_3_svc(nis_name *, struct svc_req *);
extern nis_error * nis_updkeys_3 __P ((nis_name *, CLIENT *));
extern nis_error * nis_updkeys_3_svc __P ((nis_name *, struct svc_req *));
#elif __STDC__
#define NIS_LOOKUP ((u_long)1)
extern nis_result * nis_lookup_3(ns_request *, CLIENT *);
extern nis_result * nis_lookup_3_svc(ns_request *, struct svc_req *);
#define NIS_ADD ((u_long)2)
extern nis_result * nis_add_3(ns_request *, CLIENT *);
extern nis_result * nis_add_3_svc(ns_request *, struct svc_req *);
#define NIS_MODIFY ((u_long)3)
extern nis_result * nis_modify_3(ns_request *, CLIENT *);
extern nis_result * nis_modify_3_svc(ns_request *, struct svc_req *);
#define NIS_REMOVE ((u_long)4)
extern nis_result * nis_remove_3(ns_request *, CLIENT *);
extern nis_result * nis_remove_3_svc(ns_request *, struct svc_req *);
#define NIS_IBLIST ((u_long)5)
extern nis_result * nis_iblist_3(ib_request *, CLIENT *);
extern nis_result * nis_iblist_3_svc(ib_request *, struct svc_req *);
#define NIS_IBADD ((u_long)6)
extern nis_result * nis_ibadd_3(ib_request *, CLIENT *);
extern nis_result * nis_ibadd_3_svc(ib_request *, struct svc_req *);
#define NIS_IBMODIFY ((u_long)7)
extern nis_result * nis_ibmodify_3(ib_request *, CLIENT *);
extern nis_result * nis_ibmodify_3_svc(ib_request *, struct svc_req *);
#define NIS_IBREMOVE ((u_long)8)
extern nis_result * nis_ibremove_3(ib_request *, CLIENT *);
extern nis_result * nis_ibremove_3_svc(ib_request *, struct svc_req *);
#define NIS_IBFIRST ((u_long)9)
extern nis_result * nis_ibfirst_3(ib_request *, CLIENT *);
extern nis_result * nis_ibfirst_3_svc(ib_request *, struct svc_req *);
#define NIS_IBNEXT ((u_long)10)
extern nis_result * nis_ibnext_3(ib_request *, CLIENT *);
extern nis_result * nis_ibnext_3_svc(ib_request *, struct svc_req *);
#define NIS_FINDDIRECTORY ((u_long)12)
extern fd_result * nis_finddirectory_3(fd_args *, CLIENT *);
extern fd_result * nis_finddirectory_3_svc(fd_args *, struct svc_req *);
#define NIS_STATUS ((u_long)14)
extern nis_taglist * nis_status_3(nis_taglist *, CLIENT *);
extern nis_taglist * nis_status_3_svc(nis_taglist *, struct svc_req *);
#define NIS_DUMPLOG ((u_long)15)
extern log_result * nis_dumplog_3(dump_args *, CLIENT *);
extern log_result * nis_dumplog_3_svc(dump_args *, struct svc_req *);
#define NIS_DUMP ((u_long)16)
extern log_result * nis_dump_3(dump_args *, CLIENT *);
extern log_result * nis_dump_3_svc(dump_args *, struct svc_req *);
#define NIS_CALLBACK ((u_long)17)
extern bool_t * nis_callback_3(netobj *, CLIENT *);
extern bool_t * nis_callback_3_svc(netobj *, struct svc_req *);
#define NIS_CPTIME ((u_long)18)
extern u_long * nis_cptime_3(nis_name *, CLIENT *);
extern u_long * nis_cptime_3_svc(nis_name *, struct svc_req *);
#define NIS_CHECKPOINT ((u_long)19)
extern cp_result * nis_checkpoint_3(nis_name *, CLIENT *);
extern cp_result * nis_checkpoint_3_svc(nis_name *, struct svc_req *);
#define NIS_PING ((u_long)20)
extern void * nis_ping_3(ping_args *, CLIENT *);
extern void * nis_ping_3_svc(ping_args *, struct svc_req *);
#define NIS_SERVSTATE ((u_long)21)
extern nis_taglist * nis_servstate_3(nis_taglist *, CLIENT *);
extern nis_taglist * nis_servstate_3_svc(nis_taglist *, struct svc_req *);
#define NIS_MKDIR ((u_long)22)
extern nis_error * nis_mkdir_3(nis_name *, CLIENT *);
extern nis_error * nis_mkdir_3_svc(nis_name *, struct svc_req *);
#define NIS_RMDIR ((u_long)23)
extern nis_error * nis_rmdir_3(nis_name *, CLIENT *);
extern nis_error * nis_rmdir_3_svc(nis_name *, struct svc_req *);
#define NIS_UPDKEYS ((u_long)24)
extern nis_error * nis_updkeys_3(nis_name *, CLIENT *);
extern nis_error * nis_updkeys_3_svc(nis_name *, struct svc_req *);
#else /* Old Style C */
#define NIS_LOOKUP ((u_long)1)
extern nis_result * nis_lookup_3();
extern nis_result * nis_lookup_3_svc();
#define NIS_ADD ((u_long)2)
extern nis_result * nis_add_3();
extern nis_result * nis_add_3_svc();
#define NIS_MODIFY ((u_long)3)
extern nis_result * nis_modify_3();
extern nis_result * nis_modify_3_svc();
#define NIS_REMOVE ((u_long)4)
extern nis_result * nis_remove_3();
extern nis_result * nis_remove_3_svc();
#define NIS_IBLIST ((u_long)5)
extern nis_result * nis_iblist_3();
extern nis_result * nis_iblist_3_svc();
#define NIS_IBADD ((u_long)6)
extern nis_result * nis_ibadd_3();
extern nis_result * nis_ibadd_3_svc();
#define NIS_IBMODIFY ((u_long)7)
extern nis_result * nis_ibmodify_3();
extern nis_result * nis_ibmodify_3_svc();
#define NIS_IBREMOVE ((u_long)8)
extern nis_result * nis_ibremove_3();
extern nis_result * nis_ibremove_3_svc();
#define NIS_IBFIRST ((u_long)9)
extern nis_result * nis_ibfirst_3();
extern nis_result * nis_ibfirst_3_svc();
#define NIS_IBNEXT ((u_long)10)
extern nis_result * nis_ibnext_3();
extern nis_result * nis_ibnext_3_svc();
#define NIS_FINDDIRECTORY ((u_long)12)
extern fd_result * nis_finddirectory_3();
extern fd_result * nis_finddirectory_3_svc();
#define NIS_STATUS ((u_long)14)
extern nis_taglist * nis_status_3();
extern nis_taglist * nis_status_3_svc();
#define NIS_DUMPLOG ((u_long)15)
extern log_result * nis_dumplog_3();
extern log_result * nis_dumplog_3_svc();
#define NIS_DUMP ((u_long)16)
extern log_result * nis_dump_3();
extern log_result * nis_dump_3_svc();
#define NIS_CALLBACK ((u_long)17)
extern bool_t * nis_callback_3();
extern bool_t * nis_callback_3_svc();
#define NIS_CPTIME ((u_long)18)
extern u_long * nis_cptime_3();
extern u_long * nis_cptime_3_svc();
#define NIS_CHECKPOINT ((u_long)19)
extern cp_result * nis_checkpoint_3();
extern cp_result * nis_checkpoint_3_svc();
#define NIS_PING ((u_long)20)
extern void * nis_ping_3();
extern void * nis_ping_3_svc();
#define NIS_SERVSTATE ((u_long)21)
extern nis_taglist * nis_servstate_3();
extern nis_taglist * nis_servstate_3_svc();
#define NIS_MKDIR ((u_long)22)
extern nis_error * nis_mkdir_3();
extern nis_error * nis_mkdir_3_svc();
#define NIS_RMDIR ((u_long)23)
extern nis_error * nis_rmdir_3();
extern nis_error * nis_rmdir_3_svc();
#define NIS_UPDKEYS ((u_long)24)
extern nis_error * nis_updkeys_3();
extern nis_error * nis_updkeys_3_svc();
#endif /* Old Style C */
struct rpcgen_table {
#if defined __cplusplus || __STDC__
char *(*proc)(void);
#else
char *(*proc)();
#endif
xdrproc_t xdr_arg;
unsigned len_arg;
xdrproc_t xdr_res;
unsigned len_res;
};
__END_DECLS
#endif /* !_NIS_H_RPCGEN */

View File

@ -18,6 +18,7 @@
#include <stdio.h>
#include <glob.h>
#include <unistd.h>
int
main (int argc, char *argv[])
@ -26,7 +27,11 @@ main (int argc, char *argv[])
int glob_flags = GLOB_NOSORT;
glob_t filenames;
i = glob (argv[1], glob_flags, NULL, &filenames);
if (argc != 3)
exit (1);
if (chdir (argv[1]))
exit (1);
i = glob (argv[2], glob_flags, NULL, &filenames);
if (i == GLOB_NOSPACE)
puts ("GLOB_NOSPACE");

View File

@ -20,10 +20,9 @@ echo 1_2 > $testdir/dir1/file1_2
# Run some tests.
result=0
here=`pwd`
(cd $testdir &&
LD_LIBRARY_PATH=$common_objpfx $common_objpfx/posix/globtest "*") |
LD_LIBRARY_PATH=$common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`dir1'
@ -33,8 +32,8 @@ cat <<"EOF" | cmp - $testout || result=1
not NULL
EOF
(cd $testdir &&
LD_LIBRARY_PATH=$common_objpfx $common_objpfx/posix/globtest "*/*") |
LD_LIBRARY_PATH=$common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1'
@ -42,40 +41,40 @@ cat <<"EOF" | cmp - $testout || result=1
not NULL
EOF
(cd $testdir &&
LD_LIBRARY_PATH=$common_objpfx $common_objpfx/posix/globtest "*/1") |
LD_LIBRARY_PATH=$common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/1" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH
NULL
EOF
(cd $testdir &&
LD_LIBRARY_PATH=$common_objpfx $common_objpfx/posix/globtest "*/*1_1") |
LD_LIBRARY_PATH=$common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/*1_1" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1'
not NULL
EOF
(cd $testdir &&
LD_LIBRARY_PATH=$common_objpfx $common_objpfx/posix/globtest "*/file1_1") |
LD_LIBRARY_PATH=$common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/file1_1" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1'
not NULL
EOF
(cd $testdir &&
LD_LIBRARY_PATH=$common_objpfx $common_objpfx/posix/globtest "*-/*") |
LD_LIBRARY_PATH=$common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*-/*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH
NULL
EOF
(cd $testdir &&
LD_LIBRARY_PATH=$common_objpfx $common_objpfx/posix/globtest "*-") |
LD_LIBRARY_PATH=$common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*-" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH

View File

@ -22,7 +22,7 @@
# error "Never use <bits/string2.h> directly; include <string.h> instead."
#endif
#ifdef __NO_STRING_INLINES
#ifndef __NO_STRING_INLINES
/* Unlike the definitions in the header <bits/string.h> the
definitions contained here are not optimizing down to assembler
@ -100,102 +100,101 @@ __STRING2_COPY_TYPE (8);
# if _STRING_ARCH_unaligned
# define __strcpy_small(dest, src, srclen) \
(__extension__ ({ char *__retval = (dest); \
char *__cp = __retval; \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 2: \
*((__uint16_t *) __cp) = \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
break; \
case 3: \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*(__dest + 2) = '\0'; \
break; \
case 4: \
*((__uint32_t *) __cp) = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
break; \
case 5: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*(__dest + 4) = '\0'; \
break; \
case 6: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp) = \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
break; \
case 7: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
*((unsigned char *) __cp) = '\0'; \
*(__dest + 6) = '\0'; \
break; \
case 8: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint32_t *) __cp) = \
*((__uint32_t *) (__dest + 4)) = \
__STRING2_SMALL_GET32 (src, 4); \
break; \
} \
__retval; }))
(char *) __dest; }))
# else
# define __strcpy_small(dest, src, srclen) \
(__extension__ ({ char *__cp = (dest); \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 2: \
*((__STRING2_COPY_ARR2 *) __cp) = \
*((__STRING2_COPY_ARR2 *) __dest) = \
((__STRING2_COPY_ARR2) { { (src)[0], '\0' } }); \
break; \
case 3: \
*((__STRING2_COPY_ARR3 *) __cp) = \
*((__STRING2_COPY_ARR3 *) __dest) = \
((__STRING2_COPY_ARR3) { { (src)[0], (src)[1], \
'\0' } }); \
break; \
case 4: \
*((__STRING2_COPY_ARR4 *) __cp) = \
*((__STRING2_COPY_ARR4 *) __dest) = \
((__STRING2_COPY_ARR4) { { (src)[0], (src)[1], \
(src)[2], '\0' } }); \
break; \
case 5: \
*((__STRING2_COPY_ARR5 *) __cp) = \
*((__STRING2_COPY_ARR5 *) __dest) = \
((__STRING2_COPY_ARR5) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
'\0' } }); \
break; \
case 6: \
*((__STRING2_COPY_ARR6 *) __cp) = \
*((__STRING2_COPY_ARR6 *) __dest) = \
((__STRING2_COPY_ARR6) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
(src)[4], '\0' } }); \
break; \
case 7: \
*((__STRING2_COPY_ARR7 *) __cp) = \
*((__STRING2_COPY_ARR7 *) __dest) = \
((__STRING2_COPY_ARR7) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
(src)[4], (src)[5], \
'\0' } }); \
break; \
case 8: \
*((__STRING2_COPY_ARR8 *) __cp) = \
*((__STRING2_COPY_ARR8 *) __dest) = \
((__STRING2_COPY_ARR8) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
(src)[4], (src)[5], \
(src)[6], '\0' } }); \
break; \
} \
__cp; }))
(char *) __dest; }))
# endif
#endif
@ -215,105 +214,106 @@ __STRING2_COPY_TYPE (8);
# if _STRING_ARCH_unaligned
# define __stpcpy_small(dest, src, srclen) \
(__extension__ ({ char *__cp = (dest); \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 2: \
*((__uint16_t *) __cp) = \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
++__cp; \
++__dest; \
break; \
case 3: \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) __dest)++ = \
__STRING2_SMALL_GET16 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 4: \
*((__uint32_t *) __cp) = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
__cp += 3; \
__dest += 3; \
break; \
case 5: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest)++ = \
__STRING2_SMALL_GET32 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 6: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp) = \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
++__cp; \
__dest += 5; \
break; \
case 7: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
*((unsigned char *) __cp) = '\0'; \
__dest += 6; \
*__dest = '\0'; \
break; \
case 8: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint32_t *) __cp) = \
*((__uint32_t *) (__dest + 4)) = \
__STRING2_SMALL_GET32 (src, 4); \
__cp += 3; \
__dest += 7; \
break; \
} \
__cp; }))
(char *) __dest; }))
# else
# define __stpcpy_small(dest, src, srclen) \
(__extension__ ({ char *__cp = (dest); \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 2: \
*((__STRING2_COPY_ARR2 *) __cp) = \
*((__STRING2_COPY_ARR2 *) __dest) = \
((__STRING2_COPY_ARR2) { { (src)[0], '\0' } }); \
break; \
case 3: \
*((__STRING2_COPY_ARR3 *) __cp) = \
*((__STRING2_COPY_ARR3 *) __dest) = \
((__STRING2_COPY_ARR3) { { (src)[0], (src)[1], \
'\0' } }); \
break; \
case 4: \
*((__STRING2_COPY_ARR4 *) __cp) = \
*((__STRING2_COPY_ARR4 *) __dest) = \
((__STRING2_COPY_ARR4) { { (src)[0], (src)[1], \
(src)[2], '\0' } }); \
break; \
case 5: \
*((__STRING2_COPY_ARR5 *) __cp) = \
*((__STRING2_COPY_ARR5 *) __dest) = \
((__STRING2_COPY_ARR5) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
'\0' } }); \
break; \
case 6: \
*((__STRING2_COPY_ARR6 *) __cp) = \
*((__STRING2_COPY_ARR6 *) __dest) = \
((__STRING2_COPY_ARR6) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
(src)[4], '\0' } }); \
break; \
case 7: \
*((__STRING2_COPY_ARR7 *) __cp) = \
*((__STRING2_COPY_ARR7 *) __dest) = \
((__STRING2_COPY_ARR7) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
(src)[4], (src)[5], \
'\0' } }); \
break; \
case 8: \
*((__STRING2_COPY_ARR8 *) __cp) = \
*((__STRING2_COPY_ARR8 *) __dest) = \
((__STRING2_COPY_ARR8) { { (src)[0], (src)[1], \
(src)[2], (src)[3], \
(src)[4], (src)[5], \
(src)[6], '\0' } }); \
break; \
} \
__cp + ((srclen) - 1); }))
(char *) (__dest + ((srclen) - 1)); }))
# endif
# endif
#endif
@ -323,13 +323,14 @@ __STRING2_COPY_TYPE (8);
#ifndef _HAVE_STRING_ARCH_strncpy
# if defined _HAVE_STRING_ARCH_memset && defined _HAVE_STRING_ARCH_mempcpy
# define strncpy(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) + 1 >= ((size_t) (n)) \
? (char *) memcpy (dest, src, n) \
: (memset (__mempcpy (dest, src, strlen (src)), '\0', \
n - strlen (src)), \
(char *) dest)) \
: strncpy (dest, src, n)))
(__extension__ ({ char *__dest = (dest); \
__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) + 1 >= ((size_t) (n)) \
? (char *) memcpy (__dest, src, n) \
: (memset (__mempcpy (__dest, src, strlen (src)), \
'\0', n - strlen (src)), \
__dest)) \
: strncpy (__dest, src, n); }))
# else
# define strncpy(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
@ -345,11 +346,12 @@ __STRING2_COPY_TYPE (8);
#ifndef _HAVE_STRING_ARCH_strncat
# ifdef _HAVE_STRING_ARCH_strchr
# define strncat(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) < ((size_t) (n)) \
? strcat (dest, src) \
: (memcpy (strchr (dest, '\0'), src, n), (char *) dest)) \
: strncat (dest, src, n)))
(__extension__ ({ char *__dest = (dest); \
__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) < ((size_t) (n)) \
? strcat (__dest, src) \
: (memcpy (strchr (__dest, '\0'), src, n), __dest)) \
: strncat (dest, src, n); }))
# else
# define strncat(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
@ -361,6 +363,54 @@ __STRING2_COPY_TYPE (8);
#endif
/* Compare characters of S1 and S2. */
#ifndef _HAVE_STRING_ARCH_strcmp
# define strcmp(s1, s2) \
(__extension__ (__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (sizeof (s1)[0] != 1 || strlen (s1) >= 4) \
&& (sizeof (s2)[0] != 1 || strlen (s2) >= 4) \
? memcmp (s1, s2, (strlen (s1) < strlen (s2) \
? strlen (s1) : strlen (s2)) + 1) \
: (__builtin_constant_p (s1) && sizeof (s1)[0] == 1 \
&& sizeof (s2)[0] == 1 && strlen (s1) < 4 \
? __strcmp_cg (s1, s2, strlen (s1)) \
: (__builtin_constant_p (s2) && sizeof (s1)[0] == 1 \
&& sizeof (s2)[0] == 1 && strlen (s2) < 4 \
? __strcmp_gc (s1, s2, strlen (s2)) \
: strcmp (s1, s2)))))
# define __strcmp_cg(s1, s2, l1) \
(__extension__ ({ __const unsigned char *__s2 = (unsigned char *) (s2); \
register int __result = (unsigned char) (s1)[0] - __s2[0];\
if (l1 > 0 && __result == 0) \
{ \
__result = (unsigned char) (s1)[1] - __s2[1]; \
if (l1 > 1 && __result == 0) \
{ \
__result = (unsigned char) (s1)[2] - __s2[2]; \
if (l1 > 2 && __result == 0) \
__result = (unsigned char) (s1)[3] - __s2[3]; \
} \
} \
__result; }))
# define __strcmp_gc(s1, s2, l2) \
(__extension__ ({ __const unsigned char *__s1 = (unsigned char *) (s1); \
register int __result = __s1[0] - (unsigned char) (s2)[0];\
if (l2 > 0 && __result == 0) \
{ \
__result = __s1[1] - (unsigned char) (s2)[1]; \
if (l2 > 1 && __result == 0) \
{ \
__result = __s1[2] - (unsigned char) (s2)[2]; \
if (l2 > 2 && __result == 0) \
__result = __s1[3] - (unsigned char) (s2)[3]; \
} \
} \
__result; }))
#endif
/* Compare N characters of S1 and S2. */
#ifndef _HAVE_STRING_ARCH_strncmp
# define strncmp(s1, s2, n) \
@ -474,26 +524,26 @@ __STRING_INLINE char *__strsep_1c (char **__s, char __reject);
__STRING_INLINE char *
__strsep_1c (char **__s, char __reject)
{
register __const char *__retval = *__s;
register char *__retval = *__s;
if (__retval == NULL || *__retval == '\0')
return NULL;
while (*__retval == __reject)
++__retval;
if ((*__s = strchr (__retval, __reject)) != NULL)
*(*__s)++ = '\0';
return (char *) __retval;
return __retval;
}
__STRING_INLINE char *__strsep_g (char **__s, __const char *__reject);
__STRING_INLINE char *
__strsep_g (char **__s, __const char *__reject)
{
register __const char *__retval = *__s;
register char *__retval = *__s;
if (__retval == NULL || *__retval == '\0')
return NULL;
if ((*__s = strpbrk (__retval, __reject)) != NULL)
*(*__s)++ = '\0';
return (char *) __retval;
return __retval;
}
# endif
#endif

View File

@ -1,4 +1,4 @@
/* @(#)get_myaddress.c 2.1 88/07/29 4.0 RPCSRC */
/* @(#)get_myaddress.c 2.1 88/07/29 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@ -38,13 +38,11 @@ static char sccsid[] = "@(#)get_myaddress.c 1.4 87/08/11 Copyr 1984 Sun Micro";
* Copyright (C) 1984, Sun Microsystems, Inc.
*/
#include <unistd.h>
#include <rpc/types.h>
#include <rpc/pmap_prot.h>
#include <sys/socket.h>
#include <stdio.h>
#undef _POSIX_SOURCE /* Ultrix <sys/param.h> needs --roland@gnu */
#include <sys/param.h> /* Ultrix needs before net/if --roland@gnu */
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
/* Order of following two #includes reversed by roland@gnu */
@ -53,6 +51,9 @@ static char sccsid[] = "@(#)get_myaddress.c 1.4 87/08/11 Copyr 1984 Sun Micro";
/*
* don't use gethostbyname, which would invoke yellow pages
*
* Avoid loopback interfaces. We return information from a loopback
* interface only if there are no other possible interfaces.
*/
void
get_myaddress (struct sockaddr_in *addr)
@ -61,7 +62,7 @@ get_myaddress (struct sockaddr_in *addr)
char buf[BUFSIZ];
struct ifconf ifc;
struct ifreq ifreq, *ifr;
int len;
int len, loopback = 0;
if ((s = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
{
@ -75,23 +76,32 @@ get_myaddress (struct sockaddr_in *addr)
perror (_("get_myaddress: ioctl (get interface configuration)"));
exit (1);
}
again:
ifr = ifc.ifc_req;
for (len = ifc.ifc_len; len; len -= sizeof ifreq)
{
ifreq = *ifr;
if (ioctl (s, SIOCGIFFLAGS, (char *) &ifreq) < 0)
{
perror ("get_myaddress: ioctl");
exit (1);
perror ("get_myaddress: ioctl");
exit (1);
}
if ((ifreq.ifr_flags & IFF_UP) &&
ifr->ifr_addr.sa_family == AF_INET)
if ((ifreq.ifr_flags & IFF_UP) && (ifr->ifr_addr.sa_family == AF_INET)
&& (!(ifreq.ifr_flags & IFF_LOOPBACK) ||
(loopback == 1 && (ifreq.ifr_flags & IFF_LOOPBACK))))
{
*addr = *((struct sockaddr_in *) &ifr->ifr_addr);
addr->sin_port = htons (PMAPPORT);
break;
close (s);
return;
}
ifr++;
}
(void) close (s);
if (loopback == 0)
{
loopback = 1;
goto again;
}
close (s);
}

View File

@ -121,6 +121,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
and then redirect to the address it returns. */
#ifndef PROF
# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
.text
.globl _dl_runtime_resolve
.type _dl_runtime_resolve, @function
.align 16
@ -153,9 +154,11 @@ _dl_runtime_profile:
xchgl %eax, (%esp) # Get %eax contents end store function address.
ret $8 # Jump to function address.
.size _dl_runtime_profile, .-_dl_runtime_profile
.previous
");
#else
# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
.text
.globl _dl_runtime_resolve
.globl _dl_runtime_profile
.type _dl_runtime_resolve, @function
@ -179,6 +182,7 @@ _dl_runtime_profile:
ret $8 # Jump to function address.
.size _dl_runtime_resolve, .-_dl_runtime_resolve
.size _dl_runtime_profile, .-_dl_runtime_profile
.previous
");
#endif
/* The PLT uses Elf32_Rel relocs. */

View File

@ -28,7 +28,7 @@ __attribute__ ((unused))
exchange_and_add (volatile uint32_t *mem, int val)
{
register int result;
__asm__ __volatile__ ("lock; xaddl %0,%1"
__asm__ __volatile__ ("lock; xaddl %0,%2"
: "=r" (result) : "0" (val), "m" (*mem) : "memory");
return result;
}

View File

@ -344,7 +344,7 @@ memchr (__const void *__s, int __c, size_t __n)
#define _HAVE_STRING_ARCH_strlen 1
#define strlen(str) \
(__extension__ (__builtin_constant_p (str) \
? sizeof (str) - 1 \
? __builtin_strlen (str) \
: __strlen_g (str)))
__STRING_INLINE size_t
__strlen_g (__const char *__str)
@ -374,52 +374,51 @@ __strlen_g (__const char *__str)
: __strcpy_g (dest, src)))
# define __strcpy_small(dest, src, srclen) \
(__extension__ ({ char *__retval = (dest); \
char *__cp = __retval; \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 2: \
*((__uint16_t *) __cp) = \
*((__uint16_t *) __dest) = \
__STRING_SMALL_GET16 (src, 0); \
break; \
case 3: \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) __dest) = \
__STRING_SMALL_GET16 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*(__dest + 2) = '\0'; \
break; \
case 4: \
*((__uint32_t *) __cp) = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
break; \
case 5: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*(__dest + 4) = '\0'; \
break; \
case 6: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp) = \
*((__uint16_t *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
break; \
case 7: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
*((unsigned char *) __cp) = '\0'; \
*(__dest + 6) = '\0'; \
break; \
case 8: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((__uint32_t *) __cp) = \
*((__uint32_t *) (__dest + 4)) = \
__STRING_SMALL_GET32 (src, 4); \
break; \
} \
__retval; }))
(char *) __dest; }))
__STRING_INLINE char *
__strcpy_g (char *__dest, __const char *__src)
@ -453,64 +452,65 @@ __strcpy_g (char *__dest, __const char *__src)
: __stpcpy_g (dest, src)))
# define __stpcpy_c(dest, src, srclen) \
((srclen) % 4 == 0 \
? __mempcpy_by4 (dest, src, srclen) \
? __mempcpy_by4 (dest, src, srclen) - 1 \
: ((srclen) % 2 == 0 \
? __mempcpy_by2 (dest, src, srclen) \
: __mempcpy_byn (dest, src, srclen)))
? __mempcpy_by2 (dest, src, srclen) - 1 \
: __mempcpy_byn (dest, src, srclen) - 1))
/* In glibc itself we use this symbol for namespace reasons. */
# define stpcpy(dest, src) __stpcpy (dest, src)
# define __stpcpy_small(dest, src, srclen) \
(__extension__ ({ char *__cp = (dest); \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 2: \
*((__uint16_t *) __cp) = \
*((__uint16_t *) __dest) = \
__STRING_SMALL_GET16 (src, 0); \
++__cp; \
++__dest; \
break; \
case 3: \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) __dest)++ = \
__STRING_SMALL_GET16 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 4: \
*((__uint32_t *) __cp) = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
__cp += 3; \
__dest += 3; \
break; \
case 5: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest)++ = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned char *) __cp) = '\0'; \
*__dest = '\0'; \
break; \
case 6: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp) = \
*((__uint16_t *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
++__cp; \
__dest += 5; \
break; \
case 7: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((__uint16_t *) __cp)++ = \
*((__uint16_t *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
*((unsigned char *) __cp) = '\0'; \
__dest += 6; \
*__dest = '\0'; \
break; \
case 8: \
*((__uint32_t *) __cp)++ = \
*((__uint32_t *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((__uint32_t *) __cp) = \
*((__uint32_t *) (__dest + 4)) = \
__STRING_SMALL_GET32 (src, 4); \
__cp += 3; \
__dest += 7; \
break; \
} \
__cp; }))
(char *) __dest; }))
__STRING_INLINE char *
__mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen)
@ -528,7 +528,7 @@ __mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen)
: "=r" (__dummy1), "=r" (__tmp), "=r" (__src), "=r" (__dummy2)
: "1" (__tmp), "2" (__src), "3" (__srclen / 4)
: "memory", "cc");
return __tmp - 1;
return __tmp;
}
__STRING_INLINE char *
@ -552,7 +552,7 @@ __mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen)
: "=q" (__dummy1), "=r" (__tmp), "=r" (__src), "=r" (__dummy2)
: "1" (__tmp), "2" (__src), "3" (__srclen / 2)
: "memory", "cc");
return __tmp + 1;
return __tmp + 2;
}
__STRING_INLINE char *
@ -573,7 +573,7 @@ __mempcpy_byn (char *__dest, __const char *__src, size_t __srclen)
: "=D" (__tmp)
: "c" (__srclen), "0" (__tmp),"S" (__src)
: "cx", "di", "si", "memory", "cc");
return __tmp - 1;
return __tmp;
}
__STRING_INLINE char *
@ -760,11 +760,12 @@ __strcat_g (char *__dest, __const char *__src)
/* Append no more than N characters from SRC onto DEST. */
#define _HAVE_STRING_ARCH_strncat 1
#define strncat(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) < ((size_t) (n)) \
? strcat (dest, src) \
: (memcpy (strchr (dest, '\0'), src, n), dest)) \
: __strncat_g (dest, src, n)))
(__extension__ ({ char *__dest = (dest); \
__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) < ((size_t) (n)) \
? strcat (__dest, src) \
: (memcpy (strchr (__dest, '\0'), src, n), __dest)) \
: __strncat_g (__dest, src, n); }))
__STRING_INLINE char *
__strncat_g (char *__dest, __const char __src[], size_t __n)
@ -797,8 +798,52 @@ __strncat_g (char *__dest, __const char __src[], size_t __n)
/* Compare S1 and S2. */
#define _HAVE_STRING_ARCH_strcmp 1
#define strcmp(s1, s2) \
(__extension__ (__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (sizeof (s1)[0] != 1 || strlen (s1) >= 4) \
&& (sizeof (s2)[0] != 1 || strlen (s2) >= 4) \
? memcmp (s1, s2, (strlen (s1) < strlen (s2) \
? strlen (s1) : strlen (s2)) + 1) \
: (__builtin_constant_p (s1) && sizeof (s1)[0] == 1 \
&& sizeof (s2)[0] == 1 && strlen (s1) < 4 \
? __strcmp_cg (s1, s2, strlen (s1)) \
: (__builtin_constant_p (s2) && sizeof (s1)[0] == 1 \
&& sizeof (s2)[0] == 1 && strlen (s2) < 4 \
? __strcmp_gc (s1, s2, strlen (s2)) \
: __strcmp_gg (s1, s2)))))
#define __strcmp_cg(s1, s2, l1) \
(__extension__ ({ __const unsigned char *__s2 = (unsigned char *) (s2); \
register int __result = (unsigned char) (s1)[0] - __s2[0];\
if (l1 > 0 && __result == 0) \
{ \
__result = (unsigned char) (s1)[1] - __s2[1]; \
if (l1 > 1 && __result == 0) \
{ \
__result = (unsigned char) (s1)[2] - __s2[2]; \
if (l1 > 2 && __result == 0) \
__result = (unsigned char) (s1)[3] - __s2[3]; \
} \
} \
__result; }))
#define __strcmp_gc(s1, s2, l2) \
(__extension__ ({ __const unsigned char *__s1 = (unsigned char *) (s1); \
register int __result = __s1[0] - (unsigned char) (s2)[0];\
if (l2 > 0 && __result == 0) \
{ \
__result = __s1[1] - (unsigned char) (s2)[1]; \
if (l2 > 1 && __result == 0) \
{ \
__result = __s1[2] - (unsigned char) (s2)[2]; \
if (l2 > 2 && __result == 0) \
__result = __s1[3] - (unsigned char) (s2)[3]; \
} \
} \
__result; }))
__STRING_INLINE int
strcmp (__const char *__s1, __const char *__s2)
__strcmp_gg (__const char *__s1, __const char *__s2)
{
register int __res;
__asm__ __volatile__

View File

@ -6,7 +6,7 @@
#include <machine/asm.h>
ENTRY(__exp2)
ENTRY(__ieee754_exp2)
fldl 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
@ -34,5 +34,4 @@ ENTRY(__exp2)
fstp %st
fldz /* Set result to 0. */
2: ret
END (__exp2)
weak_alias (__exp2, exp2)
END (__ieee754_exp2)

View File

@ -6,7 +6,7 @@
#include <machine/asm.h>
ENTRY(__exp2f)
ENTRY(__ieee754_exp2f)
flds 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
@ -34,5 +34,4 @@ ENTRY(__exp2f)
fstp %st
fldz /* Set result to 0. */
2: ret
END (__exp2f)
weak_alias (__exp2f, exp2f)
END (__ieee754_exp2f)

View File

@ -6,7 +6,7 @@
#include <machine/asm.h>
ENTRY(__exp2l)
ENTRY(__ieee754_exp2l)
fldt 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
@ -34,5 +34,4 @@ ENTRY(__exp2l)
fstp %st
fldz /* Set result to 0. */
2: ret
END (__exp2l)
weak_alias (__exp2l, exp2l)
END (__ieee754_exp2l)

View File

@ -0,0 +1,2 @@
t_exp2.h
t_exp2f.h

View File

@ -80,6 +80,9 @@ static double zero = 0.0; /* used as const */
* 40-- gamma(finite) overflow
* 41-- gamma(-integer)
* 42-- pow(NaN,0.0)
* 43-- +0**neg
* 44-- exp2 overflow
* 45-- exp2 underflow
*/
@ -865,7 +868,38 @@ static double zero = 0.0; /* used as const */
}
break;
/* #### Last used is 43/143/243 ### */
case 44:
case 144:
case 244:
/* exp(finite) overflow */
exc.type = OVERFLOW;
exc.name = type < 100 ? "exp2" : (type < 200
? "exp2f" : "exp2l");
if (_LIB_VERSION == _SVID_)
exc.retval = HUGE;
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
__set_errno (ERANGE);
else if (!matherr(&exc)) {
__set_errno (ERANGE);
}
break;
case 45:
case 145:
case 245:
/* exp(finite) underflow */
exc.type = UNDERFLOW;
exc.name = type < 100 ? "exp2" : (type < 200
? "exp2f" : "exp2l");
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
__set_errno (ERANGE);
else if (!matherr(&exc)) {
__set_errno (ERANGE);
}
break;
/* #### Last used is 44/144/244 ### */
}
return exc.retval;
}

View File

@ -0,0 +1,128 @@
/* Double-precision floating point 2^x.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <geoffk@ozemail.com.au>
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 basic design here is from
Shmuel Gal and Boris Bachelis, "An Accurate Elementary Mathematical
Library for the IEEE Floating Point Standard", ACM Trans. Math. Soft.,
17 (1), March 1991, pp. 26-45.
It has been slightly modified to compute 2^x instead of e^x.
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <float.h>
#include <ieee754.h>
#include <math.h>
#include <fenv.h>
#include <inttypes.h>
#include <math_private.h>
#include "t_exp2.h"
static const volatile double TWO1000 = 1.071508607186267320948e+301;
static const volatile double TWOM1000 = 9.3326361850321887899e-302;
double
__ieee754_exp2 (double x)
{
static const uint32_t a_inf = 0x7f800000;
/* Check for usual case. */
if (isless (x, (double) DBL_MAX_EXP)
&& isgreater (x, (double) (DBL_MIN_EXP - 1)))
{
static const float TWO43 = 8796093022208.0;
int tval;
double rx, x22;
union ieee754_double ex2_u;
fenv_t oldenv;
feholdexcept (&oldenv);
fesetround (FE_TONEAREST);
/* 1. Argument reduction.
Choose integers ex, -256 <= t < 256, and some real
-1/1024 <= x1 <= 1024 so that
x = ex + t/512 + x1.
First, calculate rx = ex + t/512. */
if (x >= 0)
{
rx = x + TWO43;
rx -= TWO43;
}
else
{
rx = x - TWO43;
rx += TWO43;
}
x -= rx; /* Compute x=x1. */
/* Compute tval = (ex*512 + t)+256.
Now, t = (tval mod 512)-256 and ex=tval/512 [that's mod, NOT %; and
/-round-to-nearest not the usual c integer /]. */
tval = (int) (rx * 512.0 + 256.0);
/* 2. Adjust for accurate table entry.
Find e so that
x = ex + t/512 + e + x2
where -1e6 < e < 1e6, and
(double)(2^(t/512+e))
is accurate to one part in 2^-64. */
/* 'tval & 511' is the same as 'tval%512' except that it's always
positive.
Compute x = x2. */
x -= exp2_deltatable[tval & 511];
/* 3. Compute ex2 = 2^(t/512+e+ex). */
ex2_u.d = exp2_accuratetable[tval & 511];
ex2_u.ieee.exponent += tval >> 9;
/* 4. Approximate 2^x2 - 1, using a fourth-degree polynomial,
2^x2 ~= sum(k=0..4 | (x2 * ln(2))^k / k! ) +
so
2^x2 - 1 ~= sum(k=1..4 | (x2 * ln(2))^k / k! )
with error less than 2^(1/1024) * (x2 * ln(2))^5 / 5! < 1.2e-18. */
x22 = (((.0096181291076284772
* x + .055504108664821580)
* x + .240226506959100712)
* x + .69314718055994531) * ex2_u.d;
/* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */
fesetenv (&oldenv);
/* Need to check: does this set FE_INEXACT correctly? */
return x22 * x + ex2_u.d;
}
/* 2^inf == inf, with no error. */
else if (x == *(const float *) &a_inf)
return x;
/* Check for overflow. */
else if (isgreaterequal (x, (double) DBL_MAX_EXP))
return TWO1000 * TWO1000;
/* And underflow (including -inf). */
else if (isless (x, (double) (DBL_MIN_EXP - DBL_MANT_DIG)))
return TWOM1000 * TWOM1000;
/* Maybe the result needs to be a denormalised number... */
else if (!isnan (x))
return __ieee754_exp2 (x + 1000.0) * TWOM1000;
else /* isnan(x) */
return x + x;
}

View File

@ -0,0 +1,126 @@
/* Single-precision floating point 2^x.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <geoffk@ozemail.com.au>
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 basic design here is from
Shmuel Gal and Boris Bachelis, "An Accurate Elementary Mathematical
Library for the IEEE Floating Point Standard", ACM Trans. Math. Soft.,
17 (1), March 1991, pp. 26-45.
It has been slightly modified to compute 2^x instead of e^x, and for
single-precision.
*/
#define _GNU_SOURCE
#include <float.h>
#include <ieee754.h>
#include <math.h>
#include <fenv.h>
#include <inttypes.h>
#include <math_private.h>
#include "t_exp2f.h"
static const volatile float TWOM100 = 7.88860905e-31;
static const volatile float huge = 1e+30;
float
__ieee754_exp2f (float x)
{
static const uint32_t a_inf = 0x7f800000;
/* Check for usual case. */
if (isless (x, (float) FLT_MAX_EXP)
&& isgreater (x, (float) (FLT_MIN_EXP - 1)))
{
static const float TWO16 = 65536.0;
int tval;
float rx, x22;
union ieee754_float ex2_u;
fenv_t oldenv;
feholdexcept (&oldenv);
fesetround (FE_TONEAREST);
/* 1. Argument reduction.
Choose integers ex, -128 <= t < 128, and some real
-1/512 <= x1 <= 1/512 so that
x = ex + t/512 + x1.
First, calculate rx = ex + t/256. */
if (x >= 0)
{
rx = x + TWO16;
rx -= TWO16;
}
else
{
rx = x - TWO16;
rx += TWO16;
}
x -= rx; /* Compute x=x1. */
/* Compute tval = (ex*256 + t)+128.
Now, t = (tval mod 256)-128 and ex=tval/256 [that's mod, NOT %; and
/-round-to-nearest not the usual c integer /]. */
tval = (int) (rx * 256.0f + 128.0f);
/* 2. Adjust for accurate table entry.
Find e so that
x = ex + t/256 + e + x2
where -7e-4 < e < 7e-4, and
(float)(2^(t/256+e))
is accurate to one part in 2^-64. */
/* 'tval & 255' is the same as 'tval%256' except that it's always
positive.
Compute x = x2. */
x -= exp2_deltatable[tval & 255];
/* 3. Compute ex2 = 2^(t/255+e+ex). */
ex2_u.f = exp2_accuratetable[tval & 255];
ex2_u.ieee.exponent += tval >> 8;
/* 4. Approximate 2^x2 - 1, using a second-degree polynomial,
2^x2 ~= sum(k=0..2 | (x2 * ln(2))^k / k! ) +
so
2^x2 - 1 ~= sum(k=1..4 | (x2 * ln(2))^k / k! )
with error less than 2^(1/512+7e-4) * (x2 * ln(2))^3 / 3! < 1.2e-18. */
x22 = (.240226507f * x + .6931471806f) * ex2_u.f;
/* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */
fesetenv (&oldenv);
/* Need to check: does this set FE_INEXACT correctly? */
return x22 * x + ex2_u.f;
}
/* 2^inf == inf, with no error. */
else if (x == *(const float *)&a_inf)
{
return x;
}
/* Check for overflow. */
else if (isgreaterequal (x, (float) FLT_MAX_EXP))
return huge * huge;
/* And underflow (including -inf). */
else if (isless (x, (float) (FLT_MIN_EXP - FLT_MANT_DIF)))
return TWOM100 * TWOM100;
/* Maybe the result needs to be a denormalised number... */
else if (!isnan (x))
return __ieee754_exp2f (x + 100.0) * TWOM100;
else /* isnan(x) */
return x + x;
}

View File

@ -0,0 +1,585 @@
/* These values are accurate to 52+12 bits when represented as
a double. */
static const double exp2_accuratetable[512] = {
0.707106781187802013759 /* 0x0.b504f333fb3f80007 */,
0.708064712808760599040 /* 0x0.b543baa0f71b38000 */,
0.709023942160304065938 /* 0x0.b58297d3a8d518002 */,
0.709984470998547667624 /* 0x0.b5c18ad39b4ba0001 */,
0.710946301084324217006 /* 0x0.b60093a85e8d30001 */,
0.711909434180505784637 /* 0x0.b63fb25984e628005 */,
0.712873872052760648733 /* 0x0.b67ee6eea3b5f8003 */,
0.713839616467838999908 /* 0x0.b6be316f518c98001 */,
0.714806669195984345523 /* 0x0.b6fd91e328d148007 */,
0.715775032009894562898 /* 0x0.b73d0851c69e20002 */,
0.716744706683768884058 /* 0x0.b77c94c2c9b3d0003 */,
0.717715694995770148178 /* 0x0.b7bc373dd52eb0003 */,
0.718687998724665488852 /* 0x0.b7fbefca8cd530004 */,
0.719661619652575468291 /* 0x0.b83bbe70981da8001 */,
0.720636559564428180758 /* 0x0.b87ba337a194b0006 */,
0.721612820246623098989 /* 0x0.b8bb9e27556508004 */,
0.722590403488338473025 /* 0x0.b8fbaf4762c798006 */,
0.723569311081411870036 /* 0x0.b93bd69f7be1d0000 */,
0.724549544820974333906 /* 0x0.b97c1437567828007 */,
0.725531106502312561633 /* 0x0.b9bc6816a87ae8002 */,
0.726513997924421062181 /* 0x0.b9fcd2452bee00000 */,
0.727498220889519875430 /* 0x0.ba3d52ca9e6148002 */,
0.728483777200401694265 /* 0x0.ba7de9aebe05c8003 */,
0.729470668664712662563 /* 0x0.babe96f94e62a8002 */,
0.730458897090379144517 /* 0x0.baff5ab2134df0004 */,
0.731448464287988597833 /* 0x0.bb4034e0d38ab0000 */,
0.732439372072965166897 /* 0x0.bb81258d5b2d60001 */,
0.733431622260458326859 /* 0x0.bbc22cbf75fd28001 */,
0.734425216668725511232 /* 0x0.bc034a7ef32c00001 */,
0.735420157118880535324 /* 0x0.bc447ed3a50fe0005 */,
0.736416445434497690674 /* 0x0.bc85c9c560b350001 */,
0.737414083433310718618 /* 0x0.bcc72b5bf4b4e0000 */,
0.738413072966152328496 /* 0x0.bd08a39f5417a8007 */,
0.739413415848264365956 /* 0x0.bd4a32974abcd0002 */,
0.740415113911250699637 /* 0x0.bd8bd84bb68300002 */,
0.741418168994518067562 /* 0x0.bdcd94c47ddd30003 */,
0.742422582936659858376 /* 0x0.be0f6809865968006 */,
0.743428357577745613238 /* 0x0.be515222b72530003 */,
0.744435494762383687126 /* 0x0.be935317fc6ba0002 */,
0.745443996335090397492 /* 0x0.bed56af1423de8001 */,
0.746453864145572798553 /* 0x0.bf1799b67a6248007 */,
0.747465100043933849969 /* 0x0.bf59df6f970e70002 */,
0.748477705883256683178 /* 0x0.bf9c3c248dbee8001 */,
0.749491683518965001732 /* 0x0.bfdeafdd568308000 */,
0.750507034813367890373 /* 0x0.c0213aa1f0fc38004 */,
0.751523761622240105153 /* 0x0.c063dc7a559ca0003 */,
0.752541865811731880422 /* 0x0.c0a6956e883ed8000 */,
0.753561349247157341600 /* 0x0.c0e965868bd220006 */,
0.754582213796583967110 /* 0x0.c12c4cca664cb8002 */,
0.755604461332336940791 /* 0x0.c16f4b42225350006 */,
0.756628093726406381068 /* 0x0.c1b260f5ca2c48002 */,
0.757653112855631305506 /* 0x0.c1f58ded6d72d8001 */,
0.758679520599333412360 /* 0x0.c238d2311e7d08001 */,
0.759707318837184453227 /* 0x0.c27c2dc8f00368005 */,
0.760736509456435783249 /* 0x0.c2bfa0bcfd1400000 */,
0.761767094336480043995 /* 0x0.c3032b155818d0000 */,
0.762799075372231349951 /* 0x0.c346ccda248cc0001 */,
0.763832454453522768941 /* 0x0.c38a8613805488005 */,
0.764867233473625618441 /* 0x0.c3ce56c98d1ca8005 */,
0.765903414329434539816 /* 0x0.c4123f04708d80002 */,
0.766940998920452976510 /* 0x0.c4563ecc532dc0001 */,
0.767979989148100838946 /* 0x0.c49a56295f9f88006 */,
0.769020386915772125040 /* 0x0.c4de8523c2b0a0001 */,
0.770062194131770905170 /* 0x0.c522cbc3ae94e0003 */,
0.771105412703856241146 /* 0x0.c5672a1154e6b8004 */,
0.772150044545352520777 /* 0x0.c5aba014ed5f18003 */,
0.773196091570364285606 /* 0x0.c5f02dd6b09288003 */,
0.774243555696622731700 /* 0x0.c634d35edb1260003 */,
0.775292438842697939641 /* 0x0.c67990b5aa5c18004 */,
0.776342742931542928455 /* 0x0.c6be65e360bed8000 */,
0.777394469888802008854 /* 0x0.c70352f0437f50004 */,
0.778447621641124243320 /* 0x0.c74857e498fd00006 */,
0.779502200118583399303 /* 0x0.c78d74c8ab5b60000 */,
0.780558207255445668515 /* 0x0.c7d2a9a4c959f8000 */,
0.781615644985491186966 /* 0x0.c817f681412f80002 */,
0.782674515247667956808 /* 0x0.c85d5b6666c150006 */,
0.783734819983036512536 /* 0x0.c8a2d85c904760003 */,
0.784796561133562109454 /* 0x0.c8e86d6c14f850002 */,
0.785859740645942328471 /* 0x0.c92e1a9d513ec8002 */,
0.786924360469767103536 /* 0x0.c973dff8a4b390007 */,
0.787990422552312885808 /* 0x0.c9b9bd866c6440007 */,
0.789057928854407064640 /* 0x0.c9ffb34f1444b0001 */,
0.790126881326406182996 /* 0x0.ca45c15afcc570001 */,
0.791197281930050233534 /* 0x0.ca8be7b292db38000 */,
0.792269132620954885659 /* 0x0.cad2265e3cbee8000 */,
0.793342435380726906957 /* 0x0.cb187d667d3d38006 */,
0.794417192158282659010 /* 0x0.cb5eecd3b33158006 */,
0.795493404931386649540 /* 0x0.cba574ae5d2e80001 */,
0.796571075671306805268 /* 0x0.cbec14fef2a348004 */,
0.797650206352955137846 /* 0x0.cc32cdcdef0000000 */,
0.798730798954342069432 /* 0x0.cc799f23d11d18000 */,
0.799812855456121796232 /* 0x0.ccc089091abb28004 */,
0.800896377841454287795 /* 0x0.cd078b86505c18003 */,
0.801981368096190028208 /* 0x0.cd4ea6a3f97720007 */,
0.803067828208752554378 /* 0x0.cd95da6aa057b8007 */,
0.804155760170129796375 /* 0x0.cddd26e2d21b28001 */,
0.805245165974338261710 /* 0x0.ce248c151f3330001 */,
0.806336047619038653883 /* 0x0.ce6c0a0a1c1350001 */,
0.807428407102107836855 /* 0x0.ceb3a0ca5d6be0006 */,
0.808522246427078927792 /* 0x0.cefb505e7e2550007 */,
0.809617567597010201484 /* 0x0.cf4318cf18a268002 */,
0.810714372621179513182 /* 0x0.cf8afa24ce1c98004 */,
0.811812663508675536069 /* 0x0.cfd2f4683f9810005 */,
0.812912442272482604912 /* 0x0.d01b07a2126188003 */,
0.814013710929394895825 /* 0x0.d06333daeff618001 */,
0.815116471495287542325 /* 0x0.d0ab791b80d028006 */,
0.816220725993571205593 /* 0x0.d0f3d76c75b330000 */,
0.817326476447408967199 /* 0x0.d13c4ed67f1cf8000 */,
0.818433724883006474832 /* 0x0.d184df6250e3b0001 */,
0.819542473330909460055 /* 0x0.d1cd8918a3a328004 */,
0.820652723822034690935 /* 0x0.d2164c02305fa0002 */,
0.821764478391968422618 /* 0x0.d25f2827b53fb0005 */,
0.822877739077315761840 /* 0x0.d2a81d91f188b8000 */,
0.823992507918612782109 /* 0x0.d2f12c49a8d290005 */,
0.825108786960634610365 /* 0x0.d33a5457a35e40003 */,
0.826226578247117093869 /* 0x0.d38395c4a84848007 */,
0.827345883828319528258 /* 0x0.d3ccf09985d958004 */,
0.828466705754248966560 /* 0x0.d41664df0a1320005 */,
0.829589046080638992111 /* 0x0.d45ff29e094330000 */,
0.830712906863802391671 /* 0x0.d4a999df585a20005 */,
0.831838290163696481037 /* 0x0.d4f35aabd04a60006 */,
0.832965198041969556729 /* 0x0.d53d350c4be258002 */,
0.834093632565442222342 /* 0x0.d5872909aba050007 */,
0.835223595802037643865 /* 0x0.d5d136acd138e8006 */,
0.836355089820669306292 /* 0x0.d61b5dfe9f7780004 */,
0.837488116698010487424 /* 0x0.d6659f0801afa8005 */,
0.838622678508982644113 /* 0x0.d6aff9d1e147d8004 */,
0.839758777333464490056 /* 0x0.d6fa6e652d19e0000 */,
0.840896415254110962690 /* 0x0.d744fccad70d00003 */,
0.842035594355151628676 /* 0x0.d78fa50bd2c3b0000 */,
0.843176316724478125433 /* 0x0.d7da673117e730007 */,
0.844318584453106590905 /* 0x0.d8254343a19038003 */,
0.845462399634695271912 /* 0x0.d870394c6dbf30003 */,
0.846607764365415071965 /* 0x0.d8bb49547d37c0004 */,
0.847754680744707056494 /* 0x0.d9067364d45608003 */,
0.848903150873708822763 /* 0x0.d951b7867953b0006 */,
0.850053176859071113491 /* 0x0.d99d15c2787a30006 */,
0.851204760807439786431 /* 0x0.d9e88e21de11a0003 */,
0.852357904828824897169 /* 0x0.da3420adba1508003 */,
0.853512611037803181642 /* 0x0.da7fcd6f2184d8005 */,
0.854668881550406100980 /* 0x0.dacb946f2afaf8000 */,
0.855826718478671755185 /* 0x0.db1775b6e8ad48000 */,
0.856986123964844970247 /* 0x0.db63714f8e0818006 */,
0.858147100114499461478 /* 0x0.dbaf87422625b8000 */,
0.859309649060962410524 /* 0x0.dbfbb797daa460002 */,
0.860473772936213743282 /* 0x0.dc480259d3a710001 */,
0.861639473872910177676 /* 0x0.dc9467913a0f48006 */,
0.862806754008130227807 /* 0x0.dce0e7473b9b28003 */,
0.863975615481124226159 /* 0x0.dd2d8185086c20006 */,
0.865146060433749419813 /* 0x0.dd7a3653d38168005 */,
0.866318091005120138881 /* 0x0.ddc705bcccd628000 */,
0.867491709362415264210 /* 0x0.de13efc9434100004 */,
0.868666917636779056818 /* 0x0.de60f4825df9b8005 */,
0.869843717989716047624 /* 0x0.deae13f16599c0003 */,
0.871022112578215268471 /* 0x0.defb4e1f9dc388002 */,
0.872202103559697183859 /* 0x0.df48a3164a92f0001 */,
0.873383693097737778847 /* 0x0.df9612deb6e878007 */,
0.874566883362160263365 /* 0x0.dfe39d82348310001 */,
0.875751676517234511901 /* 0x0.e031430a0f0688000 */,
0.876938074732511840819 /* 0x0.e07f037f97e548001 */,
0.878126080186539592654 /* 0x0.e0ccdeec2a75e0006 */,
0.879315695055312818168 /* 0x0.e11ad5591f4078001 */,
0.880506921518618312932 /* 0x0.e168e6cfd2f880004 */,
0.881699761760385225541 /* 0x0.e1b71359a6df60003 */,
0.882894217964411143207 /* 0x0.e2055afffc1178000 */,
0.884090292325693805080 /* 0x0.e253bdcc3ffbb8001 */,
0.885287987031581180559 /* 0x0.e2a23bc7d7a1d8002 */,
0.886487304278189114386 /* 0x0.e2f0d4fc31ab80004 */,
0.887688246263368285778 /* 0x0.e33f8972bea8a8005 */,
0.888890815189881999840 /* 0x0.e38e5934f49010007 */,
0.890095013257492739835 /* 0x0.e3dd444c460bd0007 */,
0.891300842677948068626 /* 0x0.e42c4ac232f380000 */,
0.892508305659222567226 /* 0x0.e47b6ca036f8b8005 */,
0.893717404414979710310 /* 0x0.e4caa9efd40e58002 */,
0.894928141160697743242 /* 0x0.e51a02ba8e2610007 */,
0.896140518115016826430 /* 0x0.e5697709ecab90000 */,
0.897354537501434679237 /* 0x0.e5b906e77c61d0006 */,
0.898570201543732793877 /* 0x0.e608b25cca5ba8005 */,
0.899787512470129891014 /* 0x0.e6587973688ce8002 */,
0.901006472512270728537 /* 0x0.e6a85c34ecadb8000 */,
0.902227083902570559127 /* 0x0.e6f85aaaed4f20006 */,
0.903449348881299796343 /* 0x0.e74874df09a530003 */,
0.904673269686823378091 /* 0x0.e798aadadecba0007 */,
0.905898848559668845585 /* 0x0.e7e8fca80c3ee0001 */,
0.907126087750156795426 /* 0x0.e8396a503c3fe0005 */,
0.908354989505901100354 /* 0x0.e889f3dd1615b0002 */,
0.909585556079328783087 /* 0x0.e8da9958465228007 */,
0.910817789726044213523 /* 0x0.e92b5acb7d0578001 */,
0.912051692703457872481 /* 0x0.e97c38406c3c30003 */,
0.913287267274154990210 /* 0x0.e9cd31c0cbb370001 */,
0.914524515702244578108 /* 0x0.ea1e475654d540000 */,
0.915763440256158633982 /* 0x0.ea6f790ac5cc78001 */,
0.917004043205012497909 /* 0x0.eac0c6e7dd8448007 */,
0.918246326823137892807 /* 0x0.eb1230f760a428007 */,
0.919490293387826285200 /* 0x0.eb63b7431714a8007 */,
0.920735945178816406225 /* 0x0.ebb559d4cb6f30007 */,
0.921983284479243714322 /* 0x0.ec0718b64c0940002 */,
0.923232313574974705626 /* 0x0.ec58f3f16a3910002 */,
0.924483034755387955725 /* 0x0.ecaaeb8ffb3168005 */,
0.925735450311948926408 /* 0x0.ecfcff9bd67078000 */,
0.926989562542820610982 /* 0x0.ed4f301edad1a0007 */,
0.928245373740515189457 /* 0x0.eda17d22e0f9b0001 */,
0.929502886213858126045 /* 0x0.edf3e6b1d37d40001 */,
0.930762102264245716494 /* 0x0.ee466cd594c5c8005 */,
0.932023024199046146183 /* 0x0.ee990f980dcdb0005 */,
0.933285654329454095216 /* 0x0.eeebcf032bc470007 */,
0.934549994971191289044 /* 0x0.ef3eab20e0d3c0001 */,
0.935816048439005676599 /* 0x0.ef91a3fb1e1340004 */,
0.937083817055075818404 /* 0x0.efe4b99bdcc618006 */,
0.938353303143720007819 /* 0x0.f037ec0d1889b8000 */,
0.939624509028518128972 /* 0x0.f08b3b58cc2bb8006 */,
0.940897437041863904384 /* 0x0.f0dea788fc2a90000 */,
0.942172089516254085427 /* 0x0.f13230a7ad21b8003 */,
0.943448468787511540534 /* 0x0.f185d6bee754e0006 */,
0.944726577195256100890 /* 0x0.f1d999d8b73478005 */,
0.946006417082291717338 /* 0x0.f22d79ff2cb130000 */,
0.947287990793413858827 /* 0x0.f281773c59ec48007 */,
0.948571300678290207925 /* 0x0.f2d5919a566268001 */,
0.949856349088629370320 /* 0x0.f329c9233bceb0001 */,
0.951143138379053731954 /* 0x0.f37e1de1272068002 */,
0.952431670908847949364 /* 0x0.f3d28fde3a6728006 */,
0.953721949039916472305 /* 0x0.f4271f249a93f0001 */,
0.955013975135367898520 /* 0x0.f47bcbbe6deab0001 */,
0.956307751564417496418 /* 0x0.f4d095b5e16638004 */,
0.957603280698967163097 /* 0x0.f5257d1524f590006 */,
0.958900564911197350604 /* 0x0.f57a81e668d628000 */,
0.960199606581278120057 /* 0x0.f5cfa433e60e50007 */,
0.961500408088936442422 /* 0x0.f624e407d527a0007 */,
0.962802971817578789903 /* 0x0.f67a416c72b760006 */,
0.964107300155846558292 /* 0x0.f6cfbc6c011458004 */,
0.965413395493874504368 /* 0x0.f7255510c439a8002 */,
0.966721260225105960572 /* 0x0.f77b0b6503c5b8006 */,
0.968030896745834645873 /* 0x0.f7d0df730a7940005 */,
0.969342307458006424716 /* 0x0.f826d145294be8003 */,
0.970655494764855020231 /* 0x0.f87ce0e5b29fd8000 */,
0.971970461071268720958 /* 0x0.f8d30e5efaa8f0004 */,
0.973287208789983648852 /* 0x0.f92959bb5e3c08001 */,
0.974605740331924708124 /* 0x0.f97fc305383028004 */,
0.975926058115625383329 /* 0x0.f9d64a46ebb9f8004 */,
0.977248164559556209435 /* 0x0.fa2cef8adbfc68004 */,
0.978572062087848637573 /* 0x0.fa83b2db7253d0007 */,
0.979897753126343307191 /* 0x0.fada944319fda0005 */,
0.981225240104636631254 /* 0x0.fb3193cc425870002 */,
0.982554525455618277276 /* 0x0.fb88b1815e61d0003 */,
0.983885611617111077747 /* 0x0.fbdfed6ce683e0007 */,
0.985218501026348891812 /* 0x0.fc3747995282f8006 */,
0.986553196127724962867 /* 0x0.fc8ec0112202a0005 */,
0.987889699367056062238 /* 0x0.fce656ded63710002 */,
0.989228013193998778636 /* 0x0.fd3e0c0cf48d50005 */,
0.990568140061241164686 /* 0x0.fd95dfa605c7b0003 */,
0.991910082424819927754 /* 0x0.fdedd1b4965710004 */,
0.993253842749249660216 /* 0x0.fe45e2433bfea0000 */,
0.994599423484053835071 /* 0x0.fe9e115c7c05f0005 */,
0.995946827107488830167 /* 0x0.fef65f0afb4c28006 */,
0.997296056085008264529 /* 0x0.ff4ecb59509cc8001 */,
0.998647112892057764479 /* 0x0.ffa756521dbfd0007 */,
1.000000000000000000000 /* 0x1.00000000000000000 */,
1.001354719891689004659 /* 0x1.0058c86da14aa0005 */,
1.002711275050312211844 /* 0x1.00b1afa5abead0003 */,
1.004069667960743483835 /* 0x1.010ab5b2cc0660009 */,
1.005429901112333324093 /* 0x1.0163da9fb2af30008 */,
1.006791976999887428009 /* 0x1.01bd1e7716f6a0008 */,
1.008155898118476168101 /* 0x1.02168143b03890006 */,
1.009521666967782227439 /* 0x1.027003103ae320002 */,
1.010889286051850133326 /* 0x1.02c9a3e7783030002 */,
1.012258757875921233497 /* 0x1.032363d42aaa8000e */,
1.013630084952214405194 /* 0x1.037d42e11c88d0000 */,
1.015003269791313389451 /* 0x1.03d741191635a0001 */,
1.016378314911229763267 /* 0x1.04315e86e84630008 */,
1.017755222831652872635 /* 0x1.048b9b35652800002 */,
1.019133996077934645224 /* 0x1.04e5f72f65827000b */,
1.020514637175266248212 /* 0x1.0540727fc1cfa0006 */,
1.021897148653734488385 /* 0x1.059b0d3157ebb0002 */,
1.023281533050062419584 /* 0x1.05f5c74f0cfeb0002 */,
1.024667792897328677539 /* 0x1.0650a0e3c22ee0003 */,
1.026055930738840826806 /* 0x1.06ab99fa63e1b0008 */,
1.027445949118511947550 /* 0x1.0706b29ddf2700009 */,
1.028837850584049418178 /* 0x1.0761ead9253ab0009 */,
1.030231637685799839262 /* 0x1.07bd42b72a3f80008 */,
1.031627312979383592802 /* 0x1.0818ba42e824a000c */,
1.033024879021186448496 /* 0x1.0874518759b0b0008 */,
1.034424338374263729911 /* 0x1.08d0088f80ffa0006 */,
1.035825693601787333992 /* 0x1.092bdf66604e30005 */,
1.037228947273990842283 /* 0x1.0987d617019cd000a */,
1.038634101961269928846 /* 0x1.09e3ecac6f199000f */,
1.040041160239590700707 /* 0x1.0a402331b91270002 */,
1.041450124688240164200 /* 0x1.0a9c79b1f37c3000b */,
1.042860997889083929381 /* 0x1.0af8f038352160000 */,
1.044273782427270314011 /* 0x1.0b5586cf986890006 */,
1.045688480893644856116 /* 0x1.0bb23d833dfbf0006 */,
1.047105095879385272564 /* 0x1.0c0f145e46e330007 */,
1.048523629981608529302 /* 0x1.0c6c0b6bdaadc000f */,
1.049944085800634585634 /* 0x1.0cc922b72470a000f */,
1.051366465939483019223 /* 0x1.0d265a4b5238b0007 */,
1.052790773004648849929 /* 0x1.0d83b23395e510002 */,
1.054217009607077093512 /* 0x1.0de12a7b263970006 */,
1.055645178360430591625 /* 0x1.0e3ec32d3cf680000 */,
1.057075281882416506511 /* 0x1.0e9c7c55184f5000e */,
1.058507322794714378170 /* 0x1.0efa55fdfad51000a */,
1.059941303721639416236 /* 0x1.0f58503329fed0003 */,
1.061377227289284297385 /* 0x1.0fb66affed37f0000 */,
1.062815096132297298980 /* 0x1.1014a66f95540000c */,
1.064254912884593951029 /* 0x1.1073028d725850007 */,
1.065696680185205469411 /* 0x1.10d17f64d9ea2000b */,
1.067140400676658718053 /* 0x1.11301d012586a0007 */,
1.068586077004890055886 /* 0x1.118edb6db26ab0003 */,
1.070033711820396415998 /* 0x1.11edbab5e2d6e000b */,
1.071483307775789262099 /* 0x1.124cbae51b5ef0001 */,
1.072934867526001312439 /* 0x1.12abdc06c3240000c */,
1.074388393734249103080 /* 0x1.130b1e264a62e0005 */,
1.075843889063253344684 /* 0x1.136a814f20ccd0003 */,
1.077301356179926061823 /* 0x1.13ca058cbaaed000b */,
1.078760797756675327056 /* 0x1.1429aaea9260e000e */,
1.080222216468626150775 /* 0x1.148971742537c0009 */,
1.081685614993597610617 /* 0x1.14e95934f37e8000b */,
1.083150996013011013776 /* 0x1.1549623881762000d */,
1.084618362213087383633 /* 0x1.15a98c8a58a6a000b */,
1.086087716284427351384 /* 0x1.1609d8360768c0008 */,
1.087559060917626885283 /* 0x1.166a45471c13f0008 */,
1.089032398810997337465 /* 0x1.16cad3c92d7b50009 */,
1.090507732647478578212 /* 0x1.172b83c7c18b5000f */,
1.091985065182095926460 /* 0x1.178c554ead72a000c */,
1.093464399073070136880 /* 0x1.17ed48695befe000c */,
1.094945737045367906172 /* 0x1.184e5d23812500007 */,
1.096429081816546080591 /* 0x1.18af9388c90e40005 */,
1.097914436104650892651 /* 0x1.1910eba4e031a0001 */,
1.099401802629782043408 /* 0x1.19726583755720003 */,
1.100891184121537858001 /* 0x1.19d4013041b860007 */,
1.102382583308144647940 /* 0x1.1a35beb6fd0cd0007 */,
1.103876002922312915544 /* 0x1.1a979e2363fa10000 */,
1.105371445702084232160 /* 0x1.1af99f8139025000e */,
1.106868914387219016199 /* 0x1.1b5bc2dc408b9000e */,
1.108368411723785085252 /* 0x1.1bbe084045eb30002 */,
1.109869940458469095340 /* 0x1.1c206fb91524c000e */,
1.111373503344554869449 /* 0x1.1c82f952817cc0001 */,
1.112879103137133007859 /* 0x1.1ce5a51860344000f */,
1.114386742595953938610 /* 0x1.1d4873168babf000e */,
1.115896424484008608911 /* 0x1.1dab6358e1d4a000f */,
1.117408151567338414664 /* 0x1.1e0e75eb43f9c000c */,
1.118921926613465345265 /* 0x1.1e71aad995078000f */,
1.120437752409564780022 /* 0x1.1ed5022fcd8600003 */,
1.121955631720569668277 /* 0x1.1f387bf9cd88b0000 */,
1.123475567332998359439 /* 0x1.1f9c18438cdec000a */,
1.124997562033035469759 /* 0x1.1fffd71902f970002 */,
1.126521618608448571713 /* 0x1.2063b88629079000e */,
1.128047739853580200284 /* 0x1.20c7bc96ff72a0002 */,
1.129575928566289189112 /* 0x1.212be3578a81e0006 */,
1.131106187546149888259 /* 0x1.21902cd3d05f70007 */,
1.132638519598779369743 /* 0x1.21f49917ddda5000c */,
1.134172927531616359481 /* 0x1.2259282fc1c24000e */,
1.135709414157753949251 /* 0x1.22bdda27911e90007 */,
1.137247982292643566662 /* 0x1.2322af0b638e60007 */,
1.138788634756517259562 /* 0x1.2387a6e755f270000 */,
1.140331374372893558110 /* 0x1.23ecc1c788c890006 */,
1.141876203969685699176 /* 0x1.2451ffb821639000c */,
1.143423126377846266197 /* 0x1.24b760c5486dc0009 */,
1.144972144431494420774 /* 0x1.251ce4fb2a0cc0005 */,
1.146523260971646252006 /* 0x1.25828c65f9fb8000d */,
1.148076478839068270690 /* 0x1.25e85711ebaeb0000 */,
1.149631800883562204903 /* 0x1.264e450b3c8a30008 */,
1.151189229953253789786 /* 0x1.26b4565e281a20003 */,
1.152748768902654319399 /* 0x1.271a8b16f0f000002 */,
1.154310420590433317050 /* 0x1.2780e341de2fc0001 */,
1.155874187878668246681 /* 0x1.27e75eeb3abc90007 */,
1.157440073633736243899 /* 0x1.284dfe1f5633e000a */,
1.159008080725518974322 /* 0x1.28b4c0ea840d90001 */,
1.160578212048386514965 /* 0x1.291ba75932ae60000 */,
1.162150470417516290340 /* 0x1.2982b177796850008 */,
1.163724858777502646494 /* 0x1.29e9df51fdd900001 */,
1.165301379991388053320 /* 0x1.2a5130f50bf34000e */,
1.166880036952526289469 /* 0x1.2ab8a66d10fdc0008 */,
1.168460832550151540268 /* 0x1.2b203fc675b7a000a */,
1.170043769683112966389 /* 0x1.2b87fd0dad7260008 */,
1.171628851252754177681 /* 0x1.2befde4f2e3da000d */,
1.173216080163546060084 /* 0x1.2c57e397719940002 */,
1.174805459325657830448 /* 0x1.2cc00cf2f7491000c */,
1.176396991650083379037 /* 0x1.2d285a6e3ff90000b */,
1.177990680055698513602 /* 0x1.2d90cc15d4ff90005 */,
1.179586527463262646306 /* 0x1.2df961f641c57000c */,
1.181184536796979545103 /* 0x1.2e621c1c157cd000d */,
1.182784710984701836994 /* 0x1.2ecafa93e35af0004 */,
1.184387052960675701386 /* 0x1.2f33fd6a459cb0000 */,
1.185991565661414393112 /* 0x1.2f9d24abd8fd1000e */,
1.187598252026902612178 /* 0x1.300670653e083000a */,
1.189207115003001469262 /* 0x1.306fe0a31bc040008 */,
1.190818157535919796833 /* 0x1.30d9757219895000e */,
1.192431382587621380206 /* 0x1.31432edef01a1000f */,
1.194046793097208292195 /* 0x1.31ad0cf63f0630008 */,
1.195664392040319823392 /* 0x1.32170fc4ce0db000c */,
1.197284182375793593084 /* 0x1.32813757527750005 */,
1.198906167074650808198 /* 0x1.32eb83ba8eef3000f */,
1.200530349107333139048 /* 0x1.3355f4fb457e5000d */,
1.202156731453099647353 /* 0x1.33c08b2641df9000c */,
1.203785317090505513368 /* 0x1.342b46484f07b0005 */,
1.205416109005122526928 /* 0x1.3496266e3fa270005 */,
1.207049110184904572310 /* 0x1.35012ba4e8fa10000 */,
1.208684323627194912036 /* 0x1.356c55f92aabb0004 */,
1.210321752322854882437 /* 0x1.35d7a577dd33f0004 */,
1.211961399276747286580 /* 0x1.36431a2de8748000d */,
1.213603267492579629347 /* 0x1.36aeb4283309e000c */,
1.215247359985374142610 /* 0x1.371a7373b00160000 */,
1.216893679753690671322 /* 0x1.3786581d404e90000 */,
1.218542229828181611183 /* 0x1.37f26231e82e4000c */,
1.220193013225231215567 /* 0x1.385e91be9c2d20002 */,
1.221846032973555429280 /* 0x1.38cae6d05e66f0000 */,
1.223501292099485437962 /* 0x1.393761742e5830001 */,
1.225158793636904830441 /* 0x1.39a401b713cb3000e */,
1.226818540625497444577 /* 0x1.3a10c7a61ceae0007 */,
1.228480536107136034131 /* 0x1.3a7db34e5a4a50003 */,
1.230144783126481566885 /* 0x1.3aeac4bcdf8d60001 */,
1.231811284734168454619 /* 0x1.3b57fbfec6e950008 */,
1.233480043984379381835 /* 0x1.3bc559212e7a2000f */,
1.235151063936380300149 /* 0x1.3c32dc3139f2a0004 */,
1.236824347652524913647 /* 0x1.3ca0853c106ac000e */,
1.238499898199571624970 /* 0x1.3d0e544eddd240003 */,
1.240177718649636107175 /* 0x1.3d7c4976d3fcd0000 */,
1.241857812073360767273 /* 0x1.3dea64c1231f70004 */,
1.243540181554270152039 /* 0x1.3e58a63b099920005 */,
1.245224830175077013244 /* 0x1.3ec70df1c4e46000e */,
1.246911761022835740725 /* 0x1.3f359bf29741c000e */,
1.248600977188942806639 /* 0x1.3fa4504ac7b800009 */,
1.250292481770148400634 /* 0x1.40132b07a330d000a */,
1.251986277866492969263 /* 0x1.40822c367a340000b */,
1.253682368581898742876 /* 0x1.40f153e4a18e0000d */,
1.255380757024939564249 /* 0x1.4160a21f73289000d */,
1.257081446308726757662 /* 0x1.41d016f44deaa000c */,
1.258784439550028944083 /* 0x1.423fb27094c090008 */,
1.260489739869405489991 /* 0x1.42af74a1aec1c0006 */,
1.262197350394008266193 /* 0x1.431f5d950a453000c */,
1.263907274252603851764 /* 0x1.438f6d58176860004 */,
1.265619514578811388761 /* 0x1.43ffa3f84b9eb000d */,
1.267334074511444086425 /* 0x1.44700183221180008 */,
1.269050957191869555296 /* 0x1.44e0860618b930006 */,
1.270770165768063009230 /* 0x1.4551318eb4d20000e */,
1.272491703389059036805 /* 0x1.45c2042a7cc26000b */,
1.274215573211836316547 /* 0x1.4632fde6ffacd000d */,
1.275941778396075143580 /* 0x1.46a41ed1cfac40001 */,
1.277670322103555911043 /* 0x1.471566f8812ac0000 */,
1.279401207505722393185 /* 0x1.4786d668b33260005 */,
1.281134437771823675369 /* 0x1.47f86d3002637000a */,
1.282870016078732078362 /* 0x1.486a2b5c13c00000e */,
1.284607945607987078432 /* 0x1.48dc10fa916bd0004 */,
1.286348229545787758022 /* 0x1.494e1e192aaa30007 */,
1.288090871080605159846 /* 0x1.49c052c5913df000c */,
1.289835873406902644341 /* 0x1.4a32af0d7d8090002 */,
1.291583239722392528754 /* 0x1.4aa532feab5e10002 */,
1.293332973229098792374 /* 0x1.4b17dea6db8010008 */,
1.295085077135345708087 /* 0x1.4b8ab213d57d9000d */,
1.296839554650994097442 /* 0x1.4bfdad53629e10003 */,
1.298596408992440220988 /* 0x1.4c70d0735358a000d */,
1.300355643380135983739 /* 0x1.4ce41b817c99e0001 */,
1.302117261036232376282 /* 0x1.4d578e8bb52cb0003 */,
1.303881265192249561154 /* 0x1.4dcb299fde2920008 */,
1.305647659079073541490 /* 0x1.4e3eeccbd7f4c0003 */,
1.307416445934474813521 /* 0x1.4eb2d81d8a86f000b */,
1.309187629001237640529 /* 0x1.4f26eba2e35a5000e */,
1.310961211525240921493 /* 0x1.4f9b2769d35090009 */,
1.312737196755087820678 /* 0x1.500f8b804e4a30000 */,
1.314515587949291131086 /* 0x1.508417f4530d00009 */,
1.316296388365203462468 /* 0x1.50f8ccd3df1840003 */,
1.318079601265708777911 /* 0x1.516daa2cf60020002 */,
1.319865229921343141607 /* 0x1.51e2b00da3c2b0007 */,
1.321653277603506371251 /* 0x1.5257de83f5512000d */,
1.323443747588034513690 /* 0x1.52cd359dfc7d5000e */,
1.325236643161341820781 /* 0x1.5342b569d6baa000f */,
1.327031967602244177939 /* 0x1.53b85df59921b0000 */,
1.328829724206201046165 /* 0x1.542e2f4f6b17e0006 */,
1.330629916266568235675 /* 0x1.54a4298571b27000e */,
1.332432547083447937938 /* 0x1.551a4ca5d97190009 */,
1.334237619959296017340 /* 0x1.559098bed16bf0008 */,
1.336045138203900251029 /* 0x1.56070dde90c800000 */,
1.337855105129210686631 /* 0x1.567dac13510cd0009 */,
1.339667524053662184301 /* 0x1.56f4736b52e2c000c */,
1.341482398296830025383 /* 0x1.576b63f4d8333000f */,
1.343299731186792467254 /* 0x1.57e27dbe2c40e0003 */,
1.345119526053918823702 /* 0x1.5859c0d59cd37000f */,
1.346941786233264881662 /* 0x1.58d12d497cd9a0005 */,
1.348766515064854010261 /* 0x1.5948c32824b87000c */,
1.350593715891792223641 /* 0x1.59c0827ff03890007 */,
1.352423392064920459908 /* 0x1.5a386b5f43a3e0006 */,
1.354255546937278120764 /* 0x1.5ab07dd485af1000c */,
1.356090183865519494030 /* 0x1.5b28b9ee21085000f */,
1.357927306213322804534 /* 0x1.5ba11fba8816e000b */,
1.359766917346459269620 /* 0x1.5c19af482f8f2000f */,
1.361609020638567812980 /* 0x1.5c9268a594cc00004 */,
1.363453619463660171403 /* 0x1.5d0b4be135916000c */,
1.365300717204201985683 /* 0x1.5d84590998eeb0005 */,
1.367150317245710233754 /* 0x1.5dfd902d494e40001 */,
1.369002422974674892971 /* 0x1.5e76f15ad22c40008 */,
1.370857037789471544224 /* 0x1.5ef07ca0cc166000b */,
1.372714165088220639199 /* 0x1.5f6a320dcf5280006 */,
1.374573808273481745378 /* 0x1.5fe411b0790800009 */,
1.376435970755022220096 /* 0x1.605e1b976e4b1000e */,
1.378300655944092456600 /* 0x1.60d84fd155d15000e */,
1.380167867259843417228 /* 0x1.6152ae6cdf0030003 */,
1.382037608124419003675 /* 0x1.61cd3778bc879000d */,
1.383909881963391264069 /* 0x1.6247eb03a4dc40009 */,
1.385784692209972801544 /* 0x1.62c2c91c56d9b0002 */,
1.387662042298923203992 /* 0x1.633dd1d1930ec0001 */,
1.389541935670444372533 /* 0x1.63b90532200630004 */,
1.391424375772021271329 /* 0x1.6434634ccc4cc0007 */,
1.393309366052102982208 /* 0x1.64afec30677e90008 */,
1.395196909966106124701 /* 0x1.652b9febc8e0f000d */,
1.397087010973788290271 /* 0x1.65a77e8dcc7f10004 */,
1.398979672539331309267 /* 0x1.66238825534170000 */,
1.400874898129892187656 /* 0x1.669fbcc1415600008 */,
1.402772691220124823310 /* 0x1.671c1c708328e000a */,
1.404673055288671035301 /* 0x1.6798a7420988b000d */,
1.406575993818903302975 /* 0x1.68155d44ca77a000f */,
1.408481510297352468121 /* 0x1.68923e87bf70e000a */,
1.410389608216942924956 /* 0x1.690f4b19e8f74000c */,
1.412300291075172076232 /* 0x1.698c830a4c94c0008 */
};
#define S (1.0/4503599627370496.0) /* 2^-52 */
static const float exp2_deltatable[512] = {
11527*S, -963*S, 884*S, -781*S, -2363*S, -3441*S, 123*S, 526*S,
-6*S, 1254*S, -1138*S, 1519*S, 1576*S, -65*S, 1040*S, 793*S,
-1662*S, -5063*S, -387*S, 968*S, -941*S, 984*S, -2856*S, -545*S,
495*S, -5246*S, -2109*S, 1281*S, 2075*S, 909*S, -1642*S,-78233*S,
-31653*S, -265*S, 130*S, 430*S, 2482*S, -742*S, 1616*S, -2213*S,
-519*S, 20*S, -3134*S,-13981*S, 1343*S, -1740*S, 247*S, 1679*S,
-1097*S, 3131*S, 871*S, -1480*S, 1936*S, -1827*S, 17325*S, 528*S,
-322*S, 1404*S, -152*S, -1845*S, -212*S, 2639*S, -476*S, 2960*S,
-962*S, -1012*S, -1231*S, 3030*S, 1659*S, -486*S, 2154*S, 1728*S,
-2793*S, 699*S, -1560*S, -2125*S, 2156*S, 142*S, -1888*S, 4426*S,
-13443*S, 1970*S, -50*S, 1771*S,-43399*S, 4979*S, -2448*S, -370*S,
1414*S, 1075*S, 232*S, 206*S, 873*S, 2141*S, 2970*S, 1279*S,
-2331*S, 336*S, -2595*S, 753*S, -3384*S, -616*S, 89*S, -818*S,
5755*S, -241*S, -528*S, -661*S, -3777*S, -354*S, 250*S, 3881*S,
2632*S, -2131*S, 2565*S, -316*S, 1746*S, -2541*S, -1324*S, -50*S,
2564*S, -782*S, 1176*S, 6452*S, -1002*S, 1288*S, 336*S, -185*S,
3063*S, 3784*S, 2169*S, 686*S, 328*S, -400*S, 312*S, -4517*S,
-1457*S, 1046*S, -1530*S, -685*S, 1328*S,-49815*S, -895*S, 1063*S,
-2091*S, -672*S, -1710*S, -665*S, 1545*S, 1819*S,-45265*S, 3548*S,
-554*S, -568*S, 4752*S, -1907*S,-13738*S, 675*S, 9611*S, -1115*S,
-815*S, 408*S, -1281*S, -937*S,-16376*S, -4772*S, -1440*S, 992*S,
788*S, 10364*S, -1602*S, -661*S, -1783*S, -265*S, -20*S, -3781*S,
-861*S, -345*S, -994*S, 1364*S, -5339*S, 1620*S, 9390*S, -1066*S,
-305*S, -170*S, 175*S, 2461*S, -490*S, -769*S, -1450*S, 3315*S,
2418*S, -45*S, -852*S, -1295*S, -488*S, -96*S, 1142*S, -2639*S,
7905*S, -9306*S, -3859*S, 760*S, 1057*S, -1570*S, 3977*S, 209*S,
-514*S, 7151*S, 1646*S, 627*S, 599*S, -774*S, -1468*S, 633*S,
-473*S, 851*S, 2406*S, 143*S, 74*S, 4260*S, 1177*S, -913*S,
2670*S, -3298*S, -1662*S, -120*S, -3264*S, -2148*S, 410*S, 2078*S,
-2098*S, -926*S, 3580*S, -1289*S, 2450*S, -1158*S, 907*S, -590*S,
986*S, 1801*S, 1145*S, -1677*S, 3455*S, 956*S, 710*S, 144*S,
153*S, -255*S, -1898*S, 28102*S, 2748*S, 1194*S, -3009*S, 7076*S,
0*S, -2720*S, 711*S, 1225*S, -3034*S, -473*S, 378*S, -1046*S,
962*S, -2006*S, 4647*S, 3206*S, 1769*S, -2665*S, 1254*S, 2025*S,
-2430*S, 6193*S, 1224*S, -856*S, -1592*S, -325*S, -1521*S, 1827*S,
-264*S, 2403*S, -1065*S, 967*S, -681*S, -2106*S, -474*S, 1333*S,
-893*S, 2296*S, 592*S, -1220*S, -326*S, 990*S, 139*S, 206*S,
-779*S, -1683*S, 1238*S, 6098*S, 136*S, 1197*S, 790*S, -107*S,
-1004*S, -2449*S, 939*S, 5568*S, 156*S, 1812*S, 2792*S, -1094*S,
-2677*S, -251*S, 2297*S, 943*S, -1329*S, 2883*S, -853*S, -2626*S,
-105929*S, -6552*S, 1095*S, -1508*S, 1003*S, 5039*S, -2600*S, -749*S,
1790*S, 890*S, 2016*S, -1073*S, 624*S, -2084*S, -1536*S, -1330*S,
358*S, 2444*S, -179*S,-25759*S, -243*S, -552*S, -124*S, 3766*S,
1192*S, -1614*S, 6*S, -1227*S, 345*S, -981*S, -295*S, -1006*S,
-995*S, -1195*S, 706*S, 2512*S, -1758*S, -734*S, -6286*S, -922*S,
1530*S, 1542*S, 1223*S, 61*S, -83*S, 522*S,116937*S, -914*S,
-418*S, -7339*S, 249*S, -520*S, -762*S, 426*S, -505*S, 2664*S,
-1093*S, -1035*S, 2130*S, 4878*S, 1982*S, 1551*S, 2304*S, 193*S,
1532*S, -7268*S, 24357*S, 531*S, 2676*S, -1170*S, 1465*S, -1917*S,
2143*S, 1466*S, -7*S, -7300*S, 3297*S, -1197*S, -289*S, -1548*S,
26226*S, 4401*S, 4123*S, -1588*S, 4243*S, 4069*S, -1276*S, -2010*S,
1407*S, 1478*S, 488*S, -2366*S, -2909*S, -2534*S, -1285*S, 7095*S,
-645*S, -2089*S, -944*S, -40*S, -1363*S, -833*S, 917*S, 1609*S,
1286*S, 1677*S, 1613*S, -2295*S, -1248*S, 40*S, 26*S, 2038*S,
698*S, 2675*S, -1755*S, -3522*S, -1614*S, -6111*S, 270*S, 1822*S,
-234*S, -2844*S, -1201*S, -830*S, 1193*S, 2354*S, 47*S, 1522*S,
-78*S, -640*S, 2425*S, -1596*S, 1563*S, 1169*S, -1006*S, -83*S,
2362*S, -3521*S, -314*S, 1814*S, -1751*S, 305*S, 1715*S, -3741*S,
7847*S, 1291*S, 1206*S, 36*S, 1397*S, -1419*S, -1194*S, -2014*S,
1742*S, -578*S, -207*S, 875*S, 1539*S, 2826*S, -1165*S, -909*S,
1849*S, 927*S, 2018*S, -981*S, 1637*S, -463*S, 905*S, 6618*S,
400*S, 630*S, 2614*S, 900*S, 2323*S, -1094*S, -1858*S, -212*S,
-2069*S, 747*S, 1845*S, -1450*S, 444*S, -213*S, -438*S, 1158*S,
4738*S, 2497*S, -370*S, -2016*S, -518*S, -1160*S, -1510*S, 123*S
};
/* Maximum magnitude in above table: 116937 */
#undef S

View File

@ -0,0 +1,301 @@
/* These values are accurate to 23+9 bits when represented as
a float. */
static const float exp2_accuratetable[256] = {
0.70711034541 /* 0x0.b5052f003 */,
0.70903021104 /* 0x0.b58301004 */,
0.71092861900 /* 0x0.b5ff6b006 */,
0.71286851176 /* 0x0.b67e8d006 */,
0.71481245762 /* 0x0.b6fdf3004 */,
0.71673321725 /* 0x0.b77bd4001 */,
0.71868461379 /* 0x0.b7fbb7006 */,
0.72064983853 /* 0x0.b87c82006 */,
0.72258073096 /* 0x0.b8fb0d003 */,
0.72456008199 /* 0x0.b97cc5002 */,
0.72652846578 /* 0x0.b9fdc5002 */,
0.72848570353 /* 0x0.ba7e0a004 */,
0.73046034578 /* 0x0.baff73003 */,
0.73244112730 /* 0x0.bb8143000 */,
0.73443359139 /* 0x0.bc03d7002 */,
0.73646944762 /* 0x0.bc8943000 */,
0.73839598903 /* 0x0.bd0785006 */,
0.74041211608 /* 0x0.bd8ba6002 */,
0.74243509775 /* 0x0.be103a004 */,
0.74444299943 /* 0x0.be93d1004 */,
0.74646854405 /* 0x0.bf1890003 */,
0.74849390993 /* 0x0.bf9d4c006 */,
0.75051373248 /* 0x0.c021ab003 */,
0.75252974037 /* 0x0.c0a5ca002 */,
0.75460278996 /* 0x0.c12da6006 */,
0.75663453342 /* 0x0.c1b2cd001 */,
0.75867807874 /* 0x0.c238ba006 */,
0.76072299481 /* 0x0.c2bebe000 */,
0.76271909478 /* 0x0.c3418f002 */,
0.76482868204 /* 0x0.c3cbd0006 */,
0.76694220311 /* 0x0.c45653004 */,
0.76902121311 /* 0x0.c4de93003 */,
0.77110719688 /* 0x0.c56748005 */,
0.77314376835 /* 0x0.c5ecc0003 */,
0.77531152970 /* 0x0.c67ad1004 */,
0.77739948042 /* 0x0.c703a7005 */,
0.77948719274 /* 0x0.c78c79007 */,
0.78161448246 /* 0x0.c817e3004 */,
0.78381162885 /* 0x0.c8a7e1002 */,
0.78587090971 /* 0x0.c92ed6001 */,
0.78799921275 /* 0x0.c9ba51001 */,
0.79011362800 /* 0x0.ca44e3006 */,
0.79225623615 /* 0x0.cad14e005 */,
0.79441082487 /* 0x0.cb5e82006 */,
0.79654645924 /* 0x0.cbea78003 */,
0.79873132707 /* 0x0.cc79a8001 */,
0.80093026168 /* 0x0.cd09c4005 */,
0.80304825308 /* 0x0.cd9492001 */,
0.80526113516 /* 0x0.ce2598004 */,
0.80742740634 /* 0x0.ceb390002 */,
0.80963188410 /* 0x0.cf4409000 */,
0.81180763254 /* 0x0.cfd2a0006 */,
0.81401169308 /* 0x0.d06312005 */,
0.81622666121 /* 0x0.d0f43b000 */,
0.81843453653 /* 0x0.d184ed005 */,
0.82070738078 /* 0x0.d219e1001 */,
0.82289630179 /* 0x0.d2a955003 */,
0.82509487868 /* 0x0.d3396b000 */,
0.82737630616 /* 0x0.d3ceef007 */,
0.82961845408 /* 0x0.d461e0007 */,
0.83179849386 /* 0x0.d4f0bf000 */,
0.83408612023 /* 0x0.d586ab007 */,
0.83636939536 /* 0x0.d61c4e007 */,
0.83862531186 /* 0x0.d6b026000 */,
0.84094470740 /* 0x0.d74827000 */,
0.84316509971 /* 0x0.d7d9ab006 */,
0.84546715027 /* 0x0.d87089004 */,
0.84781247378 /* 0x0.d90a3d000 */,
0.85004067431 /* 0x0.d99c44007 */,
0.85237431530 /* 0x0.da3534003 */,
0.85468208790 /* 0x0.dacc72000 */,
0.85696077349 /* 0x0.db61c8002 */,
0.85931611062 /* 0x0.dbfc24000 */,
0.86171466122 /* 0x0.dc9955007 */,
0.86397939929 /* 0x0.dd2dc1006 */,
0.86633706098 /* 0x0.ddc844004 */,
0.86868536481 /* 0x0.de622a006 */,
0.87101131681 /* 0x0.defa99002 */,
0.87337517739 /* 0x0.df9584000 */,
0.87576484682 /* 0x0.e03220001 */,
0.87814646969 /* 0x0.e0ce35007 */,
0.88050335648 /* 0x0.e168ab002 */,
0.88291734457 /* 0x0.e206df000 */,
0.88522624975 /* 0x0.e29e30004 */,
0.88768237833 /* 0x0.e33f27003 */,
0.89007008077 /* 0x0.e3dba2001 */,
0.89250904327 /* 0x0.e47b79004 */,
0.89490824949 /* 0x0.e518b5007 */,
0.89735335113 /* 0x0.e5b8f3001 */,
0.89977204799 /* 0x0.e65776000 */,
0.90221023561 /* 0x0.e6f740001 */,
0.90468037137 /* 0x0.e79922006 */,
0.90711551909 /* 0x0.e838b9003 */,
0.90958660844 /* 0x0.e8daab002 */,
0.91205561170 /* 0x0.e97c7a006 */,
0.91451990614 /* 0x0.ea1dfa006 */,
0.91699457179 /* 0x0.eac028007 */,
0.91948717833 /* 0x0.eb6383000 */,
0.92201787240 /* 0x0.ec095d004 */,
0.92446959027 /* 0x0.ecaa0a006 */,
0.92700457577 /* 0x0.ed502c003 */,
0.92946064473 /* 0x0.edf122000 */,
0.93202102187 /* 0x0.ee98ee001 */,
0.93454003345 /* 0x0.ef3e04007 */,
0.93707615143 /* 0x0.efe439004 */,
0.93964391957 /* 0x0.f08c81007 */,
0.94217014323 /* 0x0.f13210007 */,
0.94470518835 /* 0x0.f1d833005 */,
0.94727593667 /* 0x0.f280ad004 */,
0.94985383753 /* 0x0.f3299f002 */,
0.95245110992 /* 0x0.f3d3d6002 */,
0.95500063903 /* 0x0.f47aec004 */,
0.95758175857 /* 0x0.f52414004 */,
0.96018302447 /* 0x0.f5ce8e004 */,
0.96279788024 /* 0x0.f679ec005 */,
0.96541762355 /* 0x0.f7259c002 */,
0.96803289660 /* 0x0.f7d101005 */,
0.97066921004 /* 0x0.f87dc7006 */,
0.97328519823 /* 0x0.f92938001 */,
0.97589331867 /* 0x0.f9d425001 */,
0.97858297827 /* 0x0.fa846a001 */,
0.98121380814 /* 0x0.fb30d4005 */,
0.98389244083 /* 0x0.fbe060002 */,
0.98657202723 /* 0x0.fc8ffc001 */,
0.98919564488 /* 0x0.fd3bed001 */,
0.99194401506 /* 0x0.fdf00b002 */,
0.99460238224 /* 0x0.fe9e43004 */,
0.99728542574 /* 0x0.ff4e19005 */,
1.00000000000 /* 0x1.000000000 */,
1.00271666054 /* 0x1.00b20a003 */,
1.00544095058 /* 0x1.01649400c */,
1.00819313547 /* 0x1.0218f200e */,
1.01089513312 /* 0x1.02ca06007 */,
1.01363527782 /* 0x1.037d9a005 */,
1.01635849497 /* 0x1.04301200e */,
1.01918780808 /* 0x1.04e97e003 */,
1.02182090297 /* 0x1.05960e00a */,
1.02468311789 /* 0x1.0651a2002 */,
1.02744102491 /* 0x1.070660009 */,
1.03019988541 /* 0x1.07bb2e002 */,
1.03300857552 /* 0x1.087340005 */,
1.03580951708 /* 0x1.092ad000b */,
1.03865504271 /* 0x1.09e54c004 */,
1.04145348082 /* 0x1.0a9cb2007 */,
1.04426109801 /* 0x1.0b54b2007 */,
1.04706287389 /* 0x1.0c0c50003 */,
1.04996109020 /* 0x1.0cca40007 */,
1.05282557024 /* 0x1.0d85fa009 */,
1.05564439314 /* 0x1.0e3eb600c */,
1.05850863475 /* 0x1.0efa6c00c */,
1.06137108805 /* 0x1.0fb604001 */,
1.06423723713 /* 0x1.1071da00a */,
1.06716394429 /* 0x1.1131a8003 */,
1.07004547127 /* 0x1.11ee80005 */,
1.07294559497 /* 0x1.12ac9000c */,
1.07586789139 /* 0x1.136c14005 */,
1.07873940478 /* 0x1.142844007 */,
1.08172726651 /* 0x1.14ec1400e */,
1.08459246171 /* 0x1.15a7da008 */,
1.08752059939 /* 0x1.1667c0001 */,
1.09050178536 /* 0x1.172b20005 */,
1.09349620361 /* 0x1.17ef5e00d */,
1.09634935875 /* 0x1.18aa5a00d */,
1.09940552720 /* 0x1.1972a4006 */,
1.10237383858 /* 0x1.1a352c00a */,
1.10530221471 /* 0x1.1af516006 */,
1.10838031771 /* 0x1.1bbed0001 */,
1.11137616648 /* 0x1.1c8326009 */,
1.11441528816 /* 0x1.1d4a5200d */,
1.11741960066 /* 0x1.1e0f3600c */,
1.12044525152 /* 0x1.1ed580003 */,
1.12346303485 /* 0x1.1f9b4600f */,
1.12655401230 /* 0x1.2065d8000 */,
1.12955987463 /* 0x1.212ad6007 */,
1.13263440148 /* 0x1.21f45400b */,
1.13567769541 /* 0x1.22bbc6009 */,
1.13877141483 /* 0x1.238686005 */,
1.14189016826 /* 0x1.2452ea004 */,
1.14495265504 /* 0x1.251b9e00e */,
1.14807951452 /* 0x1.25e88a001 */,
1.15118837366 /* 0x1.26b448006 */,
1.15428590795 /* 0x1.277f4800e */,
1.15744590761 /* 0x1.284e60001 */,
1.16055941596 /* 0x1.291a6c00a */,
1.16371822369 /* 0x1.29e970008 */,
1.16683173193 /* 0x1.2ab57c009 */,
1.17002511035 /* 0x1.2b86c4007 */,
1.17321026344 /* 0x1.2c578200d */,
1.17639815811 /* 0x1.2d286e002 */,
1.17961537856 /* 0x1.2dfb4600c */,
1.18278920671 /* 0x1.2ecb4600e */,
1.18602204342 /* 0x1.2f9f2400d */,
1.18924140952 /* 0x1.30722000f */,
1.19246912021 /* 0x1.3145a800c */,
1.19566547881 /* 0x1.321722007 */,
1.19890022298 /* 0x1.32eb2000e */,
1.20205938816 /* 0x1.33ba2a000 */,
1.20533752458 /* 0x1.34910000b */,
1.20865476136 /* 0x1.356a66003 */,
1.21195018302 /* 0x1.36425e007 */,
1.21525228034 /* 0x1.371ac6007 */,
1.21851313125 /* 0x1.37f07a007 */,
1.22183310988 /* 0x1.38ca0e001 */,
1.22516608253 /* 0x1.39a47c00a */,
1.22848713419 /* 0x1.3a7e2200f */,
1.23174583912 /* 0x1.3b53b2000 */,
1.23522067082 /* 0x1.3c376c008 */,
1.23849928397 /* 0x1.3d0e4a00c */,
1.24181902431 /* 0x1.3de7da00f */,
1.24523758889 /* 0x1.3ec7e4001 */,
1.24859035038 /* 0x1.3fa39e00f */,
1.25193393249 /* 0x1.407ebe00d */,
1.25539278994 /* 0x1.41616c007 */,
1.25880420214 /* 0x1.4240fe004 */,
1.26223969480 /* 0x1.43222400e */,
1.26558542253 /* 0x1.43fd68001 */,
1.26904225354 /* 0x1.44dff4003 */,
1.27251851576 /* 0x1.45c3c600c */,
1.27593302748 /* 0x1.46a38c00f */,
1.27941727649 /* 0x1.4787e4007 */,
1.28286683578 /* 0x1.4869f600d */,
1.28636789342 /* 0x1.494f6800e */,
1.28982734693 /* 0x1.4a3220009 */,
1.29335498813 /* 0x1.4b1950002 */,
1.29684555547 /* 0x1.4bfe1200b */,
1.30039131655 /* 0x1.4ce672009 */,
1.30388665216 /* 0x1.4dcb8400b */,
1.30738770972 /* 0x1.4eb0f6007 */,
1.31095492852 /* 0x1.4f9abe008 */,
1.31452167056 /* 0x1.50847e00f */,
1.31807971017 /* 0x1.516dac00b */,
1.32168746004 /* 0x1.525a1c006 */,
1.32518649117 /* 0x1.533f6c00b */,
1.32884454737 /* 0x1.542f28007 */,
1.33244597914 /* 0x1.551b2e002 */,
1.33601069461 /* 0x1.5604cc007 */,
1.33969032765 /* 0x1.56f5f2000 */,
1.34328985233 /* 0x1.57e1d800d */,
1.34692609319 /* 0x1.58d026006 */,
1.35055744648 /* 0x1.59be22000 */,
1.35424625891 /* 0x1.5aafe200c */,
1.35795569436 /* 0x1.5ba2fc00b */,
1.36158764384 /* 0x1.5c910200e */,
1.36525344864 /* 0x1.5d814000a */,
1.36908590815 /* 0x1.5e7c6a00e */,
1.37272357954 /* 0x1.5f6ad0009 */,
1.37639832498 /* 0x1.605ba4001 */,
1.38020527377 /* 0x1.615522009 */,
1.38388323800 /* 0x1.62462c00b */,
1.38770687583 /* 0x1.6340c2002 */,
1.39144265656 /* 0x1.643596003 */,
1.39518976211 /* 0x1.652b28000 */,
1.39905631551 /* 0x1.66288e006 */,
1.40280294419 /* 0x1.671e18000 */,
1.40661609194 /* 0x1.6817fe00e */,
1.41035604489 /* 0x1.690d18008 */
};
#define S (1.0/8388608.0) /* 2^-23 */
static const float exp2_deltatable[256] = {
61*S, 107*S, -301*S, -91*S, 98*S, -194*S, -57*S, 223*S,
-162*S, 176*S, 241*S, 32*S, 24*S, 29*S, 138*S, 871*S,
-280*S, -49*S, 204*S, 122*S, 238*S, 262*S, 108*S, -195*S,
330*S, 103*S, -23*S, -215*S, -1269*S, -610*S, 19*S, 13*S,
28*S, -819*S, 298*S, 78*S, -233*S, -18*S, 1186*S, 172*S,
135*S, -203*S, -197*S, -97*S, -374*S, 8*S, 512*S, -295*S,
240*S, -15*S, 214*S, -75*S, -30*S, 88*S, 12*S, 806*S,
273*S, -204*S, 445*S, 429*S, -579*S, -109*S, 207*S, 38*S,
695*S, -161*S, 68*S, 825*S, -178*S, 233*S, 187*S, -358*S,
91*S, 1056*S, 53*S, 265*S, 257*S, -150*S, -118*S, 182*S,
281*S, -49*S, 317*S, -844*S, -80*S, -339*S, 10*S, -269*S,
-16*S, -208*S, -226*S, 95*S, -141*S, 14*S, 52*S, -61*S,
-125*S, -41*S, 454*S, -176*S, 196*S, -550*S, -26*S, -129*S,
-99*S, 250*S, -25*S, -274*S, -154*S, -32*S, 247*S, -169*S,
-272*S, -209*S, -64*S, 53*S, 25*S, 171*S, -25*S, -406*S,
135*S, -141*S, 84*S, 231*S, -396*S, 414*S, 36*S, -129*S,
0*S, 65*S, 133*S, 447*S, 70*S, 62*S, -236*S, 639*S,
-903*S, 181*S, -58*S, -373*S, -191*S, -189*S, 244*S, 39*S,
-147*S, -488*S, 196*S, 400*S, -9*S, 15*S, -70*S, -201*S,
267*S, 133*S, 121*S, 270*S, -240*S, 466*S, -289*S, -428*S,
-66*S, 352*S, -880*S, 41*S, -96*S, -758*S, 130*S, 29*S,
310*S, 124*S, 81*S, -135*S, 348*S, -172*S, -44*S, -338*S,
-183*S, 148*S, -206*S, 32*S, -9*S, -257*S, 61*S, -196*S,
-69*S, -501*S, -193*S, -60*S, 12*S, 296*S, 46*S, 311*S,
349*S, 383*S, 11*S, -60*S, -980*S, -789*S, -296*S, -112*S,
49*S, -289*S, -128*S, 72*S, 65*S, -643*S, 682*S, -6*S,
-378*S, 124*S, -103*S, -506*S, 116*S, 190*S, 406*S, -326*S,
-83*S, 255*S, -83*S, 152*S, -30*S, 185*S, -80*S, 206*S,
56*S, 332*S, 50*S, -266*S, -58*S, 56*S, 1*S, 313*S,
-458*S, 135*S, 122*S, -312*S, 206*S, -89*S, -141*S, -325*S,
-83*S, 253*S, -190*S, -419*S, 738*S, 83*S, -331*S, 328*S,
-233*S, 391*S, 159*S, -62*S, 663*S, 261*S, 345*S, -288*S
};
/* Maximum magnitude in above table: 1269 */
#undef S
#define EXP2_TSIZE 8
#define EXP2_TTOL 9
#define EXP2_FSIZE 23
#define EXP2_FNAME float

View File

@ -0,0 +1,36 @@
/*
* wrapper exp2(x)
*/
#include <float.h>
#include "math.h"
#include "math_private.h"
static const double o_threshold= (double) DBL_MAX_EXP;
static const double u_threshold= (double) DBL_MIN_EXP;
double
__exp2 (double x) /* wrapper exp2 */
{
#ifdef _IEEE_LIBM
return __ieee754_exp2 (x);
#else
double z;
z = __ieee754_exp2 (x);
if (_LIB_VERSION != _IEEE_ && __finite (x))
{
if (x > o_threshold)
/* exp2 overflow */
return __kernel_standard (x, x, 44);
else if (x < u_threshold)
/* exp2 underflow */
return __kernel_standard (x, x, 45);
}
return z;
#endif
}
weak_alias (__exp2, exp2)
#ifdef NO_LONG_DOUBLE
strong_alias (__exp2, __expl2)
weak_alias (__exp2, expl2)
#endif

View File

@ -0,0 +1,32 @@
/*
* wrapper exp2f(x)
*/
#include <float.h>
#include "math.h"
#include "math_private.h"
static const float o_threshold= (float) FLT_MAX_EXP;
static const float u_threshold= (float) FLT_MIN_EXP;
float
__exp2f (float x) /* wrapper exp2f */
{
#ifdef _IEEE_LIBM
return __ieee754_exp2f (x);
#else
float z;
z = __ieee754_exp2f (x);
if (_LIB_VERSION != _IEEE_ && __finitef (x))
{
if (x > o_threshold)
/* exp2 overflow */
return (float) __kernel_standard ((double) x, (double) x, 144);
else if (x < u_threshold)
/* exp2 underflow */
return (float) __kernel_standard ((double) x, (double) x, 145);
}
return z;
#endif
}
weak_alias (__exp2f, exp2f)

View File

@ -0,0 +1,30 @@
/*
* wrapper exp2l(x)
*/
#include <float.h>
#include "math.h"
#include "math_private.h"
static const long double o_threshold = (long double) LDBL_MAX_EXP;
static const long double u_threshold = (long double) LDBL_MIN_EXP;
long double
__exp2l (long double x) /* wrapper exp2l */
{
#ifdef _IEEE_LIBM
return __ieee754_exp2l (x);
#else
long double z;
z = __ieee754_exp2l (x);
if (_LIB_VERSION != _IEEE_ && __finitel (x))
{
if (x > o_threshold)
return __kernel_standard (x, x, 244); /* exp2l overflow */
else if (x < u_threshold)
return __kernel_standard (x, x, 245); /* exp2l underflow */
}
return z;
#endif
}
weak_alias (__exp2l, exp2l)

View File

@ -21,7 +21,7 @@ endif
# so that's at least 8192 entries. Since libc only uses about 1200 entries,
# we want to use -fpic, because this generates fewer relocs.
ifeq (yes,$(build-shared))
CFLAGS-.os = -fpic -fno-common
pic-ccflag = -fpic
endif
# The initfini generation code doesn't work in the presence of -fPIC, so
@ -29,3 +29,7 @@ endif
ifeq ($(subdir),csu)
CFLAGS-initfini.s = -g0 -fpic
endif
ifeq ($(subdir),string)
CFLAGS-memcmp.c += -Wno-uninitialized
endif

View File

@ -32,34 +32,22 @@ __sgn1 (double __x)
{
return __x >= 0.0 ? 1.0 : -1.0;
}
/* We'd want to use this if it was implemented in hardware, but
how can we tell? */
#if 0
__MATH_INLINE double sqrt (double __x);
__MATH_INLINE double
sqrt (double __x)
{
register double __value;
__asm
("fsqrt %0,%1"
: "=f" (__value) : "f" (__x));
return __value;
}
#endif
__MATH_INLINE double fabs (double __x);
__MATH_INLINE double
fabs (double __x)
{
register double __value;
__asm
("fabs %0,%1"
: "=f" (__value) : "f" (__x));
return __value;
}
#endif /* __NO_MATH_INLINES && __OPTIMZE__ */
#if __USE_ISOC9X
# define __unordered_cmp(x, y) \
(__extension__ \
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
unsigned __r; \
__asm__("fcmpu 7,%1,%2 ; mfcr %0" : "=r" (__r) : "f" (__x), "f"(__y)); \
__r; }))
# define isgreater(x, y) (__unordered_cmp (x, y) >> 2 & 1)
# define isgreaterequal(x, y) ((__unordered_cmp (x, y) & 6) != 0)
# define isless(x, y) (__unordered_cmp (x, y) >> 3 & 1)
# define islessequal(x, y) ((__unordered_cmp (x, y) & 0xA) != 0)
# define islessgreater(x, y) ((__unordered_cmp (x, y) & 0xC) != 0)
# define isunordered(x, y) (__unordered_cmp (x, y) & 1)
#endif /* __USE_ISOC9X */
#endif /* __GNUC__ */

27
sysdeps/powerpc/bzero.S Normal file
View File

@ -0,0 +1,27 @@
/* Optimized bzero `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. */
#include <sysdep.h>
ENTRY(__bzero)
mr %r5,%r4
li %r4,0
b memset@local
END(__bzero)
weak_alias (__bzero, bzero)

View File

@ -199,6 +199,53 @@ _dl_runtime_resolve:
bctr
0:
.size _dl_runtime_resolve,0b-_dl_runtime_resolve
.align 2
.globl _dl_prof_resolve
.type _dl_prof_resolve,@function
_dl_prof_resolve:
# We need to save the registers used to pass parameters, and register 0,
# which is used by _mcount; the registers are saved in a stack frame.
stwu 1,-48(1)
stw 0,12(1)
stw 3,16(1)
stw 4,20(1)
# The code that calls this has put parameters for `fixup' in r12 and r11.
mr 3,12
stw 5,24(1)
mr 4,11
stw 6,28(1)
mflr 5
# We also need to save some of the condition register fields.
stw 7,32(1)
stw 5,52(1)
stw 8,36(1)
mfcr 0
stw 9,40(1)
stw 10,44(1)
stw 0,8(1)
bl profile_fixup@local
# 'fixup' returns the address we want to branch to.
mtctr 3
# Put the registers back...
lwz 0,52(1)
lwz 10,44(1)
lwz 9,40(1)
mtlr 0
lwz 8,36(1)
lwz 0,8(1)
lwz 7,32(1)
lwz 6,28(1)
mtcrf 0xFF,0
lwz 5,24(1)
lwz 4,20(1)
lwz 3,16(1)
lwz 0,12(1)
# ...unwind the stack frame, and jump to the PLT entry we updated.
addi 1,1,48
bctr
0:
.size _dl_prof_resolve,0b-_dl_prof_resolve
# Undo '.section text'.
.previous
");
@ -409,8 +456,14 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
/ sizeof (Elf32_Rela));
Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);
extern void _dl_runtime_resolve (void);
Elf32_Word size_modified;
extern void _dl_runtime_resolve (void);
extern void _dl_prof_resolve (void);
Elf32_Word dlrr;
dlrr = (Elf32_Word)(char *)(profile
? _dl_prof_resolve
: _dl_runtime_resolve);
if (lazy)
for (i = 0; i < num_plt_entries; i++)
@ -433,8 +486,7 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
/* Multiply index of entry by 3 (in r11). */
plt[0] = OPCODE_SLWI (12, 11, 1);
plt[1] = OPCODE_ADD (11, 12, 11);
if ((Elf32_Word) (char *) _dl_runtime_resolve <= 0x01fffffc ||
(Elf32_Word) (char *) _dl_runtime_resolve >= 0xfe000000)
if (dlrr <= 0x01fffffc || dlrr >= 0xfe000000)
{
/* Load address of link map in r12. */
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) map);
@ -442,15 +494,13 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
+ 0x8000) >> 16));
/* Call _dl_runtime_resolve. */
plt[4] = OPCODE_BA ((Elf32_Word) (char *) _dl_runtime_resolve);
plt[4] = OPCODE_BA (dlrr);
}
else
{
/* Get address of _dl_runtime_resolve in CTR. */
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) _dl_runtime_resolve);
plt[3] = OPCODE_ADDIS (12, 12, ((((Elf32_Word) (char *)
_dl_runtime_resolve)
+ 0x8000) >> 16));
plt[2] = OPCODE_LI (12, dlrr);
plt[3] = OPCODE_ADDIS (12, 12, (dlrr + 0x8000) >> 16);
plt[4] = OPCODE_MTCTR (12);
/* Load address of link map in r12. */
@ -501,7 +551,6 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
{
assert (ELF32_R_TYPE (reloc->r_info) == R_PPC_JMP_SLOT);
/* elf_machine_runtime_setup handles this. */
}
@ -513,7 +562,7 @@ elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
LOADADDR is the load address of the object; INFO is an array indexed
by DT_* of the .dynamic section info. */
static inline void
static void
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
const Elf32_Sym *sym, const struct r_found_version *version,
Elf32_Addr *const reloc_addr)
@ -709,4 +758,4 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
#define ELF_MACHINE_NO_REL 1
#endif
#endif /* RESOLVE */

View File

@ -1,7 +1,6 @@
/* PowerPC-specific implementation of profiling support.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
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

100
sysdeps/powerpc/stpcpy.S Normal file
View File

@ -0,0 +1,100 @@
/* Optimized stpcpy 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. */
#include <sysdep.h>
/* See strlen.s for comments on how the end-of-string testing works. */
EALIGN(__stpcpy,4,0)
/* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */
/* General register assignments:
r0: temporary
r3: pointer to previous word in dest
r4: pointer to previous word in src
r6: current word from src
r7: 0xfefefeff
r8: 0x7f7f7f7f
r9: ~(word in src | 0x7f7f7f7f)
r10: alternate word from src. */
or %r0,%r4,%r3
clrlwi. %r0,%r0,30
addi %r3,%r3,-4
bne L(unaligned)
lis %r7,0xfeff
lis %r8,0x7f7f
lwz %r6,0(%r4)
addi %r7,%r7,-0x101
addi %r8,%r8,0x7f7f
b 2f
0: lwzu %r10,4(%r4)
stwu %r6,4(%r3)
add %r0,%r7,%r10
nor %r9,%r8,%r10
and. %r0,%r0,%r9
bne- 1f
lwzu %r6,4(%r4)
stwu %r10,4(%r3)
2: add %r0,%r7,%r6
nor %r9,%r8,%r6
and. %r0,%r0,%r9
beq+ 0b
mr %r10,%r6
/* We've hit the end of the string. Do the rest byte-by-byte. */
1: rlwinm. %r0,%r10,8,24,31
stbu %r0,4(%r3)
beqlr-
rlwinm. %r0,%r10,16,24,31
stbu %r0,1(%r3)
beqlr-
rlwinm. %r0,%r10,24,24,31
stbu %r0,1(%r3)
beqlr-
stbu %r10,1(%r3)
blr
/* Oh well. In this case, we just do a byte-by-byte copy. */
.align 4
nop
L(unaligned):
lbz %r6,0(%r4)
addi %r3,%r3,3
cmpwi %r6,0
beq- 2f
0: lbzu %r10,1(%r4)
stbu %r6,1(%r3)
cmpwi %r10,0
beq- 1f
nop /* Let 601 load start of loop. */
lbzu %r6,1(%r4)
stbu %r10,1(%r3)
cmpwi %r6,0
bne+ 0b
2: stbu %r6,1(%r3)
blr
1: stbu %r10,1(%r3)
blr
END(__stpcpy)
weak_alias (__stpcpy, stpcpy)

30
sysdeps/powerpc/strcat.c Normal file
View File

@ -0,0 +1,30 @@
/* strcat version that uses fast strcpy/strlen.
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. */
#include <string.h>
#undef strcat
/* Append SRC on the end of DEST. */
char *
strcat (char *dest, const char *src)
{
strcpy (dest + strlen (dest), src);
return dest;
}

100
sysdeps/powerpc/strcpy.S Normal file
View File

@ -0,0 +1,100 @@
/* Optimized strcpy 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. */
#include <sysdep.h>
/* See strlen.s for comments on how the end-of-string testing works. */
EALIGN(strcpy,4,0)
/* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */
/* General register assignments:
r0: temporary
r3: saved `dest'
r4: pointer to previous word in src
r5: pointer to previous word in dest
r6: current word from src
r7: 0xfefefeff
r8: 0x7f7f7f7f
r9: ~(word in src | 0x7f7f7f7f)
r10: alternate word from src. */
or %r0,%r4,%r3
clrlwi. %r0,%r0,30
addi %r5,%r3,-4
bne L(unaligned)
lis %r7,0xfeff
lis %r8,0x7f7f
lwz %r6,0(%r4)
addi %r7,%r7,-0x101
addi %r8,%r8,0x7f7f
b 2f
0: lwzu %r10,4(%r4)
stwu %r6,4(%r5)
add %r0,%r7,%r10
nor %r9,%r8,%r10
and. %r0,%r0,%r9
bne- 1f
lwzu %r6,4(%r4)
stwu %r10,4(%r5)
2: add %r0,%r7,%r6
nor %r9,%r8,%r6
and. %r0,%r0,%r9
beq+ 0b
mr %r10,%r6
/* We've hit the end of the string. Do the rest byte-by-byte. */
1: rlwinm. %r0,%r10,8,24,31
stb %r0,4(%r5)
beqlr-
rlwinm. %r0,%r10,16,24,31
stb %r0,5(%r5)
beqlr-
rlwinm. %r0,%r10,24,24,31
stb %r0,6(%r5)
beqlr-
stb %r10,7(%r5)
blr
/* Oh well. In this case, we just do a byte-by-byte copy. */
.align 4
nop
L(unaligned):
lbz %r6,0(%r4)
addi %r5,%r3,-1
cmpwi %r6,0
beq- 2f
0: lbzu %r10,1(%r4)
stbu %r6,1(%r5)
cmpwi %r10,0
beq- 1f
nop /* Let 601 load start of loop. */
lbzu %r6,1(%r4)
stbu %r10,1(%r5)
cmpwi %r6,0
bne+ 0b
2: stb %r6,1(%r5)
blr
1: stb %r10,1(%r5)
blr
END(strcpy)

View File

@ -1,5 +1,5 @@
/* Operating system support for run-time dynamic linker. Linux/PPC version.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
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

View File

@ -39,4 +39,16 @@ struct __kernel_termios
#define _HAVE_C_ISPEED 1
#define _HAVE_C_OSPEED 1
/* We have the kernel termios structure, so we can presume this code knows
what it's doing... */
#undef TCGETS
#undef TCSETS
#undef TCSETSW
#undef TCSETSF
#define TCGETS _IOR ('t', 19, struct __kernel_termios)
#define TCSETS _IOW ('t', 20, struct __kernel_termios)
#define TCSETSW _IOW ('t', 21, struct __kernel_termios)
#define TCSETSF _IOW ('t', 22, struct __kernel_termios)
#endif /* kernel_termios.h */