+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.
1997-05-27 14:16 Miles Bader <miles@gnu.ai.mit.edu>
- * argp-help.c (argp_args_usage): Supply correct argp to filter_doc.
+ * argp/argp-help.c (argp_args_usage): Supply correct argp to
+ filter_doc.
1997-05-27 17:51 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
1997-05-21 17:53 Miles Bader <miles@gnu.ai.mit.edu>
- * argp-help.c (hol_add_cluster): Initialize CL->depth.
+ * argp/argp-help.c (hol_add_cluster): Initialize CL->depth.
1997-05-24 03:51 Ulrich Drepper <drepper@cygnus.com>
1997-05-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>
* 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.
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>
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.
(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>
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.
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))
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
-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.
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
\f
# Some files must not be compiled with the exception handler mechanism
.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
# define _(msgid) (msgid)
# define gettext(msgid) (msgid)
#endif
+#define N_(msgid) (msgid)
#endif
#if _LIBC - 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}
};
\f
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}
};
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;
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)
{
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
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;
}
\f
/* 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;
}
/* 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
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;
}
\f
/* Parse the next argument in PARSER (as indicated by PARSER->state.next).
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;
}
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
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
# 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)
char * weak_function
__dcgettext (const char *domainname, const char *msgid, int category)
{
- assert (domainname == _libc_intl_domainname);
return (char *) msgid;
}
weak_alias (__dcgettext, dcgettext)
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
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 ;;
# 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
#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
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;
}
(void)fprintf(stderr, "%s: %m\n", hp->h_name);
sigsetmask(oldmask);
- return (-1);
+ return -1;
}
lport--;
if (fd2p == 0) {
} else {
char num[8];
int s2 = rresvport(&lport), s3;
- int len = sizeof(from);
+ size_t len = sizeof(from);
if (s2 < 0)
goto bad;
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
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;
}
}
}
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;
}
/*
if (hostf) {
if (__ivaliduser(hostf, raddr, luser, ruser) == 0) {
(void)fclose(hostf);
- return (0);
+ return 0;
}
(void)fclose(hostf);
}
}
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.
if (cp) {
__rcmd_errstr = cp;
(void)fclose(hostf);
- return (-1);
+ return -1;
}
goto again;
}
- return (-1);
+ return -1;
}
/*
if (__icheckhost(raddr, buf) &&
strcmp(ruser, *user ? user : luser) == 0) {
free (buf);
- return (0);
+ return 0;
}
}
free (buf);
- return (-1);
+ return -1;
}
/*
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;
/* 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;
{
/* 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;
}
_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.
__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*;
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)
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;
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
{
goto return_error;
}
- if (connection->database == NULL || connection->position == -1)
+ if (connection->database == NULL)
{
errno = ESRCH;
goto return_error;
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;
}
/* 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
{
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");
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 ();
/* This is an *internal* header. */
-#include <limits.h>
#include <stddef.h>
#include <utmp.h>
{
request_header header;
/* File to use. */
- char file[_POSIX_PATH_MAX + 1];
+ char file[0];
} setutent_request;
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;
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;
}
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;
}
#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"
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. */
/* 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);
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. */
__set_errno (ESRCH);
file_offset = -1l;
*result = NULL;
- return -1;
+ goto unlock_return;
}
file_offset += sizeof (struct utmp);
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);
}
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)
{
__set_errno (ESRCH);
file_offset = -1l;
- return -1;
+ goto unlock_return;
}
file_offset += sizeof (struct utmp);
{
__set_errno (ESRCH);
file_offset = -1l;
- return -1;
+ goto unlock_return;
}
file_offset += sizeof (struct utmp);
}
}
- return 0;
+ result = 0;
+
+unlock_return:
+ /* And unlock the file. */
+ fl.l_type = F_UNLCK;
+ fcntl (file_fd, F_SETLKW, &fl);
+
+ return result;
}
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;
}
.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))
# 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; \
$(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 $@ $^
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
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.
won't be considered processed; this is to allow you to actually modify
the argument (perhaps into an option), and have it processed again.
+@comment argp.h
+@comment GNU
+@item ARGP_KEY_ARGS
+If a parser function returns @code{ARGP_ERR_UNKNOWN} for
+@code{ARGP_KEY_ARG}, it is immediately called again with the key
+@code{ARGP_KEY_ARGS}, which has a similar meaning, but is slightly more
+convenient for consuming all remaining arguments. @var{arg} is 0, and
+the tail of the argument vector may be found at @code{@var{state}->argv
++ @var{state}->next}. If success is returned for this key, and
+@code{@var{state}->next} is unchanged, then all remaining arguments are
+considered to have been consumed, otherwise, the amount by which
+@code{@var{state}->next} has been adjust indicates how many were used.
+For instance, here's an example that uses both, for different args:
+
+@smallexample
+...
+case ARGP_KEY_ARG:
+ if (@var{state}->arg_num == 0)
+ /* First argument */
+ first_arg = @var{arg};
+ else
+ return ARGP_KEY_UNKNOWN; /* Let the next case parse it. */
+ break;
+case ARGP_KEY_ARGS:
+ remaining_args = @var{state}->argv + @var{state}->next;
+ num_remaining_args = @var{state}->argc - @var{state}->next;
+ break;
+@end smallexample
+
@comment argp.h
@comment GNU
@item ARGP_KEY_END
@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
--- /dev/null
+$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.
+\1f
+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:
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
%% 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.
% 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
%
\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
\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.
}
\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{%
\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 @.
%\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}}%
\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}%
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 \
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:
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)
static void
atanh_test (void)
{
+#ifndef TEST_INLINE
MATHTYPE x;
+#endif
check ("atanh(+0) == +0", FUNC(atanh) (0), 0);
#ifndef TEST_INLINE
exp2_test (void)
{
errno = 0;
- exp2(0);
+ FUNC(exp2) (0);
if (errno == ENOSYS)
/* Function not implemented. */
return;
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));
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);
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);
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);
}
{
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);
}
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));
}
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));
}
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);
}
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);
}
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 */
/* 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. */
#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
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));
/* 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_));
__MATHCALL (erfc,, (_Mdouble_));
__MATHCALL (gamma,, (_Mdouble_));
__MATHCALL (lgamma,, (_Mdouble_));
+#endif
#ifdef __USE_MISC
/* Reentrant versions of gamma and lgamma. Those functions use the global
__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
/* 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
routines += $(libcrypt-routines)
endif
+$(objpfx)md5test: $(objpfx)md5.o
+
include ../Rules
ifeq ($(build-shared),yes)
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.
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);
}
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);
# 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); \
_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); \
STRING_ADD_CHAR (str, c, char);
} while ((width <= 0 || --width > 0) && inchar () != EOF);
- if (c == EOF)
- --read_in;
-
if (!(flags & SUPPRESS))
{
*str = '\0';
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
--- /dev/null
+/* 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)
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);
\f
/* 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
# 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} $@
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}
/* 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 */
/* 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 */
/*
* 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)
* 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)
* 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)
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)
fchs
4: ret
+7: fldl 4(%esp)
+ ret
+
6: faddl MO(one)
fyl2x
jecxz 4f
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)
fchs
4: ret
+7: flds 4(%esp)
+ ret
+
6: faddl MO(one)
fyl2x
jecxz 4f
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)
fchs
4: ret
+7: fldt 4(%esp)
+ ret
+
6: faddl MO(one)
fyl2x
jecxz 4f
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)
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)
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)
#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)
#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)
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)
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)
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)
--- /dev/null
+/* 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));
+}
--- /dev/null
+/* 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));
+}
--- /dev/null
+/* 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));
+}
*
* 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.
* ====================================================
*/
#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,
* 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 */
}
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;
/* 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;
}
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;
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);
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;
*
* 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.
* ====================================================
*/
#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 */
}
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;
/* 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;
}
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;
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);
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;
long long int
-__rinttoll (long double x)
+__llrint (long double x)
{
int32_t j0,sx;
u_int32_t i0, i1, i;
long long int
-__rinttoll (long double x)
+__llrint (long double x)
{
int32_t se,j0,sx;
u_int32_t i0, i1, i;
}
#endif
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
/* 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;
}
#else
long long int
-__roundtoll (long double x)
+__llround (long double x)
{
int32_t j0;
u_int32_t se, i1, i0;
return se & 0x8000 ? -result : result;
}
#endif
-weak_alias (__roundtoll, roundtoll)
+weak_alias (__llround, llround)
long int
-__rinttol (long double x)
+__lrint (long double x)
{
int32_t j0,sx;
u_int32_t i0,i1,i;
long int
-__rinttol (long double x)
+__lrint (long double x)
{
int32_t se,j0,sx;
u_int32_t i0,i1,i;
}
#endif
-weak_alias (__rinttol, rinttol)
+weak_alias (__lrint, lrint)
/* 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;
}
#else
long int
-__roundtol (long double x)
+__lround (long double x)
{
int32_t j0;
u_int32_t se, i1, i0;
return se & 0x8000 ? -result : result;
}
#endif
-weak_alias (__roundtol, roundtol)
+weak_alias (__lround, lround)
if (x + x > y)
{
x -= y;
+ ++cquo;
if (x + x >= y)
{
x -= y;
if (x > y_half)
{
x -= y;
+ ++cquo;
if (x >= y_half)
{
x -= y;
if (x + x > y)
{
x -= y;
+ ++cquo;
if (x + x >= y)
{
x -= y;
if (x > y_half)
{
x -= y;
+ ++cquo;
if (x >= y_half)
{
x -= y;
if (x + x > p)
{
x -= p;
+ ++cquo;
if (x + x >= p)
{
x -= p;
if (x > p_half)
{
x -= p;
+ ++cquo;
if (x >= p_half)
{
x -= p;
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;
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;
*
* 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.
* ====================================================
*/
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;
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;
#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;
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)
#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
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 */
+++ /dev/null
-/* @(#)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
*
* 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.
* ====================================================
*/
#include "math.h"
#include "math_private.h"
-extern int signgam;
-
#ifdef __STDC__
float __gammaf(float x)
#else
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 */
} else
return y;
#endif
-}
+}
weak_alias (__gammaf, gammaf)
+++ /dev/null
-/* 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)
#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
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 */
+++ /dev/null
-/* 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)
__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));
#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,
#include "math_private.h"
long long int
-__rinttoll (long double x)
+__llrint (long double x)
{
int32_t se, sx;
u_int32_t h, l;
return result;
}
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
#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)
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;
# 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
common-generated := $(common-generated) stdio_lim.h mk-stdiolim
before-compile := $(before-compile) $(common-objpfx)stdio_lim.h
+
+endif # inhibit-stdio_lim
+fenv_const.c
fenv_libc.h
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
__ieee754_y0l (long double x)
{
fputs ("__ieee754_y0l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
#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;
}
__ieee754_y1l (long double x)
{
fputs ("__ieee754_y1l not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
#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;
}
__ieee754_ynl (int n, long double x)
{
fputs ("__ieee754_ynl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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)
#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)
__erfcl (long double x)
{
fputs ("__erfcl not implemented\n", stderr);
+ __set_errno (ENOSYS);
return 0.0;
}
weak_alias (__erfcl, erfcl)
#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)
#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)
#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)
#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)
#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)
#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)
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
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
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
# 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
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
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
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
+++ /dev/null
-#include <linux/limits.h>
-
-DEFAULT_FOPEN_MAX:OPEN_MAX
-DEFAULT_FILENAME_MAX:PATH_MAX
kernel_stat.h
kernel_termios.h
sys/kernel_termios.h
+init-first.h
+syscall.h
fork.S
kernel_stat.h
kernel_sigaction.h
+init-first.h
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;
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;