1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
1997-06-19 19:38  Ulrich Drepper  <drepper@cygnus.com>

	* features.h: Define __STDC_IEC_559__ and _STDC_IEC_559_COMPLEX__.

	* elf/dl-minimal.c (__dcgettext): Remove assertion.

	* inet/rcmd.c: Correct a few typos.  Reported by Eric Troan.

	* manual/Makefile (distribute): Add dir.
	* manual/dir: New file.

	* math/Makefile (libm-support): Rename s_rinttol, s_rinttoll,
	s_roundtol, and s_roundtoll to s_lrint, s_llrint, s_lround,
	and s_llround respectively.
	(libm-calls): Add e_gamma_r.
	* math/libm-test.c (check_int_exc): New function.
	(signbit_test): Remove test for sign of NaN.
	(gamma_test): Clear exception after test of existence.
	Correct tests and and epsilons.
	(lgamma_test): Likewise.
	(ilogb_test): Correct all tests.
	(scalb_test): Rewrite.
	(rinttol_test): Rename to lrint_test and correct tests.
	(rinttoll_test): Likewise.
	(roundtol_test): Likewise.
	(roundtoll_test): Likewise.
	(main): Call lrint/lround functions instead of rinttol/roundtol.
	* math/math.h: Change prototypes for rinttol/roundtol.
	* math/mathcalls.h: Rearrange prototypes according to ISO C9X draft.
	* sysdeps/generic/mathbits.h: Define FP_ILOGB0 and FP_ILOGBNAN.
	* sysdeps/i386/mathbits.h: Likewise.
	* sysdeps/libm-i387/e_scalb.S: Handle special cases correctly.
	* sysdeps/libm-i387/e_scalbf.S: Likewise.
	* sysdeps/libm-i387/e_scalbl.S: Likewise.
	* sysdeps/libm-i387/s_asinh.S: Handle -inf correctly.
	* sysdeps/libm-i387/s_asinhf.S: Likewise.
	* sysdeps/libm-i387/s_asinhl.S: Likewise.
	* sysdeps/libm-i387/s_ilogb.S: Optimize.
	* sysdeps/libm-i387/s_ilogbf.S: Likewise.
	* sysdeps/libm-i387/s_ilogbl.S: Likewise.
	* sysdeps/libm-i387/s_rinttol.S: Rename to...
	* sysdeps/libm-i387/s_lrint.S: ...this.
	* sysdeps/libm-i387/s_rinttoll.S: Rename to...
	* sysdeps/libm-i387/s_llrint.S: ...this.
	* sysdeps/libm-i387/s_remquo.S: Correctly set sign of remainder.
	* sysdeps/libm-i387/s_remquof.S: Likewise.
	* sysdeps/libm-i387/s_remquol.S: Likewise.
	* sysdeps/libm-i387/e_gamma_r.c: New file.  Implementation of gamma
	function according to ISO C.
	* sysdeps/libm-i387/e_gammaf_r.c: New file.
	* sysdeps/libm-i387/e_gammal_r.c: New file.
	* sysdeps/libm-i387/e_lgamma_r.c: Don't let optimize compile the
	generation of exceptions away.
	* sysdeps/libm-i387/e_lgammaf_r.c: Likewise.
	* sysdeps/libm-i387/k_standard.c: Correct return value for infinity
	points of gamma function when not SVID mode.
	* sysdeps/libm-i387/s_rinttoll.c: Renamed to...
	* sysdeps/libm-i387/s_llrint.c: ...this.
	* sysdeps/libm-i387/s_rinttol.c: Renamed to...
	* sysdeps/libm-i387/s_lrint.c: ...this.
	* sysdeps/libm-i387/s_roundtoll.c: Renamed to...
	* sysdeps/libm-i387/s_llround.c: ...this.
	* sysdeps/libm-i387/s_roundtol.c: Renamed to...
	* sysdeps/libm-i387/s_lround.c: ..this.
	* sysdeps/libm-i387/s_scalbn.c: Change second parameter according to
	ISO C.
	* sysdeps/libm-i387/s_scalbnf.c: Likewise.
	* sysdeps/libm-i387/s_scalbnl.c: Likewise.
	* sysdeps/libm-i387/w_gamma.c: Call __ieee754_gamma_r if library
	mode is not _SVID_.
	* sysdeps/libm-i387/w_gammaf.c: Likewise.
	* sysdeps/libm-i387/w_gammal.c: Likewise.
	* sysdeps/m68k/fpu/__math.h: Rename __rinttol to __lrint and
	rinttol to lrint.
	* sysdeps/m68k/fpu/s_rinttol.c: Renamed to...
	* sysdeps/m68k/fpu/s_lrint.c: ...this.
	* sysdeps/m68k/fpu/s_rinttoll.c: Renamed to...
	* sysdeps/m68k/fpu/s_llrint.c: ...this.

	* md5-crypt/Makefile: Link md5test program with md5.o.

	* stdio-common/temptest.c: Don't use __stdio_gen_tempname which
	is not exported by the libc.so.

	* stdio-common/vfscanf.c: Correct scanning of strings after last
	change.

	* sysdeps/unix/sysv/linux/i386/sysdep.S: Use .comm to define errno.

1997-06-19 07:37  H.J. Lu  <hjl@gnu.ai.mit.edu>

	* time/tzfile.c (__tzfile_read): Store getc () return in int.

1997-06-13  Miles Bader  <miles@gnu.ai.mit.edu>

	* argp/argp-parse.c (argp_version_parser): Include `(PROGRAM ERROR)' in
	the no-version error text to indicate that something's fucked.
	[!_] (N_): New macro.
	(argp_default_options, argp_version_options): Wrap doc strings in N_().

1997-06-12  Miles Bader  <miles@gnu.ai.mit.edu>

	* argp/argp-parse.c (parser_parse_opt): Detect and report unhandled
	options here.
	(parser_parse_arg): Handle ARGP_KEY_ARGS here.
	Adjust NEXT pointer back if we fail to parse anything.
	(parser_parse_next): Simplify arg code.  Leave state NEXT frobbing
	to parser_parse_arg.

1997-06-11  Miles Bader  <miles@gnu.ai.mit.edu>

	* argp/argp.h (ARGP_KEY_ARGS, ARGP_KEY_FINI): New macros.
	* argp/argp-parse.c (parser_finalize): Do another pass over the
	parsers with ARGP_KEY_FINI.

1997-06-18  Miles Bader  <miles@gnu.ai.mit.edu>

	* string/Makefile (routines): Add argz-replace.

1997-06-16 00:16  Miles Bader  <miles@gnu.ai.mit.edu>

	* manual/string.texi (Argz Functions): Document argz_replace.

1997-06-12  Miles Bader  <miles@gnu.ai.mit.edu>

	* string/argz.h (__argz_replace, argz_replace): New declarations.
	* string/argz-replace.c: New file.

1997-06-11  Miles Bader  <miles@gnu.ai.mit.edu>

	* manual/argp.texi (Argp Special Keys): Document ARGP_KEY_ARGS.

1997-06-16 23:08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makeconfig (libc-map): Remove definition.
	* Makerules (libc-map): Define it here, using the full name.
	(load-map-file): Remove case for empty $(..).
	($(common-objpfx)libc.so): Revert last change.

1997-06-17 22:18  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/programs/utmpd.c (main): Improve signal handling.

	* login/programs/request.c (do_setutent, do_updwtmp):
	Allow arbitrary length filenames.
	* login/programs/utmpd.h (setutent_request, updwtmp_request):
	Get rid of fixed length file field.
	* login/utmp_daemon.c (do_setutent, do_updwtmp):
	Allow arbitrary	length filenames.

	* login/programs/request.c (do_pututline):
	Don't fail if connection->position is -1 on entry.

1997-06-15 16:32  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/utmp_file.c (updwtmp_file): Use the same method for
	appending an entry as in pututline_file.

1997-06-11 18:59  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/utmp_file.c (getutent_r_file):
	Use read lock instead of write lock.
	(getutline_r_file, internal_getut_r): Lock utmp file.
	(updwtmp_file): Use fcntl to lock file instead of flock.

1997-06-18 00:11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* stdio-common/vfscanf.c (inchar, ungetc): Don't count EOF as
	character read in/put back.
	* stdio-common/tstscanf.c: Add test case for this.

1997-06-17 22:17  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libc.map: Add more symbols.

1997-06-18 12:01  Ulrich Drepper  <drepper@cygnus.com>

	* manual/Makefile (install): Make sure `dir' file exists if we use
	install-info.

1997-06-17 19:32  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* manual/Makefile (info): Depend on dir-add.info.

1997-06-17 17:19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/ldd.bash.in: Fix spacing in message.

1997-06-17 14:28  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/do-rel.h (elf_dynamic_do_rel): Always use version
	information if available.

1997-06-17 11:34  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sunrpc/Makefile ($(rpcsvc:%.x=$(objpfx)rpcsvc/%.h)): Make
	command non-empty to force make to recheck modification time.
	($(rpcsvc:%.x=$(objpfx)x%.c)): Likewise.

1997-06-17 00:26  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/stub/e_acoshl.c: Set errno to ENOSYS.
	* sysdeps/stub/e_acosl.c: Likewise.
	* sysdeps/stub/e_asinl.c: Likewise.
	* sysdeps/stub/e_atan2l.c: Likewise.
	* sysdeps/stub/e_expl.c: Likewise.
	* sysdeps/stub/e_fmodl.c: Likewise.
	* sysdeps/stub/e_j0l.c: Likewise.
	* sysdeps/stub/e_j1l.c: Likewise.
	* sysdeps/stub/e_jnl.c: Likewise.
	* sysdeps/stub/e_lgammal_r.c: Likewise.
	* sysdeps/stub/e_log10l.c: Likewise.
	* sysdeps/stub/e_logl.c: Likewise.
	* sysdeps/stub/e_powl.c: Likewise.
	* sysdeps/stub/e_rem_pio2l.c: Likewise.
	* sysdeps/stub/e_sqrtl.c: Likewise.
	* sysdeps/stub/k_cosl.c: Likewise.
	* sysdeps/stub/k_rem_pio2l.c: Likewise.
	* sysdeps/stub/k_sinl.c: Likewise.
	* sysdeps/stub/k_tanl.c: Likewise.
	* sysdeps/stub/s_atanl.c: Likewise.
	* sysdeps/stub/s_erfl.c: Likewise.
	* sysdeps/stub/s_exp2.c: Likewise.
	* sysdeps/stub/s_exp2f.c: Likewise.
	* sysdeps/stub/s_exp2l.c: Likewise.
	* sysdeps/stub/s_expm1l.c: Likewise.
	* sysdeps/stub/s_log1pl.c: Likewise.
	* sysdeps/stub/s_log2l.c: Likewise.

1997-06-18 11:46  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-ieee754/w_gamma.c: If _LIB_VERSION is _SVID_ compute
	result as before last change.
	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
	* sysdeps/libm-ieee754/w_gammal.c: Likewise.

1997-06-16 23:37  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/libm-ieee754/s_remquo.c: Fix off-by-one when computing
	quotient.
	* sysdeps/libm-ieee754/s_remquof.c: Likewise.
	* sysdeps/libm-ieee754/s_remquol.c: Likewise.

	* sysdeps/m68k/fpu/s_remquo.c: Remove FIXME and special case for
	quotient.

	* sysdeps/libm-ieee754/w_gamma.c: Add missing call to exp
	function.  Don't use global signgam.
	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
	* sysdeps/libm-ieee754/w_gammal.c: Likewise.

	* math/Makefile (libm-calls): Remove w_gamma_r.
	* sysdeps/libm-ieee754/w_gamma_r.c: Remove file.
	* sysdeps/libm-ieee754/w_gammaf_r.c: Remove file.
	* sysdeps/libm-ieee754/w_gammal_r.c: Remove file.

	* math/libm-test.c (atanh_test): Declare x only if needed.
	(signbit_test): Fix typo.
	(gamma_test): Check whether function is implemented.  Add
	epsilons.
	(lgamma_test): Likewise.
	(fmod_test): Add epsilons.
	(exp2_test): Use right function for existence test.

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

	* sysdeps/powerpc/Dist: Add fenv_const.c.
	* sysdeps/unix/sysv/linux/Dist: Add net/if_slip.h.
	* sysdeps/unix/sysv/linux/powerpc/Dist: Add init-first.h and
	syscall.h.
	* sysdeps/unix/sysv/linux/sparc/Dist: Add init-first.h.
	* string/Makefile (distribute): Add tst-svc.expect.
	* nis/Makefile (distribute): Add nis_intern.h and Banner.
	* elf/Makefile (distribute): Add dl-hash.h.
	* Rules (subdir_echo-distinfo): Add headers from $(distribute).

	* login/Makefile (others): Add utmpdump.
	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
	net/if_slip.h.

	* manual/Makefile (dir-add.texi): Also look in indirectly included
	files.

1997-06-16 23:15  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/configure.in: Remove commands to
	generate stdio_lim.h.
	* sysdeps/unix/sysv/linux/mk-stdiolim.c: Remove.
	* sysdeps/unix/sysv/linux/Makefile: Add rules to generate
	stdio_lim.h here.
	(common-generated): Add generated files.
	(inhibit-stdio_lim): Define.
	* sysdeps/posix/Makefile [$(inhibit-stdio_lim)=yes]: Disable rules
	to generate stdio_lim.h.

	* sysdeps/unix/sysv/linux/Makefile: Suppress inclusion of
	dependecy files if no_deps is set.
	($(objpfx)syscall-%.d): Add header file as target to dependency
	generation.

1997-06-14 19:19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/arm/Dist: New file.

1997-06-14 17:59  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* extra-lib.mk (others): Depend on versioned shared library, not
	the unversioned one.
	* Makerules (build-shlib): Don't make the version link here.
	($(common-objpfx)libc.so$(libc.so-version)): New rule for libc
	version link.

1997-06-16 03:07  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-ieee754/k_standard.c: Undo change of Tue Aug 6
	01:13:56 1996.

	* argp/argp-help.c (argp_args_usage): Supply correct argp to
	filter_doc.
	* argp/argp-help.c (hol_add_cluster): Initialize CL->depth.
	* argp/argp-help.c (_help): Supply STATE to argp_args_usage.
	* argp/argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro.
	* argp/argp-fmtstream.c: Add casts to prevent warnings.
	* argp/argp.h (OPTION_NO_USAGE): New macro.
	* argp/argp-help.c (usage_long_opt, usage_argful_short_opt,
	* argp/argp-fmtstream.c (__argp_fmtstream_update): Account for case
	* argp/argp-help.c <stddef.h>: New include.
	* argp/argp.h (argp_state_help, __argp_state_help, argp_usage,
	* argp/argp.h (argp_program_bug_address): Make const.
	* argp/argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME.
	* argp/argp-help.c (__argp_error, __argp_failure, __argp_state_help):
	* argp/argp-parse.c (parser_init): Set PARSER->state.flags.
This commit is contained in:
Ulrich Drepper
1997-06-19 19:11:22 +00:00
parent e7f1f046f5
commit d705269e75
118 changed files with 1765 additions and 709 deletions

346
ChangeLog
View File

@ -1,3 +1,320 @@
1997-06-19 19:38 Ulrich Drepper <drepper@cygnus.com>
* features.h: Define __STDC_IEC_559__ and _STDC_IEC_559_COMPLEX__.
* elf/dl-minimal.c (__dcgettext): Remove assertion.
* inet/rcmd.c: Correct a few typos. Reported by Eric Troan.
* manual/Makefile (distribute): Add dir.
* manual/dir: New file.
* math/Makefile (libm-support): Rename s_rinttol, s_rinttoll,
s_roundtol, and s_roundtoll to s_lrint, s_llrint, s_lround,
and s_llround respectively.
(libm-calls): Add e_gamma_r.
* math/libm-test.c (check_int_exc): New function.
(signbit_test): Remove test for sign of NaN.
(gamma_test): Clear exception after test of existence.
Correct tests and and epsilons.
(lgamma_test): Likewise.
(ilogb_test): Correct all tests.
(scalb_test): Rewrite.
(rinttol_test): Rename to lrint_test and correct tests.
(rinttoll_test): Likewise.
(roundtol_test): Likewise.
(roundtoll_test): Likewise.
(main): Call lrint/lround functions instead of rinttol/roundtol.
* math/math.h: Change prototypes for rinttol/roundtol.
* math/mathcalls.h: Rearrange prototypes according to ISO C9X draft.
* sysdeps/generic/mathbits.h: Define FP_ILOGB0 and FP_ILOGBNAN.
* sysdeps/i386/mathbits.h: Likewise.
* sysdeps/libm-i387/e_scalb.S: Handle special cases correctly.
* sysdeps/libm-i387/e_scalbf.S: Likewise.
* sysdeps/libm-i387/e_scalbl.S: Likewise.
* sysdeps/libm-i387/s_asinh.S: Handle -inf correctly.
* sysdeps/libm-i387/s_asinhf.S: Likewise.
* sysdeps/libm-i387/s_asinhl.S: Likewise.
* sysdeps/libm-i387/s_ilogb.S: Optimize.
* sysdeps/libm-i387/s_ilogbf.S: Likewise.
* sysdeps/libm-i387/s_ilogbl.S: Likewise.
* sysdeps/libm-i387/s_rinttol.S: Rename to...
* sysdeps/libm-i387/s_lrint.S: ...this.
* sysdeps/libm-i387/s_rinttoll.S: Rename to...
* sysdeps/libm-i387/s_llrint.S: ...this.
* sysdeps/libm-i387/s_remquo.S: Correctly set sign of remainder.
* sysdeps/libm-i387/s_remquof.S: Likewise.
* sysdeps/libm-i387/s_remquol.S: Likewise.
* sysdeps/libm-i387/e_gamma_r.c: New file. Implementation of gamma
function according to ISO C.
* sysdeps/libm-i387/e_gammaf_r.c: New file.
* sysdeps/libm-i387/e_gammal_r.c: New file.
* sysdeps/libm-i387/e_lgamma_r.c: Don't let optimize compile the
generation of exceptions away.
* sysdeps/libm-i387/e_lgammaf_r.c: Likewise.
* sysdeps/libm-i387/k_standard.c: Correct return value for infinity
points of gamma function when not SVID mode.
* sysdeps/libm-i387/s_rinttoll.c: Renamed to...
* sysdeps/libm-i387/s_llrint.c: ...this.
* sysdeps/libm-i387/s_rinttol.c: Renamed to...
* sysdeps/libm-i387/s_lrint.c: ...this.
* sysdeps/libm-i387/s_roundtoll.c: Renamed to...
* sysdeps/libm-i387/s_llround.c: ...this.
* sysdeps/libm-i387/s_roundtol.c: Renamed to...
* sysdeps/libm-i387/s_lround.c: ..this.
* sysdeps/libm-i387/s_scalbn.c: Change second parameter according to
ISO C.
* sysdeps/libm-i387/s_scalbnf.c: Likewise.
* sysdeps/libm-i387/s_scalbnl.c: Likewise.
* sysdeps/libm-i387/w_gamma.c: Call __ieee754_gamma_r if library
mode is not _SVID_.
* sysdeps/libm-i387/w_gammaf.c: Likewise.
* sysdeps/libm-i387/w_gammal.c: Likewise.
* sysdeps/m68k/fpu/__math.h: Rename __rinttol to __lrint and
rinttol to lrint.
* sysdeps/m68k/fpu/s_rinttol.c: Renamed to...
* sysdeps/m68k/fpu/s_lrint.c: ...this.
* sysdeps/m68k/fpu/s_rinttoll.c: Renamed to...
* sysdeps/m68k/fpu/s_llrint.c: ...this.
* md5-crypt/Makefile: Link md5test program with md5.o.
* stdio-common/temptest.c: Don't use __stdio_gen_tempname which
is not exported by the libc.so.
* stdio-common/vfscanf.c: Correct scanning of strings after last
change.
* sysdeps/unix/sysv/linux/i386/sysdep.S: Use .comm to define errno.
1997-06-19 07:37 H.J. Lu <hjl@gnu.ai.mit.edu>
* time/tzfile.c (__tzfile_read): Store getc () return in int.
1997-06-13 Miles Bader <miles@gnu.ai.mit.edu>
* argp/argp-parse.c (argp_version_parser): Include `(PROGRAM ERROR)' in
the no-version error text to indicate that something's fucked.
[!_] (N_): New macro.
(argp_default_options, argp_version_options): Wrap doc strings in N_().
1997-06-12 Miles Bader <miles@gnu.ai.mit.edu>
* argp/argp-parse.c (parser_parse_opt): Detect and report unhandled
options here.
(parser_parse_arg): Handle ARGP_KEY_ARGS here.
Adjust NEXT pointer back if we fail to parse anything.
(parser_parse_next): Simplify arg code. Leave state NEXT frobbing
to parser_parse_arg.
1997-06-11 Miles Bader <miles@gnu.ai.mit.edu>
* argp/argp.h (ARGP_KEY_ARGS, ARGP_KEY_FINI): New macros.
* argp/argp-parse.c (parser_finalize): Do another pass over the
parsers with ARGP_KEY_FINI.
1997-06-18 Miles Bader <miles@gnu.ai.mit.edu>
* string/Makefile (routines): Add argz-replace.
1997-06-16 00:16 Miles Bader <miles@gnu.ai.mit.edu>
* manual/string.texi (Argz Functions): Document argz_replace.
1997-06-12 Miles Bader <miles@gnu.ai.mit.edu>
* string/argz.h (__argz_replace, argz_replace): New declarations.
* string/argz-replace.c: New file.
1997-06-11 Miles Bader <miles@gnu.ai.mit.edu>
* manual/argp.texi (Argp Special Keys): Document ARGP_KEY_ARGS.
1997-06-16 23:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makeconfig (libc-map): Remove definition.
* Makerules (libc-map): Define it here, using the full name.
(load-map-file): Remove case for empty $(..).
($(common-objpfx)libc.so): Revert last change.
1997-06-17 22:18 Mark Kettenis <kettenis@phys.uva.nl>
* login/programs/utmpd.c (main): Improve signal handling.
* login/programs/request.c (do_setutent, do_updwtmp):
Allow arbitrary length filenames.
* login/programs/utmpd.h (setutent_request, updwtmp_request):
Get rid of fixed length file field.
* login/utmp_daemon.c (do_setutent, do_updwtmp):
Allow arbitrary length filenames.
* login/programs/request.c (do_pututline):
Don't fail if connection->position is -1 on entry.
1997-06-15 16:32 Mark Kettenis <kettenis@phys.uva.nl>
* login/utmp_file.c (updwtmp_file): Use the same method for
appending an entry as in pututline_file.
1997-06-11 18:59 Mark Kettenis <kettenis@phys.uva.nl>
* login/utmp_file.c (getutent_r_file):
Use read lock instead of write lock.
(getutline_r_file, internal_getut_r): Lock utmp file.
(updwtmp_file): Use fcntl to lock file instead of flock.
1997-06-18 00:11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* stdio-common/vfscanf.c (inchar, ungetc): Don't count EOF as
character read in/put back.
* stdio-common/tstscanf.c: Add test case for this.
1997-06-17 22:17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* libc.map: Add more symbols.
1997-06-18 12:01 Ulrich Drepper <drepper@cygnus.com>
* manual/Makefile (install): Make sure `dir' file exists if we use
install-info.
1997-06-17 19:32 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* manual/Makefile (info): Depend on dir-add.info.
1997-06-17 17:19 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* elf/ldd.bash.in: Fix spacing in message.
1997-06-17 14:28 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* elf/do-rel.h (elf_dynamic_do_rel): Always use version
information if available.
1997-06-17 11:34 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sunrpc/Makefile ($(rpcsvc:%.x=$(objpfx)rpcsvc/%.h)): Make
command non-empty to force make to recheck modification time.
($(rpcsvc:%.x=$(objpfx)x%.c)): Likewise.
1997-06-17 00:26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/stub/e_acoshl.c: Set errno to ENOSYS.
* sysdeps/stub/e_acosl.c: Likewise.
* sysdeps/stub/e_asinl.c: Likewise.
* sysdeps/stub/e_atan2l.c: Likewise.
* sysdeps/stub/e_expl.c: Likewise.
* sysdeps/stub/e_fmodl.c: Likewise.
* sysdeps/stub/e_j0l.c: Likewise.
* sysdeps/stub/e_j1l.c: Likewise.
* sysdeps/stub/e_jnl.c: Likewise.
* sysdeps/stub/e_lgammal_r.c: Likewise.
* sysdeps/stub/e_log10l.c: Likewise.
* sysdeps/stub/e_logl.c: Likewise.
* sysdeps/stub/e_powl.c: Likewise.
* sysdeps/stub/e_rem_pio2l.c: Likewise.
* sysdeps/stub/e_sqrtl.c: Likewise.
* sysdeps/stub/k_cosl.c: Likewise.
* sysdeps/stub/k_rem_pio2l.c: Likewise.
* sysdeps/stub/k_sinl.c: Likewise.
* sysdeps/stub/k_tanl.c: Likewise.
* sysdeps/stub/s_atanl.c: Likewise.
* sysdeps/stub/s_erfl.c: Likewise.
* sysdeps/stub/s_exp2.c: Likewise.
* sysdeps/stub/s_exp2f.c: Likewise.
* sysdeps/stub/s_exp2l.c: Likewise.
* sysdeps/stub/s_expm1l.c: Likewise.
* sysdeps/stub/s_log1pl.c: Likewise.
* sysdeps/stub/s_log2l.c: Likewise.
1997-06-18 11:46 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/libm-ieee754/w_gamma.c: If _LIB_VERSION is _SVID_ compute
result as before last change.
* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
* sysdeps/libm-ieee754/w_gammal.c: Likewise.
1997-06-16 23:37 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/libm-ieee754/s_remquo.c: Fix off-by-one when computing
quotient.
* sysdeps/libm-ieee754/s_remquof.c: Likewise.
* sysdeps/libm-ieee754/s_remquol.c: Likewise.
* sysdeps/m68k/fpu/s_remquo.c: Remove FIXME and special case for
quotient.
* sysdeps/libm-ieee754/w_gamma.c: Add missing call to exp
function. Don't use global signgam.
* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
* sysdeps/libm-ieee754/w_gammal.c: Likewise.
* math/Makefile (libm-calls): Remove w_gamma_r.
* sysdeps/libm-ieee754/w_gamma_r.c: Remove file.
* sysdeps/libm-ieee754/w_gammaf_r.c: Remove file.
* sysdeps/libm-ieee754/w_gammal_r.c: Remove file.
* math/libm-test.c (atanh_test): Declare x only if needed.
(signbit_test): Fix typo.
(gamma_test): Check whether function is implemented. Add
epsilons.
(lgamma_test): Likewise.
(fmod_test): Add epsilons.
(exp2_test): Use right function for existence test.
1997-06-07 09:20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/powerpc/Dist: Add fenv_const.c.
* sysdeps/unix/sysv/linux/Dist: Add net/if_slip.h.
* sysdeps/unix/sysv/linux/powerpc/Dist: Add init-first.h and
syscall.h.
* sysdeps/unix/sysv/linux/sparc/Dist: Add init-first.h.
* string/Makefile (distribute): Add tst-svc.expect.
* nis/Makefile (distribute): Add nis_intern.h and Banner.
* elf/Makefile (distribute): Add dl-hash.h.
* Rules (subdir_echo-distinfo): Add headers from $(distribute).
* login/Makefile (others): Add utmpdump.
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
net/if_slip.h.
* manual/Makefile (dir-add.texi): Also look in indirectly included
files.
1997-06-16 23:15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/configure.in: Remove commands to
generate stdio_lim.h.
* sysdeps/unix/sysv/linux/mk-stdiolim.c: Remove.
* sysdeps/unix/sysv/linux/Makefile: Add rules to generate
stdio_lim.h here.
(common-generated): Add generated files.
(inhibit-stdio_lim): Define.
* sysdeps/posix/Makefile [$(inhibit-stdio_lim)=yes]: Disable rules
to generate stdio_lim.h.
* sysdeps/unix/sysv/linux/Makefile: Suppress inclusion of
dependecy files if no_deps is set.
($(objpfx)syscall-%.d): Add header file as target to dependency
generation.
1997-06-14 19:19 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/arm/Dist: New file.
1997-06-14 17:59 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* extra-lib.mk (others): Depend on versioned shared library, not
the unversioned one.
* Makerules (build-shlib): Don't make the version link here.
($(common-objpfx)libc.so$(libc.so-version)): New rule for libc
version link.
1997-06-16 03:07 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/libm-ieee754/k_standard.c: Undo change of Tue Aug 6
01:13:56 1996.
1997-06-16 00:54 Ulrich Drepper <drepper@cygnus.com> 1997-06-16 00:54 Ulrich Drepper <drepper@cygnus.com>
* libc.map: Add more symbols. * libc.map: Add more symbols.
@ -834,7 +1151,8 @@
1997-05-27 14:16 Miles Bader <miles@gnu.ai.mit.edu> 1997-05-27 14:16 Miles Bader <miles@gnu.ai.mit.edu>
* argp-help.c (argp_args_usage): Supply correct argp to filter_doc. * argp/argp-help.c (argp_args_usage): Supply correct argp to
filter_doc.
1997-05-27 17:51 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> 1997-05-27 17:51 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
@ -1199,7 +1517,7 @@
1997-05-21 17:53 Miles Bader <miles@gnu.ai.mit.edu> 1997-05-21 17:53 Miles Bader <miles@gnu.ai.mit.edu>
* argp-help.c (hol_add_cluster): Initialize CL->depth. * argp/argp-help.c (hol_add_cluster): Initialize CL->depth.
1997-05-24 03:51 Ulrich Drepper <drepper@cygnus.com> 1997-05-24 03:51 Ulrich Drepper <drepper@cygnus.com>
@ -1401,10 +1719,10 @@
1997-05-20 14:01 Miles Bader <miles@gnu.ai.mit.edu> 1997-05-20 14:01 Miles Bader <miles@gnu.ai.mit.edu>
* argp-help.c (_help): Supply STATE to argp_args_usage. * argp/argp-help.c (_help): Supply STATE to argp_args_usage.
(argp_args_usage): Add filtering of the args doc string. (argp_args_usage): Add filtering of the args doc string.
(comma): Print cluster headers for the first entry too. (comma): Print cluster headers for the first entry too.
* argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro. * argp/argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro.
1997-05-21 02:49 Ulrich Drepper <drepper@cygnus.com> 1997-05-21 02:49 Ulrich Drepper <drepper@cygnus.com>
@ -2602,7 +2920,7 @@
* rellns-sh: Rewrite to work also in presence of symlinks. * rellns-sh: Rewrite to work also in presence of symlinks.
* arpg/argp-fmtstream.c: Add casts to prevent warnings. * argp/argp-fmtstream.c: Add casts to prevent warnings.
* argp/argp-fmtstream.h: Likewise. * argp/argp-fmtstream.h: Likewise.
* argp/argp-help.c: Likewise. * argp/argp-help.c: Likewise.
@ -5205,8 +5523,8 @@
1997-02-21 10:41 Miles Bader <miles@gnu.ai.mit.edu> 1997-02-21 10:41 Miles Bader <miles@gnu.ai.mit.edu>
* argp.h (OPTION_NO_USAGE): New macro. * argp/argp.h (OPTION_NO_USAGE): New macro.
* argp-help.c (usage_long_opt, usage_argful_short_opt, * argp/argp-help.c (usage_long_opt, usage_argful_short_opt,
add_argless_short_opt): Implement OPTION_NO_USAGE. add_argless_short_opt): Implement OPTION_NO_USAGE.
1997-02-20 16:41 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> 1997-02-20 16:41 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
@ -5215,10 +5533,10 @@
1997-02-20 15:56 Miles Bader <miles@gnu.ai.mit.edu> 1997-02-20 15:56 Miles Bader <miles@gnu.ai.mit.edu>
* argp-fmtstream.c (__argp_fmtstream_update): Account for case * argp/argp-fmtstream.c (__argp_fmtstream_update): Account for case
where NEXTLINE points one past the end of the active buffer. where NEXTLINE points one past the end of the active buffer.
* argp-help.c <stddef.h>: New include. * argp/argp-help.c <stddef.h>: New include.
(__argp_failure): Only exit if STATE says it's ok. (__argp_failure): Only exit if STATE says it's ok.
(print_header, hol_entry_help): Use UPARAMS fields rather than (print_header, hol_entry_help): Use UPARAMS fields rather than
constants. constants.
@ -5241,12 +5559,12 @@
(fill_in_uparams): New function. (fill_in_uparams): New function.
(__argp_failure, __argp_error, __argp_state_help): Make STATE (__argp_failure, __argp_error, __argp_state_help): Make STATE
parameter const. parameter const.
* argp.h (argp_state_help, __argp_state_help, argp_usage, * argp/argp.h (argp_state_help, __argp_state_help, argp_usage,
__argp_usage, argp_error, __argp_error, argp_failure, __argp_usage, argp_error, __argp_error, argp_failure,
__argp_failure): Make STATE parameter const. __argp_failure): Make STATE parameter const.
(ARGP_KEY_HELP_DUP_ARGS_NOTE): New macro. (ARGP_KEY_HELP_DUP_ARGS_NOTE): New macro.
* argp.h (argp_program_bug_address): Make const. * argp/argp.h (argp_program_bug_address): Make const.
1997-02-20 19:20 Ulrich Drepper <drepper@cygnus.com> 1997-02-20 19:20 Ulrich Drepper <drepper@cygnus.com>
@ -5283,12 +5601,12 @@
1997-02-19 18:48 Miles Bader <miles@gnu.ai.mit.edu> 1997-02-19 18:48 Miles Bader <miles@gnu.ai.mit.edu>
* argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME. * argp/argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME.
(parser_init): Use the basename for PARSER->state.name. (parser_init): Use the basename for PARSER->state.name.
* argp-help.c (__argp_error, __argp_failure, __argp_state_help): * argp/argp-help.c (__argp_error, __argp_failure, __argp_state_help):
Use PROGRAM_INVOCATION_SHORT_NAME instead of PROGRAM_INVOCATION_NAME. Use PROGRAM_INVOCATION_SHORT_NAME instead of PROGRAM_INVOCATION_NAME.
* argp-parse.c (parser_init): Set PARSER->state.flags. * argp/argp-parse.c (parser_init): Set PARSER->state.flags.
Make check whether PARSER has the prog name in argv[0] at the Make check whether PARSER has the prog name in argv[0] at the
proper place. proper place.

View File

@ -381,13 +381,6 @@ link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
endif endif
endif endif
# We have a versioning file for libc.so. We must define this here since
# otherwise in the subdirs this definition is not available and a rebuild
# of libc.so happens without versioning.
ifndef libc-map
libc-map = libc.map
endif
ifndef link-extra-libs ifndef link-extra-libs
ifeq (yes,$(build-shared)) ifeq (yes,$(build-shared))
ifneq ($(common-objpfx),$(objpfx)) ifneq ($(common-objpfx),$(objpfx))

View File

@ -345,11 +345,7 @@ no-whole-archive =
endif endif
ifeq ($(versioning),yes) ifeq ($(versioning),yes)
ifneq ($(..),)
load-map-file = $(wildcard $($(@F:%.so=%)-map) $($(@F:%.so=%)-map):%=$(..)%)
else
load-map-file = $($(@F:%.so=%)-map) load-map-file = $($(@F:%.so=%)-map)
endif
else else
load-map-file = load-map-file =
endif endif
@ -371,8 +367,6 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \
-L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \ -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
-Wl,--whole-archive $(filter-out $(load-map-file),$^) \ -Wl,--whole-archive $(filter-out $(load-map-file),$^) \
$(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so) $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
test -z "$($(@F)-version)" || \
(rm -f $@$($(@F)-version); $(LN_S) $(@F) $@$($(@F)-version))
endef endef
# Don't try to use -lc when making libc.so itself. # Don't try to use -lc when making libc.so itself.
@ -383,12 +377,18 @@ LDFLAGS-c.so = -nostdlib -nostartfiles
LDLIBS-c.so = -lgcc LDLIBS-c.so = -lgcc
# Give libc.so an entry point and make it directly runnable itself. # Give libc.so an entry point and make it directly runnable itself.
LDFLAGS-c.so += -e __libc_main LDFLAGS-c.so += -e __libc_main
# We have a versioning file for libc.so.
libc-map = $(..)libc.map
# Use our own special initializer and finalizer files for libc.so. # Use our own special initializer and finalizer files for libc.so.
$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \ $(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
$(common-objpfx)libc_pic.a \ $(common-objpfx)libc_pic.a \
$(elfobjdir)/sofini.so $(elfobjdir)/ld.so \ $(elfobjdir)/sofini.so $(elfobjdir)/ld.so \
$(libc-map:%=$(..)%) $(libc-map)
$(build-shlib) $(build-shlib)
ifdef libc.so-version
$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
$(make-link)
endif
endif endif
# Some files must not be compiled with the exception handler mechanism # Some files must not be compiled with the exception handler mechanism

2
Rules
View File

@ -122,7 +122,7 @@ subdir_echo-headers: echo-headers
.PHONY: subdir_echo-distinfo .PHONY: subdir_echo-distinfo
subdir_echo-distinfo: subdir_echo-distinfo:
@echo $(addprefix +header+,$(headers)) \ @echo $(addprefix +header+,$(headers) $(filter %.h,$(distribute))) \
$(addprefix +nodist+,$(generated) $(common-generated) $(dont_distribute)) $(addprefix +nodist+,$(generated) $(common-generated) $(dont_distribute))
# We want to install everything except the library itself, but update all # We want to install everything except the library itself, but update all

View File

@ -38,6 +38,7 @@
# define _(msgid) (msgid) # define _(msgid) (msgid)
# define gettext(msgid) (msgid) # define gettext(msgid) (msgid)
#endif #endif
#define N_(msgid) (msgid)
#endif #endif
#if _LIBC - 0 #if _LIBC - 0
@ -84,11 +85,11 @@ volatile int _argp_hang = 0;
static const struct argp_option argp_default_options[] = static const struct argp_option argp_default_options[] =
{ {
{"help", '?', 0, 0, "Give this help list", -1}, {"help", '?', 0, 0, N_("Give this help list"), -1},
{"usage", OPT_USAGE, 0, 0, "Give a short usage message"}, {"usage", OPT_USAGE, 0, 0, N_("Give a short usage message")},
{"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, "Set the program name"}, {"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, N_("Set the program name")},
{"HANG", OPT_HANG, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN, {"HANG", OPT_HANG, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
"Hang for SECS seconds (default 3600)"}, N_("Hang for SECS seconds (default 3600)")},
{0, 0} {0, 0}
}; };
@ -145,7 +146,7 @@ static const struct argp argp_default_argp =
static const struct argp_option argp_version_options[] = static const struct argp_option argp_version_options[] =
{ {
{"version", 'V', 0, 0, "Print program version", -1}, {"version", 'V', 0, 0, N_("Print program version"), -1},
{0, 0} {0, 0}
}; };
@ -160,7 +161,7 @@ argp_version_parser (int key, char *arg, struct argp_state *state)
else if (argp_program_version) else if (argp_program_version)
fprintf (state->out_stream, "%s\n", argp_program_version); fprintf (state->out_stream, "%s\n", argp_program_version);
else else
__argp_error (state, _("No version known!?")); __argp_error (state, _("(PROGRAM ERROR) No version known!?"));
if (! (state->flags & ARGP_NO_EXIT)) if (! (state->flags & ARGP_NO_EXIT))
exit (0); exit (0);
break; break;
@ -637,8 +638,8 @@ parser_finalize (struct parser *parser,
err = EBADKEY; err = EBADKEY;
} }
/* Okay, we're all done, with either an error or success. We only call the /* Okay, we're all done, with either an error or success; call the parsers
parsers once more, to indicate which one. */ to indicate which one. */
if (err) if (err)
{ {
@ -654,7 +655,7 @@ parser_finalize (struct parser *parser,
group_parse (group, &parser->state, ARGP_KEY_ERROR, 0); group_parse (group, &parser->state, ARGP_KEY_ERROR, 0);
} }
else else
/* Do final cleanup, including propagating back values from parsers. */ /* Notify parsers of success, and propagate back values from parsers. */
{ {
/* We pass over the groups in reverse order so that child groups are /* We pass over the groups in reverse order so that child groups are
given a chance to do there processing before passing back a value to given a chance to do there processing before passing back a value to
@ -667,6 +668,10 @@ parser_finalize (struct parser *parser,
err = 0; /* Some parser didn't understand. */ err = 0; /* Some parser didn't understand. */
} }
/* Call parsers once more, to do any final cleanup. Errors are ignored. */
for (group = parser->egroup - 1; group >= parser->groups; group--)
group_parse (group, &parser->state, ARGP_KEY_FINI, 0);
if (err == EBADKEY) if (err == EBADKEY)
err = EINVAL; err = EINVAL;
@ -676,28 +681,55 @@ parser_finalize (struct parser *parser,
} }
/* Call the user parsers to parse the non-option argument VAL, at the current /* Call the user parsers to parse the non-option argument VAL, at the current
position, returning any error. */ position, returning any error. The state NEXT pointer is assumed to have
been adjusted (by getopt) to point after this argument; this function will
adjust it correctly to reflect however many args actually end up being
consumed. */
static error_t static error_t
parser_parse_arg (struct parser *parser, char *val) parser_parse_arg (struct parser *parser, char *val)
{ {
int index = parser->state.next; /* Save the starting value of NEXT, first adjusting it so that the arg
we're parsing is again the front of the arg vector. */
int index = --parser->state.next;
error_t err = EBADKEY; error_t err = EBADKEY;
struct group *group; struct group *group;
int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */
/* Try to parse the argument in each parser. */
for (group = parser->groups for (group = parser->groups
; group < parser->egroup && err == EBADKEY ; group < parser->egroup && err == EBADKEY
; group++) ; group++)
err = group_parse (group, &parser->state, ARGP_KEY_ARG, val); {
parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */
key = ARGP_KEY_ARG;
err = group_parse (group, &parser->state, key, val);
if (err == EBADKEY)
/* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */
{
parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */
key = ARGP_KEY_ARGS;
err = group_parse (group, &parser->state, key, 0);
}
}
if (! err) if (! err)
if (parser->state.next >= index) {
if (key == ARGP_KEY_ARGS)
/* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't
changed by the user, *all* arguments should be considered
consumed. */
parser->state.next = parser->state.argc;
if (parser->state.next > index)
/* Remember that we successfully processed a non-option /* Remember that we successfully processed a non-option
argument -- but only if the user hasn't gotten tricky and set argument -- but only if the user hasn't gotten tricky and set
the clock back. */ the clock back. */
(--group)->args_processed++; (--group)->args_processed += (parser->state.next - index);
else else
/* The user wants to reparse some args, give getopt another try. */ /* The user wants to reparse some args, give getopt another try. */
parser->try_getopt = 1; parser->try_getopt = 1;
}
return err; return err;
} }
@ -710,6 +742,7 @@ parser_parse_opt (struct parser *parser, int opt, char *val)
/* The group key encoded in the high bits; 0 for short opts or /* The group key encoded in the high bits; 0 for short opts or
group_number + 1 for long opts. */ group_number + 1 for long opts. */
int group_key = opt >> USER_BITS; int group_key = opt >> USER_BITS;
error_t err = EBADKEY;
if (group_key == 0) if (group_key == 0)
/* A short option. By comparing OPT's position in SHORT_OPTS to the /* A short option. By comparing OPT's position in SHORT_OPTS to the
@ -722,16 +755,39 @@ parser_parse_opt (struct parser *parser, int opt, char *val)
if (short_index) if (short_index)
for (group = parser->groups; group < parser->egroup; group++) for (group = parser->groups; group < parser->egroup; group++)
if (group->short_end > short_index) if (group->short_end > short_index)
return group_parse (group, &parser->state, opt, optarg); {
err = group_parse (group, &parser->state, opt, optarg);
return EBADKEY; /* until otherwise asserted */ break;
}
} }
else else
/* A long option. We use shifts instead of masking for extracting /* A long option. We use shifts instead of masking for extracting
the user value in order to preserve the sign. */ the user value in order to preserve the sign. */
return err =
group_parse (&parser->groups[group_key - 1], &parser->state, group_parse (&parser->groups[group_key - 1], &parser->state,
(opt << GROUP_BITS) >> GROUP_BITS, optarg); (opt << GROUP_BITS) >> GROUP_BITS, optarg);
if (err == EBADKEY)
/* At least currently, an option not recognized is an error in the
parser, because we pre-compute which parser is supposed to deal
with each option. */
{
static const char bad_key_err[] =
N_("(PROGRAM ERROR) Option should have been recognized!?");
if (group_key == 0)
__argp_error (&parser->state, "-%c: %s", opt, _(bad_key_err));
else
{
struct option *long_opt = parser->long_opts;
while (long_opt->val != opt && long_opt->name)
long_opt++;
__argp_error (&parser->state, "--%s: %s",
long_opt->name ? long_opt->name : "???",
_(bad_key_err));
}
}
return err;
} }
/* Parse the next argument in PARSER (as indicated by PARSER->state.next). /* Parse the next argument in PARSER (as indicated by PARSER->state.next).
@ -800,20 +856,20 @@ parser_parse_next (struct parser *parser, int *arg_ebadkey)
return EBADKEY; return EBADKEY;
} }
else else
/* A non-option arg. */ /* A non-option arg; simulate what getopt might have done. */
err = {
parser_parse_arg (parser, parser->state.argv[parser->state.next++]); opt = KEY_ARG;
else if (opt == KEY_ARG) optarg = parser->state.argv[parser->state.next++];
}
if (opt == KEY_ARG)
/* A non-option argument; try each parser in turn. */ /* A non-option argument; try each parser in turn. */
err = parser_parse_arg (parser, optarg); err = parser_parse_arg (parser, optarg);
else else
err = parser_parse_opt (parser, opt, optarg); err = parser_parse_opt (parser, opt, optarg);
if (err == EBADKEY) if (err == EBADKEY)
{
*arg_ebadkey = (opt == KEY_END || opt == KEY_ARG); *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
parser->state.next--; /* Put back the unused argument. */
}
return err; return err;
} }

View File

@ -160,6 +160,12 @@ typedef error_t (*argp_parser_t)(int key, char *arg, struct argp_state *state);
actually modify the argument (perhaps into an option), and have it actually modify the argument (perhaps into an option), and have it
processed again. */ processed again. */
#define ARGP_KEY_ARG 0 #define ARGP_KEY_ARG 0
/* There are remaining arguments not parsed by any parser, which may be found
starting at (STATE->argv + STATE->next). If success is returned, but
STATE->next left untouched, it's assumed that all arguments were consume,
otherwise, the parser should adjust STATE->next to reflect any arguments
consumed. */
#define ARGP_KEY_ARGS 0x1000006
/* There are no more command line arguments at all. */ /* There are no more command line arguments at all. */
#define ARGP_KEY_END 0x1000001 #define ARGP_KEY_END 0x1000001
/* Because it's common to want to do some special processing if there aren't /* Because it's common to want to do some special processing if there aren't
@ -172,11 +178,12 @@ typedef error_t (*argp_parser_t)(int key, char *arg, struct argp_state *state);
element of the CHILD_INPUT field, if any, in the state structure is element of the CHILD_INPUT field, if any, in the state structure is
copied to each child's state to be the initial value of the INPUT field. */ copied to each child's state to be the initial value of the INPUT field. */
#define ARGP_KEY_INIT 0x1000003 #define ARGP_KEY_INIT 0x1000003
/* Use after all other keys, including SUCCESS & END. */
#define ARGP_KEY_FINI 0x1000007
/* Passed in when parsing has successfully been completed (even if there are /* Passed in when parsing has successfully been completed (even if there are
still arguments remaining). */ still arguments remaining). */
#define ARGP_KEY_SUCCESS 0x1000004 #define ARGP_KEY_SUCCESS 0x1000004
/* Passed in if an error occurs (in which case a call with ARGP_KEY_SUCCESS is /* Passed in if an error occurs. */
never made, so any cleanup must be done here). */
#define ARGP_KEY_ERROR 0x1000005 #define ARGP_KEY_ERROR 0x1000005
/* An argp structure contains a set of options declarations, a function to /* An argp structure contains a set of options declarations, a function to

View File

@ -35,7 +35,7 @@ elide-routines.so = $(dl-routines) dl-support enbl-secure
# interpreter and operating independent of libc. # interpreter and operating independent of libc.
rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal
distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \ distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c dl-hash.h soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c
extra-libs = libdl extra-libs = libdl
extra-libs-others = $(extra-libs) extra-libs-others = $(extra-libs)

View File

@ -126,7 +126,6 @@ longjmp (jmp_buf env, int val) { __longjmp (env[0].__jmpbuf, val); }
char * weak_function char * weak_function
__dcgettext (const char *domainname, const char *msgid, int category) __dcgettext (const char *domainname, const char *msgid, int category)
{ {
assert (domainname == _libc_intl_domainname);
return (char *) msgid; return (char *) msgid;
} }
weak_alias (__dcgettext, dcgettext) weak_alias (__dcgettext, dcgettext)

View File

@ -53,7 +53,7 @@ elf_dynamic_do_rel (struct link_map *map,
const ElfW(Sym) *const symtab = const ElfW(Sym) *const symtab =
(const ElfW(Sym) *) (map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr); (const ElfW(Sym) *) (map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
if (map->l_info[VERSYMIDX (DT_VERNEEDNUM)]) if (map->l_info[VERSYMIDX (DT_VERSYM)])
{ {
const ElfW(Half) *const version = const ElfW(Half) *const version =
(const ElfW(Half) *) (map->l_addr (const ElfW(Half) *) (map->l_addr

View File

@ -65,7 +65,7 @@ Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
verbose=yes verbose=yes
shift ;; shift ;;
--v | --ve | --ver) --v | --ve | --ver)
echo >&2 $"ldd: option \`" $1 $"' is ambiguous" echo >&2 $"ldd: option \`$1' is ambiguous"
exit 1 ;; exit 1 ;;
--) # Stop option processing. --) # Stop option processing.
shift; break ;; shift; break ;;

View File

@ -37,7 +37,7 @@ endif
# The linked shared library is never a dependent of lib-noranlib, # The linked shared library is never a dependent of lib-noranlib,
# because linking it will depend on libc.so already being built. # because linking it will depend on libc.so already being built.
ifneq (,$(filter .so,$(object-suffixes-$(lib)))) ifneq (,$(filter .so,$(object-suffixes-$(lib))))
others: $(objpfx)$(lib).so others: $(objpfx)$(lib).so$($(lib).so-version)
endif endif

View File

@ -188,6 +188,9 @@
#define __USE_REENTRANT 1 #define __USE_REENTRANT 1
#endif #endif
/* We do support the IEC 559 math functionality, real and complex. */
#define __STDC_IEC_559__ 1
#define __STDC_IEC_559_COMPLEX__ 1
/* This macro indicates that the installed library is the GNU C Library. /* This macro indicates that the installed library is the GNU C Library.
For historic reasons the value now is 6 and this will stay from now For historic reasons the value now is 6 and this will stay from now

View File

@ -105,7 +105,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
else else
(void)fprintf(stderr, "rcmd: socket: %m\n"); (void)fprintf(stderr, "rcmd: socket: %m\n");
sigsetmask(oldmask); sigsetmask(oldmask);
return (-1); return -1;
} }
fcntl(s, F_SETOWN, pid); fcntl(s, F_SETOWN, pid);
sin.sin_family = hp->h_addrtype; sin.sin_family = hp->h_addrtype;
@ -140,7 +140,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
} }
(void)fprintf(stderr, "%s: %m\n", hp->h_name); (void)fprintf(stderr, "%s: %m\n", hp->h_name);
sigsetmask(oldmask); sigsetmask(oldmask);
return (-1); return -1;
} }
lport--; lport--;
if (fd2p == 0) { if (fd2p == 0) {
@ -149,7 +149,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
} else { } else {
char num[8]; char num[8];
int s2 = rresvport(&lport), s3; int s2 = rresvport(&lport), s3;
int len = sizeof(from); size_t len = sizeof(from);
if (s2 < 0) if (s2 < 0)
goto bad; goto bad;
@ -211,14 +211,14 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
goto bad2; goto bad2;
} }
sigsetmask(oldmask); sigsetmask(oldmask);
return (s); return s;
bad2: bad2:
if (lport) if (lport)
(void)close(*fd2p); (void)close(*fd2p);
bad: bad:
(void)close(s); (void)close(s);
sigsetmask(oldmask); sigsetmask(oldmask);
return (-1); return -1;
} }
int int
@ -232,20 +232,20 @@ rresvport(alport)
sin.sin_addr.s_addr = INADDR_ANY; sin.sin_addr.s_addr = INADDR_ANY;
s = socket(AF_INET, SOCK_STREAM, 0); s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0) if (s < 0)
return (-1); return -1;
for (;;) { for (;;) {
sin.sin_port = htons((u_short)*alport); sin.sin_port = htons((u_short)*alport);
if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0) if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0)
return (s); return s;
if (errno != EADDRINUSE) { if (errno != EADDRINUSE) {
(void)close(s); (void)close(s);
return (-1); return -1;
} }
(*alport)--; (*alport)--;
if (*alport == IPPORT_RESERVED/2) { if (*alport == IPPORT_RESERVED/2) {
(void)close(s); (void)close(s);
__set_errno (EAGAIN); /* close */ __set_errno (EAGAIN); /* close */
return (-1); return -1;
} }
} }
} }
@ -282,9 +282,9 @@ ruserok(rhost, superuser, ruser, luser)
for (ap = hp->h_addr_list; *ap; ++ap) { for (ap = hp->h_addr_list; *ap; ++ap) {
bcopy(*ap, &addr, sizeof(addr)); bcopy(*ap, &addr, sizeof(addr));
if (iruserok(addr, superuser, ruser, luser) == 0) if (iruserok(addr, superuser, ruser, luser) == 0)
return (0); return 0;
} }
return (-1); return -1;
} }
/* /*
@ -314,7 +314,7 @@ again:
if (hostf) { if (hostf) {
if (__ivaliduser(hostf, raddr, luser, ruser) == 0) { if (__ivaliduser(hostf, raddr, luser, ruser) == 0) {
(void)fclose(hostf); (void)fclose(hostf);
return (0); return 0;
} }
(void)fclose(hostf); (void)fclose(hostf);
} }
@ -349,7 +349,7 @@ again:
} }
if (hostf == NULL) if (hostf == NULL)
return (-1); return -1;
/* /*
* If not a regular file, or is owned by someone other than * If not a regular file, or is owned by someone other than
* user or root or if writeable by anyone but the owner, quit. * user or root or if writeable by anyone but the owner, quit.
@ -369,11 +369,11 @@ again:
if (cp) { if (cp) {
__rcmd_errstr = cp; __rcmd_errstr = cp;
(void)fclose(hostf); (void)fclose(hostf);
return (-1); return -1;
} }
goto again; goto again;
} }
return (-1); return -1;
} }
/* /*
@ -415,11 +415,11 @@ __ivaliduser(hostf, raddr, luser, ruser)
if (__icheckhost(raddr, buf) && if (__icheckhost(raddr, buf) &&
strcmp(ruser, *user ? user : luser) == 0) { strcmp(ruser, *user ? user : luser) == 0) {
free (buf); free (buf);
return (0); return 0;
} }
} }
free (buf); free (buf);
return (-1); return -1;
} }
/* /*
@ -430,7 +430,7 @@ __icheckhost(raddr, lhost)
u_int32_t raddr; u_int32_t raddr;
register char *lhost; register char *lhost;
{ {
register struct hostent hostbuf, *hp; struct hostent hostbuf, *hp;
size_t buflen; size_t buflen;
char *buffer; char *buffer;
register u_int32_t laddr; register u_int32_t laddr;
@ -439,7 +439,7 @@ __icheckhost(raddr, lhost)
/* Try for raw ip address first. */ /* Try for raw ip address first. */
if (isdigit(*lhost) && (int32_t)(laddr = inet_addr(lhost)) != -1) if (isdigit(*lhost) && (int32_t)(laddr = inet_addr(lhost)) != -1)
return (raddr == laddr); return raddr == laddr;
/* Better be a hostname. */ /* Better be a hostname. */
buflen = 1024; buflen = 1024;
@ -452,14 +452,14 @@ __icheckhost(raddr, lhost)
{ {
/* Enlarge the buffer. */ /* Enlarge the buffer. */
buflen *= 2; buflen *= 2;
buflen = __alloca (buflen); buffer = __alloca (buflen);
} }
/* Spin through ip addresses. */ /* Spin through ip addresses. */
for (pp = hp->h_addr_list; *pp; ++pp) for (pp = hp->h_addr_list; *pp; ++pp)
if (!bcmp(&raddr, *pp, sizeof(u_int32_t))) if (!bcmp(&raddr, *pp, sizeof(u_int32_t)))
return (1); return 1;
/* No match. */ /* No match. */
return (0); return 0;
} }

View File

@ -6,14 +6,14 @@ GLIBC_2.0 {
_IO_stderr_; _IO_stdin_; _IO_stdout_; _IO_stderr_; _IO_stdin_; _IO_stdout_;
_nl_msg_cat_cntr; __environ; _environ; _res; _nl_msg_cat_cntr; __environ; _environ; _res;
___brk_addr; __curbrk; _nl_current_LC_CTYPE; _libc_intl_domainname; ___brk_addr; __curbrk; _nl_current_LC_CTYPE; _libc_intl_domainname;
_sys_errlist; _sys_siglist; _sys_errlist; _sys_siglist; __progname;
# helper functions # helper functions
__errno_location; __libc_init_first; __h_errno_location; __errno_location; __libc_init_first; __h_errno_location;
# functions with special/multiple interfaces # functions with special/multiple interfaces
__sigsetjmp; _setjmp; __sigaddset; __sigdelset; __sigismember; __sigsetjmp; _setjmp; __sigaddset; __sigdelset; __sigismember;
__sysv_signal; __bsd_getpgrp; __sysv_signal; __bsd_getpgrp; _longjmp;
# functions which have an additional interface since they are # functions which have an additional interface since they are
# are cancelable. # are cancelable.
@ -52,6 +52,22 @@ GLIBC_2.0 {
__sched_getparam; __sched_getscheduler; __sched_setscheduler; __sched_getparam; __sched_getscheduler; __sched_setscheduler;
__sched_yield; __on_exit; __gettimeofday; __fork; __clone; __sched_yield; __on_exit; __gettimeofday; __fork; __clone;
__nss_configure_lookup; _dl_open; _IO_file_setbuf; __nss_configure_lookup; _dl_open; _IO_file_setbuf;
_IO_file_init; _IO_file_attach; _IO_do_write; _IO_seekoff;
_IO_link_in; _IO_file_open; _IO_file_doallocate; _IO_file_fopen;
_IO_file_overflow; _IO_file_underflow; _IO_file_sync; _IO_file_seekoff;
_IO_file_close_it; _IO_file_read; _IO_file_seek; _IO_file_write;
_IO_file_stat; _IO_file_close; _IO_file_xsputn; _IO_sgetn;
_IO_seekpos; _IO_padn; _IO_getline; _IO_vfprintf;
_IO_proc_open; _IO_proc_close; _IO_vfscanf; _IO_free_backup_area;
_IO_un_link; _IO_switch_to_get_mode; _IO_default_uflow;
_IO_default_xsputn; _IO_default_xsgetn; _IO_default_pbackfail;
_IO_setb; _IO_default_doallocate; _IO_doallocbuf; _IO_init;
_IO_default_finish; _IO_sputbackc; _IO_sungetc; _IO_adjust_column;
_IO_flush_all; _IO_flush_all_linebuffered; _IO_init_marker;
_IO_remove_marker; _IO_marker_difference; _IO_marker_delta;
_IO_seekmark; _IO_unsave_markers; _IO_str_overflow;
_IO_str_underflow; _IO_str_init_static; _IO_str_init_readonly;
_IO_str_seekoff; _IO_str_pbackfail; _IO_list_all;
# all functions and variables in the normal name space # all functions and variables in the normal name space
a*; b*; c*; d*; e*; f*; g*; h*; i*; j*; k*; l*; m*; a*; b*; c*; d*; e*; f*; g*; h*; i*; j*; k*; l*; m*;

View File

@ -27,7 +27,7 @@ headers := utmp.h utmpbits.h lastlog.h pty.h
routines := getutent getutent_r getutid getutline getutid_r getutline_r \ routines := getutent getutent_r getutid getutline getutid_r getutline_r \
utmp_file utmp_daemon utmpname updwtmp utmp_file utmp_daemon utmpname updwtmp
others = utmpd others = utmpd utmpdump
install-sbin = utmpd install-sbin = utmpd
utmpd-routines := connection database error request xtmp utmpd-routines := connection database error request xtmp
extra-objs := $(utmpd-routines:=.o) extra-objs := $(utmpd-routines:=.o)

View File

@ -182,12 +182,8 @@ do_setutent (client_connection *connection)
setutent_request *request; setutent_request *request;
setutent_reply reply; setutent_reply reply;
/* The request size varies, so don't check it. */
request = (setutent_request *)connection->read_base; request = (setutent_request *)connection->read_base;
if (request->header.size != sizeof (setutent_request))
{
warning (EINVAL, "invalid request size");
return -1;
}
/* Initialize reply. */ /* Initialize reply. */
reply.header.version = UTMPD_VERSION; reply.header.version = UTMPD_VERSION;
@ -195,7 +191,8 @@ do_setutent (client_connection *connection)
reply.header.type = UTMPD_REQ_SETUTENT; reply.header.type = UTMPD_REQ_SETUTENT;
/* Select database. */ /* Select database. */
if (!strncmp (request->file, _PATH_UTMP, sizeof request->file)) if (!strncmp (request->file, _PATH_UTMP,
request->header.size - sizeof (setutent_request)))
connection->database = utmp_db; connection->database = utmp_db;
else else
{ {
@ -450,7 +447,7 @@ do_pututline (client_connection *connection)
goto return_error; goto return_error;
} }
if (connection->database == NULL || connection->position == -1) if (connection->database == NULL)
{ {
errno = ESRCH; errno = ESRCH;
goto return_error; goto return_error;
@ -520,12 +517,8 @@ do_updwtmp (client_connection *connection)
updwtmp_reply reply; updwtmp_reply reply;
utmp_database *database; utmp_database *database;
/* The request size varies, so don't check it. */
request = (updwtmp_request *)connection->read_base; request = (updwtmp_request *)connection->read_base;
if (request->header.size != sizeof (updwtmp_request))
{
warning (EINVAL, "invalid request size");
return -1;
}
/* Initialize reply. */ /* Initialize reply. */
reply.header.version = UTMPD_VERSION; reply.header.version = UTMPD_VERSION;
@ -539,7 +532,8 @@ do_updwtmp (client_connection *connection)
} }
/* Select database. */ /* Select database. */
if (!strncmp (request->file, _PATH_UTMP, sizeof request->file)) if (!strncmp (request->file, _PATH_UTMP,
request->header.size - sizeof (updwtmp_request)))
database = utmp_db; database = utmp_db;
else else
{ {

View File

@ -134,6 +134,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
usage (EXIT_SUCCESS); usage (EXIT_SUCCESS);
signal (SIGINT, termination_handler); signal (SIGINT, termination_handler);
signal (SIGQUIT, termination_handler);
signal (SIGTERM, termination_handler); signal (SIGTERM, termination_handler);
/* Check if we are already running. */ /* Check if we are already running. */
@ -168,6 +169,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
if (write_pid (_PATH_UTMPDPID) < 0) if (write_pid (_PATH_UTMPDPID) < 0)
warning (errno, "%s", _PATH_UTMPDPID); warning (errno, "%s", _PATH_UTMPDPID);
/* Ignore job control signals. */
signal (SIGTTOU, SIG_IGN);
signal (SIGTTIN, SIG_IGN);
signal (SIGTSTP, SIG_IGN);
} }
/* Drop priviliges. */ /* Drop priviliges. */

View File

@ -22,7 +22,6 @@
/* This is an *internal* header. */ /* This is an *internal* header. */
#include <limits.h>
#include <stddef.h> #include <stddef.h>
#include <utmp.h> #include <utmp.h>
@ -68,7 +67,7 @@ typedef struct
{ {
request_header header; request_header header;
/* File to use. */ /* File to use. */
char file[_POSIX_PATH_MAX + 1]; char file[0];
} setutent_request; } setutent_request;
typedef struct typedef struct
@ -100,10 +99,10 @@ typedef struct
typedef struct typedef struct
{ {
request_header header; request_header header;
/* File to use. */
char file[_POSIX_PATH_MAX + 1];
/* Entry to write. */ /* Entry to write. */
struct utmp utmp; struct utmp utmp;
/* File to use. */
char file[0];
} updwtmp_request; } updwtmp_request;

View File

@ -227,24 +227,35 @@ updwtmp_daemon (const char *file, const struct utmp *utmp)
static int static int
do_setutent (int sock) do_setutent (int sock)
{ {
setutent_request request; setutent_request *request;
setutent_reply reply; setutent_reply reply;
size_t size;
request.header.version = UTMPD_VERSION; size = sizeof (setutent_request) + strlen (__libc_utmp_file_name) + 1;
request.header.size = sizeof (setutent_request);
request.header.type = UTMPD_REQ_SETUTENT; request = malloc (size);
strncpy (request.file, __libc_utmp_file_name, sizeof request.file); if (request == NULL)
return -1;
request->header.version = UTMPD_VERSION;
request->header.size = size;
request->header.type = UTMPD_REQ_SETUTENT;
strcpy (request->file, __libc_utmp_file_name);
reply.header.version = UTMPD_VERSION; reply.header.version = UTMPD_VERSION;
reply.header.size = sizeof (setutent_reply); reply.header.size = sizeof (setutent_reply);
reply.header.type = UTMPD_REQ_SETUTENT; reply.header.type = UTMPD_REQ_SETUTENT;
if (send_request (sock, &request.header, &reply.header) < 0) if (send_request (sock, &request->header, &reply.header) < 0)
{
free (request);
return -1; return -1;
}
if (reply.result < 0) if (reply.result < 0)
__set_errno (reply.errnum); __set_errno (reply.errnum);
free (request);
return reply.result; return reply.result;
} }
@ -375,25 +386,36 @@ do_pututline (int sock, const struct utmp *utmp)
static int static int
do_updwtmp (int sock, const char *file, const struct utmp *utmp) do_updwtmp (int sock, const char *file, const struct utmp *utmp)
{ {
updwtmp_request request; updwtmp_request *request;
updwtmp_reply reply; updwtmp_reply reply;
size_t size;
request.header.version = UTMPD_VERSION; size = sizeof (updwtmp_request) + strlen (file) + 1;
request.header.size = sizeof (updwtmp_request);
request.header.type = UTMPD_REQ_UPDWTMP; request = malloc (size);
strncpy (request.file, file, sizeof request.file); if (request == NULL)
memcpy (&request.utmp, utmp, sizeof (struct utmp)); return -1;
request->header.version = UTMPD_VERSION;
request->header.size = size;
request->header.type = UTMPD_REQ_UPDWTMP;
memcpy (&request->utmp, utmp, sizeof (struct utmp));
strcpy (request->file, file);
reply.header.version = UTMPD_VERSION; reply.header.version = UTMPD_VERSION;
reply.header.size = sizeof (updwtmp_reply); reply.header.size = sizeof (updwtmp_reply);
reply.header.type = UTMPD_REQ_UPDWTMP; reply.header.type = UTMPD_REQ_UPDWTMP;
if (send_request (sock, &request.header, &reply.header) < 0) if (send_request (sock, &request->header, &reply.header) < 0)
{
free (request);
return -1; return -1;
}
if (reply.result < 0) if (reply.result < 0)
__set_errno (reply.errnum); __set_errno (reply.errnum);
free (request);
return reply.result; return reply.result;
} }

View File

@ -24,10 +24,9 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include <utmp.h> #include <utmp.h>
#include <sys/file.h>
#include <sys/stat.h>
#include "utmp-private.h" #include "utmp-private.h"
@ -116,7 +115,7 @@ endutent_file (void)
static int static int
getutent_r_file (struct utmp *buffer, struct utmp **result) getutent_r_file (struct utmp *buffer, struct utmp **result)
{ {
int nbytes; ssize_t nbytes;
struct flock fl; /* Information struct for locking. */ struct flock fl; /* Information struct for locking. */
/* Open utmp file if not already done. */ /* Open utmp file if not already done. */
@ -136,7 +135,7 @@ getutent_r_file (struct utmp *buffer, struct utmp **result)
/* Try to get the lock. */ /* Try to get the lock. */
memset (&fl, '\0', sizeof (struct flock)); memset (&fl, '\0', sizeof (struct flock));
fl.l_type = F_WRLCK; fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET; fl.l_whence = SEEK_SET;
fcntl (file_fd, F_SETLKW, &fl); fcntl (file_fd, F_SETLKW, &fl);
@ -170,12 +169,20 @@ static int
getutline_r_file (const struct utmp *line, struct utmp *buffer, getutline_r_file (const struct utmp *line, struct utmp *buffer,
struct utmp **result) struct utmp **result)
{ {
struct flock fl;
if (file_fd < 0 || file_offset == -1l) if (file_fd < 0 || file_offset == -1l)
{ {
*result = NULL; *result = NULL;
return -1; return -1;
} }
/* Try to get the lock. */
memset (&fl, '\0', sizeof (struct flock));
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fcntl (file_fd, F_SETLKW, &fl);
while (1) while (1)
{ {
/* Read the next entry. */ /* Read the next entry. */
@ -185,7 +192,7 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
__set_errno (ESRCH); __set_errno (ESRCH);
file_offset = -1l; file_offset = -1l;
*result = NULL; *result = NULL;
return -1; goto unlock_return;
} }
file_offset += sizeof (struct utmp); file_offset += sizeof (struct utmp);
@ -203,7 +210,12 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
memcpy (buffer, &last_entry, sizeof (struct utmp)); memcpy (buffer, &last_entry, sizeof (struct utmp));
*result = buffer; *result = buffer;
return 0; unlock_return:
/* And unlock the file. */
fl.l_type = F_UNLCK;
fcntl (file_fd, F_SETLKW, &fl);
return ((result == NULL) ? -1 : 0);
} }
@ -237,6 +249,15 @@ proc_utmp_eq (const struct utmp *entry, const struct utmp *match)
static int static int
internal_getut_r (const struct utmp *id, struct utmp *buffer) internal_getut_r (const struct utmp *id, struct utmp *buffer)
{ {
int result = -1;
struct flock fl;
/* Try to get the lock. */
memset (&fl, '\0', sizeof (struct flock));
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fcntl (file_fd, F_SETLKW, &fl);
#if _HAVE_UT_TYPE - 0 #if _HAVE_UT_TYPE - 0
if (id->ut_type == RUN_LVL || id->ut_type == BOOT_TIME if (id->ut_type == RUN_LVL || id->ut_type == BOOT_TIME
|| id->ut_type == OLD_TIME || id->ut_type == NEW_TIME) || id->ut_type == OLD_TIME || id->ut_type == NEW_TIME)
@ -252,7 +273,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
{ {
__set_errno (ESRCH); __set_errno (ESRCH);
file_offset = -1l; file_offset = -1l;
return -1; goto unlock_return;
} }
file_offset += sizeof (struct utmp); file_offset += sizeof (struct utmp);
@ -274,7 +295,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
{ {
__set_errno (ESRCH); __set_errno (ESRCH);
file_offset = -1l; file_offset = -1l;
return -1; goto unlock_return;
} }
file_offset += sizeof (struct utmp); file_offset += sizeof (struct utmp);
@ -283,7 +304,14 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
} }
} }
return 0; result = 0;
unlock_return:
/* And unlock the file. */
fl.l_type = F_UNLCK;
fcntl (file_fd, F_SETLKW, &fl);
return result;
} }
@ -401,47 +429,50 @@ static int
updwtmp_file (const char *file, const struct utmp *utmp) updwtmp_file (const char *file, const struct utmp *utmp)
{ {
int result = -1; int result = -1;
struct stat st; struct flock fl;
ssize_t nbytes; off_t offset;
int fd; int fd;
/* Open WTMP file. */ /* Open WTMP file. */
fd = __open (file, O_WRONLY | O_APPEND); fd = open (file, O_WRONLY);
if (fd < 0) if (fd < 0)
return -1; return -1;
/* Try to lock the file. */ /* Try to get the lock. */
if (__flock (fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS) memset (&fl, '\0', sizeof (struct flock));
{ fl.l_type = F_WRLCK;
/* Oh, oh. The file is already locked. Wait a bit and try again. */ fl.l_whence = SEEK_SET;
sleep (1); fcntl (fd, F_SETLKW, &fl);
/* This time we ignore the error. */
__flock (fd, LOCK_EX | LOCK_NB);
}
/* Remember original size of log file. */ /* Remember original size of log file. */
if (__fstat (fd, &st) < 0) offset = lseek (fd, 0, SEEK_END);
goto fail; if (offset % sizeof (struct utmp) != 0)
{
offset -= offset % sizeof (struct utmp);
ftruncate (fd, offset);
if (lseek (fd, 0, SEEK_END) < 0)
goto unlock_return;
}
/* Write the entry. If we can't write all the bytes, reset the file /* Write the entry. If we can't write all the bytes, reset the file
size back to the original size. That way, no partial entries size back to the original size. That way, no partial entries
will remain. */ will remain. */
nbytes = __write (fd, utmp, sizeof (struct utmp)); if (write (fd, utmp, sizeof (struct utmp)) != sizeof (struct utmp))
if (nbytes != sizeof (struct utmp))
{ {
ftruncate (fd, st.st_size); ftruncate (fd, offset);
goto fail; goto unlock_return;
} }
result = 0; result = 0;
fail: unlock_return:
/* And unlock the file. */ /* And unlock the file. */
__flock (fd, LOCK_UN); fl.l_type = F_UNLCK;
fcntl (fd, F_SETLKW, &fl);
/* Close WTMP file. */ /* Close WTMP file. */
__close (fd); close (fd);
return result; return result;
} }

View File

@ -27,7 +27,7 @@ GAWK = gawk
.PHONY: all dvi info .PHONY: all dvi info
all: dvi info all: dvi info
dvi: libc.dvi dvi: libc.dvi
info: libc.info info: libc.info dir-add.info
# Get glibc's configuration info. # Get glibc's configuration info.
ifneq (,$(wildcard ../Makeconfig)) ifneq (,$(wildcard ../Makeconfig))
@ -75,7 +75,7 @@ stamp-summary: summary.awk $(chapters) $(chapters-incl)
# Generate a file which can be added to the `dir' content to provide direct # Generate a file which can be added to the `dir' content to provide direct
# access to the documentation of the function, variables, and other # access to the documentation of the function, variables, and other
# definitions. # definitions.
dir-add.texi: xtract-typefun.awk $(chapters) dir-add.texi: xtract-typefun.awk $(chapters) $(chapters-incl)
(echo "@dircategory GNU C library functions"; \ (echo "@dircategory GNU C library functions"; \
echo "@direntry"; \ echo "@direntry"; \
$(GAWK) -f $^ | sort; \ $(GAWK) -f $^ | sort; \
@ -101,7 +101,7 @@ distribute = $(minimal-dist) \
$(minimal-dist))) \ $(minimal-dist))) \
libc.info* libc.?? libc.??s texinfo.tex summary.texi \ libc.info* libc.?? libc.??s texinfo.tex summary.texi \
stamp-summary chapters chapters-incl1 chapters-incl2 \ stamp-summary chapters chapters-incl1 chapters-incl2 \
xtract-typefun.awk dir-add.texi dir-add.info xtract-typefun.awk dir-add.texi dir-add.info dir
export distribute := $(distribute) export distribute := $(distribute)
tar-it = tar chovf $@ $^ tar-it = tar chovf $@ $^
@ -143,6 +143,7 @@ realclean: distclean
install-data subdir_install: install install-data subdir_install: install
install: $(inst_infodir)/libc.info dir-add.info install: $(inst_infodir)/libc.info dir-add.info
@if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ @if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
test -f $(inst_infodir)/dir || cp dir $(inst_infodir);\
install-info --info-dir=$(inst_infodir) $(inst_infodir)/libc.info;\ install-info --info-dir=$(inst_infodir) $(inst_infodir)/libc.info;\
install-info --info-dir=$(inst_infodir) dir-add.info;\ install-info --info-dir=$(inst_infodir) dir-add.info;\
else : ; fi else : ; fi

View File

@ -271,13 +271,13 @@ group); in this usage, it's conventional to end the string with a
The group this option is in. The group this option is in.
In a long help message, options are sorted alphabetically within each In a long help message, options are sorted alphabetically within each
group, and the groups presented in the order 0, 1, 2, @dots{}, @var{n}, group, and the groups presented in the order @math{0, 1, 2, @dots{}, @var{n},
-@var{m}, @dots{}, -2, -1. Every entry in an options array with this -@var{m}, @dots{}, -2, -1}. Every entry in an options array with this
field 0 will inherit the group number of the previous entry, or zero if field 0 will inherit the group number of the previous entry, or zero if
it's the first one, unless its a group header (@code{name} and it's the first one, unless its a group header (@code{name} and
@code{key} fields both zero), in which case, the previous entry + 1 is @code{key} fields both zero), in which case, the previous entry @math{+ 1} is
the default. Automagic options such as @samp{--help} are put into group the default. Automagic options such as @samp{--help} are put into group
-1. --1.
Note that because of C structure initialization rules, this field Note that because of C structure initialization rules, this field
often need not be specified, because 0 is the right value. often need not be specified, because 0 is the right value.
@ -458,6 +458,35 @@ decrements the @code{next} field of its @var{state} argument, the option
won't be considered processed; this is to allow you to actually modify won't be considered processed; this is to allow you to actually modify
the argument (perhaps into an option), and have it processed again. the argument (perhaps into an option), and have it processed again.
@comment argp.h
@comment GNU
@item ARGP_KEY_ARGS
If a parser function returns @code{ARGP_ERR_UNKNOWN} for
@code{ARGP_KEY_ARG}, it is immediately called again with the key
@code{ARGP_KEY_ARGS}, which has a similar meaning, but is slightly more
convenient for consuming all remaining arguments. @var{arg} is 0, and
the tail of the argument vector may be found at @code{@var{state}->argv
+ @var{state}->next}. If success is returned for this key, and
@code{@var{state}->next} is unchanged, then all remaining arguments are
considered to have been consumed, otherwise, the amount by which
@code{@var{state}->next} has been adjust indicates how many were used.
For instance, here's an example that uses both, for different args:
@smallexample
...
case ARGP_KEY_ARG:
if (@var{state}->arg_num == 0)
/* First argument */
first_arg = @var{arg};
else
return ARGP_KEY_UNKNOWN; /* Let the next case parse it. */
break;
case ARGP_KEY_ARGS:
remaining_args = @var{state}->argv + @var{state}->next;
num_remaining_args = @var{state}->argc - @var{state}->next;
break;
@end smallexample
@comment argp.h @comment argp.h
@comment GNU @comment GNU
@item ARGP_KEY_END @item ARGP_KEY_END
@ -797,7 +826,11 @@ Don't exit on errors (they may still result in error messages).
@comment argp.h @comment argp.h
@comment GNU @comment GNU
@item ARGP_LONG_ONLY @item ARGP_LONG_ONLY
Use the gnu getopt `long-only' rules for parsing arguments. Use the gnu getopt `long-only' rules for parsing arguments. This
allows long-options to be recognized with only a single @samp{-} (for
instances, @samp{-help}), but results in a generally somewhat less
useful interface, that conflicts with the way most GNU programs work.
For this reason, its use is discouraged.
@comment argp.h @comment argp.h
@comment GNU @comment GNU

16
manual/dir Normal file
View File

@ -0,0 +1,16 @@
$Id$
This is the file .../info/dir, which contains the topmost node of the
Info hierarchy. The first time you invoke Info you start off
looking at that node, which is (dir)Top.

File: dir Node: Top This is the top of the INFO tree
This (the Directory node) gives a menu of major topics.
Typing "q" exits, "?" lists all Info commands, "d" returns here,
"h" gives a primer for first-timers,
"mEmacs<Return>" visits the Emacs topic, etc.
In Emacs, you can click mouse button 2 on a menu item or cross reference
to select it.
* Menu:

View File

@ -1443,6 +1443,15 @@ it is empty (rather than a pointer to an empty block of memory); this
invariant is maintained for argz vectors created by the functions here. invariant is maintained for argz vectors created by the functions here.
@end deftypefun @end deftypefun
@comment argz.h
@comment GNU
@deftypefun error_t argz_replace (@w{char **@var{argz}, size_t *@var{argz_len}}, @w{const char *@var{str}, const char *@var{with}}, @w{unsigned *@var{replace_count}})
Replace any occurances of the string @var{str} in @var{argz} with
@var{with}, reallocating @var{argz} as necessary. If
@var{replace_count} is non-zero, @code{*@var{replace_count}} will be
incremented by number of replacements performed.
@end deftypefun
@node Envz Functions, , Argz Functions, Argz and Envz Vectors @node Envz Functions, , Argz Functions, Argz and Envz Vectors
@subsection Envz Functions @subsection Envz Functions

View File

@ -1,5 +1,5 @@
%% TeX macros to handle Texinfo files. %% TeX macros to handle Texinfo files.
%% $Id: texinfo.tex,v 2.203 1997/06/13 22:43:07 drepper Exp $ %% \$Id: texinfo.tex,v 2.204 1997/06/19 18:21:08 drepper Exp $
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, % Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
% 94, 95, 96, 97 Free Software Foundation, Inc. % 94, 95, 96, 97 Free Software Foundation, Inc.
@ -36,7 +36,7 @@
% This automatically updates the version number based on RCS. % This automatically updates the version number based on RCS.
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
\deftexinfoversion$Revision: 2.203 $ \deftexinfoversion\$Revision: 2.204 $
\message{Loading texinfo package [Version \texinfoversion]:} \message{Loading texinfo package [Version \texinfoversion]:}
% If in a .fmt file, print the version number % If in a .fmt file, print the version number
@ -185,7 +185,13 @@
% %
\unvbox\headlinebox \unvbox\headlinebox
\pagebody{#1}% \pagebody{#1}%
\ifdim\ht\footlinebox > 0pt
% Only leave this space if the footline is nonempty.
% (We lessened \vsize for it in \oddfootingxxx.)
% The \baselineskip=24pt in plain's \makefootline has no effect.
\vskip 2\baselineskip
\unvbox\footlinebox \unvbox\footlinebox
\fi
% %
\ifcropmarks \ifcropmarks
\egroup % end of \vbox\bgroup \egroup % end of \vbox\bgroup
@ -1006,6 +1012,15 @@ where each line of input produces a line of output.}
\openindices \openindices
\fixbackslash % Turn off hack to swallow `\input texinfo'. \fixbackslash % Turn off hack to swallow `\input texinfo'.
\global\let\setfilename=\comment % Ignore extra @setfilename cmds. \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
%
% If texinfo.cnf is present on the system, read it.
% Useful for site-wide @afourpaper, etc.
% Just to be on the safe side, close the input stream before the \input.
\openin 1 texinfo.cnf
\ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
\closein1
\temp
%
\comment % Ignore the actual filename. \comment % Ignore the actual filename.
} }
@ -1504,10 +1519,7 @@ where each line of input produces a line of output.}
\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% \gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} \gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% \gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
@ -1515,12 +1527,15 @@ where each line of input produces a line of output.}
\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
%
% Leave some space for the footline. Hopefully ok to assume
% @evenfooting will not be used by itself.
\global\advance\pageheight by -3\baselineskip
\global\advance\vsize by -3\baselineskip
}
\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} \gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
% %
}% unbind the catcode of @. }% unbind the catcode of @.
@ -2244,6 +2259,12 @@ width0pt\relax} \fi
%\def\char{\realbackslash char}% %\def\char{\realbackslash char}%
\def\TeX{\realbackslash TeX}% \def\TeX{\realbackslash TeX}%
\def\dots{\realbackslash dots }% \def\dots{\realbackslash dots }%
\def\result{\realbackslash result}%
\def\equiv{\realbackslash equiv}%
\def\expansion{\realbackslash expansion}%
\def\print{\realbackslash print}%
\def\error{\realbackslash error}%
\def\point{\realbackslash point}%
\def\copyright{\realbackslash copyright}% \def\copyright{\realbackslash copyright}%
\def\tclose##1{\realbackslash tclose {##1}}% \def\tclose##1{\realbackslash tclose {##1}}%
\def\code##1{\realbackslash code {##1}}% \def\code##1{\realbackslash code {##1}}%
@ -2696,6 +2717,12 @@ width0pt\relax} \fi
\def\print{\realbackslash print}% \def\print{\realbackslash print}%
\def\TeX{\realbackslash TeX}% \def\TeX{\realbackslash TeX}%
\def\dots{\realbackslash dots}% \def\dots{\realbackslash dots}%
\def\result{\realbackslash result}%
\def\equiv{\realbackslash equiv}%
\def\expansion{\realbackslash expansion}%
\def\print{\realbackslash print}%
\def\error{\realbackslash error}%
\def\point{\realbackslash point}%
\def\copyright{\realbackslash copyright}% \def\copyright{\realbackslash copyright}%
\def\tt{\realbackslash tt}% \def\tt{\realbackslash tt}%
\def\bf{\realbackslash bf}% \def\bf{\realbackslash bf}%

View File

@ -39,20 +39,20 @@ extra-libs-others = $(extra-libs)
libm-map := libm.map libm-map := libm.map
libm-support = k_standard s_lib_version s_matherr s_signgam \ libm-support = k_standard s_lib_version s_matherr s_signgam \
s_rinttol s_rinttoll s_roundtol s_roundtoll \ s_lrint s_llrint s_lround s_llround \
fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg \ fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg \
ftestexcept fegetround fesetround fegetenv feholdexcpt \ ftestexcept fegetround fesetround fegetenv feholdexcpt \
fesetenv feupdateenv fesetenv feupdateenv
libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod \ libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod \
e_hypot e_j0 e_j1 e_jn e_lgamma_r e_log e_log10 e_pow \ e_hypot e_j0 e_j1 e_jn e_lgamma_r e_log e_log10 e_pow \
e_rem_pio2 e_remainder e_scalb e_sinh e_sqrt k_cos \ e_rem_pio2 e_remainder e_scalb e_sinh e_sqrt e_gamma_r \
k_rem_pio2 k_sin k_tan s_asinh s_atan s_cbrt \ k_cos k_rem_pio2 k_sin k_tan s_asinh s_atan s_cbrt \
s_ceil s_copysign s_cos s_erf s_expm1 s_fabs s_finite \ s_ceil s_copysign s_cos s_erf s_expm1 s_fabs s_finite \
s_floor s_frexp s_ilogb s_ldexp s_log1p s_logb \ s_floor s_frexp s_ilogb s_ldexp s_log1p s_logb \
s_modf s_nextafter s_rint s_scalbn s_significand \ s_modf s_nextafter s_rint s_scalbn s_significand \
s_sin s_tan s_tanh w_acos w_acosh w_asin \ 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_fmod w_gamma \
w_gamma_r w_hypot w_j0 w_j1 w_jn w_lgamma w_lgamma_r \ 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 \ 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 \ s_signbit s_fpclassify s_fmax s_fmin s_fdim s_nan s_trunc \
s_remquo s_log2 s_exp2 s_round s_nearbyint s_sincos \ s_remquo s_log2 s_exp2 s_round s_nearbyint s_sincos \

View File

@ -47,8 +47,8 @@
ilogb, isfinite, isinf, isnan, isnormal, ilogb, isfinite, isinf, isnan, isnormal,
ldexp, lgamma, log, log10, log1p, log2, logb, ldexp, lgamma, log, log10, log1p, log2, logb,
modf, nearbyint, nextafter, modf, nearbyint, nextafter,
pow, remainder, remquo, rint, rinttol, rinttoll, pow, remainder, remquo, rint, lrint, llrint,
round, roundtol, roundtoll, round, lround, llround,
scalb, scalbn, signbit, sin, sincos, sinh, sqrt, tan, tanh, trunc scalb, scalbn, signbit, sin, sincos, sinh, sqrt, tan, tanh, trunc
and for the following complex math functions: and for the following complex math functions:
@ -593,6 +593,35 @@ check_int (const char *test_name, int computed, int expected)
fpstack_test (test_name); fpstack_test (test_name);
} }
static void
check_int_exc (const char *test_name, int computed, int expected,
short exception)
{
int diff = computed - expected;
int result = diff == 0;
output_new_test (test_name);
test_exceptions (test_name, exception);
if (result)
{
output_pass_value ();
}
else
{
output_fail_value (test_name);
if (verbose > 1)
{
printf ("Result:\n");
printf (" is: %d\n", computed);
printf (" should be: %d\n", expected);
}
noErrors++;
}
fpstack_test (test_name);
}
/* /*
check that computed and expected values are equal (long int values) check that computed and expected values are equal (long int values)
@ -953,7 +982,9 @@ atan2_test (void)
static void static void
atanh_test (void) atanh_test (void)
{ {
#ifndef TEST_INLINE
MATHTYPE x; MATHTYPE x;
#endif
check ("atanh(+0) == +0", FUNC(atanh) (0), 0); check ("atanh(+0) == +0", FUNC(atanh) (0), 0);
#ifndef TEST_INLINE #ifndef TEST_INLINE
@ -1089,7 +1120,7 @@ static void
exp2_test (void) exp2_test (void)
{ {
errno = 0; errno = 0;
exp2(0); FUNC(exp2) (0);
if (errno == ENOSYS) if (errno == ENOSYS)
/* Function not implemented. */ /* Function not implemented. */
return; return;
@ -1257,7 +1288,6 @@ signbit_test (void)
check_bool ("signbit (-0) != 0", signbit (minus_zero)); check_bool ("signbit (-0) != 0", signbit (minus_zero));
check_bool ("signbit (+inf) == 0", signbit (plus_infty) == 0); check_bool ("signbit (+inf) == 0", signbit (plus_infty) == 0);
check_bool ("signbit (-inf) != 0", signbit (minus_infty)); check_bool ("signbit (-inf) != 0", signbit (minus_infty));
check_bool ("signbit (NaN) == 0", signbit (nan_value));
x = random_less (0); x = random_less (0);
check_bool ("signbit (x) != 0 for x < 0", signbit (x)); check_bool ("signbit (x) != 0 for x < 0", signbit (x));
@ -1272,21 +1302,26 @@ signbit_test (void)
static void static void
gamma_test (void) gamma_test (void)
{ {
MATHTYPE x; errno = 0;
FUNC(gamma) (0);
if (errno == ENOSYS)
/* Function not implemented. */
return;
feclearexcept (FE_ALL_EXCEPT);
check_isinfp ("gamma (+inf) == +inf", FUNC(gamma) (plus_infty)); check_isinfp ("gamma (+inf) == +inf", FUNC(gamma) (plus_infty));
check_isnan_exc ("gamma (0) == NaN plus invalid exception", check_isnan_exc ("gamma (0) == NaN plus invalid exception",
FUNC(gamma) (0), INVALID_EXCEPTION); FUNC(gamma) (0), INVALID_EXCEPTION);
x = random_less (0.0); check_isnan_exc_ext ("gamma (x) == NaN plus invalid exception for integer x <= 0",
check_isnan_exc_ext ("gamma (x) == NaN plus invalid exception for x <= 0", FUNC(gamma) (-2), INVALID_EXCEPTION, -2);
FUNC(gamma) (x), INVALID_EXCEPTION, x);
check_isnan_exc ("gamma (-inf) == NaN plus invalid exception", check_isnan_exc ("gamma (-inf) == NaN plus invalid exception",
FUNC(gamma) (minus_infty), INVALID_EXCEPTION); FUNC(gamma) (minus_infty), INVALID_EXCEPTION);
check ("gamma (0.5) == sqrt(pi)", FUNC(gamma) (0.5), FUNC(sqrt) (M_PI)); check_eps ("gamma (0.5) == sqrt(pi)", FUNC(gamma) (0.5), FUNC(sqrt) (M_PI),
check ("gamma (-0.5) == -2*sqrt(pi)", FUNC(gamma) (-0.5), CHOOSE (0, 5e-16, 2e-7));
-2*FUNC(sqrt) (M_PI)); check_eps ("gamma (-0.5) == -2*sqrt(pi)", FUNC(gamma) (-0.5),
-2*FUNC(sqrt) (M_PI), CHOOSE (0, 5e-16, 3e-7));
check ("gamma (1) == 1", FUNC(gamma) (1), 1); check ("gamma (1) == 1", FUNC(gamma) (1), 1);
check ("gamma (4) == 6", FUNC(gamma) (4), 6); check ("gamma (4) == 6", FUNC(gamma) (4), 6);
@ -1297,15 +1332,19 @@ gamma_test (void)
static void static void
lgamma_test (void) lgamma_test (void)
{ {
MATHTYPE x; errno = 0;
FUNC(lgamma) (0);
if (errno == ENOSYS)
/* Function not implemented. */
return;
feclearexcept (FE_ALL_EXCEPT);
check_isinfp ("lgamma (+inf) == +inf", FUNC(lgamma) (plus_infty)); check_isinfp ("lgamma (+inf) == +inf", FUNC(lgamma) (plus_infty));
check_isnan_exc ("lgamma (0) == +inf plus divide by zero exception", check_isinfp_exc ("lgamma (0) == +inf plus divide by zero exception",
FUNC(lgamma) (0), DIVIDE_BY_ZERO_EXCEPTION); FUNC(lgamma) (0), DIVIDE_BY_ZERO_EXCEPTION);
x = random_less (0.0); check_isinfp_exc ("lgamma (x) == +inf plus divide by zero exception for integer x <= 0",
check_isnan_exc_ext ("lgamma (x) == +inf plus divide by zero exception for x <= 0", FUNC(lgamma) (-3), DIVIDE_BY_ZERO_EXCEPTION);
FUNC(lgamma) (x), DIVIDE_BY_ZERO_EXCEPTION, x);
check_isnan_exc ("lgamma (-inf) == NaN plus invalid exception", check_isnan_exc ("lgamma (-inf) == NaN plus invalid exception",
FUNC(lgamma) (minus_infty), INVALID_EXCEPTION); FUNC(lgamma) (minus_infty), INVALID_EXCEPTION);
@ -1331,23 +1370,15 @@ static void
ilogb_test (void) ilogb_test (void)
{ {
/* XXX Are these tests correct? I couldn't find any specification */ check_int ("ilogb (1) == 0", FUNC(ilogb) (1), 0);
#if 0 check_int ("ilogb (e) == 1", FUNC(ilogb) (M_E), 1);
/* the source suggests that the following calls should fail - check_int ("ilogb (1024) == 10", FUNC(ilogb) (1024), 10);
but shall we test these special cases or just ignore them? */ check_int ("ilogb (-2000) == 10", FUNC(ilogb) (-2000), 10);
check_isinfp ("ilogb (+inf) == +inf", FUNC(ilogb) (plus_infty));
check_isinfp ("ilogb (-inf) == +inf", FUNC(ilogb) (minus_infty));
check_isinfn_exc ("ilogb (+0) == -inf plus divide-by-zero exception", check_int_exc ("ilogb (0) == FP_ILOGB0", FUNC(ilogb) (0.0), FP_ILOGB0,
FUNC(ilogb) (0), DIVIDE_BY_ZERO_EXCEPTION); DIVIDE_BY_ZERO_EXCEPTION|INVALID_EXCEPTION);
check_int_exc ("ilogb (NaN) == FP_ILOGBNAN", FUNC(ilogb) (nan_value),
check_isinfn_exc ("ilogb (-0) == -inf plus divide-by-zero exception", FP_ILOGBNAN, INVALID_EXCEPTION);
FUNC(ilogb) (minus_zero), DIVIDE_BY_ZERO_EXCEPTION);
#endif
check ("ilogb (1) == 0", FUNC(ilogb) (1), 0);
check ("ilogb (e) == 1", FUNC(ilogb) (M_E), 1);
check ("ilogb (1024) == 10", FUNC(ilogb) (1024), 10);
check ("ilogb (-2000) == 10", FUNC(ilogb) (-2000), 10);
} }
@ -1526,17 +1557,72 @@ scalb_test (void)
{ {
MATHTYPE x; MATHTYPE x;
check ("scalb (0, 0) == 0", FUNC(scalb) (0, 0), 0); check_isnan ("scalb (2, 0.5) == NaN", FUNC(scalb) (2, 0.5));
check_isnan ("scalb (3, -2.5) == NaN", FUNC(scalb) (3, -2.5));
check_isnan ("scalb (0, NaN) == NaN", FUNC(scalb) (0, nan_value));
check_isnan ("scalb (1, NaN) == NaN", FUNC(scalb) (1, nan_value));
x = random_greater (0.0);
check ("scalb (x, 0) == 0", FUNC(scalb) (x, 0), x);
x = random_greater (0.0);
check ("scalb (-x, 0) == 0", FUNC(scalb) (-x, 0), -x);
check_isnan_exc ("scalb (+0, +inf) == NaN plus invalid exception",
FUNC(scalb) (0, plus_infty), INVALID_EXCEPTION);
check_isnan_exc ("scalb (-0, +inf) == NaN plus invalid exception",
FUNC(scalb) (minus_zero, plus_infty), INVALID_EXCEPTION);
check ("scalb (+0, 2) == +0", FUNC(scalb) (0, 2), 0);
check ("scalb (-0, 4) == -0", FUNC(scalb) (minus_zero, -4), minus_zero);
check ("scalb (+0, 0) == +0", FUNC(scalb) (0, 0), 0);
check ("scalb (-0, 0) == -0", FUNC(scalb) (minus_zero, 0), minus_zero);
check ("scalb (+0, -1) == +0", FUNC(scalb) (0, -1), 0);
check ("scalb (-0, -10) == -0", FUNC(scalb) (minus_zero, -10), minus_zero);
check ("scalb (+0, -inf) == +0", FUNC(scalb) (0, minus_infty), 0);
check ("scalb (-0, -inf) == -0", FUNC(scalb) (minus_zero, minus_infty),
minus_zero);
check_isinfp ("scalb (+inf, -1) == +inf", FUNC(scalb) (plus_infty, -1));
check_isinfn ("scalb (-inf, -10) == -inf", FUNC(scalb) (minus_infty, -10));
check_isinfp ("scalb (+inf, 0) == +inf", FUNC(scalb) (plus_infty, 0));
check_isinfn ("scalb (-inf, 0) == -inf", FUNC(scalb) (minus_infty, 0));
check_isinfp ("scalb (+inf, 2) == +inf", FUNC(scalb) (plus_infty, 2));
check_isinfn ("scalb (-inf, 100) == -inf", FUNC(scalb) (minus_infty, 100));
check ("scalb (0, -inf) == 0", FUNC(scalb) (0.0, minus_infty), 0.0);
check ("scalb (-0, -inf) == -0", FUNC(scalb) (minus_zero, minus_infty),
minus_zero);
x = random_greater (0.0);
check ("scalb (x, -inf) == 0", FUNC(scalb) (x, minus_infty), 0.0);
check ("scalb (-x, -inf) == -0", FUNC(scalb) (-x, minus_infty), minus_zero);
x = random_greater (0.0);
check_isinfp ("scalb (x, +inf) == +inf", FUNC(scalb) (x, plus_infty));
x = random_greater (0.0);
check_isinfn ("scalb (-x, +inf) == -inf", FUNC(scalb) (-x, plus_infty));
check_isinfp ("scalb (+inf, +inf) == +inf",
FUNC(scalb) (plus_infty, plus_infty));
check_isinfn ("scalb (-inf, +inf) == -inf",
FUNC(scalb) (minus_infty, plus_infty));
check_isnan ("scalb (+inf, -inf) == NaN",
FUNC(scalb) (plus_infty, minus_infty));
check_isnan ("scalb (-inf, -inf) == NaN",
FUNC(scalb) (minus_infty, minus_infty));
check_isinfp ("scalb (+inf, 1) == +inf", FUNC(scalb) (plus_infty, 1));
check_isinfn ("scalb (-inf, 1) == -inf", FUNC(scalb) (minus_infty, 1));
check_isnan ("scalb (NaN, 1) == NaN", FUNC(scalb) (nan_value, 1)); check_isnan ("scalb (NaN, 1) == NaN", FUNC(scalb) (nan_value, 1));
check_isnan ("scalb (1, NaN) == NaN", FUNC(scalb) (1, nan_value));
check_isnan ("scalb (NaN, 0) == NaN", FUNC(scalb) (nan_value, 0));
check_isnan ("scalb (0, NaN) == NaN", FUNC(scalb) (0, nan_value));
check_isnan ("scalb (NaN, +inf) == NaN",
FUNC(scalb) (nan_value, plus_infty));
check_isnan ("scalb (+inf, NaN) == NaN",
FUNC(scalb) (plus_infty, nan_value));
check_isnan ("scalb (NaN, NaN) == NaN", FUNC(scalb) (nan_value, nan_value));
check ("scalb (0.8, 4) == 12.8", FUNC(scalb) (0.8L, 4), 12.8L); check ("scalb (0.8, 4) == 12.8", FUNC(scalb) (0.8L, 4), 12.8L);
check ("scalb (-0.854375, 5) == -27.34", FUNC(scalb) (-0.854375L, 5), -27.34L); check ("scalb (-0.854375, 5) == -27.34", FUNC(scalb) (-0.854375L, 5), -27.34L);
x = random_greater (0.0);
check_ext ("scalb (x, 0) == x", FUNC(scalb) (x, 0L), x, x);
} }
@ -1630,14 +1716,15 @@ sincos_test (void)
check ("sincos (pi/2, &sin, &cos) puts 1 in sin", sin_res, 1); check ("sincos (pi/2, &sin, &cos) puts 1 in sin", sin_res, 1);
fesetenv (&fenv); fesetenv (&fenv);
check_eps ("sincos (pi/2, &sin, &cos) puts 0 in cos", cos_res, 0, check_eps ("sincos (pi/2, &sin, &cos) puts 0 in cos", cos_res, 0,
CHOOSE(0, 1e-16, 1e-7)); CHOOSE (1e-18L, 1e-16, 1e-7));
FUNC(sincos) (M_PI / 6.0, &sin_res, &cos_res); FUNC(sincos) (M_PI / 6.0, &sin_res, &cos_res);
check ("sincos (pi/6, &sin, &cos) puts 0.5 in sin", sin_res, 0.5); check_eps ("sincos (pi/6, &sin, &cos) puts 0.5 in sin", sin_res, 0.5,
CHOOSE (5e-18L, 0, 0));
FUNC(sincos) (M_PI / 3.0, &sin_res, &cos_res); FUNC(sincos) (M_PI / 3.0, &sin_res, &cos_res);
check_eps ("sincos (pi/3, &sin, &cos) puts 0.5 in cos", cos_res, 0.5, check_eps ("sincos (pi/3, &sin, &cos) puts 0.5 in cos", cos_res, 0.5,
CHOOSE(0, 1e-15, 1e-7)); CHOOSE (5e-18L, 1e-15, 1e-7));
} }
@ -2045,13 +2132,13 @@ fmod_test (void)
FUNC(fmod) (x, minus_infty), x, x); FUNC(fmod) (x, minus_infty), x, x);
check_eps ("fmod (6.5, 2.3) == 1.9", FUNC(fmod) (6.5, 2.3), 1.9, check_eps ("fmod (6.5, 2.3) == 1.9", FUNC(fmod) (6.5, 2.3), 1.9,
CHOOSE(0, 1e-15, 0)); CHOOSE(5e-16, 1e-15, 2e-7));
check_eps ("fmod (-6.5, 2.3) == -1.9", FUNC(fmod) (-6.5, 2.3), -1.9, check_eps ("fmod (-6.5, 2.3) == -1.9", FUNC(fmod) (-6.5, 2.3), -1.9,
CHOOSE(0, 1e-15, 0)); CHOOSE(5e-16, 1e-15, 2e-7));
check_eps ("fmod (6.5, -2.3) == 1.9", FUNC(fmod) (6.5, -2.3), 1.9, check_eps ("fmod (6.5, -2.3) == 1.9", FUNC(fmod) (6.5, -2.3), 1.9,
CHOOSE(0, 1e-15, 0)); CHOOSE(5e-16, 1e-15, 2e-7));
check_eps ("fmod (-6.5, -2.3) == -1.9", FUNC(fmod) (-6.5, -2.3), -1.9, check_eps ("fmod (-6.5, -2.3) == -1.9", FUNC(fmod) (-6.5, -2.3), -1.9,
CHOOSE(0, 1e-15, 0)); CHOOSE(5e-16, 1e-15, 2e-7));
} }
@ -4355,44 +4442,44 @@ rint_test (void)
static void static void
rinttol_test (void) lrint_test (void)
{ {
/* XXX this test is incomplete. We need to have a way to specifiy /* XXX this test is incomplete. We need to have a way to specifiy
the rounding method and test the critical cases. So far, only the rounding method and test the critical cases. So far, only
unproblematic numbers are tested. */ unproblematic numbers are tested. */
check_long ("rinttol(0) = 0", rinttol (0.0), 0); check_long ("lrint(0) = 0", lrint (0.0), 0);
check_long ("rinttol(-0) = 0", rinttol (minus_zero), 0); check_long ("lrint(-0) = 0", lrint (minus_zero), 0);
check_long ("rinttol(0.2) = 0", rinttol (0.2), 0); check_long ("lrint(0.2) = 0", lrint (0.2), 0);
check_long ("rinttol(-0.2) = 0", rinttol (-0.2), 0); check_long ("lrint(-0.2) = 0", lrint (-0.2), 0);
check_long ("rinttol(1.4) = 1", rinttol (1.4), 1); check_long ("lrint(1.4) = 1", lrint (1.4), 1);
check_long ("rinttol(-1.4) = -1", rinttol (-1.4), -1); check_long ("lrint(-1.4) = -1", lrint (-1.4), -1);
check_long ("rinttol(8388600.3) = 8388600", rinttol (8388600.3), 8388600); check_long ("lrint(8388600.3) = 8388600", lrint (8388600.3), 8388600);
check_long ("rinttol(-8388600.3) = -8388600", rinttol (-8388600.3), check_long ("lrint(-8388600.3) = -8388600", lrint (-8388600.3),
-8388600); -8388600);
} }
static void static void
rinttoll_test (void) llrint_test (void)
{ {
/* XXX this test is incomplete. We need to have a way to specifiy /* XXX this test is incomplete. We need to have a way to specifiy
the rounding method and test the critical cases. So far, only the rounding method and test the critical cases. So far, only
unproblematic numbers are tested. */ unproblematic numbers are tested. */
check_longlong ("rinttoll(0) = 0", rinttoll (0.0), 0); check_longlong ("llrint(0) = 0", llrint (0.0), 0);
check_longlong ("rinttoll(-0) = 0", rinttoll (minus_zero), 0); check_longlong ("llrint(-0) = 0", llrint (minus_zero), 0);
check_longlong ("rinttoll(0.2) = 0", rinttoll (0.2), 0); check_longlong ("llrint(0.2) = 0", llrint (0.2), 0);
check_longlong ("rinttoll(-0.2) = 0", rinttoll (-0.2), 0); check_longlong ("llrint(-0.2) = 0", llrint (-0.2), 0);
check_longlong ("rinttoll(1.4) = 1", rinttoll (1.4), 1); check_longlong ("llrint(1.4) = 1", llrint (1.4), 1);
check_longlong ("rinttoll(-1.4) = -1", rinttoll (-1.4), -1); check_longlong ("llrint(-1.4) = -1", llrint (-1.4), -1);
check_longlong ("rinttoll(8388600.3) = 8388600", rinttoll (8388600.3), check_longlong ("llrint(8388600.3) = 8388600", llrint (8388600.3),
8388600); 8388600);
check_longlong ("rinttoll(-8388600.3) = -8388600", rinttoll (-8388600.3), check_longlong ("llrint(-8388600.3) = -8388600", llrint (-8388600.3),
-8388600); -8388600);
} }
@ -4416,45 +4503,45 @@ round_test (void)
static void static void
roundtol_test (void) lround_test (void)
{ {
check_long ("roundtol(0) = 0", roundtol (0), 0); check_long ("lround(0) = 0", lround (0), 0);
check_long ("roundtol(-0) = 0", roundtol (minus_zero), 0); check_long ("lround(-0) = 0", lround (minus_zero), 0);
check_long ("roundtol(0.2) = 0", roundtol (0.2), 0.0); check_long ("lround(0.2) = 0", lround (0.2), 0.0);
check_long ("roundtol(-0.2) = 0", roundtol (-0.2), 0); check_long ("lround(-0.2) = 0", lround (-0.2), 0);
check_long ("roundtol(0.5) = 1", roundtol (0.5), 1); check_long ("lround(0.5) = 1", lround (0.5), 1);
check_long ("roundtol(-0.5) = -1", roundtol (-0.5), -1); check_long ("lround(-0.5) = -1", lround (-0.5), -1);
check_long ("roundtol(0.8) = 1", roundtol (0.8), 1); check_long ("lround(0.8) = 1", lround (0.8), 1);
check_long ("roundtol(-0.8) = -1", roundtol (-0.8), -1); check_long ("lround(-0.8) = -1", lround (-0.8), -1);
check_long ("roundtol(1.5) = 2", roundtol (1.5), 2); check_long ("lround(1.5) = 2", lround (1.5), 2);
check_long ("roundtol(-1.5) = -2", roundtol (-1.5), -2); check_long ("lround(-1.5) = -2", lround (-1.5), -2);
check_long ("roundtol(2097152.5) = 2097153", roundtol (2097152.5), 2097153); check_long ("lround(2097152.5) = 2097153", lround (2097152.5), 2097153);
check_long ("roundtol(-2097152.5) = -2097153", roundtol (-2097152.5), check_long ("lround(-2097152.5) = -2097153", lround (-2097152.5),
-2097153); -2097153);
} }
static void static void
roundtoll_test (void) llround_test (void)
{ {
check_longlong ("roundtoll(0) = 0", roundtoll (0), 0); check_longlong ("llround(0) = 0", llround (0), 0);
check_longlong ("roundtoll(-0) = 0", roundtoll (minus_zero), 0); check_longlong ("llround(-0) = 0", llround (minus_zero), 0);
check_longlong ("roundtoll(0.2) = 0", roundtoll (0.2), 0.0); check_longlong ("llround(0.2) = 0", llround (0.2), 0.0);
check_longlong ("roundtoll(-0.2) = 0", roundtoll (-0.2), 0); check_longlong ("llround(-0.2) = 0", llround (-0.2), 0);
check_longlong ("roundtoll(0.5) = 1", roundtoll (0.5), 1); check_longlong ("llround(0.5) = 1", llround (0.5), 1);
check_longlong ("roundtoll(-0.5) = -1", roundtoll (-0.5), -1); check_longlong ("llround(-0.5) = -1", llround (-0.5), -1);
check_longlong ("roundtoll(0.8) = 1", roundtoll (0.8), 1); check_longlong ("llround(0.8) = 1", llround (0.8), 1);
check_longlong ("roundtoll(-0.8) = -1", roundtoll (-0.8), -1); check_longlong ("llround(-0.8) = -1", llround (-0.8), -1);
check_longlong ("roundtoll(1.5) = 2", roundtoll (1.5), 2); check_longlong ("llround(1.5) = 2", llround (1.5), 2);
check_longlong ("roundtoll(-1.5) = -2", roundtoll (-1.5), -2); check_longlong ("llround(-1.5) = -2", llround (-1.5), -2);
check_longlong ("roundtoll(2097152.5) = 2097153", check_longlong ("llround(2097152.5) = 2097153",
roundtoll (2097152.5), 2097153); llround (2097152.5), 2097153);
check_longlong ("roundtoll(-2097152.5) = -2097153", check_longlong ("llround(-2097152.5) = -2097153",
roundtoll (-2097152.5), -2097153); llround (-2097152.5), -2097153);
check_longlong ("roundtoll(34359738368.5) = 34359738369", check_longlong ("llround(34359738368.5) = 34359738369",
roundtoll (34359738368.5), 34359738369ll); llround (34359738368.5), 34359738369ll);
check_longlong ("roundtoll(-34359738368.5) = -34359738369", check_longlong ("llround(-34359738368.5) = -34359738369",
roundtoll (-34359738368.5), -34359738369ll); llround (-34359738368.5), -34359738369ll);
} }
@ -4811,11 +4898,11 @@ main (int argc, char *argv[])
floor_test (); floor_test ();
nearbyint_test (); nearbyint_test ();
rint_test (); rint_test ();
rinttol_test (); lrint_test ();
rinttoll_test (); llrint_test ();
round_test (); round_test ();
roundtol_test (); lround_test ();
roundtoll_test (); llround_test ();
trunc_test (); trunc_test ();
/* remainder functions */ /* remainder functions */

View File

@ -186,13 +186,13 @@ enum
/* Round X to nearest integral value according to current rounding /* Round X to nearest integral value according to current rounding
direction. */ direction. */
extern long int rinttol __P ((long double __x)); extern long int lrint __P ((long double __x));
extern long long int rinttoll __P ((long double __x)); extern long long int llrint __P ((long double __x));
/* Round X to nearest integral value, rounding halfway cases away from /* Round X to nearest integral value, rounding halfway cases away from
zero. */ zero. */
extern long int roundtol __P ((long double __x)); extern long int lround __P ((long double __x));
extern long long int roundtoll __P ((long double __x)); extern long long int llround __P ((long double __x));
/* Comparison macros. */ /* Comparison macros. */

View File

@ -138,9 +138,7 @@ __MATHCALL (sqrt,, (_Mdouble_ __x));
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X
/* Return `sqrt(X*X + Y*Y)'. */ /* Return `sqrt(X*X + Y*Y)'. */
__MATHCALL (hypot,, (_Mdouble_ __x, _Mdouble_ __y)); __MATHCALL (hypot,, (_Mdouble_ __x, _Mdouble_ __y));
#endif
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
/* Return the cube root of X. */ /* Return the cube root of X. */
__MATHCALL (cbrt,, (_Mdouble_ __x)); __MATHCALL (cbrt,, (_Mdouble_ __x));
#endif #endif
@ -177,9 +175,6 @@ __MATHDECLX (int,finite,, (_Mdouble_ __value), (__const__));
and may return an infinity or NaN, or may do something else. */ and may return an infinity or NaN, or may do something else. */
__MATHCALLX (infnan,, (int __error), (__const__)); __MATHCALLX (infnan,, (int __error), (__const__));
/* Return X times (2 to the Nth power). */
__MATHCALL (scalbn,, (_Mdouble_ __x, int __n));
/* Return the remainder of X/Y. */ /* Return the remainder of X/Y. */
__MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y)); __MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y));
@ -203,9 +198,6 @@ __MATHCALLX (nan,, (__const char *__tagb), (__const__));
/* Return nonzero if VALUE is not a number. */ /* Return nonzero if VALUE is not a number. */
__MATHDECLX (int,isnan,, (_Mdouble_ __value), (__const__)); __MATHDECLX (int,isnan,, (_Mdouble_ __value), (__const__));
/* Return the binary exponent of X, which must be nonzero. */
__MATHDECL (int,ilogb,, (_Mdouble_ __x));
/* Bessel functions. */ /* Bessel functions. */
__MATHCALL (j0,, (_Mdouble_)); __MATHCALL (j0,, (_Mdouble_));
__MATHCALL (j1,, (_Mdouble_)); __MATHCALL (j1,, (_Mdouble_));
@ -222,6 +214,7 @@ __MATHCALL (erf,, (_Mdouble_));
__MATHCALL (erfc,, (_Mdouble_)); __MATHCALL (erfc,, (_Mdouble_));
__MATHCALL (gamma,, (_Mdouble_)); __MATHCALL (gamma,, (_Mdouble_));
__MATHCALL (lgamma,, (_Mdouble_)); __MATHCALL (lgamma,, (_Mdouble_));
#endif
#ifdef __USE_MISC #ifdef __USE_MISC
/* Reentrant versions of gamma and lgamma. Those functions use the global /* Reentrant versions of gamma and lgamma. Those functions use the global
@ -231,8 +224,6 @@ __MATHCALL (gamma,_r, (_Mdouble_, int *));
__MATHCALL (lgamma,_r, (_Mdouble_, int *)); __MATHCALL (lgamma,_r, (_Mdouble_, int *));
#endif #endif
#endif /* Use misc or X/Open. */
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X
/* Return the integer nearest X in the direction of the /* Return the integer nearest X in the direction of the
@ -244,11 +235,15 @@ __MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__));
/* Return the remainder of integer divison X / Y with infinite precision. */ /* Return the remainder of integer divison X / Y with infinite precision. */
__MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y)); __MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y));
#endif
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
/* Return X times (2 to the Nth power). */ /* Return X times (2 to the Nth power). */
__MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n)); __MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n));
/* Return X times (2 to the Nth power). */
__MATHCALL (scalbn,, (_Mdouble_ __x, long int __n));
/* Return the binary exponent of X, which must be nonzero. */
__MATHDECL (int,ilogb,, (_Mdouble_ __x));
#endif #endif
#ifdef __USE_ISOC9X #ifdef __USE_ISOC9X

View File

@ -45,6 +45,8 @@ ifeq ($(crypt-in-libc),yes)
routines += $(libcrypt-routines) routines += $(libcrypt-routines)
endif endif
$(objpfx)md5test: $(objpfx)md5.o
include ../Rules include ../Rules
ifeq ($(build-shared),yes) ifeq ($(build-shared),yes)

View File

@ -22,7 +22,7 @@
subdir := nis subdir := nis
headers := $(wildcard rpcsvc/*.[hx]) headers := $(wildcard rpcsvc/*.[hx])
distribute := nss-nis.h nss-nisplus.h distribute := nss-nis.h nss-nisplus.h nis_intern.h Banner
# These are the databases available for the nis (and perhaps later nisplus) # These are the databases available for the nis (and perhaps later nisplus)
# service. This must be a superset of the services in nss. # service. This must be a superset of the services in nss.

View File

@ -6,21 +6,17 @@ char *files[500];
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
char buf[FILENAME_MAX];
char *fn;
FILE *fp; FILE *fp;
int i; int i;
for (i = 0; i < 500; i++) { for (i = 0; i < 500; i++) {
fn = __stdio_gen_tempname(buf, sizeof (buf), (const char *) NULL, files[i] = tempnam (NULL, "file");
"file", 0, (size_t *) NULL, (FILE **) NULL); if (files[i] == NULL) {
if (fn == NULL) { printf ("tempnam failed\n");
printf ("__stdio_gen_tempname failed\n");
exit (1); exit (1);
} }
files[i] = strdup (fn); printf ("file: %s\n", files[i]);
printf ("file: %s\n", fn); fp = fopen (files[i], "w");
fp = fopen (fn, "w");
fclose (fp); fclose (fp);
} }

View File

@ -166,6 +166,12 @@ main (int argc, char **argv)
if (res != 1 || a != 0) if (res != 1 || a != 0)
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
res = sscanf ("1e3", "%lg%n", &a, &n);
printf ("res = %d, a = %g, n = %d\n", res, a, n);
if (res != 1 || a != 1000 || n != 3)
exit (EXIT_FAILURE);
} }
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);

View File

@ -54,8 +54,10 @@
# undef va_list # undef va_list
# define va_list _IO_va_list # define va_list _IO_va_list
# define ungetc(c, s) (--read_in, _IO_ungetc (c, s)) # define ungetc(c, s) ((void) ((int) c != EOF && --read_in), \
# define inchar() ((c = _IO_getc_unlocked (s)), (void) ++read_in, c) _IO_ungetc (c, s))
# define inchar() ((c = _IO_getc_unlocked (s)), \
(void) (c != EOF && ++read_in), c)
# define encode_error() do { \ # define encode_error() do { \
if (errp != NULL) *errp |= 4; \ if (errp != NULL) *errp |= 4; \
_IO_funlockfile (s); \ _IO_funlockfile (s); \
@ -98,8 +100,8 @@
_IO_flockfile (S) _IO_flockfile (S)
# define UNLOCK_STREAM __libc_cleanup_region_end (1) # define UNLOCK_STREAM __libc_cleanup_region_end (1)
#else #else
# define ungetc(c, s) (--read_in, ungetc (c, s)) # define ungetc(c, s) ((void) (c != EOF && --read_in), ungetc (c, s))
# define inchar() ((c = getc (s)), (void) ++read_in, c) # define inchar() ((c = getc (s)), (void) (c != EOF && ++read_in), c)
# define encode_error() do { \ # define encode_error() do { \
funlockfile (s); \ funlockfile (s); \
__set_errno (EILSEQ); \ __set_errno (EILSEQ); \
@ -719,9 +721,6 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
STRING_ADD_CHAR (str, c, char); STRING_ADD_CHAR (str, c, char);
} while ((width <= 0 || --width > 0) && inchar () != EOF); } while ((width <= 0 || --width > 0) && inchar () != EOF);
if (c == EOF)
--read_in;
if (!(flags & SUPPRESS)) if (!(flags & SUPPRESS))
{ {
*str = '\0'; *str = '\0';

View File

@ -36,13 +36,13 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \
swab strfry memfrob memmem \ swab strfry memfrob memmem \
$(addprefix argz-,append count create ctsep next \ $(addprefix argz-,append count create ctsep next \
delete extract insert stringify \ delete extract insert stringify \
addsep) \ addsep replace) \
envz basename \ envz basename \
strcoll_l strxfrm_l strcoll_l strxfrm_l
tests := tester testcopy test-ffs tst-strlen stratcliff \ tests := tester testcopy test-ffs tst-strlen stratcliff \
tst-svc tst-svc
distribute := memcopy.h pagecopy.h distribute := memcopy.h pagecopy.h tst-svc.expect
include ../Rules include ../Rules

135
string/argz-replace.c Normal file
View File

@ -0,0 +1,135 @@
/* String replacement in an argz vector
Copyright (C) 1997 Free Software Foundation, Inc.
Written by Miles Bader <miles@gnu.ai.mit.edu>
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 <stdlib.h>
#include <argz.h>
/* Append BUF, of length BUF_LEN to *TO, of length *TO_LEN, reallocating and
updating *TO & *TO_LEN appropriately. If an allocation error occurs,
*TO's old value is freed, and *TO is set to 0. */
static void
str_append (char **to, size_t *to_len, const char *buf, const size_t buf_len)
{
size_t new_len = *to_len + buf_len;
char *new_to = realloc (*to, new_len + 1);
if (new_to)
{
memcpy (new_to + *to_len, buf, buf_len);
new_to[new_len] = '\0';
*to = new_to;
*to_len = new_len;
}
else
{
free (*to);
*to = 0;
}
}
/* Replace any occurances of the string STR in ARGZ with WITH, reallocating
ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
incremented by number of replacements performed. */
error_t
__argz_replace (char **argz, size_t *argz_len, const char *str, const char *with,
unsigned *replace_count)
{
error_t err = 0;
if (str && *str)
{
char *arg = 0;
char *src = *argz;
size_t src_len = *argz_len;
char *dst = 0;
size_t dst_len = 0;
int delayed_copy = 1; /* True while we've avoided copying anything. */
size_t str_len = strlen (str), with_len = strlen (with);
while (!err && (arg = argz_next (src, src_len, arg)))
{
char *match = strstr (arg, str);
if (match)
{
char *from = match + str_len;
size_t to_len = match - arg;
char *to = strndup (arg, to_len);
while (to && from)
{
str_append (&to, &to_len, with, with_len);
if (to)
{
match = strstr (from, str);
if (match)
{
str_append (&to, &to_len, from, match - from);
from = match + str_len;
}
else
{
str_append (&to, &to_len, from, strlen (from));
from = 0;
}
}
}
if (to)
{
if (delayed_copy)
/* We avoided copying SRC to DST until we found a match;
now that we've done so, copy everything from the start
of SRC. */
{
if (arg > src)
err = argz_append (&dst, &dst_len, src, (arg - src));
delayed_copy = 0;
}
if (! err)
err = argz_add (&dst, &dst_len, to);
free (to);
}
else
err = ENOMEM;
if (replace_count)
(*replace_count)++;
}
else if (! delayed_copy)
err = argz_add (&dst, &dst_len, arg);
}
if (! err)
{
if (! delayed_copy)
/* We never found any instances of str. */
{
if (src)
free (src);
*argz = dst;
*argz_len = dst_len;
}
}
else if (dst_len > 0)
free (dst);
}
return err;
}
weak_alias (__argz_replace, argz_replace)

View File

@ -103,6 +103,16 @@ extern error_t __argz_insert __P ((char **__argz, size_t *__argz_len,
char *__before, __const char *__entry)); char *__before, __const char *__entry));
extern error_t argz_insert __P ((char **__argz, size_t *__argz_len, extern error_t argz_insert __P ((char **__argz, size_t *__argz_len,
char *__before, __const char *__entry)); char *__before, __const char *__entry));
/* Replace any occurances of the string STR in ARGZ with WITH, reallocating
ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
incremented by number of replacements performed. */
extern error_t __argz_replace (char **__argz, size_t *__argz_len,
__const char *__str, __const char *__with,
unsigned *__replace_count);
extern error_t argz_replace (char **__argz, size_t *__argz_len,
__const char *__str, __const char *__with,
unsigned *__replace_count);
/* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there /* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there
are no more. If entry is NULL, then the first entry is returned. This are no more. If entry is NULL, then the first entry is returned. This

View File

@ -127,7 +127,8 @@ $(inst_sysconfdir)/rpc: etc.rpc
# Generate the rpcsvc headers with rpcgen. # Generate the rpcsvc headers with rpcgen.
# We use a stamp file to avoid unnessary recompilation each time rpcgen is # We use a stamp file to avoid unnessary recompilation each time rpcgen is
# relinked. # relinked.
$(rpcsvc:%.x=$(objpfx)rpcsvc/%.h): $(objpfx)rpcsvc/%.h: $(objpfx)rpcsvc/%.stmp; $(rpcsvc:%.x=$(objpfx)rpcsvc/%.h): $(objpfx)rpcsvc/%.h: $(objpfx)rpcsvc/%.stmp
@:
$(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen $(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen
$(make-target-directory) $(make-target-directory)
-@rm -f ${@:stmp=T} $@ -@rm -f ${@:stmp=T} $@
@ -138,7 +139,8 @@ $(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen
touch $@ touch $@
# Generate the rpcsvc XDR functions with rpcgen. # Generate the rpcsvc XDR functions with rpcgen.
$(rpcsvc:%.x=$(objpfx)x%.c): $(objpfx)x%.c: $(objpfx)x%.stmp; $(rpcsvc:%.x=$(objpfx)x%.c): $(objpfx)x%.c: $(objpfx)x%.stmp
@:
$(objpfx)x%.stmp: rpcsvc/%.x $(objpfx)rpcgen $(objpfx)x%.stmp: rpcsvc/%.x $(objpfx)rpcgen
-@rm -f ${@:stmp=T} $@ -@rm -f ${@:stmp=T} $@
$(rpcgen-cmd) -c $< -o ${@:stmp=T} $(rpcgen-cmd) -c $< -o ${@:stmp=T}

View File

@ -32,4 +32,9 @@ typedef double double_t; /* `double' expressions are evaluated as
/* Define `INFINITY' as value of type `float_t'. */ /* Define `INFINITY' as value of type `float_t'. */
#define INFINITY HUGE_VAL #define INFINITY HUGE_VAL
/* The values returned by `ilogb' for 0 and NaN respectively. */
#define FP_ILOGB0 0x80000001
#define FP_ILOGBNAN 0x7fffffff
#endif /* mathbits.h */ #endif /* mathbits.h */

View File

@ -33,4 +33,9 @@ typedef long double double_t; /* `double' expressions are evaluated as
/* Define `INFINITY' as value of type `float_t'. */ /* Define `INFINITY' as value of type `float_t'. */
#define INFINITY HUGE_VALL #define INFINITY HUGE_VALL
/* The values returned by `ilogb' for 0 and NaN respectively. */
#define FP_ILOGB0 0x80000000
#define FP_ILOGBNAN 0x80000000
#endif /* mathbits.h */ #endif /* mathbits.h */

View File

@ -1,16 +1,94 @@
/* /*
* Written by J.T. Conklin <jtc@netbsd.org>. * Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain. * Public domain.
*
* Correct handling of y==-inf <drepper@gnu>
*/ */
#include <machine/asm.h> #include <machine/asm.h>
RCSID("$NetBSD: e_scalb.S,v 1.4 1995/05/08 23:49:52 jtc Exp $") RCSID("$NetBSD: e_scalb.S,v 1.4 1995/05/08 23:49:52 jtc Exp $")
#ifdef __ELF__
.section .rodata
#else
.text
#endif
.align ALIGNARG(4)
ASM_TYPE_DIRECTIVE(zero_nan,@object)
zero_nan:
.double 0.0
nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
minus_zero:
.byte 0, 0, 0, 0, 0, 0, 0, 0x80
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
ASM_SIZE_DIRECTIVE(zero_nan)
#ifdef PIC
#define MO(op) op##@GOTOFF(%ecx)
#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
#else
#define MO(op) op
#define MOX(op,x,f) op(,x,f)
#endif
ENTRY(__ieee754_scalb) ENTRY(__ieee754_scalb)
fldl 12(%esp) fldl 12(%esp)
fxam
fnstsw
fldl 4(%esp) fldl 4(%esp)
andl $0x4700, %eax
cmpl $0x0700, %eax
je 1f
andl $0x4500, %eax
cmpl $0x0100, %eax
je 2f
fxam
fnstsw
andl $0x4500, %eax
cmpl $0x0100, %eax
je 2f
fld %st(1)
frndint
fcomp %st(2)
fnstsw
sahf
jne 2f
fscale fscale
fstp %st(1) fstp %st(1)
ret ret
/* y is -inf */
1: fxam
#ifdef PIC
call 1f
1: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
#endif
fnstsw
movl 8(%esp), %edx
shrl $5, %eax
fstp %st(1)
andl $0x80000000, %edx
andl $8, %eax
fstp %st(1)
shrl $27, %edx
addl %edx, %eax
fldl MOX(zero_nan, %eax, 1)
ret
/* The result is NaN, but we must not raise an exception.
So use a variable. */
2: fstp %st
fstp %st
#ifdef PIC
call 1f
1: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
#endif
fldl MO(nan)
ret
END(__ieee754_scalb) END(__ieee754_scalb)

View File

@ -2,16 +2,95 @@
* Written by J.T. Conklin <jtc@netbsd.org>. * Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain. * Public domain.
* Adapted for float type by Ulrich Drepper <drepper@cygnus.com>. * Adapted for float type by Ulrich Drepper <drepper@cygnus.com>.
*
* Correct handling of y==-inf <drepper@gnu>
*/ */
#include <machine/asm.h> #include <machine/asm.h>
RCSID("$NetBSD: $") RCSID("$NetBSD: $")
#ifdef __ELF__
.section .rodata
#else
.text
#endif
.align ALIGNARG(4)
ASM_TYPE_DIRECTIVE(zero_nan,@object)
zero_nan:
.double 0.0
nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
minus_zero:
.byte 0, 0, 0, 0, 0, 0, 0, 0x80
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
ASM_SIZE_DIRECTIVE(zero_nan)
#ifdef PIC
#define MO(op) op##@GOTOFF(%ecx)
#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
#else
#define MO(op) op
#define MOX(op,x,f) op(,x,f)
#endif
.text
ENTRY(__ieee754_scalbf) ENTRY(__ieee754_scalbf)
flds 8(%esp) flds 8(%esp)
fxam
fnstsw
flds 4(%esp) flds 4(%esp)
andl $0x4700, %eax
cmpl $0x0700, %eax
je 1f
andl $0x4500, %eax
cmpl $0x0100, %eax
je 2f
fxam
fnstsw
andl $0x4500, %eax
cmpl $0x0100, %eax
je 2f
fld %st(1)
frndint
fcomp %st(2)
fnstsw
sahf
jne 2f
fscale fscale
fstp %st(1) fstp %st(1)
ret ret
/* y is -inf */
1: fxam
#ifdef PIC
call 1f
1: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
#endif
fnstsw
movl 4(%esp), %edx
shrl $5, %eax
fstp %st(1)
andl $0x80000000, %edx
andl $8, %eax
fstp %st(1)
shrl $27, %edx
addl %edx, %eax
fldl MOX(zero_nan, %eax, 1)
ret
/* The result is NaN, but we must not raise an exception.
So use a variable. */
2: fstp %st
fstp %st
#ifdef PIC
call 1f
1: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
#endif
fldl MO(nan)
ret
END(__ieee754_scalbf) END(__ieee754_scalbf)

View File

@ -3,16 +3,94 @@
* Public domain. * Public domain.
* *
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>. * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*
* Correct handling of y==-inf <drepper@gnu>
*/ */
#include <machine/asm.h> #include <machine/asm.h>
RCSID("$NetBSD: $") RCSID("$NetBSD: $")
#ifdef __ELF__
.section .rodata
#else
.text
#endif
.align ALIGNARG(4)
ASM_TYPE_DIRECTIVE(zero_nan,@object)
zero_nan:
.double 0.0
nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
minus_zero:
.byte 0, 0, 0, 0, 0, 0, 0, 0x80
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
ASM_SIZE_DIRECTIVE(zero_nan)
#ifdef PIC
#define MO(op) op##@GOTOFF(%ecx)
#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
#else
#define MO(op) op
#define MOX(op,x,f) op(,x,f)
#endif
ENTRY(__ieee754_scalbl) ENTRY(__ieee754_scalbl)
fldt 16(%esp) fldt 16(%esp)
fxam
fnstsw
fldt 4(%esp) fldt 4(%esp)
andl $0x4700, %eax
cmpl $0x0700, %eax
je 1f
andl $0x4500, %eax
cmpl $0x0100, %eax
je 2f
fxam
fnstsw
andl $0x4500, %eax
cmpl $0x0100, %eax
je 2f
fld %st(1)
frndint
fcomp %st(2)
fnstsw
sahf
jne 2f
fscale fscale
fstp %st(1) fstp %st(1)
ret ret
/* y is -inf */
1: fxam
#ifdef PIC
call 1f
1: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
#endif
fnstsw
movl 12(%esp), %edx
shrl $5, %eax
fstp %st(1)
andl $0x8000, %edx
andl $8, %eax
fstp %st(1)
shrl $11, %edx
addl %edx, %eax
fldl MOX(zero_nan, %eax, 1)
ret
/* The result is NaN, but we must not raise an exception.
So use a variable. */
2: fstp %st
fstp %st
#ifdef PIC
call 1f
1: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
#endif
fldl MO(nan)
ret
END(__ieee754_scalbl) END(__ieee754_scalbl)

View File

@ -49,14 +49,14 @@ ENTRY(__asinh)
movl $0x7fffffff, %eax movl $0x7fffffff, %eax
andl %ecx, %eax andl %ecx, %eax
andl $0x80000000, %ecx andl $0x80000000, %ecx
xorl %ecx, 8(%esp)
fldl 4(%esp) // |x|
movl %eax, %edx movl %eax, %edx
cmpl $0x3e300000, %eax
jb 2f // |x| < 2^-28
orl $0x800fffff, %edx orl $0x800fffff, %edx
incl %edx incl %edx
jz 4f // x in <EFBFBD>Inf or NaN jz 7f // x in <EFBFBD>Inf or NaN
xorl %ecx, 8(%esp)
fldl 4(%esp) // |x|
cmpl $0x3e300000, %eax
jb 2f // |x| < 2^-28
fldln2 // log(2) : |x| fldln2 // log(2) : |x|
cmpl $0x41b00000, %eax cmpl $0x41b00000, %eax
fxch // |x| : log(2) fxch // |x| : log(2)
@ -87,6 +87,9 @@ ENTRY(__asinh)
fchs fchs
4: ret 4: ret
7: fldl 4(%esp)
ret
6: faddl MO(one) 6: faddl MO(one)
fyl2x fyl2x
jecxz 4f jecxz 4f

View File

@ -49,14 +49,14 @@ ENTRY(__asinhf)
movl $0x7fffffff, %eax movl $0x7fffffff, %eax
andl %ecx, %eax andl %ecx, %eax
andl $0x80000000, %ecx andl $0x80000000, %ecx
xorl %ecx, 8(%esp)
flds 4(%esp) // |x|
movl %eax, %edx movl %eax, %edx
cmpl $0x38000000, %eax
jb 2f // |x| < 2^-14
orl $0x807fffff, %edx orl $0x807fffff, %edx
incl %edx incl %edx
jz 4f // x in <EFBFBD>Inf or NaN jz 7f // x in <EFBFBD>Inf or NaN
xorl %ecx, 8(%esp)
flds 4(%esp) // |x|
cmpl $0x38000000, %eax
jb 2f // |x| < 2^-14
fldln2 // log(2) : |x| fldln2 // log(2) : |x|
cmpl $0x47000000, %eax cmpl $0x47000000, %eax
fxch // |x| : log(2) fxch // |x| : log(2)
@ -87,6 +87,9 @@ ENTRY(__asinhf)
fchs fchs
4: ret 4: ret
7: flds 4(%esp)
ret
6: faddl MO(one) 6: faddl MO(one)
fyl2x fyl2x
jecxz 4f jecxz 4f

View File

@ -56,14 +56,14 @@ ENTRY(__asinhl)
movl $0x7fff, %eax movl $0x7fff, %eax
andl %ecx, %eax andl %ecx, %eax
andl $0x8000, %ecx andl $0x8000, %ecx
xorl %ecx, 12(%esp)
fldt 4(%esp) // |x|
movl %eax, %edx movl %eax, %edx
cmpl $0x3fde, %eax
jb 2f // |x| < 2^-34
orl $0xffff8000, %edx orl $0xffff8000, %edx
incl %edx incl %edx
jz 4f // x in <EFBFBD>Inf or NaN jz 7f // x in <EFBFBD>Inf or NaN
xorl %ecx, 12(%esp)
fldt 4(%esp) // |x|
cmpl $0x3fde, %eax
jb 2f // |x| < 2^-34
fldln2 // log(2) : |x| fldln2 // log(2) : |x|
cmpl $0x4020, %eax cmpl $0x4020, %eax
fxch // |x| : log(2) fxch // |x| : log(2)
@ -94,6 +94,9 @@ ENTRY(__asinhl)
fchs fchs
4: ret 4: ret
7: fldt 4(%esp)
ret
6: faddl MO(one) 6: faddl MO(one)
fyl2x fyl2x
jecxz 4f jecxz 4f

View File

@ -8,18 +8,14 @@
RCSID("$NetBSD: s_ilogb.S,v 1.5 1995/10/12 15:53:09 jtc Exp $") RCSID("$NetBSD: s_ilogb.S,v 1.5 1995/10/12 15:53:09 jtc Exp $")
ENTRY(__ilogb) ENTRY(__ilogb)
pushl %ebp fldl 4(%esp)
movl %esp,%ebp
subl $4,%esp
fldl 8(%ebp)
fxtract fxtract
pushl %eax
fstpl %st fstpl %st
fistpl -4(%ebp) fistpl (%esp)
movl -4(%ebp),%eax popl %eax
leave
ret ret
END (__ilogb) END (__ilogb)
weak_alias (__ilogb, ilogb) weak_alias (__ilogb, ilogb)

View File

@ -8,18 +8,14 @@
RCSID("$NetBSD: s_ilogbf.S,v 1.4 1995/10/22 20:32:43 pk Exp $") RCSID("$NetBSD: s_ilogbf.S,v 1.4 1995/10/22 20:32:43 pk Exp $")
ENTRY(__ilogbf) ENTRY(__ilogbf)
pushl %ebp flds 4(%esp)
movl %esp,%ebp
subl $4,%esp
flds 8(%ebp)
fxtract fxtract
pushl %eax
fstpl %st fstpl %st
fistpl -4(%ebp) fistpl (%esp)
movl -4(%ebp),%eax popl %eax
leave
ret ret
END (__ilogbf) END (__ilogbf)
weak_alias (__ilogbf, ilogbf) weak_alias (__ilogbf, ilogbf)

View File

@ -9,17 +9,14 @@
RCSID("$NetBSD: $") RCSID("$NetBSD: $")
ENTRY(__ilogbl) ENTRY(__ilogbl)
pushl %ebp fldt 4(%esp)
movl %esp,%ebp
subl $4,%esp
fldt 8(%ebp)
fxtract fxtract
pushl %eax
fstp %st
fistpl -4(%ebp) fistpl (%esp)
movl -4(%ebp),%eax popl %eax
leave
ret ret
END (__ilogbl) END (__ilogbl)
weak_alias (__ilogbl, ilogbl) weak_alias (__ilogbl, ilogbl)

View File

@ -22,12 +22,12 @@
#include <sysdep.h> #include <sysdep.h>
.text .text
ENTRY(__rinttoll) ENTRY(__llrint)
fldt 4(%esp) fldt 4(%esp)
subl $8, %esp subl $8, %esp
fistpll (%esp) fistpll (%esp)
popl %eax popl %eax
popl %edx popl %edx
ret ret
END(__rinttoll) END(__llrint)
weak_alias (__rinttoll, rinttoll) weak_alias (__llrint, llrint)

View File

@ -22,11 +22,11 @@
#include <sysdep.h> #include <sysdep.h>
.text .text
ENTRY(__rinttol) ENTRY(__lrint)
fldt 4(%esp) fldt 4(%esp)
subl $4, %esp subl $4, %esp
fistpl (%esp) fistpl (%esp)
popl %eax popl %eax
ret ret
END(__rinttol) END(__lrint)
weak_alias (__rinttol, rinttol) weak_alias (__lrint, lrint)

View File

@ -25,7 +25,12 @@ ENTRY(__remquo)
shrl %cl, %eax shrl %cl, %eax
andl $3, %eax andl $3, %eax
movl 20(%esp), %ecx movl 20(%esp), %ecx
movl %eax, (%ecx) movl 8(%esp), %edx
xorl 16(%esp), %edx
testl $0x80000000, %edx
jz 1f
negl %eax
1: movl %eax, (%ecx)
ret ret
END (__remquo) END (__remquo)
weak_alias (__remquo, remquo) weak_alias (__remquo, remquo)

View File

@ -25,7 +25,12 @@ ENTRY(__remquof)
shrl %cl, %eax shrl %cl, %eax
andl $3, %eax andl $3, %eax
movl 12(%esp), %ecx movl 12(%esp), %ecx
movl %eax, (%ecx) movl 4(%esp), %edx
xorl 8(%esp), %edx
testl $0x80000000, %edx
jz 1f
negl %eax
1: movl %eax, (%ecx)
ret ret
END (__remquof) END (__remquof)
weak_alias (__remquof, remquof) weak_alias (__remquof, remquof)

View File

@ -25,7 +25,12 @@ ENTRY(__remquol)
shrl %cl, %eax shrl %cl, %eax
andl $3, %eax andl $3, %eax
movl 28(%esp), %ecx movl 28(%esp), %ecx
movl %eax, (%ecx) movl 12(%esp), %edx
xorl 24(%esp), %edx
testl $0x8000, %edx
jz 1f
negl %eax
1: movl %eax, (%ecx)
ret ret
END (__remquol) END (__remquol)
weak_alias (__remquol, remquol) weak_alias (__remquol, remquol)

View File

@ -0,0 +1,47 @@
/* Implementation of gamma function according to ISO C.
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
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 <math.h>
#include <math_private.h>
double
__ieee754_gamma_r (double x, int *signgamp)
{
/* We don't have a real gamma implementation now. We'll use lgamma
and the exp function. But due to the required boundary
conditions we must check some values separately. */
int32_t hx;
u_int32_t lx;
EXTRACT_WORDS (hx, lx, x);
if ((hx & 0x7fffffff | lx) == 0)
/* Return value for x == 0 is NaN with invalid exception. */
return x / x;
if (hx < 0 && (u_int32_t) hx < 0xfff00000 && __rint (x) == x)
{
/* Return value for integer x < 0 is NaN with invalid exception. */
return (x - x) / (x - x);
}
/* XXX FIXME. */
return __ieee754_exp (__ieee754_lgamma_r (x, signgamp));
}

View File

@ -0,0 +1,46 @@
/* Implementation of gamma function according to ISO C.
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
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 <math.h>
#include <math_private.h>
float
__ieee754_gammaf_r (float x, int *signgamp)
{
/* We don't have a real gamma implementation now. We'll use lgamma
and the exp function. But due to the required boundary
conditions we must check some values separately. */
int32_t hx;
GET_FLOAT_WORD (hx, x);
if ((hx & 0x7fffffff) == 0)
/* Return value for x == 0 is NaN with invalid exception. */
return x / x;
if (hx < 0 && (u_int32_t) hx < 0xff800000 && __rintf (x) == x)
{
/* Return value for integer x < 0 is NaN with invalid exception. */
return (x - x) / (x - x);
}
/* XXX FIXME. */
return __ieee754_expf (__ieee754_lgammaf_r (x, signgamp));
}

View File

@ -0,0 +1,46 @@
/* Implementation of gamma function according to ISO C.
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
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 <math.h>
#include <math_private.h>
long double
__ieee754_gammal_r (long double x, int *signgamp)
{
/* We don't have a real gamma implementation now. We'll use lgamma
and the exp function. But due to the required boundary
conditions we must check some values separately. */
u_int32_t es, hx, lx;
GET_LDOUBLE_WORDS (es, hx, lx, x);
if (((es & 0x7fff) | hx | lx) == 0)
/* Return value for x == 0 is NaN with invalid exception. */
return x / x;
if ((hx & 0x8000) != 0 && (hx & 0x7fff) != 0x7fff && __rintl (x) == x)
{
/* Return value for integer x < 0 is NaN with invalid exception. */
return (x - x) / (x - x);
}
/* XXX FIXME. */
return __ieee754_expl (__ieee754_lgammal_r (x, signgamp));
}

View File

@ -226,9 +226,11 @@ static double zero= 0.00000000000000000000e+00;
/* purge off +-inf, NaN, +-0, and negative arguments */ /* purge off +-inf, NaN, +-0, and negative arguments */
*signgamp = 1; *signgamp = 1;
if ((unsigned int) hx==0xfff00000&&lx==0)
return x-x;
ix = hx&0x7fffffff; ix = hx&0x7fffffff;
if(ix>=0x7ff00000) return x*x; if(ix>=0x7ff00000) return x*x;
if((ix|lx)==0) return one/zero; if((ix|lx)==0) return one/fabs(x);
if(ix<0x3b900000) { /* |x|<2**-70, return -log(|x|) */ if(ix<0x3b900000) { /* |x|<2**-70, return -log(|x|) */
if(hx<0) { if(hx<0) {
*signgamp = -1; *signgamp = -1;
@ -237,9 +239,9 @@ static double zero= 0.00000000000000000000e+00;
} }
if(hx<0) { if(hx<0) {
if(ix>=0x43300000) /* |x|>=2**52, must be -integer */ if(ix>=0x43300000) /* |x|>=2**52, must be -integer */
return one/zero; return x/zero;
t = sin_pi(x); t = sin_pi(x);
if(t==zero) return one/zero; /* -integer */ if(t==zero) return one/fabsf(t); /* -integer */
nadj = __ieee754_log(pi/fabs(t*x)); nadj = __ieee754_log(pi/fabs(t*x));
if(t<zero) *signgamp = -1; if(t<zero) *signgamp = -1;
x = -x; x = -x;

View File

@ -162,9 +162,11 @@ static float zero= 0.0000000000e+00;
/* purge off +-inf, NaN, +-0, and negative arguments */ /* purge off +-inf, NaN, +-0, and negative arguments */
*signgamp = 1; *signgamp = 1;
if ((unsigned int)hx==0xff800000)
return x-x;
ix = hx&0x7fffffff; ix = hx&0x7fffffff;
if(ix>=0x7f800000) return x*x; if(ix>=0x7f800000) return x*x;
if(ix==0) return one/zero; if(ix==0) return one/fabsf(x);
if(ix<0x1c800000) { /* |x|<2**-70, return -log(|x|) */ if(ix<0x1c800000) { /* |x|<2**-70, return -log(|x|) */
if(hx<0) { if(hx<0) {
*signgamp = -1; *signgamp = -1;
@ -173,9 +175,9 @@ static float zero= 0.0000000000e+00;
} }
if(hx<0) { if(hx<0) {
if(ix>=0x4b000000) /* |x|>=2**23, must be -integer */ if(ix>=0x4b000000) /* |x|>=2**23, must be -integer */
return one/zero; return x/zero;
t = sin_pif(x); t = sin_pif(x);
if(t==zero) return one/zero; /* -integer */ if(t==zero) return one/fabsf(t); /* -integer */
nadj = __ieee754_logf(pi/fabsf(t*x)); nadj = __ieee754_logf(pi/fabsf(t*x));
if(t<zero) *signgamp = -1; if(t<zero) *signgamp = -1;
x = -x; x = -x;

View File

@ -33,7 +33,7 @@ static long double two52[2] =
long long int long long int
__rinttoll (long double x) __llrint (long double x)
{ {
int32_t j0,sx; int32_t j0,sx;
u_int32_t i0, i1, i; u_int32_t i0, i1, i;
@ -141,7 +141,7 @@ static long double two63[2] =
long long int long long int
__rinttoll (long double x) __llrint (long double x)
{ {
int32_t se,j0,sx; int32_t se,j0,sx;
u_int32_t i0, i1, i; u_int32_t i0, i1, i;
@ -239,4 +239,4 @@ __rinttoll (long double x)
} }
#endif #endif
weak_alias (__rinttoll, rinttoll) weak_alias (__llrint, llrint)

View File

@ -27,7 +27,7 @@
/* The `long double' is in fact the IEEE `double' type. */ /* The `long double' is in fact the IEEE `double' type. */
long long int long long int
__roundtoll (long double x) __llround (long double x)
{ {
int32_t j0; int32_t j0;
u_int32_t i1, i0; u_int32_t i1, i0;
@ -103,7 +103,7 @@ __roundtoll (long double x)
} }
#else #else
long long int long long int
__roundtoll (long double x) __llround (long double x)
{ {
int32_t j0; int32_t j0;
u_int32_t se, i1, i0; u_int32_t se, i1, i0;
@ -176,4 +176,4 @@ __roundtoll (long double x)
return se & 0x8000 ? -result : result; return se & 0x8000 ? -result : result;
} }
#endif #endif
weak_alias (__roundtoll, roundtoll) weak_alias (__llround, llround)

View File

@ -33,7 +33,7 @@ static long double two52[2] =
long int long int
__rinttol (long double x) __lrint (long double x)
{ {
int32_t j0,sx; int32_t j0,sx;
u_int32_t i0,i1,i; u_int32_t i0,i1,i;
@ -141,7 +141,7 @@ static long double two63[2] =
long int long int
__rinttol (long double x) __lrint (long double x)
{ {
int32_t se,j0,sx; int32_t se,j0,sx;
u_int32_t i0,i1,i; u_int32_t i0,i1,i;
@ -239,4 +239,4 @@ __rinttol (long double x)
} }
#endif #endif
weak_alias (__rinttol, rinttol) weak_alias (__lrint, lrint)

View File

@ -27,7 +27,7 @@
/* The `long double' is in fact the IEEE `double' type. */ /* The `long double' is in fact the IEEE `double' type. */
long int long int
__roundtol (long double x) __lround (long double x)
{ {
int32_t j0; int32_t j0;
u_int32_t i1, i0; u_int32_t i1, i0;
@ -101,7 +101,7 @@ __roundtol (long double x)
} }
#else #else
long int long int
__roundtol (long double x) __lround (long double x)
{ {
int32_t j0; int32_t j0;
u_int32_t se, i1, i0; u_int32_t se, i1, i0;
@ -174,4 +174,4 @@ __roundtol (long double x)
return se & 0x8000 ? -result : result; return se & 0x8000 ? -result : result;
} }
#endif #endif
weak_alias (__roundtol, roundtol) weak_alias (__lround, lround)

View File

@ -82,6 +82,7 @@ __remquo (double x, double y, int *quo)
if (x + x > y) if (x + x > y)
{ {
x -= y; x -= y;
++cquo;
if (x + x >= y) if (x + x >= y)
{ {
x -= y; x -= y;
@ -95,6 +96,7 @@ __remquo (double x, double y, int *quo)
if (x > y_half) if (x > y_half)
{ {
x -= y; x -= y;
++cquo;
if (x >= y_half) if (x >= y_half)
{ {
x -= y; x -= y;

View File

@ -81,6 +81,7 @@ __remquof (float x, float y, int *quo)
if (x + x > y) if (x + x > y)
{ {
x -= y; x -= y;
++cquo;
if (x + x >= y) if (x + x >= y)
{ {
x -= y; x -= y;
@ -94,6 +95,7 @@ __remquof (float x, float y, int *quo)
if (x > y_half) if (x > y_half)
{ {
x -= y; x -= y;
++cquo;
if (x >= y_half) if (x >= y_half)
{ {
x -= y; x -= y;

View File

@ -82,6 +82,7 @@ __remquol (long double x, long double p, int *quo)
if (x + x > p) if (x + x > p)
{ {
x -= p; x -= p;
++cquo;
if (x + x >= p) if (x + x >= p)
{ {
x -= p; x -= p;
@ -95,6 +96,7 @@ __remquol (long double x, long double p, int *quo)
if (x > p_half) if (x > p_half)
{ {
x -= p; x -= p;
++cquo;
if (x >= p_half) if (x >= p_half)
{ {
x -= p; x -= p;

View File

@ -35,10 +35,10 @@ huge = 1.0e+300,
tiny = 1.0e-300; tiny = 1.0e-300;
#ifdef __STDC__ #ifdef __STDC__
double __scalbn (double x, int n) double __scalbn (double x, long int n)
#else #else
double __scalbn (x,n) double __scalbn (x,n)
double x; int n; double x; long int n;
#endif #endif
{ {
int32_t k,hx,lx; int32_t k,hx,lx;
@ -49,17 +49,16 @@ tiny = 1.0e-300;
x *= two54; x *= two54;
GET_HIGH_WORD(hx,x); GET_HIGH_WORD(hx,x);
k = ((hx&0x7ff00000)>>20) - 54; k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
} }
if (k==0x7ff) return x+x; /* NaN or Inf */ if (k==0x7ff) return x+x; /* NaN or Inf */
k = k+n; k = k+n;
if (k > 0x7fe) return huge*__copysign(huge,x); /* overflow */ if (n> 50000 || k > 0x7fe)
return huge*__copysign(huge,x); /* overflow */
if (n< -50000) return tiny*__copysign(tiny,x); /*underflow*/
if (k > 0) /* normal result */ if (k > 0) /* normal result */
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;} {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
if (k <= -54) if (k <= -54)
if (n > 50000) /* in case integer overflow in n+k */ return tiny*__copysign(tiny,x); /*underflow*/
return huge*__copysign(huge,x); /*overflow*/
else return tiny*__copysign(tiny,x); /*underflow*/
k += 54; /* subnormal result */ k += 54; /* subnormal result */
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
return x*twom54; return x*twom54;

View File

@ -31,10 +31,10 @@ huge = 1.0e+30,
tiny = 1.0e-30; tiny = 1.0e-30;
#ifdef __STDC__ #ifdef __STDC__
float __scalbnf (float x, int n) float __scalbnf (float x, long int n)
#else #else
float __scalbnf (x,n) float __scalbnf (x,n)
float x; int n; float x; long int n;
#endif #endif
{ {
int32_t k,ix; int32_t k,ix;
@ -45,17 +45,17 @@ tiny = 1.0e-30;
x *= two25; x *= two25;
GET_FLOAT_WORD(ix,x); GET_FLOAT_WORD(ix,x);
k = ((ix&0x7f800000)>>23) - 25; k = ((ix&0x7f800000)>>23) - 25;
if (n< -50000) return tiny*x; /*underflow*/
} }
if (k==0xff) return x+x; /* NaN or Inf */ if (k==0xff) return x+x; /* NaN or Inf */
k = k+n; k = k+n;
if (k > 0xfe) return huge*copysignf(huge,x); /* overflow */ if (n> 50000 || k > 0xfe)
return huge*copysignf(huge,x); /* overflow */
if (n< -50000)
return tiny*copysignf(tiny,x); /*underflow*/
if (k > 0) /* normal result */ if (k > 0) /* normal result */
{SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;} {SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
if (k <= -25) if (k <= -25)
if (n > 50000) /* in case integer overflow in n+k */ return tiny*copysignf(tiny,x); /*underflow*/
return huge*copysignf(huge,x); /*overflow*/
else return tiny*copysignf(tiny,x); /*underflow*/
k += 25; /* subnormal result */ k += 25; /* subnormal result */
SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
return x*twom25; return x*twom25;

View File

@ -33,16 +33,16 @@ static const long double
#else #else
static long double static long double
#endif #endif
two54 = 1.80143985094819840000e+16, /* 0x4035, 0x00000000, 0x00000000 */ two63 = 4.50359962737049600000e+15,
twom54 = 5.55111512312578270212e-17, /* 0x3FC9, 0x00000000, 0x00000000 */ twom63 = 1.08420217248550443400e-19;
huge = 1.0e+4900L, huge = 1.0e+4900L,
tiny = 1.0e-4900L; tiny = 1.0e-4900L;
#ifdef __STDC__ #ifdef __STDC__
long double __scalbnl (long double x, int n) long double __scalbnl (long double x, long int n)
#else #else
long double __scalbnl (x,n) long double __scalbnl (x,n)
long double x; int n; long double x; long int n;
#endif #endif
{ {
int32_t k,es,hx,lx; int32_t k,es,hx,lx;
@ -50,22 +50,22 @@ tiny = 1.0e-4900L;
k = es&0x7fff; /* extract exponent */ k = es&0x7fff; /* extract exponent */
if (k==0) { /* 0 or subnormal x */ if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */ if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54; x *= two63;
GET_HIGH_WORD(hx,x); GET_LDOUBLE_EXP(es,x);
k = ((hx&0x7ff00000)>>20) - 54; k = (hx&0x7fff) - 63;
if (n< -50000) return tiny*x; /*underflow*/
} }
if (k==0x7ff) return x+x; /* NaN or Inf */ if (k==0x7fff) return x+x; /* NaN or Inf */
k = k+n; k = k+n;
if (k > 0x7fe) return huge*__copysign(huge,x); /* overflow */ if (n> 50000 || k > 0x7ffe)
return huge*__copysignl(huge,x); /* overflow */
if (n< -50000)
return tiny*__copysignl(tiny,x);
if (k > 0) /* normal result */ if (k > 0) /* normal result */
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;} {SET_LDOUBLE_EXP(x,(es&0x8000)|k); return x;}
if (k <= -54) if (k <= -63)
if (n > 50000) /* in case integer overflow in n+k */ return tiny*__copysignl(tiny,x); /*underflow*/
return huge*__copysign(huge,x); /*overflow*/
else return tiny*__copysign(tiny,x); /*underflow*/
k += 54; /* subnormal result */ k += 54; /* subnormal result */
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); SET_LDOUBLE_EXP(x,(es&0x8000)|k);
return x*twom54; return x*twom63;
} }
weak_alias (__scalbnl, scalbnl) weak_alias (__scalbnl, scalbnl)

View File

@ -15,16 +15,13 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
#endif #endif
/* double gamma(double x) /* double gamma(double x)
* Return the logarithm of the Gamma function of x. * Return the logarithm of the Gamma function of x or the Gamma function of x,
* * depending on the library mode.
* Method: call gamma_r
*/ */
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int signgam;
#ifdef __STDC__ #ifdef __STDC__
double __gamma(double x) double __gamma(double x)
#else #else
@ -32,12 +29,19 @@ extern int signgam;
double x; double x;
#endif #endif
{ {
#ifdef _IEEE_LIBM int signgam;
return __ieee754_lgamma_r(x,&signgam);
#else
double y; double y;
if (_LIB_VERSION == _SVID_)
y = __ieee754_lgamma_r(x,&signgam); y = __ieee754_lgamma_r(x,&signgam);
else
{
y = __ieee754_gamma_r(x,&signgam);
if (signgam < 0) y = -y;
#ifdef _IEEE_LIBM
return y;
#else
if(_LIB_VERSION == _IEEE_) return y; if(_LIB_VERSION == _IEEE_) return y;
}
if(!__finite(y)&&__finite(x)) { if(!__finite(y)&&__finite(x)) {
if(__floor(x)==x&&x<=0.0) if(__floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,41); /* gamma pole */ return __kernel_standard(x,x,41); /* gamma pole */

View File

@ -1,51 +0,0 @@
/* @(#)wr_gamma.c 5.1 93/09/24 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: w_gamma_r.c,v 1.7 1995/11/20 22:06:45 jtc Exp $";
#endif
/*
* wrapper double gamma_r(double x, int *signgamp)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
double __gamma_r(double x, int *signgamp) /* wrapper lgamma_r */
#else
double __gamma_r(x,signgamp) /* wrapper lgamma_r */
double x; int *signgamp;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgamma_r(x,signgamp);
#else
double y;
y = __ieee754_lgamma_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finite(y)&&__finite(x)) {
if(__floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,41); /* gamma pole */
else
return __kernel_standard(x,x,40); /* gamma overflow */
} else
return y;
#endif
}
weak_alias (__gamma_r, gamma_r)
#ifdef NO_LONG_DOUBLE
strong_alias (__gamma_r, __gammal_r)
weak_alias (__gamma_r, gammal_r)
#endif

View File

@ -20,8 +20,6 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int signgam;
#ifdef __STDC__ #ifdef __STDC__
float __gammaf(float x) float __gammaf(float x)
#else #else
@ -29,12 +27,19 @@ extern int signgam;
float x; float x;
#endif #endif
{ {
#ifdef _IEEE_LIBM int signgam;
return __ieee754_lgammaf_r(x,&signgam);
#else
float y; float y;
if (_LIB_VERSION == _SVID_)
y = __ieee754_lgammaf_r(x,&signgam); y = __ieee754_lgammaf_r(x,&signgam);
else
{
y = __ieee754_gammaf_r(x,&signgam);
if (signgam < 0) y = -y;
#ifdef _IEEE_LIBM
return y;
#else
if(_LIB_VERSION == _IEEE_) return y; if(_LIB_VERSION == _IEEE_) return y;
}
if(!__finitef(y)&&__finitef(x)) { if(!__finitef(y)&&__finitef(x)) {
if(__floorf(x)==x&&x<=(float)0.0) if(__floorf(x)==x&&x<=(float)0.0)
/* gammaf pole */ /* gammaf pole */

View File

@ -1,52 +0,0 @@
/* w_gammaf_r.c -- float version of w_gamma_r.c.
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: w_gammaf_r.c,v 1.4 1995/11/20 22:06:50 jtc Exp $";
#endif
/*
* wrapper float gammaf_r(float x, int *signgamp)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
float __gammaf_r(float x, int *signgamp) /* wrapper lgammaf_r */
#else
float __gammaf_r(x,signgamp) /* wrapper lgammaf_r */
float x; int *signgamp;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammaf_r(x,signgamp);
#else
float y;
y = __ieee754_lgammaf_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitef(y)&&__finitef(x)) {
if(__floorf(x)==x&&x<=(float)0.0)
/* gammaf pole */
return (float)__kernel_standard((double)x,(double)x,141);
else
/* gamma overflow */
return (float)__kernel_standard((double)x,(double)x,140);
} else
return y;
#endif
}
weak_alias (__gammaf_r, gammaf_r)

View File

@ -19,16 +19,12 @@ static char rcsid[] = "$NetBSD: $";
#endif #endif
/* long double gammal(double x) /* long double gammal(double x)
* Return the logarithm of the Gamma function of x. * Return the Gamma function of x.
*
* Method: call gammal_r
*/ */
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int signgam;
#ifdef __STDC__ #ifdef __STDC__
long double __gammal(long double x) long double __gammal(long double x)
#else #else
@ -36,12 +32,19 @@ extern int signgam;
long double x; long double x;
#endif #endif
{ {
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,&signgam);
#else
long double y; long double y;
int signgam;
if (_LIB_VERSION == _SVID_)
y = __ieee754_lgammal_r(x,&signgam); y = __ieee754_lgammal_r(x,&signgam);
else
{
y = __ieee754_gammal_r(x,&signgam);
if (signgam < 0) y = -y;
#ifdef _IEEE_LIBM
return y;
#else
if(_LIB_VERSION == _IEEE_) return y; if(_LIB_VERSION == _IEEE_) return y;
}
if(!__finitel(y)&&__finitel(x)) { if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0) if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,241); /* gamma pole */ return __kernel_standard(x,x,241); /* gamma pole */

View File

@ -1,52 +0,0 @@
/* w_gammal_r.c -- long double version of w_gamma_r.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper long double gammal_r(long double x, int *signgamp)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __gammal_r(long double x, int *signgamp)
/* wrapper lgammal_r */
#else
long double __gammal_r(x,signgamp) /* wrapper lgamma_r */
long double x; int *signgamp;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,signgamp);
#else
long double y;
y = __ieee754_lgammal_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,241); /* gamma pole */
else
return __kernel_standard(x,x,240); /* gamma overflow */
} else
return y;
#endif
}
weak_alias (__gammal_r, gammal_r)

View File

@ -309,7 +309,7 @@ __inline_functions (float,f)
__inline_functions (long double,l) __inline_functions (long double,l)
#undef __inline_functions #undef __inline_functions
__m81_defun (long int, __rinttol, (long double __x)) __m81_defun (long int, __lrint, (long double __x))
{ {
long int __result; long int __result;
__asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x)); __asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x));
@ -391,7 +391,7 @@ __inline_forward_c(int,ilogbl, (long double __value), (__value))
#endif #endif
#ifdef __USE_ISOC9X #ifdef __USE_ISOC9X
__inline_forward_c(long double,nearbyintl, (long double __value), (__value)) __inline_forward_c(long double,nearbyintl, (long double __value), (__value))
__inline_forward_c(long int,rinttol, (long double __value), (__value)) __inline_forward_c(long int,lrint, (long double __value), (__value))
#endif #endif
#ifdef __USE_GNU #ifdef __USE_GNU
__inline_forward(void,sincosl, __inline_forward(void,sincosl,

View File

@ -24,7 +24,7 @@
#include "math_private.h" #include "math_private.h"
long long int long long int
__rinttoll (long double x) __llrint (long double x)
{ {
int32_t se, sx; int32_t se, sx;
u_int32_t h, l; u_int32_t h, l;
@ -59,4 +59,4 @@ __rinttoll (long double x)
return result; return result;
} }
weak_alias (__rinttoll, rinttoll) weak_alias (__llrint, llrint)

View File

@ -23,9 +23,9 @@
#include <math.h> #include <math.h>
long int long int
__rinttol (long double x) __lrint (long double x)
{ {
return __m81_u(__rinttol) (x); return __m81_u(__lrint) (x);
} }
weak_alias (__rinttol, rinttol) weak_alias (__lrint, lrint)

View File

@ -37,18 +37,9 @@ s(__remquo) (float_type x, float_type y, int *quo)
float_type result; float_type result;
int cquo, fpsr; int cquo, fpsr;
/* FIXME: Which of frem and fmod is correct? */
#if 1
__asm ("frem%.x %2,%0\n\tfmove%.l %/fpsr,%1" __asm ("frem%.x %2,%0\n\tfmove%.l %/fpsr,%1"
: "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x)); : "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x));
cquo = (fpsr >> 16) & 0x7f; cquo = (fpsr >> 16) & 0x7f;
if ((result > 0) != (x > 0))
cquo--;
#else
__asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1"
: "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x));
cquo = (fpsr >> 16) & 0x7f;
#endif
if (fpsr & (1 << 23)) if (fpsr & (1 << 23))
cquo = -cquo; cquo = -cquo;
*quo = cquo; *quo = cquo;

View File

@ -16,6 +16,9 @@
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA. # Boston, MA 02111-1307, USA.
ifneq (yes,$(inhibit-stdio_lim))
# Disable these rules if we generate stdio_lim.h by other means.
ifeq (yes,$(cross-compiling)) ifeq (yes,$(cross-compiling))
$(common-objpfx)stdio_lim.h: $(common-objpfx)stdio_lim.h:
@echo @echo
@ -38,3 +41,5 @@ $(common-objpfx)mk-stdiolim: $(sysdep_dir)/posix/mk-stdiolim.c \
common-generated := $(common-generated) stdio_lim.h mk-stdiolim common-generated := $(common-generated) stdio_lim.h mk-stdiolim
before-compile := $(before-compile) $(common-objpfx)stdio_lim.h before-compile := $(before-compile) $(common-objpfx)stdio_lim.h
endif # inhibit-stdio_lim

View File

@ -1 +1,2 @@
fenv_const.c
fenv_libc.h fenv_libc.h

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_acoshl (long double x) __ieee754_acoshl (long double x)
{ {
fputs ("__ieee754_acoshl not implemented\n", stderr); fputs ("__ieee754_acoshl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_acosl (long double x) __ieee754_acosl (long double x)
{ {
fputs ("__ieee754_acosl not implemented\n", stderr); fputs ("__ieee754_acosl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_asinl (long double x) __ieee754_asinl (long double x)
{ {
fputs ("__ieee754_asinl not implemented\n", stderr); fputs ("__ieee754_asinl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_atan2l (long double x, long double y) __ieee754_atan2l (long double x, long double y)
{ {
fputs ("__ieee754_atan2l not implemented\n", stderr); fputs ("__ieee754_atan2l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_expl (long double x) __ieee754_expl (long double x)
{ {
fputs ("__ieee754_expl not implemented\n", stderr); fputs ("__ieee754_expl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_fmodl (long double x, long double y) __ieee754_fmodl (long double x, long double y)
{ {
fputs ("__ieee754_fmodl not implemented\n", stderr); fputs ("__ieee754_fmodl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_j0l (long double x) __ieee754_j0l (long double x)
{ {
fputs ("__ieee754_j0l not implemented\n", stderr); fputs ("__ieee754_j0l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }
@ -14,6 +16,7 @@ long double
__ieee754_y0l (long double x) __ieee754_y0l (long double x)
{ {
fputs ("__ieee754_y0l not implemented\n", stderr); fputs ("__ieee754_y0l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_j1l (long double x) __ieee754_j1l (long double x)
{ {
fputs ("__ieee754_j1l not implemented\n", stderr); fputs ("__ieee754_j1l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }
@ -14,6 +16,7 @@ long double
__ieee754_y1l (long double x) __ieee754_y1l (long double x)
{ {
fputs ("__ieee754_y1l not implemented\n", stderr); fputs ("__ieee754_y1l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_jnl (int n, long double x) __ieee754_jnl (int n, long double x)
{ {
fputs ("__ieee754_jnl not implemented\n", stderr); fputs ("__ieee754_jnl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }
@ -14,6 +16,7 @@ long double
__ieee754_ynl (int n, long double x) __ieee754_ynl (int n, long double x)
{ {
fputs ("__ieee754_ynl not implemented\n", stderr); fputs ("__ieee754_ynl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_lgammal_r (long double x, int *signgamp) __ieee754_lgammal_r (long double x, int *signgamp)
{ {
fputs ("__ieee754_lgammal_r not implemented\n", stderr); fputs ("__ieee754_lgammal_r not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_log10l (long double x) __ieee754_log10l (long double x)
{ {
fputs ("__ieee754_log10l not implemented\n", stderr); fputs ("__ieee754_log10l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_logl (long double x) __ieee754_logl (long double x)
{ {
fputs ("__ieee754_logl not implemented\n", stderr); fputs ("__ieee754_logl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_powl (long double x, long double y) __ieee754_powl (long double x, long double y)
{ {
fputs ("__ieee754_powl not implemented\n", stderr); fputs ("__ieee754_powl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_rem_pio2l (long double x, long double *y) __ieee754_rem_pio2l (long double x, long double *y)
{ {
fputs ("__ieee754_rem_pio2l not implemented\n", stderr); fputs ("__ieee754_rem_pio2l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__ieee754_sqrtl (long double x) __ieee754_sqrtl (long double x)
{ {
fputs ("__ieee754_sqrtl not implemented\n", stderr); fputs ("__ieee754_sqrtl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__kernel_cosl (long double x, long double y) __kernel_cosl (long double x, long double y)
{ {
fputs ("__kernel_cosl not implemented\n", stderr); fputs ("__kernel_cosl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,12 +1,14 @@
#include <math.h> #include <math.h>
#include <math_private.h> #include <math_private.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
int int
__kernel_rem_pio2l (long double *x, long double *y, int e0, int nx, int prec, __kernel_rem_pio2l (long double *x, long double *y, int e0, int nx, int prec,
const int *ipio2) const int *ipio2)
{ {
fputs ("__kernel_rem_pio2l not implemented\n", stderr); fputs ("__kernel_rem_pio2l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__kernel_sinl (long double x, long double y) __kernel_sinl (long double x, long double y)
{ {
fputs ("__kernel_sinl not implemented\n", stderr); fputs ("__kernel_sinl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

View File

@ -1,10 +1,12 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
long double long double
__kernel_tanl (long double x, long double y, int iy) __kernel_tanl (long double x, long double y, int iy)
{ {
fputs ("__kernel_tanl not implemented\n", stderr); fputs ("__kernel_tanl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0; return 0.0;
} }

Some files were not shown because too many files have changed in this diff Show More