Update.
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:
parent
e7f1f046f5
commit
d705269e75
346
ChangeLog
346
ChangeLog
@ -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.
|
||||
|
||||
|
@ -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))
|
||||
|
14
Makerules
14
Makerules
@ -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
2
Rules
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
11
argp/argp.h
11
argp/argp.h
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 ;;
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
44
inet/rcmd.c
44
inet/rcmd.c
@ -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;
|
||||
}
|
||||
|
20
libc.map
20
libc.map
@ -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*;
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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 ();
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
16
manual/dir
Normal 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:
|
@ -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
|
||||
|
||||
|
@ -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}%
|
||||
|
@ -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 \
|
||||
|
287
math/libm-test.c
287
math/libm-test.c
@ -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 */
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
@ -45,6 +45,8 @@ ifeq ($(crypt-in-libc),yes)
|
||||
routines += $(libcrypt-routines)
|
||||
endif
|
||||
|
||||
$(objpfx)md5test: $(objpfx)md5.o
|
||||
|
||||
include ../Rules
|
||||
|
||||
ifeq ($(build-shared),yes)
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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';
|
||||
|
@ -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
135
string/argz-replace.c
Normal 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)
|
@ -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
|
||||
|
@ -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}
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
@ -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)
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
47
sysdeps/libm-ieee754/e_gamma_r.c
Normal file
47
sysdeps/libm-ieee754/e_gamma_r.c
Normal 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));
|
||||
}
|
46
sysdeps/libm-ieee754/e_gammaf_r.c
Normal file
46
sysdeps/libm-ieee754/e_gammaf_r.c
Normal 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));
|
||||
}
|
46
sysdeps/libm-ieee754/e_gammal_r.c
Normal file
46
sysdeps/libm-ieee754/e_gammal_r.c
Normal 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));
|
||||
}
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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 */
|
||||
|
@ -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
|
@ -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)
|
||||
|
@ -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)
|
@ -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 */
|
||||
|
@ -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)
|
@ -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,
|
||||
|
@ -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)
|
@ -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)
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -1 +1,2 @@
|
||||
fenv_const.c
|
||||
fenv_libc.h
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user