aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog346
-rw-r--r--Makeconfig7
-rw-r--r--Makerules14
-rw-r--r--Rules2
-rw-r--r--argp/argp-parse.c126
-rw-r--r--argp/argp.h11
-rw-r--r--elf/Makefile2
-rw-r--r--elf/dl-minimal.c1
-rw-r--r--elf/do-rel.h2
-rw-r--r--elf/ldd.bash.in2
-rw-r--r--extra-lib.mk2
-rw-r--r--features.h3
-rw-r--r--inet/rcmd.c44
-rw-r--r--libc.map20
-rw-r--r--login/Makefile2
-rw-r--r--login/programs/request.c20
-rw-r--r--login/programs/utmpd.c10
-rw-r--r--login/programs/utmpd.h7
-rw-r--r--login/utmp_daemon.c52
-rw-r--r--login/utmp_file.c89
-rw-r--r--manual/Makefile7
-rw-r--r--manual/argp.texi43
-rw-r--r--manual/dir16
-rw-r--r--manual/string.texi9
-rw-r--r--manual/texinfo.tex53
-rw-r--r--math/Makefile8
-rw-r--r--math/libm-test.c287
-rw-r--r--math/math.h8
-rw-r--r--math/mathcalls.h19
-rw-r--r--md5-crypt/Makefile2
-rw-r--r--nis/Makefile2
-rw-r--r--stdio-common/temptest.c14
-rw-r--r--stdio-common/tstscanf.c6
-rw-r--r--stdio-common/vfscanf.c13
-rw-r--r--string/Makefile4
-rw-r--r--string/argz-replace.c135
-rw-r--r--string/argz.h10
-rw-r--r--sunrpc/Makefile6
-rw-r--r--sysdeps/generic/mathbits.h5
-rw-r--r--sysdeps/i386/fpu/mathbits.h5
-rw-r--r--sysdeps/libm-i387/e_scalb.S78
-rw-r--r--sysdeps/libm-i387/e_scalbf.S79
-rw-r--r--sysdeps/libm-i387/e_scalbl.S78
-rw-r--r--sysdeps/libm-i387/s_asinh.S11
-rw-r--r--sysdeps/libm-i387/s_asinhf.S11
-rw-r--r--sysdeps/libm-i387/s_asinhl.S11
-rw-r--r--sysdeps/libm-i387/s_ilogb.S12
-rw-r--r--sysdeps/libm-i387/s_ilogbf.S12
-rw-r--r--sysdeps/libm-i387/s_ilogbl.S13
-rw-r--r--sysdeps/libm-i387/s_llrint.S (renamed from sysdeps/libm-i387/s_rinttoll.S)6
-rw-r--r--sysdeps/libm-i387/s_lrint.S (renamed from sysdeps/libm-i387/s_rinttol.S)6
-rw-r--r--sysdeps/libm-i387/s_remquo.S7
-rw-r--r--sysdeps/libm-i387/s_remquof.S7
-rw-r--r--sysdeps/libm-i387/s_remquol.S7
-rw-r--r--sysdeps/libm-ieee754/e_gamma_r.c47
-rw-r--r--sysdeps/libm-ieee754/e_gammaf_r.c46
-rw-r--r--sysdeps/libm-ieee754/e_gammal_r.c46
-rw-r--r--sysdeps/libm-ieee754/e_lgamma_r.c40
-rw-r--r--sysdeps/libm-ieee754/e_lgammaf_r.c22
-rw-r--r--sysdeps/libm-ieee754/s_llrint.c (renamed from sysdeps/libm-ieee754/s_rinttoll.c)6
-rw-r--r--sysdeps/libm-ieee754/s_llround.c (renamed from sysdeps/libm-ieee754/s_roundtoll.c)6
-rw-r--r--sysdeps/libm-ieee754/s_lrint.c (renamed from sysdeps/libm-ieee754/s_rinttol.c)6
-rw-r--r--sysdeps/libm-ieee754/s_lround.c (renamed from sysdeps/libm-ieee754/s_roundtol.c)6
-rw-r--r--sysdeps/libm-ieee754/s_remquo.c2
-rw-r--r--sysdeps/libm-ieee754/s_remquof.c2
-rw-r--r--sysdeps/libm-ieee754/s_remquol.c2
-rw-r--r--sysdeps/libm-ieee754/s_scalbn.c13
-rw-r--r--sysdeps/libm-ieee754/s_scalbnf.c20
-rw-r--r--sysdeps/libm-ieee754/s_scalbnl.c34
-rw-r--r--sysdeps/libm-ieee754/w_gamma.c22
-rw-r--r--sysdeps/libm-ieee754/w_gamma_r.c51
-rw-r--r--sysdeps/libm-ieee754/w_gammaf.c21
-rw-r--r--sysdeps/libm-ieee754/w_gammaf_r.c52
-rw-r--r--sysdeps/libm-ieee754/w_gammal.c21
-rw-r--r--sysdeps/libm-ieee754/w_gammal_r.c52
-rw-r--r--sysdeps/m68k/fpu/__math.h4
-rw-r--r--sysdeps/m68k/fpu/s_llrint.c (renamed from sysdeps/m68k/fpu/s_rinttoll.c)4
-rw-r--r--sysdeps/m68k/fpu/s_lrint.c (renamed from sysdeps/m68k/fpu/s_rinttol.c)6
-rw-r--r--sysdeps/m68k/fpu/s_remquo.c9
-rw-r--r--sysdeps/posix/Makefile5
-rw-r--r--sysdeps/powerpc/Dist1
-rw-r--r--sysdeps/stub/e_acoshl.c2
-rw-r--r--sysdeps/stub/e_acosl.c2
-rw-r--r--sysdeps/stub/e_asinl.c2
-rw-r--r--sysdeps/stub/e_atan2l.c2
-rw-r--r--sysdeps/stub/e_expl.c2
-rw-r--r--sysdeps/stub/e_fmodl.c2
-rw-r--r--sysdeps/stub/e_j0l.c3
-rw-r--r--sysdeps/stub/e_j1l.c3
-rw-r--r--sysdeps/stub/e_jnl.c3
-rw-r--r--sysdeps/stub/e_lgammal_r.c2
-rw-r--r--sysdeps/stub/e_log10l.c2
-rw-r--r--sysdeps/stub/e_logl.c2
-rw-r--r--sysdeps/stub/e_powl.c2
-rw-r--r--sysdeps/stub/e_rem_pio2l.c2
-rw-r--r--sysdeps/stub/e_sqrtl.c2
-rw-r--r--sysdeps/stub/k_cosl.c2
-rw-r--r--sysdeps/stub/k_rem_pio2l.c2
-rw-r--r--sysdeps/stub/k_sinl.c2
-rw-r--r--sysdeps/stub/k_tanl.c2
-rw-r--r--sysdeps/stub/s_atanl.c2
-rw-r--r--sysdeps/stub/s_erfl.c3
-rw-r--r--sysdeps/stub/s_exp2.c2
-rw-r--r--sysdeps/stub/s_exp2f.c2
-rw-r--r--sysdeps/stub/s_exp2l.c2
-rw-r--r--sysdeps/stub/s_expm1l.c2
-rw-r--r--sysdeps/stub/s_log1pl.c2
-rw-r--r--sysdeps/stub/s_log2l.c2
-rw-r--r--sysdeps/unix/sysv/linux/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/Makefile34
-rw-r--r--sysdeps/unix/sysv/linux/arm/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/configure24
-rw-r--r--sysdeps/unix/sysv/linux/configure.in24
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.S9
-rw-r--r--sysdeps/unix/sysv/linux/mk-stdiolim.c4
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/Dist2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/Dist1
-rw-r--r--time/tzfile.c4
118 files changed, 1758 insertions, 702 deletions
diff --git a/ChangeLog b/ChangeLog
index 9c70ad3..cb09bdf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,320 @@
+1997-06-19 19:38 Ulrich Drepper <drepper@cygnus.com>
+
+ * features.h: Define __STDC_IEC_559__ and _STDC_IEC_559_COMPLEX__.
+
+ * elf/dl-minimal.c (__dcgettext): Remove assertion.
+
+ * inet/rcmd.c: Correct a few typos. Reported by Eric Troan.
+
+ * manual/Makefile (distribute): Add dir.
+ * manual/dir: New file.
+
+ * math/Makefile (libm-support): Rename s_rinttol, s_rinttoll,
+ s_roundtol, and s_roundtoll to s_lrint, s_llrint, s_lround,
+ and s_llround respectively.
+ (libm-calls): Add e_gamma_r.
+ * math/libm-test.c (check_int_exc): New function.
+ (signbit_test): Remove test for sign of NaN.
+ (gamma_test): Clear exception after test of existence.
+ Correct tests and and epsilons.
+ (lgamma_test): Likewise.
+ (ilogb_test): Correct all tests.
+ (scalb_test): Rewrite.
+ (rinttol_test): Rename to lrint_test and correct tests.
+ (rinttoll_test): Likewise.
+ (roundtol_test): Likewise.
+ (roundtoll_test): Likewise.
+ (main): Call lrint/lround functions instead of rinttol/roundtol.
+ * math/math.h: Change prototypes for rinttol/roundtol.
+ * math/mathcalls.h: Rearrange prototypes according to ISO C9X draft.
+ * sysdeps/generic/mathbits.h: Define FP_ILOGB0 and FP_ILOGBNAN.
+ * sysdeps/i386/mathbits.h: Likewise.
+ * sysdeps/libm-i387/e_scalb.S: Handle special cases correctly.
+ * sysdeps/libm-i387/e_scalbf.S: Likewise.
+ * sysdeps/libm-i387/e_scalbl.S: Likewise.
+ * sysdeps/libm-i387/s_asinh.S: Handle -inf correctly.
+ * sysdeps/libm-i387/s_asinhf.S: Likewise.
+ * sysdeps/libm-i387/s_asinhl.S: Likewise.
+ * sysdeps/libm-i387/s_ilogb.S: Optimize.
+ * sysdeps/libm-i387/s_ilogbf.S: Likewise.
+ * sysdeps/libm-i387/s_ilogbl.S: Likewise.
+ * sysdeps/libm-i387/s_rinttol.S: Rename to...
+ * sysdeps/libm-i387/s_lrint.S: ...this.
+ * sysdeps/libm-i387/s_rinttoll.S: Rename to...
+ * sysdeps/libm-i387/s_llrint.S: ...this.
+ * sysdeps/libm-i387/s_remquo.S: Correctly set sign of remainder.
+ * sysdeps/libm-i387/s_remquof.S: Likewise.
+ * sysdeps/libm-i387/s_remquol.S: Likewise.
+ * sysdeps/libm-i387/e_gamma_r.c: New file. Implementation of gamma
+ function according to ISO C.
+ * sysdeps/libm-i387/e_gammaf_r.c: New file.
+ * sysdeps/libm-i387/e_gammal_r.c: New file.
+ * sysdeps/libm-i387/e_lgamma_r.c: Don't let optimize compile the
+ generation of exceptions away.
+ * sysdeps/libm-i387/e_lgammaf_r.c: Likewise.
+ * sysdeps/libm-i387/k_standard.c: Correct return value for infinity
+ points of gamma function when not SVID mode.
+ * sysdeps/libm-i387/s_rinttoll.c: Renamed to...
+ * sysdeps/libm-i387/s_llrint.c: ...this.
+ * sysdeps/libm-i387/s_rinttol.c: Renamed to...
+ * sysdeps/libm-i387/s_lrint.c: ...this.
+ * sysdeps/libm-i387/s_roundtoll.c: Renamed to...
+ * sysdeps/libm-i387/s_llround.c: ...this.
+ * sysdeps/libm-i387/s_roundtol.c: Renamed to...
+ * sysdeps/libm-i387/s_lround.c: ..this.
+ * sysdeps/libm-i387/s_scalbn.c: Change second parameter according to
+ ISO C.
+ * sysdeps/libm-i387/s_scalbnf.c: Likewise.
+ * sysdeps/libm-i387/s_scalbnl.c: Likewise.
+ * sysdeps/libm-i387/w_gamma.c: Call __ieee754_gamma_r if library
+ mode is not _SVID_.
+ * sysdeps/libm-i387/w_gammaf.c: Likewise.
+ * sysdeps/libm-i387/w_gammal.c: Likewise.
+ * sysdeps/m68k/fpu/__math.h: Rename __rinttol to __lrint and
+ rinttol to lrint.
+ * sysdeps/m68k/fpu/s_rinttol.c: Renamed to...
+ * sysdeps/m68k/fpu/s_lrint.c: ...this.
+ * sysdeps/m68k/fpu/s_rinttoll.c: Renamed to...
+ * sysdeps/m68k/fpu/s_llrint.c: ...this.
+
+ * md5-crypt/Makefile: Link md5test program with md5.o.
+
+ * stdio-common/temptest.c: Don't use __stdio_gen_tempname which
+ is not exported by the libc.so.
+
+ * stdio-common/vfscanf.c: Correct scanning of strings after last
+ change.
+
+ * sysdeps/unix/sysv/linux/i386/sysdep.S: Use .comm to define errno.
+
+1997-06-19 07:37 H.J. Lu <hjl@gnu.ai.mit.edu>
+
+ * time/tzfile.c (__tzfile_read): Store getc () return in int.
+
+1997-06-13 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * argp/argp-parse.c (argp_version_parser): Include `(PROGRAM ERROR)' in
+ the no-version error text to indicate that something's fucked.
+ [!_] (N_): New macro.
+ (argp_default_options, argp_version_options): Wrap doc strings in N_().
+
+1997-06-12 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * argp/argp-parse.c (parser_parse_opt): Detect and report unhandled
+ options here.
+ (parser_parse_arg): Handle ARGP_KEY_ARGS here.
+ Adjust NEXT pointer back if we fail to parse anything.
+ (parser_parse_next): Simplify arg code. Leave state NEXT frobbing
+ to parser_parse_arg.
+
+1997-06-11 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * argp/argp.h (ARGP_KEY_ARGS, ARGP_KEY_FINI): New macros.
+ * argp/argp-parse.c (parser_finalize): Do another pass over the
+ parsers with ARGP_KEY_FINI.
+
+1997-06-18 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * string/Makefile (routines): Add argz-replace.
+
+1997-06-16 00:16 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * manual/string.texi (Argz Functions): Document argz_replace.
+
+1997-06-12 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * string/argz.h (__argz_replace, argz_replace): New declarations.
+ * string/argz-replace.c: New file.
+
+1997-06-11 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * manual/argp.texi (Argp Special Keys): Document ARGP_KEY_ARGS.
+
+1997-06-16 23:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makeconfig (libc-map): Remove definition.
+ * Makerules (libc-map): Define it here, using the full name.
+ (load-map-file): Remove case for empty $(..).
+ ($(common-objpfx)libc.so): Revert last change.
+
+1997-06-17 22:18 Mark Kettenis <kettenis@phys.uva.nl>
+
+ * login/programs/utmpd.c (main): Improve signal handling.
+
+ * login/programs/request.c (do_setutent, do_updwtmp):
+ Allow arbitrary length filenames.
+ * login/programs/utmpd.h (setutent_request, updwtmp_request):
+ Get rid of fixed length file field.
+ * login/utmp_daemon.c (do_setutent, do_updwtmp):
+ Allow arbitrary length filenames.
+
+ * login/programs/request.c (do_pututline):
+ Don't fail if connection->position is -1 on entry.
+
+1997-06-15 16:32 Mark Kettenis <kettenis@phys.uva.nl>
+
+ * login/utmp_file.c (updwtmp_file): Use the same method for
+ appending an entry as in pututline_file.
+
+1997-06-11 18:59 Mark Kettenis <kettenis@phys.uva.nl>
+
+ * login/utmp_file.c (getutent_r_file):
+ Use read lock instead of write lock.
+ (getutline_r_file, internal_getut_r): Lock utmp file.
+ (updwtmp_file): Use fcntl to lock file instead of flock.
+
+1997-06-18 00:11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * stdio-common/vfscanf.c (inchar, ungetc): Don't count EOF as
+ character read in/put back.
+ * stdio-common/tstscanf.c: Add test case for this.
+
+1997-06-17 22:17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * libc.map: Add more symbols.
+
+1997-06-18 12:01 Ulrich Drepper <drepper@cygnus.com>
+
+ * manual/Makefile (install): Make sure `dir' file exists if we use
+ install-info.
+
+1997-06-17 19:32 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * manual/Makefile (info): Depend on dir-add.info.
+
+1997-06-17 17:19 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * elf/ldd.bash.in: Fix spacing in message.
+
+1997-06-17 14:28 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * elf/do-rel.h (elf_dynamic_do_rel): Always use version
+ information if available.
+
+1997-06-17 11:34 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sunrpc/Makefile ($(rpcsvc:%.x=$(objpfx)rpcsvc/%.h)): Make
+ command non-empty to force make to recheck modification time.
+ ($(rpcsvc:%.x=$(objpfx)x%.c)): Likewise.
+
+1997-06-17 00:26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/stub/e_acoshl.c: Set errno to ENOSYS.
+ * sysdeps/stub/e_acosl.c: Likewise.
+ * sysdeps/stub/e_asinl.c: Likewise.
+ * sysdeps/stub/e_atan2l.c: Likewise.
+ * sysdeps/stub/e_expl.c: Likewise.
+ * sysdeps/stub/e_fmodl.c: Likewise.
+ * sysdeps/stub/e_j0l.c: Likewise.
+ * sysdeps/stub/e_j1l.c: Likewise.
+ * sysdeps/stub/e_jnl.c: Likewise.
+ * sysdeps/stub/e_lgammal_r.c: Likewise.
+ * sysdeps/stub/e_log10l.c: Likewise.
+ * sysdeps/stub/e_logl.c: Likewise.
+ * sysdeps/stub/e_powl.c: Likewise.
+ * sysdeps/stub/e_rem_pio2l.c: Likewise.
+ * sysdeps/stub/e_sqrtl.c: Likewise.
+ * sysdeps/stub/k_cosl.c: Likewise.
+ * sysdeps/stub/k_rem_pio2l.c: Likewise.
+ * sysdeps/stub/k_sinl.c: Likewise.
+ * sysdeps/stub/k_tanl.c: Likewise.
+ * sysdeps/stub/s_atanl.c: Likewise.
+ * sysdeps/stub/s_erfl.c: Likewise.
+ * sysdeps/stub/s_exp2.c: Likewise.
+ * sysdeps/stub/s_exp2f.c: Likewise.
+ * sysdeps/stub/s_exp2l.c: Likewise.
+ * sysdeps/stub/s_expm1l.c: Likewise.
+ * sysdeps/stub/s_log1pl.c: Likewise.
+ * sysdeps/stub/s_log2l.c: Likewise.
+
+1997-06-18 11:46 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/libm-ieee754/w_gamma.c: If _LIB_VERSION is _SVID_ compute
+ result as before last change.
+ * sysdeps/libm-ieee754/w_gammaf.c: Likewise.
+ * sysdeps/libm-ieee754/w_gammal.c: Likewise.
+
+1997-06-16 23:37 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/libm-ieee754/s_remquo.c: Fix off-by-one when computing
+ quotient.
+ * sysdeps/libm-ieee754/s_remquof.c: Likewise.
+ * sysdeps/libm-ieee754/s_remquol.c: Likewise.
+
+ * sysdeps/m68k/fpu/s_remquo.c: Remove FIXME and special case for
+ quotient.
+
+ * sysdeps/libm-ieee754/w_gamma.c: Add missing call to exp
+ function. Don't use global signgam.
+ * sysdeps/libm-ieee754/w_gammaf.c: Likewise.
+ * sysdeps/libm-ieee754/w_gammal.c: Likewise.
+
+ * math/Makefile (libm-calls): Remove w_gamma_r.
+ * sysdeps/libm-ieee754/w_gamma_r.c: Remove file.
+ * sysdeps/libm-ieee754/w_gammaf_r.c: Remove file.
+ * sysdeps/libm-ieee754/w_gammal_r.c: Remove file.
+
+ * math/libm-test.c (atanh_test): Declare x only if needed.
+ (signbit_test): Fix typo.
+ (gamma_test): Check whether function is implemented. Add
+ epsilons.
+ (lgamma_test): Likewise.
+ (fmod_test): Add epsilons.
+ (exp2_test): Use right function for existence test.
+
+1997-06-07 09:20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/powerpc/Dist: Add fenv_const.c.
+ * sysdeps/unix/sysv/linux/Dist: Add net/if_slip.h.
+ * sysdeps/unix/sysv/linux/powerpc/Dist: Add init-first.h and
+ syscall.h.
+ * sysdeps/unix/sysv/linux/sparc/Dist: Add init-first.h.
+ * string/Makefile (distribute): Add tst-svc.expect.
+ * nis/Makefile (distribute): Add nis_intern.h and Banner.
+ * elf/Makefile (distribute): Add dl-hash.h.
+ * Rules (subdir_echo-distinfo): Add headers from $(distribute).
+
+ * login/Makefile (others): Add utmpdump.
+ * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
+ net/if_slip.h.
+
+ * manual/Makefile (dir-add.texi): Also look in indirectly included
+ files.
+
+1997-06-16 23:15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/configure.in: Remove commands to
+ generate stdio_lim.h.
+ * sysdeps/unix/sysv/linux/mk-stdiolim.c: Remove.
+ * sysdeps/unix/sysv/linux/Makefile: Add rules to generate
+ stdio_lim.h here.
+ (common-generated): Add generated files.
+ (inhibit-stdio_lim): Define.
+ * sysdeps/posix/Makefile [$(inhibit-stdio_lim)=yes]: Disable rules
+ to generate stdio_lim.h.
+
+ * sysdeps/unix/sysv/linux/Makefile: Suppress inclusion of
+ dependecy files if no_deps is set.
+ ($(objpfx)syscall-%.d): Add header file as target to dependency
+ generation.
+
+1997-06-14 19:19 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/arm/Dist: New file.
+
+1997-06-14 17:59 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * extra-lib.mk (others): Depend on versioned shared library, not
+ the unversioned one.
+ * Makerules (build-shlib): Don't make the version link here.
+ ($(common-objpfx)libc.so$(libc.so-version)): New rule for libc
+ version link.
+
+1997-06-16 03:07 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/libm-ieee754/k_standard.c: Undo change of Tue Aug 6
+ 01:13:56 1996.
+
1997-06-16 00:54 Ulrich Drepper <drepper@cygnus.com>
* libc.map: Add more symbols.
@@ -834,7 +1151,8 @@
1997-05-27 14:16 Miles Bader <miles@gnu.ai.mit.edu>
- * argp-help.c (argp_args_usage): Supply correct argp to filter_doc.
+ * argp/argp-help.c (argp_args_usage): Supply correct argp to
+ filter_doc.
1997-05-27 17:51 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
@@ -1199,7 +1517,7 @@
1997-05-21 17:53 Miles Bader <miles@gnu.ai.mit.edu>
- * argp-help.c (hol_add_cluster): Initialize CL->depth.
+ * argp/argp-help.c (hol_add_cluster): Initialize CL->depth.
1997-05-24 03:51 Ulrich Drepper <drepper@cygnus.com>
@@ -1401,10 +1719,10 @@
1997-05-20 14:01 Miles Bader <miles@gnu.ai.mit.edu>
- * argp-help.c (_help): Supply STATE to argp_args_usage.
+ * argp/argp-help.c (_help): Supply STATE to argp_args_usage.
(argp_args_usage): Add filtering of the args doc string.
(comma): Print cluster headers for the first entry too.
- * argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro.
+ * argp/argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro.
1997-05-21 02:49 Ulrich Drepper <drepper@cygnus.com>
@@ -2602,7 +2920,7 @@
* rellns-sh: Rewrite to work also in presence of symlinks.
- * arpg/argp-fmtstream.c: Add casts to prevent warnings.
+ * argp/argp-fmtstream.c: Add casts to prevent warnings.
* argp/argp-fmtstream.h: Likewise.
* argp/argp-help.c: Likewise.
@@ -5205,8 +5523,8 @@
1997-02-21 10:41 Miles Bader <miles@gnu.ai.mit.edu>
- * argp.h (OPTION_NO_USAGE): New macro.
- * argp-help.c (usage_long_opt, usage_argful_short_opt,
+ * argp/argp.h (OPTION_NO_USAGE): New macro.
+ * argp/argp-help.c (usage_long_opt, usage_argful_short_opt,
add_argless_short_opt): Implement OPTION_NO_USAGE.
1997-02-20 16:41 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
@@ -5215,10 +5533,10 @@
1997-02-20 15:56 Miles Bader <miles@gnu.ai.mit.edu>
- * argp-fmtstream.c (__argp_fmtstream_update): Account for case
+ * argp/argp-fmtstream.c (__argp_fmtstream_update): Account for case
where NEXTLINE points one past the end of the active buffer.
- * argp-help.c <stddef.h>: New include.
+ * argp/argp-help.c <stddef.h>: New include.
(__argp_failure): Only exit if STATE says it's ok.
(print_header, hol_entry_help): Use UPARAMS fields rather than
constants.
@@ -5241,12 +5559,12 @@
(fill_in_uparams): New function.
(__argp_failure, __argp_error, __argp_state_help): Make STATE
parameter const.
- * argp.h (argp_state_help, __argp_state_help, argp_usage,
+ * argp/argp.h (argp_state_help, __argp_state_help, argp_usage,
__argp_usage, argp_error, __argp_error, argp_failure,
__argp_failure): Make STATE parameter const.
(ARGP_KEY_HELP_DUP_ARGS_NOTE): New macro.
- * argp.h (argp_program_bug_address): Make const.
+ * argp/argp.h (argp_program_bug_address): Make const.
1997-02-20 19:20 Ulrich Drepper <drepper@cygnus.com>
@@ -5283,12 +5601,12 @@
1997-02-19 18:48 Miles Bader <miles@gnu.ai.mit.edu>
- * argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME.
+ * argp/argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME.
(parser_init): Use the basename for PARSER->state.name.
- * argp-help.c (__argp_error, __argp_failure, __argp_state_help):
+ * argp/argp-help.c (__argp_error, __argp_failure, __argp_state_help):
Use PROGRAM_INVOCATION_SHORT_NAME instead of PROGRAM_INVOCATION_NAME.
- * argp-parse.c (parser_init): Set PARSER->state.flags.
+ * argp/argp-parse.c (parser_init): Set PARSER->state.flags.
Make check whether PARSER has the prog name in argv[0] at the
proper place.
diff --git a/Makeconfig b/Makeconfig
index 73cae78..fbff6b3 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 4acf64c..6430167 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 45417e0..89050be 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 edc5516..018a978 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 61ed835..2305590 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 33d57ed..489a565 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 12d38c9..f5b2568 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 66f1359..766e62c 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 809c271..32a9405 100644
--- a/elf/ldd.bash.in
+++ b/elf/ldd.bash.in
@@ -65,7 +65,7 @@ Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
verbose=yes
shift ;;
--v | --ve | --ver)
- echo >&2 $"ldd: option \`" $1 $"' is ambiguous"
+ echo >&2 $"ldd: option \`$1' is ambiguous"
exit 1 ;;
--) # Stop option processing.
shift; break ;;
diff --git a/extra-lib.mk b/extra-lib.mk
index e608894..f2efb4b 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 a14179b..c38480e 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 d390a8d..6a680c1 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 29f67f6..c5100b8 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 916dd6c..e4f9a9e 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 d2c12e6..5e6bfa1 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 ca310a2..3c8d626 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 8fbc33c..ef92a14 100644
--- a/login/programs/utmpd.h
+++ b/login/programs/utmpd.h
@@ -22,7 +22,6 @@
/* This is an *internal* header. */
-#include <limits.h>
#include <stddef.h>
#include <utmp.h>
@@ -68,7 +67,7 @@ typedef struct
{
request_header header;
/* File to use. */
- char file[_POSIX_PATH_MAX + 1];
+ char file[0];
} setutent_request;
typedef struct
@@ -100,10 +99,10 @@ typedef struct
typedef struct
{
request_header header;
- /* File to use. */
- char file[_POSIX_PATH_MAX + 1];
/* Entry to write. */
struct utmp utmp;
+ /* File to use. */
+ char file[0];
} updwtmp_request;
diff --git a/login/utmp_daemon.c b/login/utmp_daemon.c
index 705c8b3..e0a20e9 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 2026070..51b3322 100644
--- a/login/utmp_file.c
+++ b/login/utmp_file.c
@@ -24,10 +24,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <utmp.h>
-#include <sys/file.h>
-#include <sys/stat.h>
#include "utmp-private.h"
@@ -116,7 +115,7 @@ endutent_file (void)
static int
getutent_r_file (struct utmp *buffer, struct utmp **result)
{
- int nbytes;
+ ssize_t nbytes;
struct flock fl; /* Information struct for locking. */
/* Open utmp file if not already done. */
@@ -136,7 +135,7 @@ getutent_r_file (struct utmp *buffer, struct utmp **result)
/* Try to get the lock. */
memset (&fl, '\0', sizeof (struct flock));
- fl.l_type = F_WRLCK;
+ fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fcntl (file_fd, F_SETLKW, &fl);
@@ -170,12 +169,20 @@ static int
getutline_r_file (const struct utmp *line, struct utmp *buffer,
struct utmp **result)
{
+ struct flock fl;
+
if (file_fd < 0 || file_offset == -1l)
{
*result = NULL;
return -1;
}
+ /* Try to get the lock. */
+ memset (&fl, '\0', sizeof (struct flock));
+ fl.l_type = F_RDLCK;
+ fl.l_whence = SEEK_SET;
+ fcntl (file_fd, F_SETLKW, &fl);
+
while (1)
{
/* Read the next entry. */
@@ -185,7 +192,7 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
__set_errno (ESRCH);
file_offset = -1l;
*result = NULL;
- return -1;
+ goto unlock_return;
}
file_offset += sizeof (struct utmp);
@@ -203,7 +210,12 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
memcpy (buffer, &last_entry, sizeof (struct utmp));
*result = buffer;
- return 0;
+unlock_return:
+ /* And unlock the file. */
+ fl.l_type = F_UNLCK;
+ fcntl (file_fd, F_SETLKW, &fl);
+
+ return ((result == NULL) ? -1 : 0);
}
@@ -237,6 +249,15 @@ proc_utmp_eq (const struct utmp *entry, const struct utmp *match)
static int
internal_getut_r (const struct utmp *id, struct utmp *buffer)
{
+ int result = -1;
+ struct flock fl;
+
+ /* Try to get the lock. */
+ memset (&fl, '\0', sizeof (struct flock));
+ fl.l_type = F_RDLCK;
+ fl.l_whence = SEEK_SET;
+ fcntl (file_fd, F_SETLKW, &fl);
+
#if _HAVE_UT_TYPE - 0
if (id->ut_type == RUN_LVL || id->ut_type == BOOT_TIME
|| id->ut_type == OLD_TIME || id->ut_type == NEW_TIME)
@@ -252,7 +273,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
{
__set_errno (ESRCH);
file_offset = -1l;
- return -1;
+ goto unlock_return;
}
file_offset += sizeof (struct utmp);
@@ -274,7 +295,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
{
__set_errno (ESRCH);
file_offset = -1l;
- return -1;
+ goto unlock_return;
}
file_offset += sizeof (struct utmp);
@@ -283,7 +304,14 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
}
}
- return 0;
+ result = 0;
+
+unlock_return:
+ /* And unlock the file. */
+ fl.l_type = F_UNLCK;
+ fcntl (file_fd, F_SETLKW, &fl);
+
+ return result;
}
@@ -401,47 +429,50 @@ static int
updwtmp_file (const char *file, const struct utmp *utmp)
{
int result = -1;
- struct stat st;
- ssize_t nbytes;
+ struct flock fl;
+ off_t offset;
int fd;
/* Open WTMP file. */
- fd = __open (file, O_WRONLY | O_APPEND);
+ fd = open (file, O_WRONLY);
if (fd < 0)
return -1;
- /* Try to lock the file. */
- if (__flock (fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS)
+ /* 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 80ab3dc..8362293 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 53a405e..f28a87a 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.
@@ -460,6 +460,35 @@ 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
There are no more command line arguments at all.
@@ -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 0000000..f5920b1
--- /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<Return>" visits the Emacs topic, etc.
+
+ In Emacs, you can click mouse button 2 on a menu item or cross reference
+ to select it.
+
+* Menu:
diff --git a/manual/string.texi b/manual/string.texi
index cb9f541..46101de 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 8e42adc..cce8561 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 fbbcad6..bd4506b 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 be75383..5bf968f 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 5229a02..aa37f71 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 0aac420..735b595 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 aae6e8c..6e88eb6 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 770f3b8..23a7144 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 7186817..35ea4dc 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 eb2f30d..d0ff6c8 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 3738e44..0b24b8b 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 b924dfc..d2629e6 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 0000000..4d658f4
--- /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 <miles@gnu.ai.mit.edu>
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <stdlib.h>
+#include <argz.h>
+
+/* Append BUF, of length BUF_LEN to *TO, of length *TO_LEN, reallocating and
+ updating *TO & *TO_LEN appropriately. If an allocation error occurs,
+ *TO's old value is freed, and *TO is set to 0. */
+static void
+str_append (char **to, size_t *to_len, const char *buf, const size_t buf_len)
+{
+ size_t new_len = *to_len + buf_len;
+ char *new_to = realloc (*to, new_len + 1);
+
+ if (new_to)
+ {
+ memcpy (new_to + *to_len, buf, buf_len);
+ new_to[new_len] = '\0';
+ *to = new_to;
+ *to_len = new_len;
+ }
+ else
+ {
+ free (*to);
+ *to = 0;
+ }
+}
+
+/* Replace any occurances of the string STR in ARGZ with WITH, reallocating
+ ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
+ incremented by number of replacements performed. */
+error_t
+__argz_replace (char **argz, size_t *argz_len, const char *str, const char *with,
+ unsigned *replace_count)
+{
+ error_t err = 0;
+
+ if (str && *str)
+ {
+ char *arg = 0;
+ char *src = *argz;
+ size_t src_len = *argz_len;
+ char *dst = 0;
+ size_t dst_len = 0;
+ int delayed_copy = 1; /* True while we've avoided copying anything. */
+ size_t str_len = strlen (str), with_len = strlen (with);
+
+ while (!err && (arg = argz_next (src, src_len, arg)))
+ {
+ char *match = strstr (arg, str);
+ if (match)
+ {
+ char *from = match + str_len;
+ size_t to_len = match - arg;
+ char *to = strndup (arg, to_len);
+
+ while (to && from)
+ {
+ str_append (&to, &to_len, with, with_len);
+ if (to)
+ {
+ match = strstr (from, str);
+ if (match)
+ {
+ str_append (&to, &to_len, from, match - from);
+ from = match + str_len;
+ }
+ else
+ {
+ str_append (&to, &to_len, from, strlen (from));
+ from = 0;
+ }
+ }
+ }
+
+ if (to)
+ {
+ if (delayed_copy)
+ /* We avoided copying SRC to DST until we found a match;
+ now that we've done so, copy everything from the start
+ of SRC. */
+ {
+ if (arg > src)
+ err = argz_append (&dst, &dst_len, src, (arg - src));
+ delayed_copy = 0;
+ }
+ if (! err)
+ err = argz_add (&dst, &dst_len, to);
+ free (to);
+ }
+ else
+ err = ENOMEM;
+
+ if (replace_count)
+ (*replace_count)++;
+ }
+ else if (! delayed_copy)
+ err = argz_add (&dst, &dst_len, arg);
+ }
+
+ if (! err)
+ {
+ if (! delayed_copy)
+ /* We never found any instances of str. */
+ {
+ if (src)
+ free (src);
+ *argz = dst;
+ *argz_len = dst_len;
+ }
+ }
+ else if (dst_len > 0)
+ free (dst);
+ }
+
+ return err;
+}
+weak_alias (__argz_replace, argz_replace)
diff --git a/string/argz.h b/string/argz.h
index e17b742..0126235 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 ee66e53..ad21cb2 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 e4db3dc..b14b52d 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 7885afe..f4a22c0 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 427a3b9..790f1c1 100644
--- a/sysdeps/libm-i387/e_scalb.S
+++ b/sysdeps/libm-i387/e_scalb.S
@@ -1,16 +1,94 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
*/
#include <machine/asm.h>
RCSID("$NetBSD: e_scalb.S,v 1.4 1995/05/08 23:49:52 jtc Exp $")
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+ .double 0.0
+nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+ .byte 0, 0, 0, 0, 0, 0, 0, 0x80
+ .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+ ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
ENTRY(__ieee754_scalb)
fldl 12(%esp)
+ fxam
+ fnstsw
fldl 4(%esp)
+ andl $0x4700, %eax
+ cmpl $0x0700, %eax
+ je 1f
+ andl $0x4500, %eax
+ cmpl $0x0100, %eax
+ je 2f
+ fxam
+ fnstsw
+ andl $0x4500, %eax
+ cmpl $0x0100, %eax
+ je 2f
+ fld %st(1)
+ frndint
+ fcomp %st(2)
+ fnstsw
+ sahf
+ jne 2f
fscale
fstp %st(1)
ret
+
+ /* y is -inf */
+1: fxam
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ fnstsw
+ movl 8(%esp), %edx
+ shrl $5, %eax
+ fstp %st(1)
+ andl $0x80000000, %edx
+ andl $8, %eax
+ fstp %st(1)
+ shrl $27, %edx
+ addl %edx, %eax
+ fldl MOX(zero_nan, %eax, 1)
+ ret
+
+ /* The result is NaN, but we must not raise an exception.
+ So use a variable. */
+2: fstp %st
+ fstp %st
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ fldl MO(nan)
+ ret
END(__ieee754_scalb)
diff --git a/sysdeps/libm-i387/e_scalbf.S b/sysdeps/libm-i387/e_scalbf.S
index 4c62134..c869da9 100644
--- a/sysdeps/libm-i387/e_scalbf.S
+++ b/sysdeps/libm-i387/e_scalbf.S
@@ -2,16 +2,95 @@
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
* Adapted for float type by Ulrich Drepper <drepper@cygnus.com>.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+ .double 0.0
+nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+ .byte 0, 0, 0, 0, 0, 0, 0, 0x80
+ .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+ ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
+ .text
ENTRY(__ieee754_scalbf)
flds 8(%esp)
+ fxam
+ fnstsw
flds 4(%esp)
+ andl $0x4700, %eax
+ cmpl $0x0700, %eax
+ je 1f
+ andl $0x4500, %eax
+ cmpl $0x0100, %eax
+ je 2f
+ fxam
+ fnstsw
+ andl $0x4500, %eax
+ cmpl $0x0100, %eax
+ je 2f
+ fld %st(1)
+ frndint
+ fcomp %st(2)
+ fnstsw
+ sahf
+ jne 2f
fscale
fstp %st(1)
ret
+
+ /* y is -inf */
+1: fxam
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ fnstsw
+ movl 4(%esp), %edx
+ shrl $5, %eax
+ fstp %st(1)
+ andl $0x80000000, %edx
+ andl $8, %eax
+ fstp %st(1)
+ shrl $27, %edx
+ addl %edx, %eax
+ fldl MOX(zero_nan, %eax, 1)
+ ret
+
+ /* The result is NaN, but we must not raise an exception.
+ So use a variable. */
+2: fstp %st
+ fstp %st
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ fldl MO(nan)
+ ret
END(__ieee754_scalbf)
diff --git a/sysdeps/libm-i387/e_scalbl.S b/sysdeps/libm-i387/e_scalbl.S
index 3b746ad..e272614 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 <drepper@cygnus.com>.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+ .double 0.0
+nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+ .byte 0, 0, 0, 0, 0, 0, 0, 0x80
+ .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+ ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
ENTRY(__ieee754_scalbl)
fldt 16(%esp)
+ fxam
+ fnstsw
fldt 4(%esp)
+ andl $0x4700, %eax
+ cmpl $0x0700, %eax
+ je 1f
+ andl $0x4500, %eax
+ cmpl $0x0100, %eax
+ je 2f
+ fxam
+ fnstsw
+ andl $0x4500, %eax
+ cmpl $0x0100, %eax
+ je 2f
+ fld %st(1)
+ frndint
+ fcomp %st(2)
+ fnstsw
+ sahf
+ jne 2f
fscale
fstp %st(1)
ret
+
+ /* y is -inf */
+1: fxam
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ fnstsw
+ movl 12(%esp), %edx
+ shrl $5, %eax
+ fstp %st(1)
+ andl $0x8000, %edx
+ andl $8, %eax
+ fstp %st(1)
+ shrl $11, %edx
+ addl %edx, %eax
+ fldl MOX(zero_nan, %eax, 1)
+ ret
+
+ /* The result is NaN, but we must not raise an exception.
+ So use a variable. */
+2: fstp %st
+ fstp %st
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ fldl MO(nan)
+ ret
END(__ieee754_scalbl)
diff --git a/sysdeps/libm-i387/s_asinh.S b/sysdeps/libm-i387/s_asinh.S
index 45153fe..a4c52cb 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 7e5176c..6369e19 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 f764381..62e29bc 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 01b8afa..6c12558 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 6a94326..b08a32f 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 2422a41..adc88aa 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_rinttoll.S b/sysdeps/libm-i387/s_llrint.S
index 9939505..cfb8e86 100644
--- a/sysdeps/libm-i387/s_rinttoll.S
+++ b/sysdeps/libm-i387/s_llrint.S
@@ -22,12 +22,12 @@
#include <sysdep.h>
.text
-ENTRY(__rinttoll)
+ENTRY(__llrint)
fldt 4(%esp)
subl $8, %esp
fistpll (%esp)
popl %eax
popl %edx
ret
-END(__rinttoll)
-weak_alias (__rinttoll, rinttoll)
+END(__llrint)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/libm-i387/s_rinttol.S b/sysdeps/libm-i387/s_lrint.S
index 22a3e46..1924145 100644
--- a/sysdeps/libm-i387/s_rinttol.S
+++ b/sysdeps/libm-i387/s_lrint.S
@@ -22,11 +22,11 @@
#include <sysdep.h>
.text
-ENTRY(__rinttol)
+ENTRY(__lrint)
fldt 4(%esp)
subl $4, %esp
fistpl (%esp)
popl %eax
ret
-END(__rinttol)
-weak_alias (__rinttol, rinttol)
+END(__lrint)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/libm-i387/s_remquo.S b/sysdeps/libm-i387/s_remquo.S
index a4c5a35..252bf26 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 5695432..144eb30 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 9c91d90..2cbcdf1 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-ieee754/e_gamma_r.c b/sysdeps/libm-ieee754/e_gamma_r.c
new file mode 100644
index 0000000..eb80809
--- /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 <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <math.h>
+#include <math_private.h>
+
+
+double
+__ieee754_gamma_r (double x, int *signgamp)
+{
+ /* We don't have a real gamma implementation now. We'll use lgamma
+ and the exp function. But due to the required boundary
+ conditions we must check some values separately. */
+ int32_t hx;
+ u_int32_t lx;
+
+ EXTRACT_WORDS (hx, lx, x);
+
+ if ((hx & 0x7fffffff | lx) == 0)
+ /* Return value for x == 0 is NaN with invalid exception. */
+ return x / x;
+ if (hx < 0 && (u_int32_t) hx < 0xfff00000 && __rint (x) == x)
+ {
+ /* Return value for integer x < 0 is NaN with invalid exception. */
+ return (x - x) / (x - x);
+ }
+
+ /* XXX FIXME. */
+ return __ieee754_exp (__ieee754_lgamma_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_gammaf_r.c b/sysdeps/libm-ieee754/e_gammaf_r.c
new file mode 100644
index 0000000..bf79ffe
--- /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 <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <math.h>
+#include <math_private.h>
+
+
+float
+__ieee754_gammaf_r (float x, int *signgamp)
+{
+ /* We don't have a real gamma implementation now. We'll use lgamma
+ and the exp function. But due to the required boundary
+ conditions we must check some values separately. */
+ int32_t hx;
+
+ GET_FLOAT_WORD (hx, x);
+
+ if ((hx & 0x7fffffff) == 0)
+ /* Return value for x == 0 is NaN with invalid exception. */
+ return x / x;
+ if (hx < 0 && (u_int32_t) hx < 0xff800000 && __rintf (x) == x)
+ {
+ /* Return value for integer x < 0 is NaN with invalid exception. */
+ return (x - x) / (x - x);
+ }
+
+ /* XXX FIXME. */
+ return __ieee754_expf (__ieee754_lgammaf_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_gammal_r.c b/sysdeps/libm-ieee754/e_gammal_r.c
new file mode 100644
index 0000000..4fd4988
--- /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 <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <math.h>
+#include <math_private.h>
+
+
+long double
+__ieee754_gammal_r (long double x, int *signgamp)
+{
+ /* We don't have a real gamma implementation now. We'll use lgamma
+ and the exp function. But due to the required boundary
+ conditions we must check some values separately. */
+ u_int32_t es, hx, lx;
+
+ GET_LDOUBLE_WORDS (es, hx, lx, x);
+
+ if (((es & 0x7fff) | hx | lx) == 0)
+ /* Return value for x == 0 is NaN with invalid exception. */
+ return x / x;
+ if ((hx & 0x8000) != 0 && (hx & 0x7fff) != 0x7fff && __rintl (x) == x)
+ {
+ /* Return value for integer x < 0 is NaN with invalid exception. */
+ return (x - x) / (x - x);
+ }
+
+ /* XXX FIXME. */
+ return __ieee754_expl (__ieee754_lgammal_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_lgamma_r.c b/sysdeps/libm-ieee754/e_lgamma_r.c
index 1be4dda..92e9556 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<zero) *signgamp = -1;
x = -x;
@@ -275,7 +277,7 @@ static double zero= 0.00000000000000000000e+00;
p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
p = z*p1-(tt-w*(p2+y*p3));
r += (tf + p); break;
- case 2:
+ case 2:
p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
r += (-0.5*y + p1/p2);
@@ -304,7 +306,7 @@ static double zero= 0.00000000000000000000e+00;
y = z*z;
w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
r = (x-half)*(t-one)+w;
- } else
+ } else
/* 2**58 <= x <= inf */
r = x*(__ieee754_log(x)-one);
if(hx<0) r = nadj - r;
diff --git a/sysdeps/libm-ieee754/e_lgammaf_r.c b/sysdeps/libm-ieee754/e_lgammaf_r.c
index 1d0122d..f744d53 100644
--- a/sysdeps/libm-ieee754/e_lgammaf_r.c
+++ b/sysdeps/libm-ieee754/e_lgammaf_r.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.
* ====================================================
*/
@@ -21,9 +21,9 @@ static char rcsid[] = "$NetBSD: e_lgammaf_r.c,v 1.3 1995/05/10 20:45:47 jtc Exp
#include "math_private.h"
#ifdef __STDC__
-static const float
+static const float
#else
-static float
+static float
#endif
two23= 8.3886080000e+06, /* 0x4b000000 */
half= 5.0000000000e-01, /* 0x3f000000 */
@@ -136,9 +136,9 @@ static float zero= 0.0000000000e+00;
}
switch (n) {
case 0: y = __kernel_sinf(pi*y,zero,0); break;
- case 1:
+ case 1:
case 2: y = __kernel_cosf(pi*((float)0.5-y),zero); break;
- case 3:
+ case 3:
case 4: y = __kernel_sinf(pi*(one-y),zero,0); break;
case 5:
case 6: y = -__kernel_cosf(pi*(y-(float)1.5),zero); break;
@@ -162,9 +162,11 @@ static float zero= 0.0000000000e+00;
/* purge off +-inf, NaN, +-0, and negative arguments */
*signgamp = 1;
+ if ((unsigned int)hx==0xff800000)
+ return x-x;
ix = hx&0x7fffffff;
if(ix>=0x7f800000) return x*x;
- if(ix==0) return one/zero;
+ if(ix==0) return one/fabsf(x);
if(ix<0x1c800000) { /* |x|<2**-70, return -log(|x|) */
if(hx<0) {
*signgamp = -1;
@@ -173,9 +175,9 @@ static float zero= 0.0000000000e+00;
}
if(hx<0) {
if(ix>=0x4b000000) /* |x|>=2**23, must be -integer */
- return one/zero;
+ return x/zero;
t = sin_pif(x);
- if(t==zero) return one/zero; /* -integer */
+ if(t==zero) return one/fabsf(t); /* -integer */
nadj = __ieee754_logf(pi/fabsf(t*x));
if(t<zero) *signgamp = -1;
x = -x;
@@ -211,7 +213,7 @@ static float zero= 0.0000000000e+00;
p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
p = z*p1-(tt-w*(p2+y*p3));
r += (tf + p); break;
- case 2:
+ case 2:
p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
r += (-(float)0.5*y + p1/p2);
@@ -240,7 +242,7 @@ static float zero= 0.0000000000e+00;
y = z*z;
w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
r = (x-half)*(t-one)+w;
- } else
+ } else
/* 2**58 <= x <= inf */
r = x*(__ieee754_logf(x)-one);
if(hx<0) r = nadj - r;
diff --git a/sysdeps/libm-ieee754/s_rinttoll.c b/sysdeps/libm-ieee754/s_llrint.c
index b2fccd1..faae106 100644
--- a/sysdeps/libm-ieee754/s_rinttoll.c
+++ b/sysdeps/libm-ieee754/s_llrint.c
@@ -33,7 +33,7 @@ static long double two52[2] =
long long int
-__rinttoll (long double x)
+__llrint (long double x)
{
int32_t j0,sx;
u_int32_t i0, i1, i;
@@ -141,7 +141,7 @@ static long double two63[2] =
long long int
-__rinttoll (long double x)
+__llrint (long double x)
{
int32_t se,j0,sx;
u_int32_t i0, i1, i;
@@ -239,4 +239,4 @@ __rinttoll (long double x)
}
#endif
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/libm-ieee754/s_roundtoll.c b/sysdeps/libm-ieee754/s_llround.c
index 4916723..aee0e31 100644
--- a/sysdeps/libm-ieee754/s_roundtoll.c
+++ b/sysdeps/libm-ieee754/s_llround.c
@@ -27,7 +27,7 @@
/* The `long double' is in fact the IEEE `double' type. */
long long int
-__roundtoll (long double x)
+__llround (long double x)
{
int32_t j0;
u_int32_t i1, i0;
@@ -103,7 +103,7 @@ __roundtoll (long double x)
}
#else
long long int
-__roundtoll (long double x)
+__llround (long double x)
{
int32_t j0;
u_int32_t se, i1, i0;
@@ -176,4 +176,4 @@ __roundtoll (long double x)
return se & 0x8000 ? -result : result;
}
#endif
-weak_alias (__roundtoll, roundtoll)
+weak_alias (__llround, llround)
diff --git a/sysdeps/libm-ieee754/s_rinttol.c b/sysdeps/libm-ieee754/s_lrint.c
index 257bdc7..6779f97 100644
--- a/sysdeps/libm-ieee754/s_rinttol.c
+++ b/sysdeps/libm-ieee754/s_lrint.c
@@ -33,7 +33,7 @@ static long double two52[2] =
long int
-__rinttol (long double x)
+__lrint (long double x)
{
int32_t j0,sx;
u_int32_t i0,i1,i;
@@ -141,7 +141,7 @@ static long double two63[2] =
long int
-__rinttol (long double x)
+__lrint (long double x)
{
int32_t se,j0,sx;
u_int32_t i0,i1,i;
@@ -239,4 +239,4 @@ __rinttol (long double x)
}
#endif
-weak_alias (__rinttol, rinttol)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/libm-ieee754/s_roundtol.c b/sysdeps/libm-ieee754/s_lround.c
index bc0ceae..0f91280 100644
--- a/sysdeps/libm-ieee754/s_roundtol.c
+++ b/sysdeps/libm-ieee754/s_lround.c
@@ -27,7 +27,7 @@
/* The `long double' is in fact the IEEE `double' type. */
long int
-__roundtol (long double x)
+__lround (long double x)
{
int32_t j0;
u_int32_t i1, i0;
@@ -101,7 +101,7 @@ __roundtol (long double x)
}
#else
long int
-__roundtol (long double x)
+__lround (long double x)
{
int32_t j0;
u_int32_t se, i1, i0;
@@ -174,4 +174,4 @@ __roundtol (long double x)
return se & 0x8000 ? -result : result;
}
#endif
-weak_alias (__roundtol, roundtol)
+weak_alias (__lround, lround)
diff --git a/sysdeps/libm-ieee754/s_remquo.c b/sysdeps/libm-ieee754/s_remquo.c
index f0a3213..39f6cea 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 6fa02e4..b3870f4 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 9ef4249..b7835e6 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_scalbn.c b/sysdeps/libm-ieee754/s_scalbn.c
index 439b966..0ce0ffd 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 3a83e54..4799c82 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 6825e9c..3e80d85 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 49e4bcf..87a3408 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 f9efc8c..0000000
--- 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 c2d21da..ecde183 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 b15d5e8..0000000
--- 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 f72e2e7..605a416 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 ad6a43a..0000000
--- 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 fd90a2d..bdeaa9e 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_rinttoll.c b/sysdeps/m68k/fpu/s_llrint.c
index bad8082..f5d0d51 100644
--- a/sysdeps/m68k/fpu/s_rinttoll.c
+++ b/sysdeps/m68k/fpu/s_llrint.c
@@ -24,7 +24,7 @@
#include "math_private.h"
long long int
-__rinttoll (long double x)
+__llrint (long double x)
{
int32_t se, sx;
u_int32_t h, l;
@@ -59,4 +59,4 @@ __rinttoll (long double x)
return result;
}
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/m68k/fpu/s_rinttol.c b/sysdeps/m68k/fpu/s_lrint.c
index 7476d78..a704411 100644
--- a/sysdeps/m68k/fpu/s_rinttol.c
+++ b/sysdeps/m68k/fpu/s_lrint.c
@@ -23,9 +23,9 @@
#include <math.h>
long int
-__rinttol (long double x)
+__lrint (long double x)
{
- return __m81_u(__rinttol) (x);
+ return __m81_u(__lrint) (x);
}
-weak_alias (__rinttol, rinttol)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/m68k/fpu/s_remquo.c b/sysdeps/m68k/fpu/s_remquo.c
index 3682ba7..0332ecc 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/posix/Makefile b/sysdeps/posix/Makefile
index 7c1013a..a47f77a 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 ba908dc..ae16c0f 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 6ec9a15..3383c14 100644
--- a/sysdeps/stub/e_acoshl.c
+++ b/sysdeps/stub/e_acoshl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_acoshl (long double x)
{
fputs ("__ieee754_acoshl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_acosl.c b/sysdeps/stub/e_acosl.c
index 5c10b52..af1e626 100644
--- a/sysdeps/stub/e_acosl.c
+++ b/sysdeps/stub/e_acosl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_acosl (long double x)
{
fputs ("__ieee754_acosl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_asinl.c b/sysdeps/stub/e_asinl.c
index f926091..ce8c8cd 100644
--- a/sysdeps/stub/e_asinl.c
+++ b/sysdeps/stub/e_asinl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_asinl (long double x)
{
fputs ("__ieee754_asinl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_atan2l.c b/sysdeps/stub/e_atan2l.c
index 3edfacd..6c500d4 100644
--- a/sysdeps/stub/e_atan2l.c
+++ b/sysdeps/stub/e_atan2l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_atan2l (long double x, long double y)
{
fputs ("__ieee754_atan2l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_expl.c b/sysdeps/stub/e_expl.c
index 246b5ae..4ea8c79 100644
--- a/sysdeps/stub/e_expl.c
+++ b/sysdeps/stub/e_expl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_expl (long double x)
{
fputs ("__ieee754_expl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_fmodl.c b/sysdeps/stub/e_fmodl.c
index b479125..25cc114 100644
--- a/sysdeps/stub/e_fmodl.c
+++ b/sysdeps/stub/e_fmodl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_fmodl (long double x, long double y)
{
fputs ("__ieee754_fmodl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_j0l.c b/sysdeps/stub/e_j0l.c
index c16e8a8..ecb8a8e 100644
--- a/sysdeps/stub/e_j0l.c
+++ b/sysdeps/stub/e_j0l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_j0l (long double x)
{
fputs ("__ieee754_j0l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
@@ -14,6 +16,7 @@ long double
__ieee754_y0l (long double x)
{
fputs ("__ieee754_y0l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_j1l.c b/sysdeps/stub/e_j1l.c
index 0a781e5..2465570 100644
--- a/sysdeps/stub/e_j1l.c
+++ b/sysdeps/stub/e_j1l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_j1l (long double x)
{
fputs ("__ieee754_j1l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
@@ -14,6 +16,7 @@ long double
__ieee754_y1l (long double x)
{
fputs ("__ieee754_y1l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_jnl.c b/sysdeps/stub/e_jnl.c
index 86ff03b..8ced34d 100644
--- a/sysdeps/stub/e_jnl.c
+++ b/sysdeps/stub/e_jnl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_jnl (int n, long double x)
{
fputs ("__ieee754_jnl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
@@ -14,6 +16,7 @@ long double
__ieee754_ynl (int n, long double x)
{
fputs ("__ieee754_ynl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_lgammal_r.c b/sysdeps/stub/e_lgammal_r.c
index 0155118..d7fbbca 100644
--- a/sysdeps/stub/e_lgammal_r.c
+++ b/sysdeps/stub/e_lgammal_r.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_lgammal_r (long double x, int *signgamp)
{
fputs ("__ieee754_lgammal_r not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_log10l.c b/sysdeps/stub/e_log10l.c
index 0e8cdca..a414d04 100644
--- a/sysdeps/stub/e_log10l.c
+++ b/sysdeps/stub/e_log10l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_log10l (long double x)
{
fputs ("__ieee754_log10l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_logl.c b/sysdeps/stub/e_logl.c
index b835754..45248a3 100644
--- a/sysdeps/stub/e_logl.c
+++ b/sysdeps/stub/e_logl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_logl (long double x)
{
fputs ("__ieee754_logl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_powl.c b/sysdeps/stub/e_powl.c
index 2fa7862..611dfb5 100644
--- a/sysdeps/stub/e_powl.c
+++ b/sysdeps/stub/e_powl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_powl (long double x, long double y)
{
fputs ("__ieee754_powl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_rem_pio2l.c b/sysdeps/stub/e_rem_pio2l.c
index 0a9ac79..eec7d79 100644
--- a/sysdeps/stub/e_rem_pio2l.c
+++ b/sysdeps/stub/e_rem_pio2l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_rem_pio2l (long double x, long double *y)
{
fputs ("__ieee754_rem_pio2l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/e_sqrtl.c b/sysdeps/stub/e_sqrtl.c
index 88a7668..c583a27 100644
--- a/sysdeps/stub/e_sqrtl.c
+++ b/sysdeps/stub/e_sqrtl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__ieee754_sqrtl (long double x)
{
fputs ("__ieee754_sqrtl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/k_cosl.c b/sysdeps/stub/k_cosl.c
index 3e6c968..10016ab 100644
--- a/sysdeps/stub/k_cosl.c
+++ b/sysdeps/stub/k_cosl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__kernel_cosl (long double x, long double y)
{
fputs ("__kernel_cosl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/k_rem_pio2l.c b/sysdeps/stub/k_rem_pio2l.c
index a51c445..01bf158 100644
--- a/sysdeps/stub/k_rem_pio2l.c
+++ b/sysdeps/stub/k_rem_pio2l.c
@@ -1,12 +1,14 @@
#include <math.h>
#include <math_private.h>
#include <stdio.h>
+#include <errno.h>
int
__kernel_rem_pio2l (long double *x, long double *y, int e0, int nx, int prec,
const int *ipio2)
{
fputs ("__kernel_rem_pio2l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/k_sinl.c b/sysdeps/stub/k_sinl.c
index 2057bf8..40cf22a 100644
--- a/sysdeps/stub/k_sinl.c
+++ b/sysdeps/stub/k_sinl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__kernel_sinl (long double x, long double y)
{
fputs ("__kernel_sinl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/k_tanl.c b/sysdeps/stub/k_tanl.c
index 713c8cd..95ffc23 100644
--- a/sysdeps/stub/k_tanl.c
+++ b/sysdeps/stub/k_tanl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
long double
__kernel_tanl (long double x, long double y, int iy)
{
fputs ("__kernel_tanl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
diff --git a/sysdeps/stub/s_atanl.c b/sysdeps/stub/s_atanl.c
index 38dd6f5..2957d70 100644
--- a/sysdeps/stub/s_atanl.c
+++ b/sysdeps/stub/s_atanl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 efcf490..7ae25d6 100644
--- a/sysdeps/stub/s_erfl.c
+++ b/sysdeps/stub/s_erfl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 a3d0906..5adda41 100644
--- a/sysdeps/stub/s_exp2.c
+++ b/sysdeps/stub/s_exp2.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 5d6540e..51b268c 100644
--- a/sysdeps/stub/s_exp2f.c
+++ b/sysdeps/stub/s_exp2f.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 4c52fc9..cab2cb2 100644
--- a/sysdeps/stub/s_exp2l.c
+++ b/sysdeps/stub/s_exp2l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 fb8bda5..3879881 100644
--- a/sysdeps/stub/s_expm1l.c
+++ b/sysdeps/stub/s_expm1l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 0728248..9e51ce2 100644
--- a/sysdeps/stub/s_log1pl.c
+++ b/sysdeps/stub/s_log1pl.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 d8d86af..cc09569 100644
--- a/sysdeps/stub/s_log2l.c
+++ b/sysdeps/stub/s_log2l.c
@@ -1,10 +1,12 @@
#include <math.h>
#include <stdio.h>
+#include <errno.h>
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 fc40387..ae79600 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 c61904a..7255a69 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 <linux/limits.h>' | \
+ 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 0000000..738b9cc
--- /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 a8780df..79dbf16 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 f24af67..18bb6dc 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 a686495..5a615ef 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 23295f0..0000000
--- a/sysdeps/unix/sysv/linux/mk-stdiolim.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <linux/limits.h>
-
-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 27a951f..4410266 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 c31f140..d93c648 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 44b33cb..2d0752c 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;