From d705269e75ff9846000abea981774b381b076482 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 19 Jun 1997 19:11:22 +0000 Subject: Update. 1997-06-19 19:38 Ulrich Drepper * 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 * time/tzfile.c (__tzfile_read): Store getc () return in int. 1997-06-13 Miles Bader * 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 * 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 * 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 * string/Makefile (routines): Add argz-replace. 1997-06-16 00:16 Miles Bader * manual/string.texi (Argz Functions): Document argz_replace. 1997-06-12 Miles Bader * string/argz.h (__argz_replace, argz_replace): New declarations. * string/argz-replace.c: New file. 1997-06-11 Miles Bader * manual/argp.texi (Argp Special Keys): Document ARGP_KEY_ARGS. 1997-06-16 23:08 Andreas Schwab * 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 * 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 * 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 * 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 * 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 * libc.map: Add more symbols. 1997-06-18 12:01 Ulrich Drepper * manual/Makefile (install): Make sure `dir' file exists if we use install-info. 1997-06-17 19:32 Andreas Schwab * manual/Makefile (info): Depend on dir-add.info. 1997-06-17 17:19 Andreas Schwab * elf/ldd.bash.in: Fix spacing in message. 1997-06-17 14:28 Andreas Schwab * elf/do-rel.h (elf_dynamic_do_rel): Always use version information if available. 1997-06-17 11:34 Andreas Schwab * 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 * 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 * 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 * 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 * 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 * 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 * sysdeps/unix/sysv/linux/arm/Dist: New file. 1997-06-14 17:59 Andreas Schwab * 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 * 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 : 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. --- ChangeLog | 346 ++++++++++++++++++++++++++++++++-- Makeconfig | 7 - Makerules | 14 +- Rules | 2 +- argp/argp-parse.c | 126 +++++++++---- argp/argp.h | 11 +- elf/Makefile | 2 +- elf/dl-minimal.c | 1 - elf/do-rel.h | 2 +- elf/ldd.bash.in | 2 +- extra-lib.mk | 2 +- features.h | 3 + inet/rcmd.c | 44 ++--- libc.map | 20 +- login/Makefile | 2 +- login/programs/request.c | 20 +- login/programs/utmpd.c | 10 +- login/programs/utmpd.h | 7 +- login/utmp_daemon.c | 52 +++-- login/utmp_file.c | 89 ++++++--- manual/Makefile | 7 +- manual/argp.texi | 43 ++++- manual/dir | 16 ++ manual/string.texi | 9 + manual/texinfo.tex | 53 ++++-- math/Makefile | 8 +- math/libm-test.c | 287 ++++++++++++++++++---------- math/math.h | 8 +- math/mathcalls.h | 19 +- md5-crypt/Makefile | 2 + nis/Makefile | 2 +- stdio-common/temptest.c | 14 +- stdio-common/tstscanf.c | 6 + stdio-common/vfscanf.c | 13 +- string/Makefile | 4 +- string/argz-replace.c | 135 +++++++++++++ string/argz.h | 10 + sunrpc/Makefile | 6 +- sysdeps/generic/mathbits.h | 5 + sysdeps/i386/fpu/mathbits.h | 5 + sysdeps/libm-i387/e_scalb.S | 78 ++++++++ sysdeps/libm-i387/e_scalbf.S | 79 ++++++++ sysdeps/libm-i387/e_scalbl.S | 78 ++++++++ sysdeps/libm-i387/s_asinh.S | 11 +- sysdeps/libm-i387/s_asinhf.S | 11 +- sysdeps/libm-i387/s_asinhl.S | 11 +- sysdeps/libm-i387/s_ilogb.S | 12 +- sysdeps/libm-i387/s_ilogbf.S | 12 +- sysdeps/libm-i387/s_ilogbl.S | 13 +- sysdeps/libm-i387/s_llrint.S | 33 ++++ sysdeps/libm-i387/s_lrint.S | 32 ++++ sysdeps/libm-i387/s_remquo.S | 7 +- sysdeps/libm-i387/s_remquof.S | 7 +- sysdeps/libm-i387/s_remquol.S | 7 +- sysdeps/libm-i387/s_rinttol.S | 32 ---- sysdeps/libm-i387/s_rinttoll.S | 33 ---- sysdeps/libm-ieee754/e_gamma_r.c | 47 +++++ sysdeps/libm-ieee754/e_gammaf_r.c | 46 +++++ sysdeps/libm-ieee754/e_gammal_r.c | 46 +++++ sysdeps/libm-ieee754/e_lgamma_r.c | 40 ++-- sysdeps/libm-ieee754/e_lgammaf_r.c | 22 ++- sysdeps/libm-ieee754/s_llrint.c | 242 ++++++++++++++++++++++++ sysdeps/libm-ieee754/s_llround.c | 179 ++++++++++++++++++ sysdeps/libm-ieee754/s_lrint.c | 242 ++++++++++++++++++++++++ sysdeps/libm-ieee754/s_lround.c | 177 +++++++++++++++++ sysdeps/libm-ieee754/s_remquo.c | 2 + sysdeps/libm-ieee754/s_remquof.c | 2 + sysdeps/libm-ieee754/s_remquol.c | 2 + sysdeps/libm-ieee754/s_rinttol.c | 242 ------------------------ sysdeps/libm-ieee754/s_rinttoll.c | 242 ------------------------ sysdeps/libm-ieee754/s_roundtol.c | 177 ----------------- sysdeps/libm-ieee754/s_roundtoll.c | 179 ------------------ sysdeps/libm-ieee754/s_scalbn.c | 13 +- sysdeps/libm-ieee754/s_scalbnf.c | 20 +- sysdeps/libm-ieee754/s_scalbnl.c | 34 ++-- sysdeps/libm-ieee754/w_gamma.c | 22 ++- sysdeps/libm-ieee754/w_gamma_r.c | 51 ----- sysdeps/libm-ieee754/w_gammaf.c | 21 ++- sysdeps/libm-ieee754/w_gammaf_r.c | 52 ----- sysdeps/libm-ieee754/w_gammal.c | 21 ++- sysdeps/libm-ieee754/w_gammal_r.c | 52 ----- sysdeps/m68k/fpu/__math.h | 4 +- sysdeps/m68k/fpu/s_llrint.c | 62 ++++++ sysdeps/m68k/fpu/s_lrint.c | 31 +++ sysdeps/m68k/fpu/s_remquo.c | 9 - sysdeps/m68k/fpu/s_rinttol.c | 31 --- sysdeps/m68k/fpu/s_rinttoll.c | 62 ------ sysdeps/posix/Makefile | 5 + sysdeps/powerpc/Dist | 1 + sysdeps/stub/e_acoshl.c | 2 + sysdeps/stub/e_acosl.c | 2 + sysdeps/stub/e_asinl.c | 2 + sysdeps/stub/e_atan2l.c | 2 + sysdeps/stub/e_expl.c | 2 + sysdeps/stub/e_fmodl.c | 2 + sysdeps/stub/e_j0l.c | 3 + sysdeps/stub/e_j1l.c | 3 + sysdeps/stub/e_jnl.c | 3 + sysdeps/stub/e_lgammal_r.c | 2 + sysdeps/stub/e_log10l.c | 2 + sysdeps/stub/e_logl.c | 2 + sysdeps/stub/e_powl.c | 2 + sysdeps/stub/e_rem_pio2l.c | 2 + sysdeps/stub/e_sqrtl.c | 2 + sysdeps/stub/k_cosl.c | 2 + sysdeps/stub/k_rem_pio2l.c | 2 + sysdeps/stub/k_sinl.c | 2 + sysdeps/stub/k_tanl.c | 2 + sysdeps/stub/s_atanl.c | 2 + sysdeps/stub/s_erfl.c | 3 + sysdeps/stub/s_exp2.c | 2 + sysdeps/stub/s_exp2f.c | 2 + sysdeps/stub/s_exp2l.c | 2 + sysdeps/stub/s_expm1l.c | 2 + sysdeps/stub/s_log1pl.c | 2 + sysdeps/stub/s_log2l.c | 2 + sysdeps/unix/sysv/linux/Dist | 1 + sysdeps/unix/sysv/linux/Makefile | 34 +++- sysdeps/unix/sysv/linux/arm/Dist | 1 + sysdeps/unix/sysv/linux/configure | 24 --- sysdeps/unix/sysv/linux/configure.in | 24 --- sysdeps/unix/sysv/linux/i386/sysdep.S | 9 +- sysdeps/unix/sysv/linux/mk-stdiolim.c | 4 - sysdeps/unix/sysv/linux/powerpc/Dist | 2 + sysdeps/unix/sysv/linux/sparc/Dist | 1 + time/tzfile.c | 4 +- 126 files changed, 2733 insertions(+), 1677 deletions(-) create mode 100644 manual/dir create mode 100644 string/argz-replace.c create mode 100644 sysdeps/libm-i387/s_llrint.S create mode 100644 sysdeps/libm-i387/s_lrint.S delete mode 100644 sysdeps/libm-i387/s_rinttol.S delete mode 100644 sysdeps/libm-i387/s_rinttoll.S create mode 100644 sysdeps/libm-ieee754/e_gamma_r.c create mode 100644 sysdeps/libm-ieee754/e_gammaf_r.c create mode 100644 sysdeps/libm-ieee754/e_gammal_r.c create mode 100644 sysdeps/libm-ieee754/s_llrint.c create mode 100644 sysdeps/libm-ieee754/s_llround.c create mode 100644 sysdeps/libm-ieee754/s_lrint.c create mode 100644 sysdeps/libm-ieee754/s_lround.c delete mode 100644 sysdeps/libm-ieee754/s_rinttol.c delete mode 100644 sysdeps/libm-ieee754/s_rinttoll.c delete mode 100644 sysdeps/libm-ieee754/s_roundtol.c delete mode 100644 sysdeps/libm-ieee754/s_roundtoll.c delete mode 100644 sysdeps/libm-ieee754/w_gamma_r.c delete mode 100644 sysdeps/libm-ieee754/w_gammaf_r.c delete mode 100644 sysdeps/libm-ieee754/w_gammal_r.c create mode 100644 sysdeps/m68k/fpu/s_llrint.c create mode 100644 sysdeps/m68k/fpu/s_lrint.c delete mode 100644 sysdeps/m68k/fpu/s_rinttol.c delete mode 100644 sysdeps/m68k/fpu/s_rinttoll.c create mode 100644 sysdeps/unix/sysv/linux/arm/Dist delete mode 100644 sysdeps/unix/sysv/linux/mk-stdiolim.c diff --git a/ChangeLog b/ChangeLog index 9c70ad3486..cb09bdf38b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,320 @@ +1997-06-19 19:38 Ulrich Drepper + + * 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 + + * time/tzfile.c (__tzfile_read): Store getc () return in int. + +1997-06-13 Miles Bader + + * 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 + + * 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 + + * 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 + + * string/Makefile (routines): Add argz-replace. + +1997-06-16 00:16 Miles Bader + + * manual/string.texi (Argz Functions): Document argz_replace. + +1997-06-12 Miles Bader + + * string/argz.h (__argz_replace, argz_replace): New declarations. + * string/argz-replace.c: New file. + +1997-06-11 Miles Bader + + * manual/argp.texi (Argp Special Keys): Document ARGP_KEY_ARGS. + +1997-06-16 23:08 Andreas Schwab + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * libc.map: Add more symbols. + +1997-06-18 12:01 Ulrich Drepper + + * manual/Makefile (install): Make sure `dir' file exists if we use + install-info. + +1997-06-17 19:32 Andreas Schwab + + * manual/Makefile (info): Depend on dir-add.info. + +1997-06-17 17:19 Andreas Schwab + + * elf/ldd.bash.in: Fix spacing in message. + +1997-06-17 14:28 Andreas Schwab + + * elf/do-rel.h (elf_dynamic_do_rel): Always use version + information if available. + +1997-06-17 11:34 Andreas Schwab + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * sysdeps/unix/sysv/linux/arm/Dist: New file. + +1997-06-14 17:59 Andreas Schwab + + * 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 + + * sysdeps/libm-ieee754/k_standard.c: Undo change of Tue Aug 6 + 01:13:56 1996. + 1997-06-16 00:54 Ulrich Drepper * libc.map: Add more symbols. @@ -834,7 +1151,8 @@ 1997-05-27 14:16 Miles Bader - * 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 @@ -1199,7 +1517,7 @@ 1997-05-21 17:53 Miles Bader - * 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 @@ -1401,10 +1719,10 @@ 1997-05-20 14:01 Miles Bader - * 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 @@ -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 - * 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 @@ -5215,10 +5533,10 @@ 1997-02-20 15:56 Miles Bader - * 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 : New include. + * argp/argp-help.c : 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 @@ -5283,12 +5601,12 @@ 1997-02-19 18:48 Miles Bader - * 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. diff --git a/Makeconfig b/Makeconfig index 73cae78aed..fbff6b3d3e 100644 --- a/Makeconfig +++ b/Makeconfig @@ -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)) diff --git a/Makerules b/Makerules index 4acf64cfdf..64301673d5 100644 --- a/Makerules +++ b/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 diff --git a/Rules b/Rules index 45417e0142..89050bedf1 100644 --- a/Rules +++ b/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 diff --git a/argp/argp-parse.c b/argp/argp-parse.c index edc5516851..018a97807e 100644 --- a/argp/argp-parse.c +++ b/argp/argp-parse.c @@ -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); - - 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; + { + parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */ + key = ARGP_KEY_ARG; + err = group_parse (group, &parser->state, key, val); + + if (err == EBADKEY) + /* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */ + { + parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */ + key = ARGP_KEY_ARGS; + err = group_parse (group, &parser->state, key, 0); + } + } + + if (! err) + { + if (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; } diff --git a/argp/argp.h b/argp/argp.h index 61ed8351e6..2305590a5d 100644 --- a/argp/argp.h +++ b/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 diff --git a/elf/Makefile b/elf/Makefile index 33d57ed70f..489a565945 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -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) diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c index 12d38c9a3a..f5b256808a 100644 --- a/elf/dl-minimal.c +++ b/elf/dl-minimal.c @@ -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) diff --git a/elf/do-rel.h b/elf/do-rel.h index 66f135916c..766e62c219 100644 --- a/elf/do-rel.h +++ b/elf/do-rel.h @@ -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 diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in index 809c2717da..32a9405422 100644 --- a/elf/ldd.bash.in +++ b/elf/ldd.bash.in @@ -65,7 +65,7 @@ Report bugs using the \`glibcbug' script to ." 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 ;; diff --git a/extra-lib.mk b/extra-lib.mk index e6088943e2..f2efb4bf7e 100644 --- a/extra-lib.mk +++ b/extra-lib.mk @@ -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 diff --git a/features.h b/features.h index a14179b6a3..c38480e637 100644 --- a/features.h +++ b/features.h @@ -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 diff --git a/inet/rcmd.c b/inet/rcmd.c index d390a8d809..6a680c18b7 100644 --- a/inet/rcmd.c +++ b/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; } diff --git a/libc.map b/libc.map index 29f67f6eac..c5100b829a 100644 --- a/libc.map +++ b/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*; diff --git a/login/Makefile b/login/Makefile index 916dd6c512..e4f9a9e9be 100644 --- a/login/Makefile +++ b/login/Makefile @@ -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) diff --git a/login/programs/request.c b/login/programs/request.c index d2c12e68cf..5e6bfa19cf 100644 --- a/login/programs/request.c +++ b/login/programs/request.c @@ -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 { diff --git a/login/programs/utmpd.c b/login/programs/utmpd.c index ca310a21de..3c8d626a84 100644 --- a/login/programs/utmpd.c +++ b/login/programs/utmpd.c @@ -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 (); diff --git a/login/programs/utmpd.h b/login/programs/utmpd.h index 8fbc33c923..ef92a1490b 100644 --- a/login/programs/utmpd.h +++ b/login/programs/utmpd.h @@ -22,7 +22,6 @@ /* This is an *internal* header. */ -#include #include #include @@ -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; diff --git a/login/utmp_daemon.c b/login/utmp_daemon.c index 705c8b3de9..e0a20e9a9f 100644 --- a/login/utmp_daemon.c +++ b/login/utmp_daemon.c @@ -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; } diff --git a/login/utmp_file.c b/login/utmp_file.c index 2026070f14..51b33226e0 100644 --- a/login/utmp_file.c +++ b/login/utmp_file.c @@ -24,10 +24,9 @@ #include #include #include +#include #include #include -#include -#include #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) + /* 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. */ + offset = lseek (fd, 0, SEEK_END); + if (offset % sizeof (struct utmp) != 0) { - /* Oh, oh. The file is already locked. Wait a bit and try again. */ - sleep (1); + offset -= offset % sizeof (struct utmp); + ftruncate (fd, offset); - /* This time we ignore the error. */ - __flock (fd, LOCK_EX | LOCK_NB); + if (lseek (fd, 0, SEEK_END) < 0) + goto unlock_return; } - /* Remember original size of log file. */ - if (__fstat (fd, &st) < 0) - goto fail; - /* 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; } diff --git a/manual/Makefile b/manual/Makefile index 80ab3dc30a..836229356e 100644 --- a/manual/Makefile +++ b/manual/Makefile @@ -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 diff --git a/manual/argp.texi b/manual/argp.texi index 53a405e93f..f28a87afc6 100644 --- a/manual/argp.texi +++ b/manual/argp.texi @@ -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 diff --git a/manual/dir b/manual/dir new file mode 100644 index 0000000000..f5920b12be --- /dev/null +++ b/manual/dir @@ -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" visits the Emacs topic, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: diff --git a/manual/string.texi b/manual/string.texi index cb9f5412f8..46101ded99 100644 --- a/manual/string.texi +++ b/manual/string.texi @@ -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 diff --git a/manual/texinfo.tex b/manual/texinfo.tex index 8e42adc34f..cce85615de 100644 --- a/manual/texinfo.tex +++ b/manual/texinfo.tex @@ -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}% diff --git a/math/Makefile b/math/Makefile index fbbcad6ea9..bd4506b99e 100644 --- a/math/Makefile +++ b/math/Makefile @@ -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 \ diff --git a/math/libm-test.c b/math/libm-test.c index be7538350b..5bf968f844 100644 --- a/math/libm-test.c +++ b/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_isinfn_exc ("ilogb (+0) == -inf plus divide-by-zero exception", - FUNC(ilogb) (0), DIVIDE_BY_ZERO_EXCEPTION); + 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) (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 */ diff --git a/math/math.h b/math/math.h index 5229a020e0..aa37f71f3c 100644 --- a/math/math.h +++ b/math/math.h @@ -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. */ diff --git a/math/mathcalls.h b/math/mathcalls.h index 0aac420bd0..735b5953a7 100644 --- a/math/mathcalls.h +++ b/math/mathcalls.h @@ -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 diff --git a/md5-crypt/Makefile b/md5-crypt/Makefile index aae6e8c216..6e88eb6053 100644 --- a/md5-crypt/Makefile +++ b/md5-crypt/Makefile @@ -45,6 +45,8 @@ ifeq ($(crypt-in-libc),yes) routines += $(libcrypt-routines) endif +$(objpfx)md5test: $(objpfx)md5.o + include ../Rules ifeq ($(build-shared),yes) diff --git a/nis/Makefile b/nis/Makefile index 770f3b8283..23a71446bb 100644 --- a/nis/Makefile +++ b/nis/Makefile @@ -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. diff --git a/stdio-common/temptest.c b/stdio-common/temptest.c index 71868174db..35ea4dc808 100644 --- a/stdio-common/temptest.c +++ b/stdio-common/temptest.c @@ -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); } diff --git a/stdio-common/tstscanf.c b/stdio-common/tstscanf.c index eb2f30d0f9..d0ff6c8b41 100644 --- a/stdio-common/tstscanf.c +++ b/stdio-common/tstscanf.c @@ -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); diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index 3738e44f0a..0b24b8bb52 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -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'; diff --git a/string/Makefile b/string/Makefile index b924dfc87d..d2629e60dc 100644 --- a/string/Makefile +++ b/string/Makefile @@ -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 diff --git a/string/argz-replace.c b/string/argz-replace.c new file mode 100644 index 0000000000..4d658f4713 --- /dev/null +++ b/string/argz-replace.c @@ -0,0 +1,135 @@ +/* String replacement in an argz vector + Copyright (C) 1997 Free Software Foundation, Inc. + Written by Miles Bader + + 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 +#include + +/* 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) diff --git a/string/argz.h b/string/argz.h index e17b742cf7..0126235b8f 100644 --- a/string/argz.h +++ b/string/argz.h @@ -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 diff --git a/sunrpc/Makefile b/sunrpc/Makefile index ee66e532f1..ad21cb251e 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -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} diff --git a/sysdeps/generic/mathbits.h b/sysdeps/generic/mathbits.h index e4db3dcf19..b14b52d901 100644 --- a/sysdeps/generic/mathbits.h +++ b/sysdeps/generic/mathbits.h @@ -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 */ diff --git a/sysdeps/i386/fpu/mathbits.h b/sysdeps/i386/fpu/mathbits.h index 7885afeec0..f4a22c0757 100644 --- a/sysdeps/i386/fpu/mathbits.h +++ b/sysdeps/i386/fpu/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 */ diff --git a/sysdeps/libm-i387/e_scalb.S b/sysdeps/libm-i387/e_scalb.S index 427a3b905e..790f1c1d56 100644 --- a/sysdeps/libm-i387/e_scalb.S +++ b/sysdeps/libm-i387/e_scalb.S @@ -1,16 +1,94 @@ /* * Written by J.T. Conklin . * Public domain. + * + * Correct handling of y==-inf */ #include 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) diff --git a/sysdeps/libm-i387/e_scalbf.S b/sysdeps/libm-i387/e_scalbf.S index 4c62134a0c..c869da9b38 100644 --- a/sysdeps/libm-i387/e_scalbf.S +++ b/sysdeps/libm-i387/e_scalbf.S @@ -2,16 +2,95 @@ * Written by J.T. Conklin . * Public domain. * Adapted for float type by Ulrich Drepper . + * + * Correct handling of y==-inf */ #include 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) diff --git a/sysdeps/libm-i387/e_scalbl.S b/sysdeps/libm-i387/e_scalbl.S index 3b746ad363..e272614acf 100644 --- a/sysdeps/libm-i387/e_scalbl.S +++ b/sysdeps/libm-i387/e_scalbl.S @@ -3,16 +3,94 @@ * Public domain. * * Adapted for `long double' by Ulrich Drepper . + * + * Correct handling of y==-inf */ #include 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) diff --git a/sysdeps/libm-i387/s_asinh.S b/sysdeps/libm-i387/s_asinh.S index 45153fe2d3..a4c52cb67c 100644 --- a/sysdeps/libm-i387/s_asinh.S +++ b/sysdeps/libm-i387/s_asinh.S @@ -49,14 +49,14 @@ ENTRY(__asinh) movl $0x7fffffff, %eax andl %ecx, %eax andl $0x80000000, %ecx + movl %eax, %edx + orl $0x800fffff, %edx + incl %edx + jz 7f // x in ±Inf or NaN 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 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 diff --git a/sysdeps/libm-i387/s_asinhf.S b/sysdeps/libm-i387/s_asinhf.S index 7e5176c4a6..6369e19ac6 100644 --- a/sysdeps/libm-i387/s_asinhf.S +++ b/sysdeps/libm-i387/s_asinhf.S @@ -49,14 +49,14 @@ ENTRY(__asinhf) movl $0x7fffffff, %eax andl %ecx, %eax andl $0x80000000, %ecx + movl %eax, %edx + orl $0x807fffff, %edx + incl %edx + jz 7f // x in ±Inf or NaN 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 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 diff --git a/sysdeps/libm-i387/s_asinhl.S b/sysdeps/libm-i387/s_asinhl.S index f764381aab..62e29bc58e 100644 --- a/sysdeps/libm-i387/s_asinhl.S +++ b/sysdeps/libm-i387/s_asinhl.S @@ -56,14 +56,14 @@ ENTRY(__asinhl) movl $0x7fff, %eax andl %ecx, %eax andl $0x8000, %ecx + movl %eax, %edx + orl $0xffff8000, %edx + incl %edx + jz 7f // x in ±Inf or NaN 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 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 diff --git a/sysdeps/libm-i387/s_ilogb.S b/sysdeps/libm-i387/s_ilogb.S index 01b8afac10..6c125586c7 100644 --- a/sysdeps/libm-i387/s_ilogb.S +++ b/sysdeps/libm-i387/s_ilogb.S @@ -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) diff --git a/sysdeps/libm-i387/s_ilogbf.S b/sysdeps/libm-i387/s_ilogbf.S index 6a943265b2..b08a32f4ef 100644 --- a/sysdeps/libm-i387/s_ilogbf.S +++ b/sysdeps/libm-i387/s_ilogbf.S @@ -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) diff --git a/sysdeps/libm-i387/s_ilogbl.S b/sysdeps/libm-i387/s_ilogbl.S index 2422a41355..adc88aabab 100644 --- a/sysdeps/libm-i387/s_ilogbl.S +++ b/sysdeps/libm-i387/s_ilogbl.S @@ -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) diff --git a/sysdeps/libm-i387/s_llrint.S b/sysdeps/libm-i387/s_llrint.S new file mode 100644 index 0000000000..cfb8e86f7d --- /dev/null +++ b/sysdeps/libm-i387/s_llrint.S @@ -0,0 +1,33 @@ +/* Round argument to nearest integral value according to current rounding + direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 + + .text +ENTRY(__llrint) + fldt 4(%esp) + subl $8, %esp + fistpll (%esp) + popl %eax + popl %edx + ret +END(__llrint) +weak_alias (__llrint, llrint) diff --git a/sysdeps/libm-i387/s_lrint.S b/sysdeps/libm-i387/s_lrint.S new file mode 100644 index 0000000000..19241456a8 --- /dev/null +++ b/sysdeps/libm-i387/s_lrint.S @@ -0,0 +1,32 @@ +/* Round argument to nearest integral value according to current rounding + direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 + + .text +ENTRY(__lrint) + fldt 4(%esp) + subl $4, %esp + fistpl (%esp) + popl %eax + ret +END(__lrint) +weak_alias (__lrint, lrint) diff --git a/sysdeps/libm-i387/s_remquo.S b/sysdeps/libm-i387/s_remquo.S index a4c5a35468..252bf2678a 100644 --- a/sysdeps/libm-i387/s_remquo.S +++ b/sysdeps/libm-i387/s_remquo.S @@ -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) diff --git a/sysdeps/libm-i387/s_remquof.S b/sysdeps/libm-i387/s_remquof.S index 56954323a6..144eb3034c 100644 --- a/sysdeps/libm-i387/s_remquof.S +++ b/sysdeps/libm-i387/s_remquof.S @@ -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) diff --git a/sysdeps/libm-i387/s_remquol.S b/sysdeps/libm-i387/s_remquol.S index 9c91d90c45..2cbcdf18af 100644 --- a/sysdeps/libm-i387/s_remquol.S +++ b/sysdeps/libm-i387/s_remquol.S @@ -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) diff --git a/sysdeps/libm-i387/s_rinttol.S b/sysdeps/libm-i387/s_rinttol.S deleted file mode 100644 index 22a3e46bd6..0000000000 --- a/sysdeps/libm-i387/s_rinttol.S +++ /dev/null @@ -1,32 +0,0 @@ -/* Round argument to nearest integral value according to current rounding - direction. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 - - .text -ENTRY(__rinttol) - fldt 4(%esp) - subl $4, %esp - fistpl (%esp) - popl %eax - ret -END(__rinttol) -weak_alias (__rinttol, rinttol) diff --git a/sysdeps/libm-i387/s_rinttoll.S b/sysdeps/libm-i387/s_rinttoll.S deleted file mode 100644 index 99395052de..0000000000 --- a/sysdeps/libm-i387/s_rinttoll.S +++ /dev/null @@ -1,33 +0,0 @@ -/* Round argument to nearest integral value according to current rounding - direction. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 - - .text -ENTRY(__rinttoll) - fldt 4(%esp) - subl $8, %esp - fistpll (%esp) - popl %eax - popl %edx - ret -END(__rinttoll) -weak_alias (__rinttoll, rinttoll) diff --git a/sysdeps/libm-ieee754/e_gamma_r.c b/sysdeps/libm-ieee754/e_gamma_r.c new file mode 100644 index 0000000000..eb80809843 --- /dev/null +++ b/sysdeps/libm-ieee754/e_gamma_r.c @@ -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 , 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 +#include + + +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)); +} diff --git a/sysdeps/libm-ieee754/e_gammaf_r.c b/sysdeps/libm-ieee754/e_gammaf_r.c new file mode 100644 index 0000000000..bf79ffeb57 --- /dev/null +++ b/sysdeps/libm-ieee754/e_gammaf_r.c @@ -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 , 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 +#include + + +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)); +} diff --git a/sysdeps/libm-ieee754/e_gammal_r.c b/sysdeps/libm-ieee754/e_gammal_r.c new file mode 100644 index 0000000000..4fd49886d1 --- /dev/null +++ b/sysdeps/libm-ieee754/e_gammal_r.c @@ -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 , 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 +#include + + +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)); +} diff --git a/sysdeps/libm-ieee754/e_lgamma_r.c b/sysdeps/libm-ieee754/e_lgamma_r.c index 1be4ddad8f..92e9556568 100644 --- a/sysdeps/libm-ieee754/e_lgamma_r.c +++ b/sysdeps/libm-ieee754/e_lgamma_r.c @@ -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=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, 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 + +#include "math_private.h" + +#ifdef NO_LONG_DOUBLE +/* The `long double' is in fact the IEEE `double' type. */ +static long double two52[2] = +{ + 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ + -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ +}; + + +long long int +__llrint (long double x) +{ + int32_t j0,sx; + u_int32_t i0, i1, i; + long double t, w; + long long int result; + + EXTRACT_WORDS (i0, i1, x); + + sx = i0 >> 31; + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + + if (j0 < 20) + { + if (j0 < 0) + { + if (((i0 & 0x7fffffff) | i1) == 0) + /* The number is 0. */ + result = 0; + else + { + i1 |= i0; + i0 &= 0xfffe0000; + i0 |= ((i1 | -i1) >> 12) & 0x80000; + SET_HIGH_WORD (x, i0); + w = two52[sx] + x; + t = w - two52[sx]; + GET_HIGH_WORD (i0, t); + if ((i0 & 0x7fffffff) >= 0x3fff0000) + result = sx ? -1 : 1; + else + result = 0; + } + } + else + { + u_int32_t i = 0x000fffff >> j0; + if (((i0 & i) | i1) == 0) + { + /* X is not integral. */ + i >>= 1; + if (((i0 & i) | i1) != 0) + { + if (j0 == 19) + i1 = 0x40000000; + else + i0 = (i0 & (~i)) | (0x20000 >> j0); + + INSERT_WORDS (x, i0, i1); + w = two52[sx] + x; + x = w - two52[sx]; + EXTRACT_WORDS (i0, i1, x); + + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + } + } + + result = ((i0 >> (20 - j0)) & 0xfffff) | (0x00100000 >> (20 - j0)); + if (sx) + result = -result; + } + } + else if ((unsigned int) j0 < sizeof (long long int) * 8 && j0 < 53) + { + i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); + if ((i1 & i) != 0) + { + /* x is not integral. */ + i >>= 1; + if ((i1 & i) != 0) + i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 20)); + } + + INSERT_WORDS (x, i0, i1); + w = two52[sx] + x; + x = w - two52[sx]; + EXTRACT_WORDS (i0, i1, x); + + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + + result = i0 | 0x00100000; + if (j0 > 20) + { + result <<= j0 - 20; + result |= i1 >> (52 - j0); + } + if (sx) + result = -result; + } + else + /* Too large. The number is either +-inf or NaN or it is too + large to be effected by rounding. The standard leaves it + undefined what to return when the number is too large to fit in + a `long int'. */ + result = (long long int) x; + + return result; +} + +#else +static long double two63[2] = +{ + 9.223372036854775808000000e+18, /* 0x403E, 0x00000000, 0x00000000 */ + -9.223372036854775808000000e+18 /* 0xC03E, 0x00000000, 0x00000000 */ +}; + + +long long int +__llrint (long double x) +{ + int32_t se,j0,sx; + u_int32_t i0, i1, i; + long long int result; + long double w, t; + + GET_LDOUBLE_WORDS (se, i0, i1, x); + + sx = (se >> 15) & 1; + j0 = (se & 0x7fff) - 0x3fff; + + if (j0 < 31) + { + if (j0 < 0) + { + if (((se & 0x7fff) | i0 | i1) == 0) + /* The number is 0. */ + result = 0; + else + { + i1 |= i0; + i0 &= 0xe0000000; + i0 |= (i1 | -i1) & 0x80000000; + SET_LDOUBLE_MSW (x, i0); + w = two63[sx] + x; + t = w - two63[sx]; + GET_LDOUBLE_EXP (i0, t); + if ((i0 & 0x7fff) >= 0x3fff) + result = sx ? -1 : 1; + else + result = 0; + } + } + else + { + u_int32_t i = 0x7fffffff >> j0; + if (((i0 & i) | i1) == 0) + { + /* X is not integral. */ + i >>= 1; + if (((i0 & i) | i1) != 0) + { + if (j0 == 31) + i1 = 0x40000000; + else + i0 = (i0 & (~i)) | (0x20000000 >> j0); + + SET_LDOUBLE_WORDS (x, se, i0, i1); + w = two63[sx] + x; + x = w - two63[sx]; + GET_LDOUBLE_WORDS (se, i0, i1, x); + + sx = (se >> 15) & 1; + j0 = (se & 0x7fff) - 0x3fff; + } + } + + + result = i0 >> (31 - j0); + } + } + else if ((unsigned int) j0 < sizeof (long long int) * 8 && j0 < 64) + { + i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); + if ((i1 & i) != 0) + { + /* x is not integral. */ + i >>= 1; + if ((i1 & i) != 0) + i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 31)); + } + + SET_LDOUBLE_WORDS (x, se, i0, i1); + w = two63[sx] + x; + x = w - two63[sx]; + GET_LDOUBLE_WORDS (se, i0, i1, x); + + j0 = (se & 0x7fff) - 0x3fff; + + result = i0; + if (j0 > 31) + { + result <<= j0 - 31; + result |= i1 >> (63 - j0); + } + } + else + /* Too large. The number is either +-inf or NaN or it is too + large to be effected by rounding. The standard leaves it + undefined what to return when the number is too large to fit in + a `long int'. */ + result = (long long int) x; + + return result; +} +#endif + +weak_alias (__llrint, llrint) diff --git a/sysdeps/libm-ieee754/s_llround.c b/sysdeps/libm-ieee754/s_llround.c new file mode 100644 index 0000000000..aee0e31fc0 --- /dev/null +++ b/sysdeps/libm-ieee754/s_llround.c @@ -0,0 +1,179 @@ +/* Round long double value to long long int. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 + +#include "math_private.h" + + +#ifdef NO_LONG_DOUBLE +/* The `long double' is in fact the IEEE `double' type. */ + +long long int +__llround (long double x) +{ + int32_t j0; + u_int32_t i1, i0; + long long int result; + + EXTRACT_WORDS (i0, i1, x); + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + if (j0 < 20) + { + if (j0 < 0) + result = j0 < -1 ? 0 : ((i0 & 0x80000000) ? -1 : 1); + else + { + u_int32_t i = 0xfffff >> j0; + if (((i0 & i) | i1) == 0) + result = (long long int) ((i0 & 0xfffff) | 0x100000) >> j0; + else + { + /* X is not integral. */ + u_int32_t j = i0 + (0x80000 >> j0); + if (j < i0) + result = (long long int) 0x80000 >> (20 - j0); + else + result = (j | 0x100000) >> (20 - j0); + } + } + } + else if (j0 >= 8 * sizeof (long long int) || j0 > 51) + { + /* The number is too large. It is left implementation defined + what happens. */ + result = (long long int) x; + } + else + { + u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); + if ((i1 & i) != 0) + { + /* x is not integral. */ + u_int32_t j = i1 + (0x80000000 >> (j0 - 20)); + if (j < i1) + { + j = i0 + 1; + if ((j & 0xfffff) == 0) + { + if (sizeof (long long int) <= 4) + /* Overflow. */ + result = (long long int) x; + else + result = 1ll << (j0 + 1); + } + else + result = ((long long int) ((i0 & 0xfffff) | 0x100000) + << (j0 - 31)); + } + else + { + result = ((long long int) ((i0 & 0xfffff) | 0x100000) + << (j0 - 31)); + if (sizeof (long long int) > 4 && j0 > 31) + result |= j >> (63 - j0); + } + } + else + { + result = (long long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); + if (sizeof (long long int) > 4 && j0 > 31) + result |= i1 >> (63 - j0); + } + } + + return i0 & 0x80000000 ? -result : result; +} +#else +long long int +__llround (long double x) +{ + int32_t j0; + u_int32_t se, i1, i0; + long long int result; + + GET_LDOUBLE_WORDS (se, i0, i1, x); + j0 = (se & 0x7fff) - 0x3fff; + if (j0 < 31) + { + if (j0 < 0) + result = j0 < -1 ? 0 : 1; + else + { + u_int32_t i = 0x7fffffff >> j0; + if (((i0 & i) | i1) == 0) + result = (long long int) i0 >> j0; + else + { + /* X is not integral. */ + u_int32_t j = i0 + (0x40000000 >> j0); + if (j < i0) + result = 0x80000000l >> (30 - j0); + else + result = j >> (31 - j0); + } + } + } + else if ((unsigned int) j0 >= 8 * sizeof (long long int) || j0 > 62) + { + /* The number is too large. It is left implementation defined + what happens. */ + result = (long long int) x; + } + else + { + u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); + if ((i1 & i) != 0) + { + /* x is not integral. */ + u_int32_t j = i1 + (0x80000000 >> (j0 - 31)); + if (j < i1) + { + j = i0 + 1; + if (j == 0) + { + if (sizeof (long long int) <= 4) + /* Overflow. */ + result = (long long int) x; + else + result = 1ll << (j0 + 1); + } + else + result = (long long int) i0 << (j0 - 31); + } + else + { + result = (long long int) i0 << (j0 - 31); + if (sizeof (long long int) > 4 && j0 > 31) + result |= j >> (63 - j0); + } + } + else + { + result = (long long int) i0 << (j0 - 31); + if (sizeof (long long int) > 4 && j0 > 31) + result |= i1 >> (63 - j0); + } + } + + return se & 0x8000 ? -result : result; +} +#endif +weak_alias (__llround, llround) diff --git a/sysdeps/libm-ieee754/s_lrint.c b/sysdeps/libm-ieee754/s_lrint.c new file mode 100644 index 0000000000..6779f974bd --- /dev/null +++ b/sysdeps/libm-ieee754/s_lrint.c @@ -0,0 +1,242 @@ +/* Round argument to nearest integral value according to current rounding + direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 + +#include "math_private.h" + +#ifdef NO_LONG_DOUBLE +/* The `long double' is in fact the IEEE `double' type. */ +static long double two52[2] = +{ + 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ + -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ +}; + + +long int +__lrint (long double x) +{ + int32_t j0,sx; + u_int32_t i0,i1,i; + long double t, w; + long int result; + + EXTRACT_WORDS (i0, i1, x); + + sx = i0 >> 31; + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + + if (j0 < 20) + { + if (j0 < 0) + { + if (((i0 & 0x7fffffff) | i1) == 0) + /* The number is 0. */ + result = 0; + else + { + i1 |= i0; + i0 &= 0xfffe0000; + i0 |= ((i1 | -i1) >> 12) & 0x80000; + SET_HIGH_WORD (x, i0); + w = two52[sx] + x; + t = w - two52[sx]; + GET_HIGH_WORD (i0, t); + if ((i0 & 0x7fffffff) >= 0x3fff0000) + result = sx ? -1 : 1; + else + result = 0; + } + } + else + { + u_int32_t i = 0x000fffff >> j0; + if (((i0 & i) | i1) == 0) + { + /* X is not integral. */ + i >>= 1; + if (((i0 & i) | i1) != 0) + { + if (j0 == 19) + i1 = 0x40000000; + else + i0 = (i0 & (~i)) | (0x20000 >> j0); + + INSERT_WORDS (x, i0, i1); + w = two52[sx] + x; + x = w - two52[sx]; + EXTRACT_WORDS (i0, i1, x); + + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + } + } + + result = ((i0 >> (20 - j0)) & 0xfffff) | (0x00100000 >> (20 - j0)); + if (sx) + result = -result; + } + } + else if ((unsigned int) j0 < sizeof (long int) * 8 && j0 < 53) + { + i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); + if ((i1 & i) != 0) + { + /* x is not integral. */ + i >>= 1; + if ((i1 & i) != 0) + i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 20)); + } + + INSERT_WORDS (x, i0, i1); + w = two52[sx] + x; + x = w - two52[sx]; + EXTRACT_WORDS (i0, i1, x); + + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + + result = i0 | 0x00100000; + if (j0 > 20) + { + result <<= j0 - 20; + result |= i1 >> (52 - j0); + } + if (sx) + result = -result; + } + else + /* Too large. The number is either +-inf or NaN or it is too + large to be effected by rounding. The standard leaves it + undefined what to return when the number is too large to fit in + a `long int'. */ + result = (long int) x; + + return result; +} + +#else +static long double two63[2] = +{ + 9.223372036854775808000000e+18, /* 0x403E, 0x00000000, 0x00000000 */ + -9.223372036854775808000000e+18 /* 0xC03E, 0x00000000, 0x00000000 */ +}; + + +long int +__lrint (long double x) +{ + int32_t se,j0,sx; + u_int32_t i0,i1,i; + long int result; + long double w, t; + + GET_LDOUBLE_WORDS (se, i0, i1, x); + + sx = (se >> 15) & 1; + j0 = (se & 0x7fff) - 0x3fff; + + if (j0 < 31) + { + if (j0 < 0) + { + if (((se & 0x7fff) | i0 | i1) == 0) + /* The number is 0. */ + result = 0; + else + { + i1 |= i0; + i0 &= 0xe0000000; + i0 |= (i1 | -i1) & 0x80000000; + SET_LDOUBLE_MSW (x, i0); + w = two63[sx] + x; + t = w - two63[sx]; + GET_LDOUBLE_EXP (i0, t); + if ((i0 & 0x7fff) >= 0x3fff) + result = sx ? -1 : 1; + else + result = 0; + } + } + else + { + u_int32_t i = 0x7fffffff >> j0; + if (((i0 & i) | i1) == 0) + { + /* X is not integral. */ + i >>= 1; + if (((i0 & i) | i1) != 0) + { + if (j0 == 31) + i1 = 0x40000000; + else + i0 = (i0 & (~i)) | (0x20000000 >> j0); + + SET_LDOUBLE_WORDS (x, se, i0, i1); + w = two63[sx] + x; + x = w - two63[sx]; + GET_LDOUBLE_WORDS (se, i0, i1, x); + + sx = (se >> 15) & 1; + j0 = (se & 0x7fff) - 0x3fff; + } + } + + + result = i0 >> (31 - j0); + } + } + else if ((unsigned int) j0 < sizeof (long int) * 8 && j0 < 64) + { + i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); + if ((i1 & i) != 0) + { + /* x is not integral. */ + i >>= 1; + if ((i1 & i) != 0) + i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 31)); + } + + SET_LDOUBLE_WORDS (x, se, i0, i1); + w = two63[sx] + x; + x = w - two63[sx]; + GET_LDOUBLE_WORDS (se, i0, i1, x); + + j0 = (se & 0x7fff) - 0x3fff; + + result = i0; + if (j0 > 31) + { + result <<= j0 - 31; + result |= i1 >> (63 - j0); + } + } + else + /* Too large. The number is either +-inf or NaN or it is too + large to be effected by rounding. The standard leaves it + undefined what to return when the number is too large to fit in + a `long int'. */ + result = (long int) x; + + return result; +} +#endif + +weak_alias (__lrint, lrint) diff --git a/sysdeps/libm-ieee754/s_lround.c b/sysdeps/libm-ieee754/s_lround.c new file mode 100644 index 0000000000..0f91280a79 --- /dev/null +++ b/sysdeps/libm-ieee754/s_lround.c @@ -0,0 +1,177 @@ +/* Round long double value to long int. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 + +#include "math_private.h" + + +#ifdef NO_LONG_DOUBLE +/* The `long double' is in fact the IEEE `double' type. */ + +long int +__lround (long double x) +{ + int32_t j0; + u_int32_t i1, i0; + long int result; + + EXTRACT_WORDS (i0, i1, x); + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + if (j0 < 20) + { + if (j0 < 0) + result = j0 < -1 ? 0 : ((i0 & 0x80000000) ? -1 : 1); + else + { + u_int32_t i = 0xfffff >> j0; + if (((i0 & i) | i1) == 0) + result = (long int) ((i0 & 0xfffff) | 0x100000) >> j0; + else + { + /* X is not integral. */ + u_int32_t j = i0 + (0x80000 >> j0); + if (j < i0) + result = (long int) 0x80000 >> (20 - j0); + else + result = (j | 0x100000) >> (20 - j0); + } + } + } + else if (j0 >= 8 * sizeof (long int) || j0 > 51) + { + /* The number is too large. It is left implementation defined + what happens. */ + result = (long int) x; + } + else + { + u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); + if ((i1 & i) != 0) + { + /* x is not integral. */ + u_int32_t j = i1 + (0x80000000 >> (j0 - 20)); + if (j < i1) + { + j = i0 + 1; + if ((j & 0xfffff) == 0) + { + if (sizeof (long int) <= 4) + /* Overflow. */ + result = (long int) x; + else + result = 1l << (j0 + 1); + } + else + result = (long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); + } + else + { + result = (long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); + if (sizeof (long int) > 4 && j0 > 31) + result |= j >> (63 - j0); + } + } + else + { + result = (long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); + if (sizeof (long int) > 4 && j0 > 31) + result |= i1 >> (63 - j0); + } + } + + return i0 & 0x80000000 ? -result : result; +} +#else +long int +__lround (long double x) +{ + int32_t j0; + u_int32_t se, i1, i0; + long int result; + + GET_LDOUBLE_WORDS (se, i0, i1, x); + j0 = (se & 0x7fff) - 0x3fff; + if (j0 < 31) + { + if (j0 < 0) + result = j0 < -1 ? 0 : 1; + else + { + u_int32_t i = 0x7fffffff >> j0; + if (((i0 & i) | i1) == 0) + result = (long int) i0 >> j0; + else + { + /* X is not integral. */ + u_int32_t j = i0 + (0x40000000 >> j0); + if (j < i0) + result = 0x80000000l >> (30 - j0); + else + result = j >> (31 - j0); + } + } + } + else if ((unsigned int) j0 >= 8 * sizeof (long int) || j0 > 62) + { + /* The number is too large. It is left implementation defined + what happens. */ + result = (long int) x; + } + else + { + u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); + if ((i1 & i) != 0) + { + /* x is not integral. */ + u_int32_t j = i1 + (0x80000000 >> (j0 - 31)); + if (j < i1) + { + j = i0 + 1; + if (j == 0) + { + if (sizeof (long int) <= 4) + /* Overflow. */ + result = (long int) x; + else + result = 1l << (j0 + 1); + } + else + result = (long int) i0 << (j0 - 31); + } + else + { + result = (long int) i0 << (j0 - 31); + if (sizeof (long int) > 4 && j0 > 31) + result |= j >> (63 - j0); + } + } + else + { + result = (long int) i0 << (j0 - 31); + if (sizeof (long int) > 4 && j0 > 31) + result |= i1 >> (63 - j0); + } + } + + return se & 0x8000 ? -result : result; +} +#endif +weak_alias (__lround, lround) diff --git a/sysdeps/libm-ieee754/s_remquo.c b/sysdeps/libm-ieee754/s_remquo.c index f0a32130a2..39f6ceab2e 100644 --- a/sysdeps/libm-ieee754/s_remquo.c +++ b/sysdeps/libm-ieee754/s_remquo.c @@ -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; diff --git a/sysdeps/libm-ieee754/s_remquof.c b/sysdeps/libm-ieee754/s_remquof.c index 6fa02e47b3..b3870f4b02 100644 --- a/sysdeps/libm-ieee754/s_remquof.c +++ b/sysdeps/libm-ieee754/s_remquof.c @@ -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; diff --git a/sysdeps/libm-ieee754/s_remquol.c b/sysdeps/libm-ieee754/s_remquol.c index 9ef424901b..b7835e6dc7 100644 --- a/sysdeps/libm-ieee754/s_remquol.c +++ b/sysdeps/libm-ieee754/s_remquol.c @@ -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; diff --git a/sysdeps/libm-ieee754/s_rinttol.c b/sysdeps/libm-ieee754/s_rinttol.c deleted file mode 100644 index 257bdc744c..0000000000 --- a/sysdeps/libm-ieee754/s_rinttol.c +++ /dev/null @@ -1,242 +0,0 @@ -/* Round argument to nearest integral value according to current rounding - direction. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 - -#include "math_private.h" - -#ifdef NO_LONG_DOUBLE -/* The `long double' is in fact the IEEE `double' type. */ -static long double two52[2] = -{ - 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ - -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ -}; - - -long int -__rinttol (long double x) -{ - int32_t j0,sx; - u_int32_t i0,i1,i; - long double t, w; - long int result; - - EXTRACT_WORDS (i0, i1, x); - - sx = i0 >> 31; - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - - if (j0 < 20) - { - if (j0 < 0) - { - if (((i0 & 0x7fffffff) | i1) == 0) - /* The number is 0. */ - result = 0; - else - { - i1 |= i0; - i0 &= 0xfffe0000; - i0 |= ((i1 | -i1) >> 12) & 0x80000; - SET_HIGH_WORD (x, i0); - w = two52[sx] + x; - t = w - two52[sx]; - GET_HIGH_WORD (i0, t); - if ((i0 & 0x7fffffff) >= 0x3fff0000) - result = sx ? -1 : 1; - else - result = 0; - } - } - else - { - u_int32_t i = 0x000fffff >> j0; - if (((i0 & i) | i1) == 0) - { - /* X is not integral. */ - i >>= 1; - if (((i0 & i) | i1) != 0) - { - if (j0 == 19) - i1 = 0x40000000; - else - i0 = (i0 & (~i)) | (0x20000 >> j0); - - INSERT_WORDS (x, i0, i1); - w = two52[sx] + x; - x = w - two52[sx]; - EXTRACT_WORDS (i0, i1, x); - - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - } - } - - result = ((i0 >> (20 - j0)) & 0xfffff) | (0x00100000 >> (20 - j0)); - if (sx) - result = -result; - } - } - else if ((unsigned int) j0 < sizeof (long int) * 8 && j0 < 53) - { - i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); - if ((i1 & i) != 0) - { - /* x is not integral. */ - i >>= 1; - if ((i1 & i) != 0) - i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 20)); - } - - INSERT_WORDS (x, i0, i1); - w = two52[sx] + x; - x = w - two52[sx]; - EXTRACT_WORDS (i0, i1, x); - - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - - result = i0 | 0x00100000; - if (j0 > 20) - { - result <<= j0 - 20; - result |= i1 >> (52 - j0); - } - if (sx) - result = -result; - } - else - /* Too large. The number is either +-inf or NaN or it is too - large to be effected by rounding. The standard leaves it - undefined what to return when the number is too large to fit in - a `long int'. */ - result = (long int) x; - - return result; -} - -#else -static long double two63[2] = -{ - 9.223372036854775808000000e+18, /* 0x403E, 0x00000000, 0x00000000 */ - -9.223372036854775808000000e+18 /* 0xC03E, 0x00000000, 0x00000000 */ -}; - - -long int -__rinttol (long double x) -{ - int32_t se,j0,sx; - u_int32_t i0,i1,i; - long int result; - long double w, t; - - GET_LDOUBLE_WORDS (se, i0, i1, x); - - sx = (se >> 15) & 1; - j0 = (se & 0x7fff) - 0x3fff; - - if (j0 < 31) - { - if (j0 < 0) - { - if (((se & 0x7fff) | i0 | i1) == 0) - /* The number is 0. */ - result = 0; - else - { - i1 |= i0; - i0 &= 0xe0000000; - i0 |= (i1 | -i1) & 0x80000000; - SET_LDOUBLE_MSW (x, i0); - w = two63[sx] + x; - t = w - two63[sx]; - GET_LDOUBLE_EXP (i0, t); - if ((i0 & 0x7fff) >= 0x3fff) - result = sx ? -1 : 1; - else - result = 0; - } - } - else - { - u_int32_t i = 0x7fffffff >> j0; - if (((i0 & i) | i1) == 0) - { - /* X is not integral. */ - i >>= 1; - if (((i0 & i) | i1) != 0) - { - if (j0 == 31) - i1 = 0x40000000; - else - i0 = (i0 & (~i)) | (0x20000000 >> j0); - - SET_LDOUBLE_WORDS (x, se, i0, i1); - w = two63[sx] + x; - x = w - two63[sx]; - GET_LDOUBLE_WORDS (se, i0, i1, x); - - sx = (se >> 15) & 1; - j0 = (se & 0x7fff) - 0x3fff; - } - } - - - result = i0 >> (31 - j0); - } - } - else if ((unsigned int) j0 < sizeof (long int) * 8 && j0 < 64) - { - i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); - if ((i1 & i) != 0) - { - /* x is not integral. */ - i >>= 1; - if ((i1 & i) != 0) - i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 31)); - } - - SET_LDOUBLE_WORDS (x, se, i0, i1); - w = two63[sx] + x; - x = w - two63[sx]; - GET_LDOUBLE_WORDS (se, i0, i1, x); - - j0 = (se & 0x7fff) - 0x3fff; - - result = i0; - if (j0 > 31) - { - result <<= j0 - 31; - result |= i1 >> (63 - j0); - } - } - else - /* Too large. The number is either +-inf or NaN or it is too - large to be effected by rounding. The standard leaves it - undefined what to return when the number is too large to fit in - a `long int'. */ - result = (long int) x; - - return result; -} -#endif - -weak_alias (__rinttol, rinttol) diff --git a/sysdeps/libm-ieee754/s_rinttoll.c b/sysdeps/libm-ieee754/s_rinttoll.c deleted file mode 100644 index b2fccd17b7..0000000000 --- a/sysdeps/libm-ieee754/s_rinttoll.c +++ /dev/null @@ -1,242 +0,0 @@ -/* Round argument to nearest integral value according to current rounding - direction. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 - -#include "math_private.h" - -#ifdef NO_LONG_DOUBLE -/* The `long double' is in fact the IEEE `double' type. */ -static long double two52[2] = -{ - 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ - -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ -}; - - -long long int -__rinttoll (long double x) -{ - int32_t j0,sx; - u_int32_t i0, i1, i; - long double t, w; - long long int result; - - EXTRACT_WORDS (i0, i1, x); - - sx = i0 >> 31; - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - - if (j0 < 20) - { - if (j0 < 0) - { - if (((i0 & 0x7fffffff) | i1) == 0) - /* The number is 0. */ - result = 0; - else - { - i1 |= i0; - i0 &= 0xfffe0000; - i0 |= ((i1 | -i1) >> 12) & 0x80000; - SET_HIGH_WORD (x, i0); - w = two52[sx] + x; - t = w - two52[sx]; - GET_HIGH_WORD (i0, t); - if ((i0 & 0x7fffffff) >= 0x3fff0000) - result = sx ? -1 : 1; - else - result = 0; - } - } - else - { - u_int32_t i = 0x000fffff >> j0; - if (((i0 & i) | i1) == 0) - { - /* X is not integral. */ - i >>= 1; - if (((i0 & i) | i1) != 0) - { - if (j0 == 19) - i1 = 0x40000000; - else - i0 = (i0 & (~i)) | (0x20000 >> j0); - - INSERT_WORDS (x, i0, i1); - w = two52[sx] + x; - x = w - two52[sx]; - EXTRACT_WORDS (i0, i1, x); - - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - } - } - - result = ((i0 >> (20 - j0)) & 0xfffff) | (0x00100000 >> (20 - j0)); - if (sx) - result = -result; - } - } - else if ((unsigned int) j0 < sizeof (long long int) * 8 && j0 < 53) - { - i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); - if ((i1 & i) != 0) - { - /* x is not integral. */ - i >>= 1; - if ((i1 & i) != 0) - i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 20)); - } - - INSERT_WORDS (x, i0, i1); - w = two52[sx] + x; - x = w - two52[sx]; - EXTRACT_WORDS (i0, i1, x); - - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - - result = i0 | 0x00100000; - if (j0 > 20) - { - result <<= j0 - 20; - result |= i1 >> (52 - j0); - } - if (sx) - result = -result; - } - else - /* Too large. The number is either +-inf or NaN or it is too - large to be effected by rounding. The standard leaves it - undefined what to return when the number is too large to fit in - a `long int'. */ - result = (long long int) x; - - return result; -} - -#else -static long double two63[2] = -{ - 9.223372036854775808000000e+18, /* 0x403E, 0x00000000, 0x00000000 */ - -9.223372036854775808000000e+18 /* 0xC03E, 0x00000000, 0x00000000 */ -}; - - -long long int -__rinttoll (long double x) -{ - int32_t se,j0,sx; - u_int32_t i0, i1, i; - long long int result; - long double w, t; - - GET_LDOUBLE_WORDS (se, i0, i1, x); - - sx = (se >> 15) & 1; - j0 = (se & 0x7fff) - 0x3fff; - - if (j0 < 31) - { - if (j0 < 0) - { - if (((se & 0x7fff) | i0 | i1) == 0) - /* The number is 0. */ - result = 0; - else - { - i1 |= i0; - i0 &= 0xe0000000; - i0 |= (i1 | -i1) & 0x80000000; - SET_LDOUBLE_MSW (x, i0); - w = two63[sx] + x; - t = w - two63[sx]; - GET_LDOUBLE_EXP (i0, t); - if ((i0 & 0x7fff) >= 0x3fff) - result = sx ? -1 : 1; - else - result = 0; - } - } - else - { - u_int32_t i = 0x7fffffff >> j0; - if (((i0 & i) | i1) == 0) - { - /* X is not integral. */ - i >>= 1; - if (((i0 & i) | i1) != 0) - { - if (j0 == 31) - i1 = 0x40000000; - else - i0 = (i0 & (~i)) | (0x20000000 >> j0); - - SET_LDOUBLE_WORDS (x, se, i0, i1); - w = two63[sx] + x; - x = w - two63[sx]; - GET_LDOUBLE_WORDS (se, i0, i1, x); - - sx = (se >> 15) & 1; - j0 = (se & 0x7fff) - 0x3fff; - } - } - - - result = i0 >> (31 - j0); - } - } - else if ((unsigned int) j0 < sizeof (long long int) * 8 && j0 < 64) - { - i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); - if ((i1 & i) != 0) - { - /* x is not integral. */ - i >>= 1; - if ((i1 & i) != 0) - i1 = (i1 & (~i)) | (0x40000000 >> (j0 - 31)); - } - - SET_LDOUBLE_WORDS (x, se, i0, i1); - w = two63[sx] + x; - x = w - two63[sx]; - GET_LDOUBLE_WORDS (se, i0, i1, x); - - j0 = (se & 0x7fff) - 0x3fff; - - result = i0; - if (j0 > 31) - { - result <<= j0 - 31; - result |= i1 >> (63 - j0); - } - } - else - /* Too large. The number is either +-inf or NaN or it is too - large to be effected by rounding. The standard leaves it - undefined what to return when the number is too large to fit in - a `long int'. */ - result = (long long int) x; - - return result; -} -#endif - -weak_alias (__rinttoll, rinttoll) diff --git a/sysdeps/libm-ieee754/s_roundtol.c b/sysdeps/libm-ieee754/s_roundtol.c deleted file mode 100644 index bc0ceae0f8..0000000000 --- a/sysdeps/libm-ieee754/s_roundtol.c +++ /dev/null @@ -1,177 +0,0 @@ -/* Round long double value to long int. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 - -#include "math_private.h" - - -#ifdef NO_LONG_DOUBLE -/* The `long double' is in fact the IEEE `double' type. */ - -long int -__roundtol (long double x) -{ - int32_t j0; - u_int32_t i1, i0; - long int result; - - EXTRACT_WORDS (i0, i1, x); - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - if (j0 < 20) - { - if (j0 < 0) - result = j0 < -1 ? 0 : ((i0 & 0x80000000) ? -1 : 1); - else - { - u_int32_t i = 0xfffff >> j0; - if (((i0 & i) | i1) == 0) - result = (long int) ((i0 & 0xfffff) | 0x100000) >> j0; - else - { - /* X is not integral. */ - u_int32_t j = i0 + (0x80000 >> j0); - if (j < i0) - result = (long int) 0x80000 >> (20 - j0); - else - result = (j | 0x100000) >> (20 - j0); - } - } - } - else if (j0 >= 8 * sizeof (long int) || j0 > 51) - { - /* The number is too large. It is left implementation defined - what happens. */ - result = (long int) x; - } - else - { - u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); - if ((i1 & i) != 0) - { - /* x is not integral. */ - u_int32_t j = i1 + (0x80000000 >> (j0 - 20)); - if (j < i1) - { - j = i0 + 1; - if ((j & 0xfffff) == 0) - { - if (sizeof (long int) <= 4) - /* Overflow. */ - result = (long int) x; - else - result = 1l << (j0 + 1); - } - else - result = (long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); - } - else - { - result = (long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); - if (sizeof (long int) > 4 && j0 > 31) - result |= j >> (63 - j0); - } - } - else - { - result = (long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); - if (sizeof (long int) > 4 && j0 > 31) - result |= i1 >> (63 - j0); - } - } - - return i0 & 0x80000000 ? -result : result; -} -#else -long int -__roundtol (long double x) -{ - int32_t j0; - u_int32_t se, i1, i0; - long int result; - - GET_LDOUBLE_WORDS (se, i0, i1, x); - j0 = (se & 0x7fff) - 0x3fff; - if (j0 < 31) - { - if (j0 < 0) - result = j0 < -1 ? 0 : 1; - else - { - u_int32_t i = 0x7fffffff >> j0; - if (((i0 & i) | i1) == 0) - result = (long int) i0 >> j0; - else - { - /* X is not integral. */ - u_int32_t j = i0 + (0x40000000 >> j0); - if (j < i0) - result = 0x80000000l >> (30 - j0); - else - result = j >> (31 - j0); - } - } - } - else if ((unsigned int) j0 >= 8 * sizeof (long int) || j0 > 62) - { - /* The number is too large. It is left implementation defined - what happens. */ - result = (long int) x; - } - else - { - u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); - if ((i1 & i) != 0) - { - /* x is not integral. */ - u_int32_t j = i1 + (0x80000000 >> (j0 - 31)); - if (j < i1) - { - j = i0 + 1; - if (j == 0) - { - if (sizeof (long int) <= 4) - /* Overflow. */ - result = (long int) x; - else - result = 1l << (j0 + 1); - } - else - result = (long int) i0 << (j0 - 31); - } - else - { - result = (long int) i0 << (j0 - 31); - if (sizeof (long int) > 4 && j0 > 31) - result |= j >> (63 - j0); - } - } - else - { - result = (long int) i0 << (j0 - 31); - if (sizeof (long int) > 4 && j0 > 31) - result |= i1 >> (63 - j0); - } - } - - return se & 0x8000 ? -result : result; -} -#endif -weak_alias (__roundtol, roundtol) diff --git a/sysdeps/libm-ieee754/s_roundtoll.c b/sysdeps/libm-ieee754/s_roundtoll.c deleted file mode 100644 index 49167236a6..0000000000 --- a/sysdeps/libm-ieee754/s_roundtoll.c +++ /dev/null @@ -1,179 +0,0 @@ -/* Round long double value to long long int. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 - -#include "math_private.h" - - -#ifdef NO_LONG_DOUBLE -/* The `long double' is in fact the IEEE `double' type. */ - -long long int -__roundtoll (long double x) -{ - int32_t j0; - u_int32_t i1, i0; - long long int result; - - EXTRACT_WORDS (i0, i1, x); - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - if (j0 < 20) - { - if (j0 < 0) - result = j0 < -1 ? 0 : ((i0 & 0x80000000) ? -1 : 1); - else - { - u_int32_t i = 0xfffff >> j0; - if (((i0 & i) | i1) == 0) - result = (long long int) ((i0 & 0xfffff) | 0x100000) >> j0; - else - { - /* X is not integral. */ - u_int32_t j = i0 + (0x80000 >> j0); - if (j < i0) - result = (long long int) 0x80000 >> (20 - j0); - else - result = (j | 0x100000) >> (20 - j0); - } - } - } - else if (j0 >= 8 * sizeof (long long int) || j0 > 51) - { - /* The number is too large. It is left implementation defined - what happens. */ - result = (long long int) x; - } - else - { - u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 20); - if ((i1 & i) != 0) - { - /* x is not integral. */ - u_int32_t j = i1 + (0x80000000 >> (j0 - 20)); - if (j < i1) - { - j = i0 + 1; - if ((j & 0xfffff) == 0) - { - if (sizeof (long long int) <= 4) - /* Overflow. */ - result = (long long int) x; - else - result = 1ll << (j0 + 1); - } - else - result = ((long long int) ((i0 & 0xfffff) | 0x100000) - << (j0 - 31)); - } - else - { - result = ((long long int) ((i0 & 0xfffff) | 0x100000) - << (j0 - 31)); - if (sizeof (long long int) > 4 && j0 > 31) - result |= j >> (63 - j0); - } - } - else - { - result = (long long int) ((i0 & 0xfffff) | 0x100000) << (j0 - 31); - if (sizeof (long long int) > 4 && j0 > 31) - result |= i1 >> (63 - j0); - } - } - - return i0 & 0x80000000 ? -result : result; -} -#else -long long int -__roundtoll (long double x) -{ - int32_t j0; - u_int32_t se, i1, i0; - long long int result; - - GET_LDOUBLE_WORDS (se, i0, i1, x); - j0 = (se & 0x7fff) - 0x3fff; - if (j0 < 31) - { - if (j0 < 0) - result = j0 < -1 ? 0 : 1; - else - { - u_int32_t i = 0x7fffffff >> j0; - if (((i0 & i) | i1) == 0) - result = (long long int) i0 >> j0; - else - { - /* X is not integral. */ - u_int32_t j = i0 + (0x40000000 >> j0); - if (j < i0) - result = 0x80000000l >> (30 - j0); - else - result = j >> (31 - j0); - } - } - } - else if ((unsigned int) j0 >= 8 * sizeof (long long int) || j0 > 62) - { - /* The number is too large. It is left implementation defined - what happens. */ - result = (long long int) x; - } - else - { - u_int32_t i = ((u_int32_t) (0xffffffff)) >> (j0 - 31); - if ((i1 & i) != 0) - { - /* x is not integral. */ - u_int32_t j = i1 + (0x80000000 >> (j0 - 31)); - if (j < i1) - { - j = i0 + 1; - if (j == 0) - { - if (sizeof (long long int) <= 4) - /* Overflow. */ - result = (long long int) x; - else - result = 1ll << (j0 + 1); - } - else - result = (long long int) i0 << (j0 - 31); - } - else - { - result = (long long int) i0 << (j0 - 31); - if (sizeof (long long int) > 4 && j0 > 31) - result |= j >> (63 - j0); - } - } - else - { - result = (long long int) i0 << (j0 - 31); - if (sizeof (long long int) > 4 && j0 > 31) - result |= i1 >> (63 - j0); - } - } - - return se & 0x8000 ? -result : result; -} -#endif -weak_alias (__roundtoll, roundtoll) diff --git a/sysdeps/libm-ieee754/s_scalbn.c b/sysdeps/libm-ieee754/s_scalbn.c index 439b966e69..0ce0ffdf2f 100644 --- a/sysdeps/libm-ieee754/s_scalbn.c +++ b/sysdeps/libm-ieee754/s_scalbn.c @@ -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; diff --git a/sysdeps/libm-ieee754/s_scalbnf.c b/sysdeps/libm-ieee754/s_scalbnf.c index 3a83e54c56..4799c825c9 100644 --- a/sysdeps/libm-ieee754/s_scalbnf.c +++ b/sysdeps/libm-ieee754/s_scalbnf.c @@ -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; diff --git a/sysdeps/libm-ieee754/s_scalbnl.c b/sysdeps/libm-ieee754/s_scalbnl.c index 6825e9c7b3..3e80d85136 100644 --- a/sysdeps/libm-ieee754/s_scalbnl.c +++ b/sysdeps/libm-ieee754/s_scalbnl.c @@ -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) diff --git a/sysdeps/libm-ieee754/w_gamma.c b/sysdeps/libm-ieee754/w_gamma.c index 49e4bcf3c3..87a3408c3f 100644 --- a/sysdeps/libm-ieee754/w_gamma.c +++ b/sysdeps/libm-ieee754/w_gamma.c @@ -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 { + int signgam; + double 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 __ieee754_lgamma_r(x,&signgam); + return y; #else - double y; - y = __ieee754_lgamma_r(x,&signgam); - if(_LIB_VERSION == _IEEE_) return y; + 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 */ diff --git a/sysdeps/libm-ieee754/w_gamma_r.c b/sysdeps/libm-ieee754/w_gamma_r.c deleted file mode 100644 index f9efc8cf2e..0000000000 --- a/sysdeps/libm-ieee754/w_gamma_r.c +++ /dev/null @@ -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 diff --git a/sysdeps/libm-ieee754/w_gammaf.c b/sysdeps/libm-ieee754/w_gammaf.c index c2d21daf47..ecde183824 100644 --- a/sysdeps/libm-ieee754/w_gammaf.c +++ b/sysdeps/libm-ieee754/w_gammaf.c @@ -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 { + int signgam; + float 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 __ieee754_lgammaf_r(x,&signgam); + return y; #else - float y; - y = __ieee754_lgammaf_r(x,&signgam); - if(_LIB_VERSION == _IEEE_) return y; + 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) diff --git a/sysdeps/libm-ieee754/w_gammaf_r.c b/sysdeps/libm-ieee754/w_gammaf_r.c deleted file mode 100644 index b15d5e84bb..0000000000 --- a/sysdeps/libm-ieee754/w_gammaf_r.c +++ /dev/null @@ -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) diff --git a/sysdeps/libm-ieee754/w_gammal.c b/sysdeps/libm-ieee754/w_gammal.c index f72e2e7e44..605a4167c4 100644 --- a/sysdeps/libm-ieee754/w_gammal.c +++ b/sysdeps/libm-ieee754/w_gammal.c @@ -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 { + long double 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 __ieee754_lgammal_r(x,&signgam); + return y; #else - long double y; - y = __ieee754_lgammal_r(x,&signgam); - if(_LIB_VERSION == _IEEE_) return y; + 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 */ diff --git a/sysdeps/libm-ieee754/w_gammal_r.c b/sysdeps/libm-ieee754/w_gammal_r.c deleted file mode 100644 index ad6a43ae9b..0000000000 --- a/sysdeps/libm-ieee754/w_gammal_r.c +++ /dev/null @@ -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) diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h index fd90a2de1b..bdeaa9efb0 100644 --- a/sysdeps/m68k/fpu/__math.h +++ b/sysdeps/m68k/fpu/__math.h @@ -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, diff --git a/sysdeps/m68k/fpu/s_llrint.c b/sysdeps/m68k/fpu/s_llrint.c new file mode 100644 index 0000000000..f5d0d51122 --- /dev/null +++ b/sysdeps/m68k/fpu/s_llrint.c @@ -0,0 +1,62 @@ +/* Round argument to nearest integral value according to current rounding + direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define __LIBC_M81_MATH_INLINES +#include +#include "math_private.h" + +long long int +__llrint (long double x) +{ + int32_t se, sx; + u_int32_t h, l; + long long int result; + + x = __m81_u(__rintl) (x); + + /* We could use __fixxfdi from libgcc, but here we can take advantage of + the known floating point format. */ + GET_LDOUBLE_WORDS (se, h, l, x); + + sx = se & (1 << 15); + se = (se ^ sx) - 0x3fff; + + if (se < 64) + { + if (se > 31) + result = (((long long int) (h >> (63 - se)) << 32) + | (l >> (63 - se)) | (h << (se - 31))); + else + result = h >> (31 - se); + if (sx) + result = -result; + } + else + /* Too large. The number is either +-inf or NaN or it is too + large to be effected by rounding. The standard leaves it + undefined what to return when the number is too large to fit in + a `long long int'. */ + result = -1LL; + + return result; +} + +weak_alias (__llrint, llrint) diff --git a/sysdeps/m68k/fpu/s_lrint.c b/sysdeps/m68k/fpu/s_lrint.c new file mode 100644 index 0000000000..a7044113af --- /dev/null +++ b/sysdeps/m68k/fpu/s_lrint.c @@ -0,0 +1,31 @@ +/* Round argument to nearest integral value according to current rounding + direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define __LIBC_M81_MATH_INLINES +#include + +long int +__lrint (long double x) +{ + return __m81_u(__lrint) (x); +} + +weak_alias (__lrint, lrint) diff --git a/sysdeps/m68k/fpu/s_remquo.c b/sysdeps/m68k/fpu/s_remquo.c index 3682ba7896..0332eccfd0 100644 --- a/sysdeps/m68k/fpu/s_remquo.c +++ b/sysdeps/m68k/fpu/s_remquo.c @@ -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; diff --git a/sysdeps/m68k/fpu/s_rinttol.c b/sysdeps/m68k/fpu/s_rinttol.c deleted file mode 100644 index 7476d785a6..0000000000 --- a/sysdeps/m68k/fpu/s_rinttol.c +++ /dev/null @@ -1,31 +0,0 @@ -/* Round argument to nearest integral value according to current rounding - direction. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Schwab - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#define __LIBC_M81_MATH_INLINES -#include - -long int -__rinttol (long double x) -{ - return __m81_u(__rinttol) (x); -} - -weak_alias (__rinttol, rinttol) diff --git a/sysdeps/m68k/fpu/s_rinttoll.c b/sysdeps/m68k/fpu/s_rinttoll.c deleted file mode 100644 index bad8082bd1..0000000000 --- a/sysdeps/m68k/fpu/s_rinttoll.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Round argument to nearest integral value according to current rounding - direction. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Schwab - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#define __LIBC_M81_MATH_INLINES -#include -#include "math_private.h" - -long long int -__rinttoll (long double x) -{ - int32_t se, sx; - u_int32_t h, l; - long long int result; - - x = __m81_u(__rintl) (x); - - /* We could use __fixxfdi from libgcc, but here we can take advantage of - the known floating point format. */ - GET_LDOUBLE_WORDS (se, h, l, x); - - sx = se & (1 << 15); - se = (se ^ sx) - 0x3fff; - - if (se < 64) - { - if (se > 31) - result = (((long long int) (h >> (63 - se)) << 32) - | (l >> (63 - se)) | (h << (se - 31))); - else - result = h >> (31 - se); - if (sx) - result = -result; - } - else - /* Too large. The number is either +-inf or NaN or it is too - large to be effected by rounding. The standard leaves it - undefined what to return when the number is too large to fit in - a `long long int'. */ - result = -1LL; - - return result; -} - -weak_alias (__rinttoll, rinttoll) diff --git a/sysdeps/posix/Makefile b/sysdeps/posix/Makefile index 7c1013ad2b..a47f77af32 100644 --- a/sysdeps/posix/Makefile +++ b/sysdeps/posix/Makefile @@ -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 diff --git a/sysdeps/powerpc/Dist b/sysdeps/powerpc/Dist index ba908dc0cb..ae16c0f8fb 100644 --- a/sysdeps/powerpc/Dist +++ b/sysdeps/powerpc/Dist @@ -1 +1,2 @@ +fenv_const.c fenv_libc.h diff --git a/sysdeps/stub/e_acoshl.c b/sysdeps/stub/e_acoshl.c index 6ec9a15d38..3383c14872 100644 --- a/sysdeps/stub/e_acoshl.c +++ b/sysdeps/stub/e_acoshl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_acoshl (long double x) { fputs ("__ieee754_acoshl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_acosl.c b/sysdeps/stub/e_acosl.c index 5c10b526cc..af1e6261c3 100644 --- a/sysdeps/stub/e_acosl.c +++ b/sysdeps/stub/e_acosl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_acosl (long double x) { fputs ("__ieee754_acosl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_asinl.c b/sysdeps/stub/e_asinl.c index f9260913e8..ce8c8cdaea 100644 --- a/sysdeps/stub/e_asinl.c +++ b/sysdeps/stub/e_asinl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_asinl (long double x) { fputs ("__ieee754_asinl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_atan2l.c b/sysdeps/stub/e_atan2l.c index 3edfacd68a..6c500d4c8a 100644 --- a/sysdeps/stub/e_atan2l.c +++ b/sysdeps/stub/e_atan2l.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_atan2l (long double x, long double y) { fputs ("__ieee754_atan2l not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_expl.c b/sysdeps/stub/e_expl.c index 246b5ae83f..4ea8c79597 100644 --- a/sysdeps/stub/e_expl.c +++ b/sysdeps/stub/e_expl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_expl (long double x) { fputs ("__ieee754_expl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_fmodl.c b/sysdeps/stub/e_fmodl.c index b47912581b..25cc114808 100644 --- a/sysdeps/stub/e_fmodl.c +++ b/sysdeps/stub/e_fmodl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_fmodl (long double x, long double y) { fputs ("__ieee754_fmodl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_j0l.c b/sysdeps/stub/e_j0l.c index c16e8a8a9d..ecb8a8ed16 100644 --- a/sysdeps/stub/e_j0l.c +++ b/sysdeps/stub/e_j0l.c @@ -1,10 +1,12 @@ #include #include +#include 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; } diff --git a/sysdeps/stub/e_j1l.c b/sysdeps/stub/e_j1l.c index 0a781e5cc1..24655700e3 100644 --- a/sysdeps/stub/e_j1l.c +++ b/sysdeps/stub/e_j1l.c @@ -1,10 +1,12 @@ #include #include +#include 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; } diff --git a/sysdeps/stub/e_jnl.c b/sysdeps/stub/e_jnl.c index 86ff03b031..8ced34d461 100644 --- a/sysdeps/stub/e_jnl.c +++ b/sysdeps/stub/e_jnl.c @@ -1,10 +1,12 @@ #include #include +#include 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; } diff --git a/sysdeps/stub/e_lgammal_r.c b/sysdeps/stub/e_lgammal_r.c index 015511818c..d7fbbca4df 100644 --- a/sysdeps/stub/e_lgammal_r.c +++ b/sysdeps/stub/e_lgammal_r.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_lgammal_r (long double x, int *signgamp) { fputs ("__ieee754_lgammal_r not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_log10l.c b/sysdeps/stub/e_log10l.c index 0e8cdcaaa9..a414d04d74 100644 --- a/sysdeps/stub/e_log10l.c +++ b/sysdeps/stub/e_log10l.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_log10l (long double x) { fputs ("__ieee754_log10l not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_logl.c b/sysdeps/stub/e_logl.c index b8357543b0..45248a375a 100644 --- a/sysdeps/stub/e_logl.c +++ b/sysdeps/stub/e_logl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_logl (long double x) { fputs ("__ieee754_logl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_powl.c b/sysdeps/stub/e_powl.c index 2fa7862ea5..611dfb583c 100644 --- a/sysdeps/stub/e_powl.c +++ b/sysdeps/stub/e_powl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_powl (long double x, long double y) { fputs ("__ieee754_powl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/e_rem_pio2l.c b/sysdeps/stub/e_rem_pio2l.c index 0a9ac79917..eec7d793bb 100644 --- a/sysdeps/stub/e_rem_pio2l.c +++ b/sysdeps/stub/e_rem_pio2l.c @@ -1,10 +1,12 @@ #include #include +#include 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; } diff --git a/sysdeps/stub/e_sqrtl.c b/sysdeps/stub/e_sqrtl.c index 88a7668330..c583a27673 100644 --- a/sysdeps/stub/e_sqrtl.c +++ b/sysdeps/stub/e_sqrtl.c @@ -1,10 +1,12 @@ #include #include +#include long double __ieee754_sqrtl (long double x) { fputs ("__ieee754_sqrtl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/k_cosl.c b/sysdeps/stub/k_cosl.c index 3e6c9688f0..10016ab72e 100644 --- a/sysdeps/stub/k_cosl.c +++ b/sysdeps/stub/k_cosl.c @@ -1,10 +1,12 @@ #include #include +#include long double __kernel_cosl (long double x, long double y) { fputs ("__kernel_cosl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/k_rem_pio2l.c b/sysdeps/stub/k_rem_pio2l.c index a51c44546b..01bf158249 100644 --- a/sysdeps/stub/k_rem_pio2l.c +++ b/sysdeps/stub/k_rem_pio2l.c @@ -1,12 +1,14 @@ #include #include #include +#include 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; } diff --git a/sysdeps/stub/k_sinl.c b/sysdeps/stub/k_sinl.c index 2057bf8bff..40cf22a596 100644 --- a/sysdeps/stub/k_sinl.c +++ b/sysdeps/stub/k_sinl.c @@ -1,10 +1,12 @@ #include #include +#include long double __kernel_sinl (long double x, long double y) { fputs ("__kernel_sinl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } diff --git a/sysdeps/stub/k_tanl.c b/sysdeps/stub/k_tanl.c index 713c8cdfe6..95ffc23bd9 100644 --- a/sysdeps/stub/k_tanl.c +++ b/sysdeps/stub/k_tanl.c @@ -1,10 +1,12 @@ #include #include +#include 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; } diff --git a/sysdeps/stub/s_atanl.c b/sysdeps/stub/s_atanl.c index 38dd6f5991..2957d702d5 100644 --- a/sysdeps/stub/s_atanl.c +++ b/sysdeps/stub/s_atanl.c @@ -1,10 +1,12 @@ #include #include +#include long double __atanl (long double x) { fputs ("__atanl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__atanl, atanl) diff --git a/sysdeps/stub/s_erfl.c b/sysdeps/stub/s_erfl.c index efcf490fa7..7ae25d6252 100644 --- a/sysdeps/stub/s_erfl.c +++ b/sysdeps/stub/s_erfl.c @@ -1,10 +1,12 @@ #include #include +#include long double __erfl (long double x) { fputs ("__erfl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__erfl, erfl) @@ -15,6 +17,7 @@ long double __erfcl (long double x) { fputs ("__erfcl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__erfcl, erfcl) diff --git a/sysdeps/stub/s_exp2.c b/sysdeps/stub/s_exp2.c index a3d0906a33..5adda4107a 100644 --- a/sysdeps/stub/s_exp2.c +++ b/sysdeps/stub/s_exp2.c @@ -1,10 +1,12 @@ #include #include +#include double __exp2 (double x) { fputs ("__exp2 not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__exp2, exp2) diff --git a/sysdeps/stub/s_exp2f.c b/sysdeps/stub/s_exp2f.c index 5d6540e074..51b268c9e0 100644 --- a/sysdeps/stub/s_exp2f.c +++ b/sysdeps/stub/s_exp2f.c @@ -1,10 +1,12 @@ #include #include +#include float __exp2f (float x) { fputs ("__exp2f not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__exp2f, exp2f) diff --git a/sysdeps/stub/s_exp2l.c b/sysdeps/stub/s_exp2l.c index 4c52fc904d..cab2cb2a69 100644 --- a/sysdeps/stub/s_exp2l.c +++ b/sysdeps/stub/s_exp2l.c @@ -1,10 +1,12 @@ #include #include +#include long double __exp2l (long double x) { fputs ("__exp2l not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__exp2l, exp2l) diff --git a/sysdeps/stub/s_expm1l.c b/sysdeps/stub/s_expm1l.c index fb8bda5eca..38798812ff 100644 --- a/sysdeps/stub/s_expm1l.c +++ b/sysdeps/stub/s_expm1l.c @@ -1,10 +1,12 @@ #include #include +#include long double __expm1l (long double x) { fputs ("__expm1l not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__expm1l, expm1l) diff --git a/sysdeps/stub/s_log1pl.c b/sysdeps/stub/s_log1pl.c index 07282482f3..9e51ce2d43 100644 --- a/sysdeps/stub/s_log1pl.c +++ b/sysdeps/stub/s_log1pl.c @@ -1,10 +1,12 @@ #include #include +#include long double __log1pl (long double x) { fputs ("__log1pl not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__log1pl, log1pl) diff --git a/sysdeps/stub/s_log2l.c b/sysdeps/stub/s_log2l.c index d8d86af995..cc09569422 100644 --- a/sysdeps/stub/s_log2l.c +++ b/sysdeps/stub/s_log2l.c @@ -1,10 +1,12 @@ #include #include +#include long double __log2l (long double x) { fputs ("__log2l not implemented\n", stderr); + __set_errno (ENOSYS); return 0.0; } weak_alias (__log2l, log2l) diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist index fc403871f3..ae79600717 100644 --- a/sysdeps/unix/sysv/linux/Dist +++ b/sysdeps/unix/sysv/linux/Dist @@ -10,6 +10,7 @@ net/ethernet.h net/if.h net/if_arp.h net/if_ppp.h +net/if_slip.h net/ppp-comp.h net/ppp_defs.h net/route.h diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index c61904a3b8..7255a69ece 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -19,13 +19,15 @@ $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/sys/syscal echo > $(@:.d=.h).new \ '/* Generated at libc build time from kernel syscall list. */' SUNPRO_DEPENDENCIES='$(@:.h=.d) $(patsubst $(objpfx)%,$$(objpfx)%,\ - $(@:.h=.d))' \ + $(@:.d=.h) $(@:.h=.d))' \ $(CC) -E -x c $< -D_LIBC -dM | \ sed -n >> $(@:.d=.h).new \ 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' mv -f $(@:.d=.h).new $(@:.d=.h) +ifndef no_deps # Get the generated list of dependencies (probably /usr/include/asm/unistd.h). -include $(objpfx)syscall-list.d +endif generated += syscall-list.h syscall-list.d endif @@ -35,7 +37,8 @@ endif ifeq ($(subdir),socket) sysdep_headers += sys/socketcall.h net/if.h net/if_ppp.h net/ppp-comp.h \ - net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h + net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \ + net/if_slip.h sysdep_routines += cmsg_nxthdr endif @@ -61,3 +64,30 @@ endif # Don't compile the ctype glue code, since there is no old non-GNU C library. inhibit-glue = yes + +# Tell sysdeps/posix/Makefile that we create stdio_lim.h differently. +inhibit-stdio_lim = yes + +$(common-objpfx)stdio_%.h $(common-objpfx)stdio_%.d: \ + $(..)sysdeps/unix/sysv/linux/stdio_%.h.in + rm -f $(@:.h=.d) $(@:.d=.h)-t + echo '#include ' | \ + SUNPRO_DEPENDENCIES='$(@:.h=.d) \ + $(patsubst $(common-objpfx)%,$$(common-objpfx)%,\ + $(@:.d=.h) $(@:.h=.d))' \ + $(CC) -E -dM - > $(@:.d=.h)-t + fopen_max=`sed -n 's/^#define OPEN_MAX //p' $(@:.d=.h)-t`; \ + filename_max=`sed -n 's/^#define PATH_MAX //p' $(@:.d=.h)-t`; \ + if test -n "$$fopen_max" && test -n "$$filename_max"; then \ + sed -e "s/DEFAULT_FOPEN_MAX/$$fopen_max/" \ + -e "s/DEFAULT_FILENAME_MAX/$$filename_max/" $< \ + > $(@:.d=.h).new && \ + mv -f $(@:.d=.h).new $(@:.d=.h); \ + else exit 1; fi +# Remove this last so that it can be examined if something went wrong. + rm -f $(@:.d=.h)-t +ifndef no_deps +# Get the list of dependencies (probably /usr/include/linux/limits.h). +-include $(common-objpfx)stdio_lim.d +endif +common-generated += stdio_lim.h stdio_lim.d diff --git a/sysdeps/unix/sysv/linux/arm/Dist b/sysdeps/unix/sysv/linux/arm/Dist new file mode 100644 index 0000000000..738b9cc542 --- /dev/null +++ b/sysdeps/unix/sysv/linux/arm/Dist @@ -0,0 +1 @@ +clone.S diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure index a8780df917..79dbf16912 100644 --- a/sysdeps/unix/sysv/linux/configure +++ b/sysdeps/unix/sysv/linux/configure @@ -98,27 +98,3 @@ fi if test -f $srcdir/elf/ldconfig.c; then has_ldconfig=yes fi - -# Generate stdio_lim.h -default_fopen_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FOPEN_MAX | cut -f2 -d':'`" -default_filename_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FILENAME_MAX | cut -f2 -d':'`" -# We double check if "default_fopen_max" and "default_filename_max" are -# ok or not. -if test "x$default_fopen_max" != "xOPEN_MAX" \ - -a "x$default_filename_max" != "xPATH_MAX" -then - sed -e "s/DEFAULT_FOPEN_MAX/$default_fopen_max/" \ - -e "s/DEFAULT_FILENAME_MAX/$default_filename_max/" \ - $srcdir/sysdeps/unix/sysv/linux/stdio_lim.h.in > stdio_lim.h.new - if test -r stdio_lim.h.new && cmp -s stdio_lim.h.new stdio_lim.h - then - echo stdio_lim.h unchanged - rm -f stdio_lim.h.new - else - mv -f stdio_lim.h.new stdio_lim.h - fi -else - # We remove the old one if we cannot generate the new one during - # configure. - rm -f stdio_lim.h -fi diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in index f24af67f1e..18bb6dc469 100644 --- a/sysdeps/unix/sysv/linux/configure.in +++ b/sysdeps/unix/sysv/linux/configure.in @@ -83,27 +83,3 @@ fi if test -f $srcdir/elf/ldconfig.c; then has_ldconfig=yes fi - -# Generate stdio_lim.h -default_fopen_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FOPEN_MAX | cut -f2 -d':'`" -default_filename_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FILENAME_MAX | cut -f2 -d':'`" -# We double check if "default_fopen_max" and "default_filename_max" are -# ok or not. -if test "x$default_fopen_max" != "xOPEN_MAX" \ - -a "x$default_filename_max" != "xPATH_MAX" -then - sed -e "s/DEFAULT_FOPEN_MAX/$default_fopen_max/" \ - -e "s/DEFAULT_FILENAME_MAX/$default_filename_max/" \ - $srcdir/sysdeps/unix/sysv/linux/stdio_lim.h.in > stdio_lim.h.new - if test -r stdio_lim.h.new && cmp -s stdio_lim.h.new stdio_lim.h - then - echo stdio_lim.h unchanged - rm -f stdio_lim.h.new - else - mv -f stdio_lim.h.new stdio_lim.h - fi -else - # We remove the old one if we cannot generate the new one during - # configure. - rm -f stdio_lim.h -fi diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.S b/sysdeps/unix/sysv/linux/i386/sysdep.S index a686495818..5a615efecb 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.S +++ b/sysdeps/unix/sysv/linux/i386/sysdep.S @@ -25,15 +25,8 @@ it somewhere else. ...and this place is here. */ - .bss - .globl errno - .type errno,@object - .size errno,4 -errno: .zero 4 - .globl _errno - .type _errno,@object + .comm errno,4,4 _errno = errno /* This name is expected by hj's libc.so.5 startup code. */ - .text /* The following code is only used in the shared library when we compile the reentrant version. Otherwise each system call defines diff --git a/sysdeps/unix/sysv/linux/mk-stdiolim.c b/sysdeps/unix/sysv/linux/mk-stdiolim.c deleted file mode 100644 index 23295f007d..0000000000 --- a/sysdeps/unix/sysv/linux/mk-stdiolim.c +++ /dev/null @@ -1,4 +0,0 @@ -#include - -DEFAULT_FOPEN_MAX:OPEN_MAX -DEFAULT_FILENAME_MAX:PATH_MAX diff --git a/sysdeps/unix/sysv/linux/powerpc/Dist b/sysdeps/unix/sysv/linux/powerpc/Dist index 27a951f169..4410266d71 100644 --- a/sysdeps/unix/sysv/linux/powerpc/Dist +++ b/sysdeps/unix/sysv/linux/powerpc/Dist @@ -4,3 +4,5 @@ termbits.h kernel_stat.h kernel_termios.h sys/kernel_termios.h +init-first.h +syscall.h diff --git a/sysdeps/unix/sysv/linux/sparc/Dist b/sysdeps/unix/sysv/linux/sparc/Dist index c31f140137..d93c648651 100644 --- a/sysdeps/unix/sysv/linux/sparc/Dist +++ b/sysdeps/unix/sysv/linux/sparc/Dist @@ -4,3 +4,4 @@ pipe.S fork.S kernel_stat.h kernel_sigaction.h +init-first.h diff --git a/time/tzfile.c b/time/tzfile.c index 44b33cb02c..2d0752c147 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -244,7 +244,7 @@ __tzfile_read (const char *file) for (i = 0; i < num_isstd; ++i) { - char c = getc (f); + int c = getc (f); if (c == EOF) goto lose; types[i].isstd = c != 0; @@ -254,7 +254,7 @@ __tzfile_read (const char *file) for (i = 0; i < num_isgmt; ++i) { - char c = getc (f); + int c = getc (f); if (c == EOF) goto lose; types[i].isgmt = c != 0; -- cgit 1.4.1