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>
* libc.map: Add more symbols.
@ -834,7 +1151,8 @@
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>
@ -1199,7 +1517,7 @@
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>
@ -1401,10 +1719,10 @@
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.
(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>
@ -2602,7 +2920,7 @@
* 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-help.c: Likewise.
@ -5205,8 +5523,8 @@
1997-02-21 10:41 Miles Bader <miles@gnu.ai.mit.edu>
* argp.h (OPTION_NO_USAGE): New macro.
* argp-help.c (usage_long_opt, usage_argful_short_opt,
* argp/argp.h (OPTION_NO_USAGE): New macro.
* argp/argp-help.c (usage_long_opt, usage_argful_short_opt,
add_argless_short_opt): Implement OPTION_NO_USAGE.
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>
* 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.
* 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.
(print_header, hol_entry_help): Use UPARAMS fields rather than
constants.
@ -5241,12 +5559,12 @@
(fill_in_uparams): New function.
(__argp_failure, __argp_error, __argp_state_help): Make STATE
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_failure): Make STATE parameter const.
(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>
@ -5283,12 +5601,12 @@
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.
* 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.
* 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
proper place.

View File

@ -381,13 +381,6 @@ link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
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
ifeq (yes,$(build-shared))
ifneq ($(common-objpfx),$(objpfx))

View File

@ -345,11 +345,7 @@ no-whole-archive =
endif
ifeq ($(versioning),yes)
ifneq ($(..),)
load-map-file = $(wildcard $($(@F:%.so=%)-map) $($(@F:%.so=%)-map):%=$(..)%)
else
load-map-file = $($(@F:%.so=%)-map)
endif
else
load-map-file =
endif
@ -371,8 +367,6 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \
-L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
-Wl,--whole-archive $(filter-out $(load-map-file),$^) \
$(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
test -z "$($(@F)-version)" || \
(rm -f $@$($(@F)-version); $(LN_S) $(@F) $@$($(@F)-version))
endef
# Don't try to use -lc when making libc.so itself.
@ -383,12 +377,18 @@ LDFLAGS-c.so = -nostdlib -nostartfiles
LDLIBS-c.so = -lgcc
# Give libc.so an entry point and make it directly runnable itself.
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.
$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
$(common-objpfx)libc_pic.a \
$(elfobjdir)/sofini.so $(elfobjdir)/ld.so \
$(libc-map:%=$(..)%)
$(libc-map)
$(build-shlib)
ifdef libc.so-version
$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
$(make-link)
endif
endif
# 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
subdir_echo-distinfo:
@echo $(addprefix +header+,$(headers)) \
@echo $(addprefix +header+,$(headers) $(filter %.h,$(distribute))) \
$(addprefix +nodist+,$(generated) $(common-generated) $(dont_distribute))
# We want to install everything except the library itself, but update all

View File

@ -38,6 +38,7 @@
# define _(msgid) (msgid)
# define gettext(msgid) (msgid)
#endif
#define N_(msgid) (msgid)
#endif
#if _LIBC - 0
@ -84,11 +85,11 @@ volatile int _argp_hang = 0;
static const struct argp_option argp_default_options[] =
{
{"help", '?', 0, 0, "Give this help list", -1},
{"usage", OPT_USAGE, 0, 0, "Give a short usage message"},
{"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, "Set the program name"},
{"help", '?', 0, 0, N_("Give this help list"), -1},
{"usage", OPT_USAGE, 0, 0, N_("Give a short usage message")},
{"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, N_("Set the program name")},
{"HANG", OPT_HANG, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
"Hang for SECS seconds (default 3600)"},
N_("Hang for SECS seconds (default 3600)")},
{0, 0}
};
@ -145,7 +146,7 @@ static const struct argp argp_default_argp =
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}
};
@ -160,7 +161,7 @@ argp_version_parser (int key, char *arg, struct argp_state *state)
else if (argp_program_version)
fprintf (state->out_stream, "%s\n", argp_program_version);
else
__argp_error (state, _("No version known!?"));
__argp_error (state, _("(PROGRAM ERROR) No version known!?"));
if (! (state->flags & ARGP_NO_EXIT))
exit (0);
break;
@ -637,8 +638,8 @@ parser_finalize (struct parser *parser,
err = EBADKEY;
}
/* Okay, we're all done, with either an error or success. We only call the
parsers once more, to indicate which one. */
/* Okay, we're all done, with either an error or success; call the parsers
to indicate which one. */
if (err)
{
@ -654,7 +655,7 @@ parser_finalize (struct parser *parser,
group_parse (group, &parser->state, ARGP_KEY_ERROR, 0);
}
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
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. */
}
/* 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)
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
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
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;
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
; group < parser->egroup && err == EBADKEY
; 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)
if (parser->state.next >= index)
/* Remember that we successfully processed a non-option
argument -- but only if the user hasn't gotten tricky and set
the clock back. */
(--group)->args_processed++;
else
/* The user wants to reparse some args, give getopt another try. */
parser->try_getopt = 1;
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 (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
argument -- but only if the user hasn't gotten tricky and set
the clock back. */
(--group)->args_processed += (parser->state.next - index);
else
/* The user wants to reparse some args, give getopt another try. */
parser->try_getopt = 1;
}
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
group_number + 1 for long opts. */
int group_key = opt >> USER_BITS;
error_t err = EBADKEY;
if (group_key == 0)
/* 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)
for (group = parser->groups; group < parser->egroup; group++)
if (group->short_end > short_index)
return group_parse (group, &parser->state, opt, optarg);
return EBADKEY; /* until otherwise asserted */
{
err = group_parse (group, &parser->state, opt, optarg);
break;
}
}
else
/* A long option. We use shifts instead of masking for extracting
the user value in order to preserve the sign. */
return
err =
group_parse (&parser->groups[group_key - 1], &parser->state,
(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).
@ -800,20 +856,20 @@ parser_parse_next (struct parser *parser, int *arg_ebadkey)
return EBADKEY;
}
else
/* A non-option arg. */
err =
parser_parse_arg (parser, parser->state.argv[parser->state.next++]);
else if (opt == KEY_ARG)
/* A non-option arg; simulate what getopt might have done. */
{
opt = KEY_ARG;
optarg = parser->state.argv[parser->state.next++];
}
if (opt == KEY_ARG)
/* A non-option argument; try each parser in turn. */
err = parser_parse_arg (parser, optarg);
else
err = parser_parse_opt (parser, opt, optarg);
if (err == EBADKEY)
{
*arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
parser->state.next--; /* Put back the unused argument. */
}
*arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
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
processed again. */
#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. */
#define ARGP_KEY_END 0x1000001
/* 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
copied to each child's state to be the initial value of the INPUT field. */
#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
still arguments remaining). */
#define ARGP_KEY_SUCCESS 0x1000004
/* Passed in if an error occurs (in which case a call with ARGP_KEY_SUCCESS is
never made, so any cleanup must be done here). */
/* Passed in if an error occurs. */
#define ARGP_KEY_ERROR 0x1000005
/* 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.
rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal
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-others = $(extra-libs)

View File

@ -126,7 +126,6 @@ longjmp (jmp_buf env, int val) { __longjmp (env[0].__jmpbuf, val); }
char * weak_function
__dcgettext (const char *domainname, const char *msgid, int category)
{
assert (domainname == _libc_intl_domainname);
return (char *) msgid;
}
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) *) (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) *) (map->l_addr

View File

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

View File

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

View File

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

View File

@ -6,14 +6,14 @@ GLIBC_2.0 {
_IO_stderr_; _IO_stdin_; _IO_stdout_;
_nl_msg_cat_cntr; __environ; _environ; _res;
___brk_addr; __curbrk; _nl_current_LC_CTYPE; _libc_intl_domainname;
_sys_errlist; _sys_siglist;
_sys_errlist; _sys_siglist; __progname;
# helper functions
__errno_location; __libc_init_first; __h_errno_location;
# functions with special/multiple interfaces
__sigsetjmp; _setjmp; __sigaddset; __sigdelset; __sigismember;
__sysv_signal; __bsd_getpgrp;
__sysv_signal; __bsd_getpgrp; _longjmp;
# functions which have an additional interface since they are
# are cancelable.
@ -52,6 +52,22 @@ GLIBC_2.0 {
__sched_getparam; __sched_getscheduler; __sched_setscheduler;
__sched_yield; __on_exit; __gettimeofday; __fork; __clone;
__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
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 \
utmp_file utmp_daemon utmpname updwtmp
others = utmpd
others = utmpd utmpdump
install-sbin = utmpd
utmpd-routines := connection database error request xtmp
extra-objs := $(utmpd-routines:=.o)

View File

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

View File

@ -134,8 +134,9 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
usage (EXIT_SUCCESS);
signal (SIGINT, termination_handler);
signal (SIGQUIT, termination_handler);
signal (SIGTERM, termination_handler);
/* Check if we are already running. */
if (check_pid (_PATH_UTMPDPID))
error (EXIT_FAILURE, 0, "already running");
@ -168,8 +169,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
if (write_pid (_PATH_UTMPDPID) < 0)
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. */
#include <limits.h>
#include <stddef.h>
#include <utmp.h>
@ -68,7 +67,7 @@ typedef struct
{
request_header header;
/* File to use. */
char file[_POSIX_PATH_MAX + 1];
char file[0];
} setutent_request;
typedef struct
@ -100,10 +99,10 @@ typedef struct
typedef struct
{
request_header header;
/* File to use. */
char file[_POSIX_PATH_MAX + 1];
/* Entry to write. */
struct utmp utmp;
/* File to use. */
char file[0];
} updwtmp_request;

View File

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

View File

@ -24,10 +24,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <utmp.h>
#include <sys/file.h>
#include <sys/stat.h>
#include "utmp-private.h"
@ -116,7 +115,7 @@ endutent_file (void)
static int
getutent_r_file (struct utmp *buffer, struct utmp **result)
{
int nbytes;
ssize_t nbytes;
struct flock fl; /* Information struct for locking. */
/* 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. */
memset (&fl, '\0', sizeof (struct flock));
fl.l_type = F_WRLCK;
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fcntl (file_fd, F_SETLKW, &fl);
@ -170,12 +169,20 @@ static int
getutline_r_file (const struct utmp *line, struct utmp *buffer,
struct utmp **result)
{
struct flock fl;
if (file_fd < 0 || file_offset == -1l)
{
*result = NULL;
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)
{
/* Read the next entry. */
@ -185,7 +192,7 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
__set_errno (ESRCH);
file_offset = -1l;
*result = NULL;
return -1;
goto unlock_return;
}
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));
*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
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 (id->ut_type == RUN_LVL || id->ut_type == BOOT_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);
file_offset = -1l;
return -1;
goto unlock_return;
}
file_offset += sizeof (struct utmp);
@ -274,7 +295,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
{
__set_errno (ESRCH);
file_offset = -1l;
return -1;
goto unlock_return;
}
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)
{
int result = -1;
struct stat st;
ssize_t nbytes;
struct flock fl;
off_t offset;
int fd;
/* Open WTMP file. */
fd = __open (file, O_WRONLY | O_APPEND);
fd = open (file, O_WRONLY);
if (fd < 0)
return -1;
/* Try to lock the file. */
if (__flock (fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS)
{
/* Oh, oh. The file is already locked. Wait a bit and try again. */
sleep (1);
/* This time we ignore the error. */
__flock (fd, LOCK_EX | LOCK_NB);
}
/* Try to get the lock. */
memset (&fl, '\0', sizeof (struct flock));
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fcntl (fd, F_SETLKW, &fl);
/* Remember original size of log file. */
if (__fstat (fd, &st) < 0)
goto fail;
offset = lseek (fd, 0, SEEK_END);
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
size back to the original size. That way, no partial entries
will remain. */
nbytes = __write (fd, utmp, sizeof (struct utmp));
if (nbytes != sizeof (struct utmp))
if (write (fd, utmp, sizeof (struct utmp)) != sizeof (struct utmp))
{
ftruncate (fd, st.st_size);
goto fail;
ftruncate (fd, offset);
goto unlock_return;
}
result = 0;
fail:
unlock_return:
/* And unlock the file. */
__flock (fd, LOCK_UN);
fl.l_type = F_UNLCK;
fcntl (fd, F_SETLKW, &fl);
/* Close WTMP file. */
__close (fd);
close (fd);
return result;
}

View File

@ -27,7 +27,7 @@ GAWK = gawk
.PHONY: all dvi info
all: dvi info
dvi: libc.dvi
info: libc.info
info: libc.info dir-add.info
# Get glibc's configuration info.
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
# access to the documentation of the function, variables, and other
# definitions.
dir-add.texi: xtract-typefun.awk $(chapters)
dir-add.texi: xtract-typefun.awk $(chapters) $(chapters-incl)
(echo "@dircategory GNU C library functions"; \
echo "@direntry"; \
$(GAWK) -f $^ | sort; \
@ -101,7 +101,7 @@ distribute = $(minimal-dist) \
$(minimal-dist))) \
libc.info* libc.?? libc.??s texinfo.tex summary.texi \
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)
tar-it = tar chovf $@ $^
@ -143,6 +143,7 @@ realclean: distclean
install-data subdir_install: install
install: $(inst_infodir)/libc.info dir-add.info
@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) dir-add.info;\
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.
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},
-@var{m}, @dots{}, -2, -1. Every entry in an options array with this
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
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
@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
-1.
--1.
Note that because of C structure initialization rules, this field
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
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 GNU
@item ARGP_KEY_END
@ -797,7 +826,11 @@ Don't exit on errors (they may still result in error messages).
@comment argp.h
@comment GNU
@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 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.
@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
@subsection Envz Functions

View File

@ -1,5 +1,5 @@
%% 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,
% 94, 95, 96, 97 Free Software Foundation, Inc.
@ -36,7 +36,7 @@
% This automatically updates the version number based on RCS.
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
\deftexinfoversion$Revision: 2.203 $
\deftexinfoversion\$Revision: 2.204 $
\message{Loading texinfo package [Version \texinfoversion]:}
% If in a .fmt file, print the version number
@ -185,7 +185,13 @@
%
\unvbox\headlinebox
\pagebody{#1}%
\unvbox\footlinebox
\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
\fi
%
\ifcropmarks
\egroup % end of \vbox\bgroup
@ -1006,6 +1012,15 @@ where each line of input produces a line of output.}
\openindices
\fixbackslash % Turn off hack to swallow `\input texinfo'.
\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.
}
@ -1504,10 +1519,7 @@ where each line of input produces a line of output.}
\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
\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\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\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\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\everyfootingyyy #1@|#2@|#3@|#4\finish{%
\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
%
}% unbind the catcode of @.
@ -2244,7 +2259,13 @@ width0pt\relax} \fi
%\def\char{\realbackslash char}%
\def\TeX{\realbackslash TeX}%
\def\dots{\realbackslash dots }%
\def\copyright{\realbackslash copyright }%
\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\tclose##1{\realbackslash tclose {##1}}%
\def\code##1{\realbackslash code {##1}}%
\def\dotless##1{\realbackslash dotless {##1}}%
@ -2696,6 +2717,12 @@ width0pt\relax} \fi
\def\print{\realbackslash print}%
\def\TeX{\realbackslash TeX}%
\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\tt{\realbackslash tt}%
\def\bf{\realbackslash bf}%

View File

@ -39,20 +39,20 @@ extra-libs-others = $(extra-libs)
libm-map := libm.map
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 \
ftestexcept fegetround fesetround fegetenv feholdexcpt \
fesetenv feupdateenv
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_rem_pio2 e_remainder e_scalb e_sinh e_sqrt k_cos \
k_rem_pio2 k_sin k_tan s_asinh s_atan s_cbrt \
e_rem_pio2 e_remainder e_scalb e_sinh e_sqrt e_gamma_r \
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_floor s_frexp s_ilogb s_ldexp s_log1p s_logb \
s_modf s_nextafter s_rint s_scalbn s_significand \
s_sin s_tan s_tanh w_acos w_acosh w_asin \
w_atan2 w_atanh w_cosh w_drem w_exp w_fmod w_gamma \
w_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 \
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 \

View File

@ -47,8 +47,8 @@
ilogb, isfinite, isinf, isnan, isnormal,
ldexp, lgamma, log, log10, log1p, log2, logb,
modf, nearbyint, nextafter,
pow, remainder, remquo, rint, rinttol, rinttoll,
round, roundtol, roundtoll,
pow, remainder, remquo, rint, lrint, llrint,
round, lround, llround,
scalb, scalbn, signbit, sin, sincos, sinh, sqrt, tan, tanh, trunc
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);
}
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)
@ -953,7 +982,9 @@ atan2_test (void)
static void
atanh_test (void)
{
#ifndef TEST_INLINE
MATHTYPE x;
#endif
check ("atanh(+0) == +0", FUNC(atanh) (0), 0);
#ifndef TEST_INLINE
@ -1089,7 +1120,7 @@ static void
exp2_test (void)
{
errno = 0;
exp2(0);
FUNC(exp2) (0);
if (errno == ENOSYS)
/* Function not implemented. */
return;
@ -1257,7 +1288,6 @@ signbit_test (void)
check_bool ("signbit (-0) != 0", signbit (minus_zero));
check_bool ("signbit (+inf) == 0", signbit (plus_infty) == 0);
check_bool ("signbit (-inf) != 0", signbit (minus_infty));
check_bool ("signbit (NaN) == 0", signbit (nan_value));
x = random_less (0);
check_bool ("signbit (x) != 0 for x < 0", signbit (x));
@ -1272,21 +1302,26 @@ signbit_test (void)
static 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_isnan_exc ("gamma (0) == NaN plus invalid exception",
FUNC(gamma) (0), INVALID_EXCEPTION);
x = random_less (0.0);
check_isnan_exc_ext ("gamma (x) == NaN plus invalid exception for x <= 0",
FUNC(gamma) (x), INVALID_EXCEPTION, x);
check_isnan_exc_ext ("gamma (x) == NaN plus invalid exception for integer x <= 0",
FUNC(gamma) (-2), INVALID_EXCEPTION, -2);
check_isnan_exc ("gamma (-inf) == NaN plus invalid exception",
FUNC(gamma) (minus_infty), INVALID_EXCEPTION);
check ("gamma (0.5) == sqrt(pi)", FUNC(gamma) (0.5), FUNC(sqrt) (M_PI));
check ("gamma (-0.5) == -2*sqrt(pi)", FUNC(gamma) (-0.5),
-2*FUNC(sqrt) (M_PI));
check_eps ("gamma (0.5) == sqrt(pi)", FUNC(gamma) (0.5), FUNC(sqrt) (M_PI),
CHOOSE (0, 5e-16, 2e-7));
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 (4) == 6", FUNC(gamma) (4), 6);
@ -1297,15 +1332,19 @@ gamma_test (void)
static 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_isnan_exc ("lgamma (0) == +inf plus divide by zero exception",
FUNC(lgamma) (0), DIVIDE_BY_ZERO_EXCEPTION);
check_isinfp_exc ("lgamma (0) == +inf plus divide by zero exception",
FUNC(lgamma) (0), DIVIDE_BY_ZERO_EXCEPTION);
x = random_less (0.0);
check_isnan_exc_ext ("lgamma (x) == +inf plus divide by zero exception for x <= 0",
FUNC(lgamma) (x), DIVIDE_BY_ZERO_EXCEPTION, x);
check_isinfp_exc ("lgamma (x) == +inf plus divide by zero exception for integer x <= 0",
FUNC(lgamma) (-3), DIVIDE_BY_ZERO_EXCEPTION);
check_isnan_exc ("lgamma (-inf) == NaN plus invalid exception",
FUNC(lgamma) (minus_infty), INVALID_EXCEPTION);
@ -1331,23 +1370,15 @@ static void
ilogb_test (void)
{
/* XXX Are these tests correct? I couldn't find any specification */
#if 0
/* the source suggests that the following calls should fail -
but shall we test these special cases or just ignore them? */
check_isinfp ("ilogb (+inf) == +inf", FUNC(ilogb) (plus_infty));
check_isinfp ("ilogb (-inf) == +inf", FUNC(ilogb) (minus_infty));
check_int ("ilogb (1) == 0", FUNC(ilogb) (1), 0);
check_int ("ilogb (e) == 1", FUNC(ilogb) (M_E), 1);
check_int ("ilogb (1024) == 10", FUNC(ilogb) (1024), 10);
check_int ("ilogb (-2000) == 10", FUNC(ilogb) (-2000), 10);
check_isinfn_exc ("ilogb (+0) == -inf plus divide-by-zero exception",
FUNC(ilogb) (0), DIVIDE_BY_ZERO_EXCEPTION);
check_isinfn_exc ("ilogb (-0) == -inf plus divide-by-zero 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);
check_int_exc ("ilogb (0) == FP_ILOGB0", FUNC(ilogb) (0.0), FP_ILOGB0,
DIVIDE_BY_ZERO_EXCEPTION|INVALID_EXCEPTION);
check_int_exc ("ilogb (NaN) == FP_ILOGBNAN", FUNC(ilogb) (nan_value),
FP_ILOGBNAN, INVALID_EXCEPTION);
}
@ -1526,17 +1557,72 @@ scalb_test (void)
{
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 (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.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);
fesetenv (&fenv);
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);
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);
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);
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,
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,
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,
CHOOSE(0, 1e-15, 0));
CHOOSE(5e-16, 1e-15, 2e-7));
}
@ -4355,44 +4442,44 @@ rint_test (void)
static void
rinttol_test (void)
lrint_test (void)
{
/* XXX this test is incomplete. We need to have a way to specifiy
the rounding method and test the critical cases. So far, only
unproblematic numbers are tested. */
check_long ("rinttol(0) = 0", rinttol (0.0), 0);
check_long ("rinttol(-0) = 0", rinttol (minus_zero), 0);
check_long ("rinttol(0.2) = 0", rinttol (0.2), 0);
check_long ("rinttol(-0.2) = 0", rinttol (-0.2), 0);
check_long ("lrint(0) = 0", lrint (0.0), 0);
check_long ("lrint(-0) = 0", lrint (minus_zero), 0);
check_long ("lrint(0.2) = 0", lrint (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 ("rinttol(-1.4) = -1", rinttol (-1.4), -1);
check_long ("lrint(1.4) = 1", lrint (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 ("rinttol(-8388600.3) = -8388600", rinttol (-8388600.3),
check_long ("lrint(8388600.3) = 8388600", lrint (8388600.3), 8388600);
check_long ("lrint(-8388600.3) = -8388600", lrint (-8388600.3),
-8388600);
}
static void
rinttoll_test (void)
llrint_test (void)
{
/* XXX this test is incomplete. We need to have a way to specifiy
the rounding method and test the critical cases. So far, only
unproblematic numbers are tested. */
check_longlong ("rinttoll(0) = 0", rinttoll (0.0), 0);
check_longlong ("rinttoll(-0) = 0", rinttoll (minus_zero), 0);
check_longlong ("rinttoll(0.2) = 0", rinttoll (0.2), 0);
check_longlong ("rinttoll(-0.2) = 0", rinttoll (-0.2), 0);
check_longlong ("llrint(0) = 0", llrint (0.0), 0);
check_longlong ("llrint(-0) = 0", llrint (minus_zero), 0);
check_longlong ("llrint(0.2) = 0", llrint (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 ("rinttoll(-1.4) = -1", rinttoll (-1.4), -1);
check_longlong ("llrint(1.4) = 1", llrint (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);
check_longlong ("rinttoll(-8388600.3) = -8388600", rinttoll (-8388600.3),
check_longlong ("llrint(-8388600.3) = -8388600", llrint (-8388600.3),
-8388600);
}
@ -4416,45 +4503,45 @@ round_test (void)
static void
roundtol_test (void)
lround_test (void)
{
check_long ("roundtol(0) = 0", roundtol (0), 0);
check_long ("roundtol(-0) = 0", roundtol (minus_zero), 0);
check_long ("roundtol(0.2) = 0", roundtol (0.2), 0.0);
check_long ("roundtol(-0.2) = 0", roundtol (-0.2), 0);
check_long ("roundtol(0.5) = 1", roundtol (0.5), 1);
check_long ("roundtol(-0.5) = -1", roundtol (-0.5), -1);
check_long ("roundtol(0.8) = 1", roundtol (0.8), 1);
check_long ("roundtol(-0.8) = -1", roundtol (-0.8), -1);
check_long ("roundtol(1.5) = 2", roundtol (1.5), 2);
check_long ("roundtol(-1.5) = -2", roundtol (-1.5), -2);
check_long ("roundtol(2097152.5) = 2097153", roundtol (2097152.5), 2097153);
check_long ("roundtol(-2097152.5) = -2097153", roundtol (-2097152.5),
check_long ("lround(0) = 0", lround (0), 0);
check_long ("lround(-0) = 0", lround (minus_zero), 0);
check_long ("lround(0.2) = 0", lround (0.2), 0.0);
check_long ("lround(-0.2) = 0", lround (-0.2), 0);
check_long ("lround(0.5) = 1", lround (0.5), 1);
check_long ("lround(-0.5) = -1", lround (-0.5), -1);
check_long ("lround(0.8) = 1", lround (0.8), 1);
check_long ("lround(-0.8) = -1", lround (-0.8), -1);
check_long ("lround(1.5) = 2", lround (1.5), 2);
check_long ("lround(-1.5) = -2", lround (-1.5), -2);
check_long ("lround(2097152.5) = 2097153", lround (2097152.5), 2097153);
check_long ("lround(-2097152.5) = -2097153", lround (-2097152.5),
-2097153);
}
static void
roundtoll_test (void)
llround_test (void)
{
check_longlong ("roundtoll(0) = 0", roundtoll (0), 0);
check_longlong ("roundtoll(-0) = 0", roundtoll (minus_zero), 0);
check_longlong ("roundtoll(0.2) = 0", roundtoll (0.2), 0.0);
check_longlong ("roundtoll(-0.2) = 0", roundtoll (-0.2), 0);
check_longlong ("roundtoll(0.5) = 1", roundtoll (0.5), 1);
check_longlong ("roundtoll(-0.5) = -1", roundtoll (-0.5), -1);
check_longlong ("roundtoll(0.8) = 1", roundtoll (0.8), 1);
check_longlong ("roundtoll(-0.8) = -1", roundtoll (-0.8), -1);
check_longlong ("roundtoll(1.5) = 2", roundtoll (1.5), 2);
check_longlong ("roundtoll(-1.5) = -2", roundtoll (-1.5), -2);
check_longlong ("roundtoll(2097152.5) = 2097153",
roundtoll (2097152.5), 2097153);
check_longlong ("roundtoll(-2097152.5) = -2097153",
roundtoll (-2097152.5), -2097153);
check_longlong ("roundtoll(34359738368.5) = 34359738369",
roundtoll (34359738368.5), 34359738369ll);
check_longlong ("roundtoll(-34359738368.5) = -34359738369",
roundtoll (-34359738368.5), -34359738369ll);
check_longlong ("llround(0) = 0", llround (0), 0);
check_longlong ("llround(-0) = 0", llround (minus_zero), 0);
check_longlong ("llround(0.2) = 0", llround (0.2), 0.0);
check_longlong ("llround(-0.2) = 0", llround (-0.2), 0);
check_longlong ("llround(0.5) = 1", llround (0.5), 1);
check_longlong ("llround(-0.5) = -1", llround (-0.5), -1);
check_longlong ("llround(0.8) = 1", llround (0.8), 1);
check_longlong ("llround(-0.8) = -1", llround (-0.8), -1);
check_longlong ("llround(1.5) = 2", llround (1.5), 2);
check_longlong ("llround(-1.5) = -2", llround (-1.5), -2);
check_longlong ("llround(2097152.5) = 2097153",
llround (2097152.5), 2097153);
check_longlong ("llround(-2097152.5) = -2097153",
llround (-2097152.5), -2097153);
check_longlong ("llround(34359738368.5) = 34359738369",
llround (34359738368.5), 34359738369ll);
check_longlong ("llround(-34359738368.5) = -34359738369",
llround (-34359738368.5), -34359738369ll);
}
@ -4811,11 +4898,11 @@ main (int argc, char *argv[])
floor_test ();
nearbyint_test ();
rint_test ();
rinttol_test ();
rinttoll_test ();
lrint_test ();
llrint_test ();
round_test ();
roundtol_test ();
roundtoll_test ();
lround_test ();
llround_test ();
trunc_test ();
/* remainder functions */

View File

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

View File

@ -138,9 +138,7 @@ __MATHCALL (sqrt,, (_Mdouble_ __x));
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X
/* Return `sqrt(X*X + Y*Y)'. */
__MATHCALL (hypot,, (_Mdouble_ __x, _Mdouble_ __y));
#endif
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
/* Return the cube root of X. */
__MATHCALL (cbrt,, (_Mdouble_ __x));
#endif
@ -177,9 +175,6 @@ __MATHDECLX (int,finite,, (_Mdouble_ __value), (__const__));
and may return an infinity or NaN, or may do something else. */
__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. */
__MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y));
@ -203,9 +198,6 @@ __MATHCALLX (nan,, (__const char *__tagb), (__const__));
/* Return nonzero if VALUE is not a number. */
__MATHDECLX (int,isnan,, (_Mdouble_ __value), (__const__));
/* Return the binary exponent of X, which must be nonzero. */
__MATHDECL (int,ilogb,, (_Mdouble_ __x));
/* Bessel functions. */
__MATHCALL (j0,, (_Mdouble_));
__MATHCALL (j1,, (_Mdouble_));
@ -222,6 +214,7 @@ __MATHCALL (erf,, (_Mdouble_));
__MATHCALL (erfc,, (_Mdouble_));
__MATHCALL (gamma,, (_Mdouble_));
__MATHCALL (lgamma,, (_Mdouble_));
#endif
#ifdef __USE_MISC
/* 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 *));
#endif
#endif /* Use misc or X/Open. */
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X
/* 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. */
__MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y));
#endif
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
/* Return X times (2 to the Nth power). */
__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
#ifdef __USE_ISOC9X

View File

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

View File

@ -22,7 +22,7 @@
subdir := nis
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)
# service. This must be a superset of the services in nss.

View File

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

View File

@ -166,6 +166,12 @@ main (int argc, char **argv)
if (res != 1 || a != 0)
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);

View File

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

View File

@ -36,13 +36,13 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \
swab strfry memfrob memmem \
$(addprefix argz-,append count create ctsep next \
delete extract insert stringify \
addsep) \
addsep replace) \
envz basename \
strcoll_l strxfrm_l
tests := tester testcopy test-ffs tst-strlen stratcliff \
tst-svc
distribute := memcopy.h pagecopy.h
distribute := memcopy.h pagecopy.h tst-svc.expect
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));
extern error_t argz_insert __P ((char **__argz, size_t *__argz_len,
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
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.
# We use a stamp file to avoid unnessary recompilation each time rpcgen is
# 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
$(make-target-directory)
-@rm -f ${@:stmp=T} $@
@ -138,7 +139,8 @@ $(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen
touch $@
# 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
-@rm -f ${@: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 HUGE_VAL
/* The values returned by `ilogb' for 0 and NaN respectively. */
#define FP_ILOGB0 0x80000001
#define FP_ILOGBNAN 0x7fffffff
#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 HUGE_VALL
/* The values returned by `ilogb' for 0 and NaN respectively. */
#define FP_ILOGB0 0x80000000
#define FP_ILOGBNAN 0x80000000
#endif /* mathbits.h */

View File

@ -1,16 +1,94 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Correct handling of y==-inf <drepper@gnu>
*/
#include <machine/asm.h>
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)
fldl 12(%esp)
fxam
fnstsw
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
fstp %st(1)
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)

View File

@ -2,16 +2,95 @@
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
* Adapted for float type by Ulrich Drepper <drepper@cygnus.com>.
*
* Correct handling of y==-inf <drepper@gnu>
*/
#include <machine/asm.h>
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)
flds 8(%esp)
fxam
fnstsw
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
fstp %st(1)
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)

View File

@ -3,16 +3,94 @@
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*
* Correct handling of y==-inf <drepper@gnu>
*/
#include <machine/asm.h>
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)
fldt 16(%esp)
fxam
fnstsw
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
fstp %st(1)
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)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -25,7 +25,12 @@ ENTRY(__remquo)
shrl %cl, %eax
andl $3, %eax
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
END (__remquo)
weak_alias (__remquo, remquo)

View File

@ -25,7 +25,12 @@ ENTRY(__remquof)
shrl %cl, %eax
andl $3, %eax
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
END (__remquof)
weak_alias (__remquof, remquof)

View File

@ -25,7 +25,12 @@ ENTRY(__remquol)
shrl %cl, %eax
andl $3, %eax
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
END (__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

@ -5,7 +5,7 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
@ -15,12 +15,12 @@ static char rcsid[] = "$NetBSD: e_lgamma_r.c,v 1.7 1995/05/10 20:45:42 jtc Exp $
#endif
/* __ieee754_lgamma_r(x, signgamp)
* Reentrant version of the logarithm of the Gamma function
* with user provide pointer for the sign of Gamma(x).
* Reentrant version of the logarithm of the Gamma function
* with user provide pointer for the sign of Gamma(x).
*
* Method:
* 1. Argument Reduction for 0 < x <= 8
* Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
* Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
* reduce x to a number in [1.5,2.5] by
* lgamma(1+s) = log(s) + lgamma(s)
* for example,
@ -58,36 +58,36 @@ static char rcsid[] = "$NetBSD: e_lgamma_r.c,v 1.7 1995/05/10 20:45:42 jtc Exp $
* by
* 3 5 11
* w = w0 + w1*z + w2*z + w3*z + ... + w6*z
* where
* where
* |w - f(z)| < 2**-58.74
*
*
* 4. For negative x, since (G is gamma function)
* -x*G(-x)*G(x) = pi/sin(pi*x),
* we have
* G(x) = pi/(sin(pi*x)*(-x)*G(-x))
* since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
* Hence, for x<0, signgam = sign(sin(pi*x)) and
* Hence, for x<0, signgam = sign(sin(pi*x)) and
* lgamma(x) = log(|Gamma(x)|)
* = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
* Note: one should avoid compute pi*(-x) directly in the
* Note: one should avoid compute pi*(-x) directly in the
* computation of sin(pi*(-x)).
*
*
* 5. Special Cases
* lgamma(2+s) ~ s*(1-Euler) for tiny s
* lgamma(1)=lgamma(2)=0
* lgamma(x) ~ -log(x) for tiny x
* lgamma(0) = lgamma(inf) = inf
* lgamma(-integer) = +-inf
*
*
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
static const double
static const double
#else
static double
static double
#endif
two52= 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
half= 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
@ -200,9 +200,9 @@ static double zero= 0.00000000000000000000e+00;
}
switch (n) {
case 0: y = __kernel_sin(pi*y,zero,0); break;
case 1:
case 1:
case 2: y = __kernel_cos(pi*(0.5-y),zero); break;
case 3:
case 3:
case 4: y = __kernel_sin(pi*(one-y),zero,0); break;
case 5:
case 6: y = -__kernel_cos(pi*(y-1.5),zero); break;
@ -226,9 +226,11 @@ static double zero= 0.00000000000000000000e+00;
/* purge off +-inf, NaN, +-0, and negative arguments */
*signgamp = 1;
if ((unsigned int) hx==0xfff00000&&lx==0)
return x-x;
ix = hx&0x7fffffff;
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(hx<0) {
*signgamp = -1;
@ -237,9 +239,9 @@ static double zero= 0.00000000000000000000e+00;
}
if(hx<0) {
if(ix>=0x43300000) /* |x|>=2**52, must be -integer */
return one/zero;
return x/zero;
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));
if(t<zero) *signgamp = -1;
x = -x;
@ -275,7 +277,7 @@ static double zero= 0.00000000000000000000e+00;
p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
p = z*p1-(tt-w*(p2+y*p3));
r += (tf + p); break;
case 2:
case 2:
p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
r += (-0.5*y + p1/p2);
@ -304,7 +306,7 @@ static double zero= 0.00000000000000000000e+00;
y = z*z;
w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
r = (x-half)*(t-one)+w;
} else
} else
/* 2**58 <= x <= inf */
r = x*(__ieee754_log(x)-one);
if(hx<0) r = nadj - r;

View File

@ -8,7 +8,7 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
@ -21,9 +21,9 @@ static char rcsid[] = "$NetBSD: e_lgammaf_r.c,v 1.3 1995/05/10 20:45:47 jtc Exp
#include "math_private.h"
#ifdef __STDC__
static const float
static const float
#else
static float
static float
#endif
two23= 8.3886080000e+06, /* 0x4b000000 */
half= 5.0000000000e-01, /* 0x3f000000 */
@ -136,9 +136,9 @@ static float zero= 0.0000000000e+00;
}
switch (n) {
case 0: y = __kernel_sinf(pi*y,zero,0); break;
case 1:
case 1:
case 2: y = __kernel_cosf(pi*((float)0.5-y),zero); break;
case 3:
case 3:
case 4: y = __kernel_sinf(pi*(one-y),zero,0); break;
case 5:
case 6: y = -__kernel_cosf(pi*(y-(float)1.5),zero); break;
@ -162,9 +162,11 @@ static float zero= 0.0000000000e+00;
/* purge off +-inf, NaN, +-0, and negative arguments */
*signgamp = 1;
if ((unsigned int)hx==0xff800000)
return x-x;
ix = hx&0x7fffffff;
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(hx<0) {
*signgamp = -1;
@ -173,9 +175,9 @@ static float zero= 0.0000000000e+00;
}
if(hx<0) {
if(ix>=0x4b000000) /* |x|>=2**23, must be -integer */
return one/zero;
return x/zero;
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));
if(t<zero) *signgamp = -1;
x = -x;
@ -211,7 +213,7 @@ static float zero= 0.0000000000e+00;
p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
p = z*p1-(tt-w*(p2+y*p3));
r += (tf + p); break;
case 2:
case 2:
p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
r += (-(float)0.5*y + p1/p2);
@ -240,7 +242,7 @@ static float zero= 0.0000000000e+00;
y = z*z;
w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
r = (x-half)*(t-one)+w;
} else
} else
/* 2**58 <= x <= inf */
r = x*(__ieee754_logf(x)-one);
if(hx<0) r = nadj - r;

View File

@ -33,7 +33,7 @@ static long double two52[2] =
long long int
__rinttoll (long double x)
__llrint (long double x)
{
int32_t j0,sx;
u_int32_t i0, i1, i;
@ -141,7 +141,7 @@ static long double two63[2] =
long long int
__rinttoll (long double x)
__llrint (long double x)
{
int32_t se,j0,sx;
u_int32_t i0, i1, i;
@ -239,4 +239,4 @@ __rinttoll (long double x)
}
#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. */
long long int
__roundtoll (long double x)
__llround (long double x)
{
int32_t j0;
u_int32_t i1, i0;
@ -103,7 +103,7 @@ __roundtoll (long double x)
}
#else
long long int
__roundtoll (long double x)
__llround (long double x)
{
int32_t j0;
u_int32_t se, i1, i0;
@ -176,4 +176,4 @@ __roundtoll (long double x)
return se & 0x8000 ? -result : result;
}
#endif
weak_alias (__roundtoll, roundtoll)
weak_alias (__llround, llround)

View File

@ -33,7 +33,7 @@ static long double two52[2] =
long int
__rinttol (long double x)
__lrint (long double x)
{
int32_t j0,sx;
u_int32_t i0,i1,i;
@ -141,7 +141,7 @@ static long double two63[2] =
long int
__rinttol (long double x)
__lrint (long double x)
{
int32_t se,j0,sx;
u_int32_t i0,i1,i;
@ -239,4 +239,4 @@ __rinttol (long double x)
}
#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. */
long int
__roundtol (long double x)
__lround (long double x)
{
int32_t j0;
u_int32_t i1, i0;
@ -101,7 +101,7 @@ __roundtol (long double x)
}
#else
long int
__roundtol (long double x)
__lround (long double x)
{
int32_t j0;
u_int32_t se, i1, i0;
@ -174,4 +174,4 @@ __roundtol (long double x)
return se & 0x8000 ? -result : result;
}
#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)
{
x -= y;
++cquo;
if (x + x >= y)
{
x -= y;
@ -95,6 +96,7 @@ __remquo (double x, double y, int *quo)
if (x > y_half)
{
x -= y;
++cquo;
if (x >= y_half)
{
x -= y;

View File

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

View File

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

View File

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

View File

@ -8,7 +8,7 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
@ -31,10 +31,10 @@ huge = 1.0e+30,
tiny = 1.0e-30;
#ifdef __STDC__
float __scalbnf (float x, int n)
float __scalbnf (float x, long int n)
#else
float __scalbnf (x,n)
float x; int n;
float x; long int n;
#endif
{
int32_t k,ix;
@ -44,18 +44,18 @@ tiny = 1.0e-30;
if ((ix&0x7fffffff)==0) return x; /* +-0 */
x *= two25;
GET_FLOAT_WORD(ix,x);
k = ((ix&0x7f800000)>>23) - 25;
if (n< -50000) return tiny*x; /*underflow*/
k = ((ix&0x7f800000)>>23) - 25;
}
if (k==0xff) return x+x; /* NaN or Inf */
k = k+n;
if (k > 0xfe) return huge*copysignf(huge,x); /* overflow */
k = k+n;
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 */
{SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
if (k <= -25)
if (n > 50000) /* in case integer overflow in n+k */
return huge*copysignf(huge,x); /*overflow*/
else return tiny*copysignf(tiny,x); /*underflow*/
return tiny*copysignf(tiny,x); /*underflow*/
k += 25; /* subnormal result */
SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
return x*twom25;

View File

@ -33,16 +33,16 @@ static const long double
#else
static long double
#endif
two54 = 1.80143985094819840000e+16, /* 0x4035, 0x00000000, 0x00000000 */
twom54 = 5.55111512312578270212e-17, /* 0x3FC9, 0x00000000, 0x00000000 */
two63 = 4.50359962737049600000e+15,
twom63 = 1.08420217248550443400e-19;
huge = 1.0e+4900L,
tiny = 1.0e-4900L;
#ifdef __STDC__
long double __scalbnl (long double x, int n)
long double __scalbnl (long double x, long int n)
#else
long double __scalbnl (x,n)
long double x; int n;
long double x; long int n;
#endif
{
int32_t k,es,hx,lx;
@ -50,22 +50,22 @@ tiny = 1.0e-4900L;
k = es&0x7fff; /* extract exponent */
if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54;
GET_HIGH_WORD(hx,x);
k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
x *= two63;
GET_LDOUBLE_EXP(es,x);
k = (hx&0x7fff) - 63;
}
if (k==0x7ff) return x+x; /* NaN or Inf */
if (k==0x7fff) return x+x; /* NaN or Inf */
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 */
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
if (k <= -54)
if (n > 50000) /* in case integer overflow in n+k */
return huge*__copysign(huge,x); /*overflow*/
else return tiny*__copysign(tiny,x); /*underflow*/
{SET_LDOUBLE_EXP(x,(es&0x8000)|k); return x;}
if (k <= -63)
return tiny*__copysignl(tiny,x); /*underflow*/
k += 54; /* subnormal result */
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
return x*twom54;
SET_LDOUBLE_EXP(x,(es&0x8000)|k);
return x*twom63;
}
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
/* double gamma(double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call gamma_r
* Return the logarithm of the Gamma function of x or the Gamma function of x,
* depending on the library mode.
*/
#include "math.h"
#include "math_private.h"
extern int signgam;
#ifdef __STDC__
double __gamma(double x)
#else
@ -32,12 +29,19 @@ extern int signgam;
double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgamma_r(x,&signgam);
#else
int signgam;
double y;
y = __ieee754_lgamma_r(x,&signgam);
if(_LIB_VERSION == _IEEE_) return y;
if (_LIB_VERSION == _SVID_)
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(!__finite(y)&&__finite(x)) {
if(__floor(x)==x&&x<=0.0)
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

@ -8,7 +8,7 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
@ -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_private.h"
extern int signgam;
#ifdef __STDC__
float __gammaf(float x)
#else
@ -29,12 +27,19 @@ extern int signgam;
float x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammaf_r(x,&signgam);
#else
int signgam;
float y;
y = __ieee754_lgammaf_r(x,&signgam);
if(_LIB_VERSION == _IEEE_) return y;
if (_LIB_VERSION == _SVID_)
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(!__finitef(y)&&__finitef(x)) {
if(__floorf(x)==x&&x<=(float)0.0)
/* gammaf pole */
@ -45,5 +50,5 @@ extern int signgam;
} else
return y;
#endif
}
}
weak_alias (__gammaf, gammaf)

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
/* long double gammal(double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call gammal_r
* Return the Gamma function of x.
*/
#include "math.h"
#include "math_private.h"
extern int signgam;
#ifdef __STDC__
long double __gammal(long double x)
#else
@ -36,12 +32,19 @@ extern int signgam;
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,&signgam);
#else
long double y;
y = __ieee754_lgammal_r(x,&signgam);
if(_LIB_VERSION == _IEEE_) return y;
int signgam;
if (_LIB_VERSION == _SVID_)
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(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
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)
#undef __inline_functions
__m81_defun (long int, __rinttol, (long double __x))
__m81_defun (long int, __lrint, (long double __x))
{
long int __result;
__asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x));
@ -391,7 +391,7 @@ __inline_forward_c(int,ilogbl, (long double __value), (__value))
#endif
#ifdef __USE_ISOC9X
__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
#ifdef __USE_GNU
__inline_forward(void,sincosl,

View File

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

View File

@ -23,9 +23,9 @@
#include <math.h>
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;
int cquo, fpsr;
/* FIXME: Which of frem and fmod is correct? */
#if 1
__asm ("frem%.x %2,%0\n\tfmove%.l %/fpsr,%1"
: "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x));
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))
cquo = -cquo;
*quo = cquo;

View File

@ -16,6 +16,9 @@
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# 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))
$(common-objpfx)stdio_lim.h:
@echo
@ -38,3 +41,5 @@ $(common-objpfx)mk-stdiolim: $(sysdep_dir)/posix/mk-stdiolim.c \
common-generated := $(common-generated) stdio_lim.h mk-stdiolim
before-compile := $(before-compile) $(common-objpfx)stdio_lim.h
endif # inhibit-stdio_lim

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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