update from main archive 960919

Thu Sep 19 21:50:55 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/posix/gettimeofday.c (__gettimeofday): Use localtime_r
	instead of localtime.
	Reported by Matthias Urlichs.

	* shlib-versions: Remove version number for libcrypt.
	* features.h: Define __USE_REENTRANT if _REENTRANT or _THREAD_SAFE.
	* libc-symbols.h: Define _REENTRANT while compiling libc.

	* sysdeps/unix/sysv/linux/i386/sysdep.S (__errno_location):
	Define even if !_LIBC_REENTRANT.
	* sysdeps/unix/sysv/linux/i386/sysdep.S (__errno_location):
	Likewise.

	* sysdeps/posix/cuserid.h: Remove prototype for geteuid().
	De-ANSI-fy.

	* MakeTAGS ($P/libc.pot): Generate correctly formed header.
	* po/header.pot: Correct title line.
	* po/nl.po: Update.

Thu Sep 19 18:59:55 1996  Ulrich Drepper  <drepper@cygnus.com>

	* Makeconfig (soversions.mk): Prefer shared lib version numbers
	is add ons over version in libc itself.

	* sysdeps/unix/sysv/linux/i386/sysdep.S: Include <sysdep.h>.
	* sysdeps/unix/sysv/linux/i386/sysdep.h: Prevent multiple
	inclusion.

	* libio/iofgets.c: Use __flockfile and __funlockfile instead of
 	_IO_flockfile and _IO_funlockfile resp.

	* locale/categories.def: Partly support for correct `era' handling
	in LC_TIME category.
	* locale/langinfo.h: Likewise.
	* locale/programs/ld-time.c: Likewise.
	* locale/localeinfo.h: Change comment a bit.

	* malloc/memalign.c: Don't use goto, not necessary anymore.

1996-09-18  Paul Eggert  <eggert@twinsun.com>

	* time/mktime.c (ydhms_tm_diff):  Work correctly even if year
	is negative, or if time_t is unsigned.
	* time/strftime.c (tm_diff): Work correctly even if tm_year
	is near INT_MIN.

Tue Sep 17 16:14:34 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/fpu/__math.h (__inline_mathop): Changed to generate
 	all three versions of the math function.
	(__inline_mathopf, __inline_mathopl): Removed.
	(__inline_functions): New temporary definition containing all
 	non-trivial inline functions.

Wed Sep 18 00:25:41 1996  Ulrich Drepper  <drepper@cygnus.com>

	* time/strftime.c (strftime): The T_FMT_AMPM string may be empty.

Tue Sep 17 20:27:18 1996  Ulrich Drepper  <drepper@cygnus.com>

	* math/Makefile (extra-libs-others): Use $(extra-libs) instead
	of $(extra-libc).

Tue Sep 17 17:09:44 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/stub/fpu_control.h: Correct end of file comment.

Tue Sep 17 05:39:18 1996  Ulrich Drepper  <drepper@cygnus.com>

	* stdio-common/bug3.c, stdio-common/bug4.c, stdio-common/bug5.c,
	stdio-common/test-popen.c: Remove temporary files after test.
	* stdio-common/bug5.c: Use `system' instead of `execlp'.
	Patches by Andreas Jaeger.

	* stdio-common/bug5.c: Create string for `system' argument to
	make sure the input and output file names are really correct.

Sun Sep 15 12:46:44 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* configure.in: If $os contains a hyphen add the part before the
	hyphen to $ostry.

Sun Sep 15 18:14:02 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/fpu/__math.h (__ieee754_pow, __ieee754_powf,
	__ieee754_powl): Rename local variable i to __i.
	(__ieee754_atan2, __ieee754_atan2f, __ieee754_atan2l): New inline
	functions.
	* sysdeps/m68k/fpu/e_atan2.c, sysdeps/m68k/fpu/e_atan2f.c,
	sysdeps/m68k/fpu/e_atan2l.c: New files.

1996-09-15  Paul Eggert  <eggert@twinsun.com>

	* manual/time.texi: Change `range X to Y' to `range X through
	Y', to avoid ambiguity in English.

	(strftime): Numbers that do not have a range indicated are not padded.
	Describe E and O modifiers.
	%g, %G, %u: New formats.
	%C, %y, %Y: Describe behavior on negative years.
	%e: Fix typo (was labeled %d).
	%l, %V: Fix typo in range.
	%M, %S, %U, %w, %W: Give ranges.
	%p: Clarify how noon and midnight are handled for AM and PM.
	%s: Clarify leap second handling.
	%r: Now locale-defined.
	%C, %D, %e, %h, %n, %r, %t, %T: Say that they are POSIX.2 extensions.
	%z: Say that it is a GNU extension.
	%Z: Wording fix.

	* time/strftime.c: (strftime):
		%V: Fix mishandling of week numbers near year boundaries.
		%g, %G: New formats (suggested by Arthur David Olson).
		%U, %W: Use inline expression instead of `week' function.
		%C, %y: Handle negative years portably.
		%C, %Y: Use width 1, since values can be arbitrarily wide.
		%r: Use T_FMT_AMPM format if _NL_CURRENT is defined.
		%u: New Posix.2 format.
		%w: Width is 1, not 2.
	(iso_week_days): New function, for %V, %G, %g.
	(week): Remove; it didn't handle %V correctly.
	(__isleap): New macro.
	(mbsinit): Use arg, to pacify GCC -Wall.

1996-09-13  Paul Eggert  <eggert@twinsun.com>

	* time/strftime.c (strftime):
	If using the GNU C library, do not bother to check for
	multibyte encodings, since they're safe in formats.  Otherwise:
	  - Check for multibyte encodings when encountering any character that
	  is not in the basic execution character set of the C Standard.
	  - Use mbrlen (if available) instead of mblen, to avoid modifying
	  mblen's internal state.
	  - Do not assume that '%' cannot appear as the first character of a
	  multibyte character sequence, since this is possible when not in the
	  initial shift state.
	(HAVE_MBRLEN, MULTIBYTE_IS_FORMAT_SAFE): Define if _LIBC is defined.
	(DO_MULTIBYTE): New macro.
	(<ctype.h>): Do not include.
	(<wchar.h>): Include if HAVE_MBRLEN.
	(mbstate_t, mbrlen, mbsinit): Define if ! HAVE_MBRLEN.
	(mbstate_zero): New constant.

1996-09-12  Paul Eggert  <eggert@twinsun.com>

	* time/strftime.c (strftime):
	Use an empty zone if it can't be determined; POSIX.2 requires this.
	Use plain `int' for pad and modifier (which now contain char value).
	Use plain `int' for number_value, to print negative values correctly.
	Use plain `int' for digits; there was no need to make it unsigned.
	Initialize subfmt consistently.
	Remove incorrect code for %EC and %Ey; they aren't implemented yet.
	For %O, if there is no alternate digit, output Ascii instead of "".
	Output the `%' of an unknown format; this is most likely the right
	thing to do if a multibyte string has been misparsed.

Thu Sep 12 23:23:13 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* stdio-common/scanf7.c (main): Remove extra conversion from
	printf format string.

Thu Sep 12 23:01:16 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* stdlib/test-canon.c (tests): Rename structure member from errno
	to error, all uses changed.

Thu Sep 12 20:08:06 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/fpu/__math.h (__ldexp, __ldexpf, __ldexpl):
	Removed.
	* sysdeps/m68k/fpu/s_ldexp.c, sysdeps/m68k/fpu/s_ldexpf.c,
	sysdeps/m68k/fpu/s_ldexpl.c: Removed, use generic implementation
	instead.
	* sysdeps/m68k/fpu/s_scalbn.c, sysdeps/m68k/fpu/s_scalbnf.c,
	sysdeps/m68k/fpu/s_scalbnl.c: Replaced with old contents of
	s_ldexp.c, s_ldexpf.c and s_ldexpl.c, resp., suitably adpted.

	* sysdeps/m68k/fpu/__math.h (__frexp, __frexpf, __frexpl):
	Return value must be in [0.5, 1), not [1, 2).  Reported by Chris
	Lawrence.
	(__ilogb, __ilogbf, __ilogbl): Check for argument being zero.
	(__scalbn, __scalbnf, __scalbnl): Use second argument directly.

Thu Sep 12 19:59:24 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/libm-ieee754/e_acoshl.c: Fix typos.
	* sysdeps/libm-ieee754/s_cbrtl.c: Remove unused variable.

Thu Sep 12 19:59:24 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/libm-ieee754/e_acoshl.c: Fix typos.
	* sysdeps/libm-ieee754/s_cbrtl.c: Remove unused variable.

Thu Sep 12 19:56:07 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* inet/herrno.c (__h_errno_location): Fix return type.

Tue Sep 17 10:51:58 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* malloc/memalign.c (memalign): Only acquire __libc_malloc_lock
	for actual modifications to global state.

Fri Sep 13 01:21:36 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* sysdeps/mach/Makefile (includes): Add -I$(common-objpfx)mach/.
	* sysdeps/mach/hurd/Makefile (includes): Add
	-I$(common-objpfx)hurd/.  Reported by Marcus Daniels.

	* sysdeps/generic/schedbits.h (struct sched_param): Renamed from
	struct sched_params.
	* sysdeps/stub/sched_setp.c (__sched_setparam): struct
	sched_params -> struct sched_param.
	* sysdeps/stub/sched_getp.c (__sched_getparam): Likewise.
	* sysdeps/stub/sched_sets.c (__sched_setscheduler): Likewise.

Thu Sep 12 23:58:25 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* sysdeps/mach/libc-lock.h (__libc_cleanup_region_start): Fix
	syntax error.

	* stdio-common/Makefile: Put lockfile in routines
	unconditionally.
	Define _MT_SAFE_IO if using for libio and compiling reentrant
	libc.

	* stdio-common/vfprintf.c (__flockfile, __funlockfile): Declare
	this always, not just if _LIBC_REENTRANT.
	(__funlockfile): Don't use weak_extern for this one;
	__libc_cleanup_region_end might be defined and the use of
	__funlockfile can't be protected the way the use of __flockfile
	can be.

	* sched.h: New file.  Helper to access posix/sched.h.
Thu Sep 12 12:33:52 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* sysdeps/mach/hurd/dl-cache.c: Delete second copy of file
	accidentally added on.

	* sysdeps/stub/intr-msg.h: New file.

	* stdio-common/vfprintf.c: Include <libc-lock.h>.
	* stdio-common/vfscanf.c: Include <libc-lock.h>.

	* sysdeps/mach/libc-lock.h (__libc_cleanup_region_start): New
	macro.
	(__libc_cleanup_region_end): New macro.
This commit is contained in:
Ulrich Drepper 1996-09-20 01:58:09 +00:00
parent d66b7b41b8
commit ec4b0518a3
42 changed files with 2463 additions and 1120 deletions

251
ChangeLog
View File

@ -31,9 +31,244 @@ Thu Sep 12 23:58:25 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
__funlockfile can't be protected the way the use of __flockfile
can be.
Thu Sep 19 21:50:55 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/posix/gettimeofday.c (__gettimeofday): Use localtime_r
instead of localtime.
Reported by Matthias Urlichs.
* shlib-versions: Remove version number for libcrypt.
* features.h: Define __USE_REENTRANT if _REENTRANT or _THREAD_SAFE.
* libc-symbols.h: Define _REENTRANT while compiling libc.
* sysdeps/unix/sysv/linux/i386/sysdep.S (__errno_location):
Define even if !_LIBC_REENTRANT.
* sysdeps/unix/sysv/linux/i386/sysdep.S (__errno_location):
Likewise.
* sysdeps/posix/cuserid.h: Remove prototype for geteuid().
De-ANSI-fy.
* MakeTAGS ($P/libc.pot): Generate correctly formed header.
* po/header.pot: Correct title line.
* po/nl.po: Update.
Thu Sep 19 18:59:55 1996 Ulrich Drepper <drepper@cygnus.com>
* Makeconfig (soversions.mk): Prefer shared lib version numbers
is add ons over version in libc itself.
* sysdeps/unix/sysv/linux/i386/sysdep.S: Include <sysdep.h>.
* sysdeps/unix/sysv/linux/i386/sysdep.h: Prevent multiple
inclusion.
* libio/iofgets.c: Use __flockfile and __funlockfile instead of
_IO_flockfile and _IO_funlockfile resp.
* locale/categories.def: Partly support for correct `era' handling
in LC_TIME category.
* locale/langinfo.h: Likewise.
* locale/programs/ld-time.c: Likewise.
* locale/localeinfo.h: Change comment a bit.
* malloc/memalign.c: Don't use goto, not necessary anymore.
1996-09-18 Paul Eggert <eggert@twinsun.com>
* time/mktime.c (ydhms_tm_diff): Work correctly even if year
is negative, or if time_t is unsigned.
* time/strftime.c (tm_diff): Work correctly even if tm_year
is near INT_MIN.
Tue Sep 17 16:14:34 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/fpu/__math.h (__inline_mathop): Changed to generate
all three versions of the math function.
(__inline_mathopf, __inline_mathopl): Removed.
(__inline_functions): New temporary definition containing all
non-trivial inline functions.
Wed Sep 18 00:25:41 1996 Ulrich Drepper <drepper@cygnus.com>
* time/strftime.c (strftime): The T_FMT_AMPM string may be empty.
Tue Sep 17 20:27:18 1996 Ulrich Drepper <drepper@cygnus.com>
* math/Makefile (extra-libs-others): Use $(extra-libs) instead
of $(extra-libc).
Tue Sep 17 17:09:44 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/stub/fpu_control.h: Correct end of file comment.
Tue Sep 17 05:39:18 1996 Ulrich Drepper <drepper@cygnus.com>
* stdio-common/bug3.c, stdio-common/bug4.c, stdio-common/bug5.c,
stdio-common/test-popen.c: Remove temporary files after test.
* stdio-common/bug5.c: Use `system' instead of `execlp'.
Patches by Andreas Jaeger.
* stdio-common/bug5.c: Create string for `system' argument to
make sure the input and output file names are really correct.
Sun Sep 15 12:46:44 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* configure.in: If $os contains a hyphen add the part before the
hyphen to $ostry.
Sun Sep 15 18:14:02 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/fpu/__math.h (__ieee754_pow, __ieee754_powf,
__ieee754_powl): Rename local variable i to __i.
(__ieee754_atan2, __ieee754_atan2f, __ieee754_atan2l): New inline
functions.
* sysdeps/m68k/fpu/e_atan2.c, sysdeps/m68k/fpu/e_atan2f.c,
sysdeps/m68k/fpu/e_atan2l.c: New files.
1996-09-15 Paul Eggert <eggert@twinsun.com>
* manual/time.texi: Change `range X to Y' to `range X through
Y', to avoid ambiguity in English.
(strftime): Numbers that do not have a range indicated are not padded.
Describe E and O modifiers.
%g, %G, %u: New formats.
%C, %y, %Y: Describe behavior on negative years.
%e: Fix typo (was labeled %d).
%l, %V: Fix typo in range.
%M, %S, %U, %w, %W: Give ranges.
%p: Clarify how noon and midnight are handled for AM and PM.
%s: Clarify leap second handling.
%r: Now locale-defined.
%C, %D, %e, %h, %n, %r, %t, %T: Say that they are POSIX.2 extensions.
%z: Say that it is a GNU extension.
%Z: Wording fix.
* time/strftime.c: (strftime):
%V: Fix mishandling of week numbers near year boundaries.
%g, %G: New formats (suggested by Arthur David Olson).
%U, %W: Use inline expression instead of `week' function.
%C, %y: Handle negative years portably.
%C, %Y: Use width 1, since values can be arbitrarily wide.
%r: Use T_FMT_AMPM format if _NL_CURRENT is defined.
%u: New Posix.2 format.
%w: Width is 1, not 2.
(iso_week_days): New function, for %V, %G, %g.
(week): Remove; it didn't handle %V correctly.
(__isleap): New macro.
(mbsinit): Use arg, to pacify GCC -Wall.
1996-09-13 Paul Eggert <eggert@twinsun.com>
* time/strftime.c (strftime):
If using the GNU C library, do not bother to check for
multibyte encodings, since they're safe in formats. Otherwise:
- Check for multibyte encodings when encountering any character that
is not in the basic execution character set of the C Standard.
- Use mbrlen (if available) instead of mblen, to avoid modifying
mblen's internal state.
- Do not assume that '%' cannot appear as the first character of a
multibyte character sequence, since this is possible when not in the
initial shift state.
(HAVE_MBRLEN, MULTIBYTE_IS_FORMAT_SAFE): Define if _LIBC is defined.
(DO_MULTIBYTE): New macro.
(<ctype.h>): Do not include.
(<wchar.h>): Include if HAVE_MBRLEN.
(mbstate_t, mbrlen, mbsinit): Define if ! HAVE_MBRLEN.
(mbstate_zero): New constant.
1996-09-12 Paul Eggert <eggert@twinsun.com>
* time/strftime.c (strftime):
Use an empty zone if it can't be determined; POSIX.2 requires this.
Use plain `int' for pad and modifier (which now contain char value).
Use plain `int' for number_value, to print negative values correctly.
Use plain `int' for digits; there was no need to make it unsigned.
Initialize subfmt consistently.
Remove incorrect code for %EC and %Ey; they aren't implemented yet.
For %O, if there is no alternate digit, output Ascii instead of "".
Output the `%' of an unknown format; this is most likely the right
thing to do if a multibyte string has been misparsed.
Thu Sep 12 23:23:13 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* stdio-common/scanf7.c (main): Remove extra conversion from
printf format string.
Thu Sep 12 23:01:16 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* stdlib/test-canon.c (tests): Rename structure member from errno
to error, all uses changed.
Thu Sep 12 20:08:06 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/fpu/__math.h (__ldexp, __ldexpf, __ldexpl):
Removed.
* sysdeps/m68k/fpu/s_ldexp.c, sysdeps/m68k/fpu/s_ldexpf.c,
sysdeps/m68k/fpu/s_ldexpl.c: Removed, use generic implementation
instead.
* sysdeps/m68k/fpu/s_scalbn.c, sysdeps/m68k/fpu/s_scalbnf.c,
sysdeps/m68k/fpu/s_scalbnl.c: Replaced with old contents of
s_ldexp.c, s_ldexpf.c and s_ldexpl.c, resp., suitably adpted.
* sysdeps/m68k/fpu/__math.h (__frexp, __frexpf, __frexpl):
Return value must be in [0.5, 1), not [1, 2). Reported by Chris
Lawrence.
(__ilogb, __ilogbf, __ilogbl): Check for argument being zero.
(__scalbn, __scalbnf, __scalbnl): Use second argument directly.
Thu Sep 12 19:59:24 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/libm-ieee754/e_acoshl.c: Fix typos.
* sysdeps/libm-ieee754/s_cbrtl.c: Remove unused variable.
Thu Sep 12 19:59:24 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/libm-ieee754/e_acoshl.c: Fix typos.
* sysdeps/libm-ieee754/s_cbrtl.c: Remove unused variable.
Thu Sep 12 19:56:07 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* inet/herrno.c (__h_errno_location): Fix return type.
Tue Sep 17 10:51:58 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* malloc/memalign.c (memalign): Only acquire __libc_malloc_lock
for actual modifications to global state.
Fri Sep 13 01:21:36 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* sysdeps/mach/Makefile (includes): Add -I$(common-objpfx)mach/.
* sysdeps/mach/hurd/Makefile (includes): Add
-I$(common-objpfx)hurd/. Reported by Marcus Daniels.
* sysdeps/generic/schedbits.h (struct sched_param): Renamed from
struct sched_params.
* sysdeps/stub/sched_setp.c (__sched_setparam): struct
sched_params -> struct sched_param.
* sysdeps/stub/sched_getp.c (__sched_getparam): Likewise.
* sysdeps/stub/sched_sets.c (__sched_setscheduler): Likewise.
Thu Sep 12 23:58:25 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* sysdeps/mach/libc-lock.h (__libc_cleanup_region_start): Fix
syntax error.
* stdio-common/Makefile: Put lockfile in routines
unconditionally.
Define _MT_SAFE_IO if using for libio and compiling reentrant
libc.
* stdio-common/vfprintf.c (__flockfile, __funlockfile): Declare
this always, not just if _LIBC_REENTRANT.
(__funlockfile): Don't use weak_extern for this one;
__libc_cleanup_region_end might be defined and the use of
__funlockfile can't be protected the way the use of __flockfile
can be.
Fri Sep 13 04:33:08 1996 Ulrich Drepper <drepper@cygnus.com>
* sched.h: New file. helper to access posix/sched.h.
* sched.h: New file. Helper to access posix/sched.h.
* posix/sched.h: Change `sched_params' to `sched_param' to follow
POSIX.4.
@ -76,6 +311,20 @@ Thu Sep 12 12:33:52 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
macro.
(__libc_cleanup_region_end): New macro.
Thu Sep 12 12:33:52 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* sysdeps/mach/hurd/dl-cache.c: Delete second copy of file
accidentally added on.
* sysdeps/stub/intr-msg.h: New file.
* stdio-common/vfprintf.c: Include <libc-lock.h>.
* stdio-common/vfscanf.c: Include <libc-lock.h>.
* sysdeps/mach/libc-lock.h (__libc_cleanup_region_start): New
macro.
(__libc_cleanup_region_end): New macro.
Thu Sep 12 03:35:27 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/i386/Dist: Remove init-first.h.

View File

@ -166,9 +166,12 @@ $P/subdirs.pot: $(subdirs:%=$P/%.pot)
include $(common-objpfx)version.mk
# Combine all the messages into the final sorted template translation file.
# The following code requires GNU date.
$P/libc.pot: $(all-pot)
@rm -f $@.new
sed -e 's/VERSION/$(version)/' -e "s/DATE/`date +'%Y-%m-%d %k:%M'`/" \
disp='set `date -R`; echo $$6'; \
sed -e 's/VERSION/$(version)/' \
-e "s/DATE/`date +'%Y-%m-%d %I:%M'$$disp/" \
po/header.pot > $@.new
$(XGETTEXT) -d - --omit-header -n -s $^ >> $@.new
mv -f $@.new $@

View File

@ -527,8 +527,8 @@ $(common-objpfx)soversions.mk: $(..)shlib-versions $(..)Makeconfig \
$(wildcard $(patsubst %, $(..)%/shlib-versions,\
$(add-ons))) \
$(common-objpfx)config.make
(file="$(..)shlib-versions \
$(wildcard $(patsubst %,$(..)%/shlib-versions,$(add-ons)))"; \
(file="$(wildcard $(patsubst %,$(..)%/shlib-versions,$(add-ons))) \
$(..)shlib-versions"; \
for f in $$file; do \
sed 's/#.*$$//' $$f | while read conf versions; do \
test -n "$$versions" || continue; \

47
configure vendored
View File

@ -2,7 +2,7 @@
# From configure.in CVSid
# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.99
# Generated automatically using autoconf version 2.10
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
@ -355,7 +355,7 @@ EOF
verbose=yes ;;
-version | --version | --versio | --versi | --vers)
echo "configure generated by autoconf version 2.99"
echo "configure generated by autoconf version 2.10"
exit 0 ;;
-with-* | --with-*)
@ -717,9 +717,9 @@ NONE)
esac
host=`$ac_config_sub $host_alias`
host_cpu=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'`
host_vendor=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'`
host_os=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'`
host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6
# We keep the original values in `$config_*' and never modify them, so we
@ -799,6 +799,11 @@ o=`echo $tail | sed 's/[0-9]*$//'`
if test $o != $tail; then
ostry="$ostry /$o"
fi
# For linux-gnu, try linux-gnu, then linux.
o=`echo $tail | sed 's/-.*$//'`
if test $o != $tail; then
ostry="$ostry /$o"
fi
# For unix/sysv/sysv4, try unix/sysv/sysv4, then unix/sysv, then unix.
base=
@ -1085,9 +1090,9 @@ NONE)
esac
build=`$ac_config_sub $build_alias`
build_cpu=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'`
build_vendor=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'`
build_os=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'`
build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$build" 1>&6
if test $host != $build; then
@ -1170,13 +1175,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
#line 1174 "configure"
#line 1179 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1180: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1185: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
@ -1185,13 +1190,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
#line 1189 "configure"
#line 1194 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1195: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1200: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
@ -1333,7 +1338,7 @@ if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1337 "configure"
#line 1342 "configure"
#include "confdefs.h"
#define __need_size_t
#define __need_wchar_t
@ -1349,7 +1354,7 @@ size_t size; wchar_t wchar;
if (&size == NULL || &wchar == NULL) abort ();
; return 0; }
EOF
if { (eval echo configure:1353: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1358: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_friendly_stddef=yes
else
@ -1456,7 +1461,7 @@ if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1460 "configure"
#line 1465 "configure"
#include "confdefs.h"
int main() { return 0; }
@ -1466,7 +1471,7 @@ asm (".section .init");
asm (".text");
; return 0; }
EOF
if { (eval echo configure:1470: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1475: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_have_initfini=yes
else
@ -1494,7 +1499,7 @@ if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1498 "configure"
#line 1503 "configure"
#include "confdefs.h"
asm ("_glibc_foobar:");
int main() { return 0; }
@ -1502,7 +1507,7 @@ int t() {
glibc_foobar ();
; return 0; }
EOF
if { (eval echo configure:1506: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:1511: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
libc_cv_asm_underscores=yes
else
@ -1596,7 +1601,7 @@ __throw () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -Wl,--no-whole-archive
-o conftest conftest.c'; { (eval echo configure:1600: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
-o conftest conftest.c'; { (eval echo configure:1605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_ld_no_whole_archive=yes
else
libc_cv_ld_no_whole_archive=no
@ -1617,7 +1622,7 @@ __throw () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -fno-exceptions
-o conftest conftest.c'; { (eval echo configure:1621: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
-o conftest conftest.c'; { (eval echo configure:1626: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_no_exceptions=yes
else
libc_cv_gcc_no_exceptions=no
@ -1834,7 +1839,7 @@ do
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
echo "$CONFIG_STATUS generated by autoconf version 2.99"
echo "$CONFIG_STATUS generated by autoconf version 2.10"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;

View File

@ -167,6 +167,11 @@ o=`echo $tail | sed 's/[0-9]*$//'`
if test $o != $tail; then
ostry="$ostry /$o"
fi
# For linux-gnu, try linux-gnu, then linux.
o=`echo $tail | sed 's/-.*$//'`
if test $o != $tail; then
ostry="$ostry /$o"
fi
# For unix/sysv/sysv4, try unix/sysv/sysv4, then unix/sysv, then unix.
base=

View File

@ -29,6 +29,8 @@ Cambridge, MA 02139, USA. */
_BSD_SOURCE ANSI, POSIX, and 4.3BSD things.
_SVID_SOURCE ANSI, POSIX, and SVID things.
_GNU_SOURCE All of the above, plus GNU extensions.
_REENTRANT Select additionally reentrant object.
_THREAD_SAFE Same as _REENTRANT, often used by other systems.
The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__.
If none of these are defined, the default is all but _GNU_SOURCE.
@ -137,7 +139,7 @@ Cambridge, MA 02139, USA. */
#define __USE_GNU 1
#endif
#if defined (__USE_GNU) || defined (__USE_MISC)
#if defined (_REENTRANT) || defined (_THREAD_SAFE)
#define __USE_REENTRANT 1
#endif

View File

@ -25,7 +25,7 @@ strong_alias (__h_errno, h_errno)
/* When threaded, h_errno may be a per-process variable. */
#ifdef __USE_REENTRANT
int
int *
weak_const_function
__h_errno_location (void)
{

View File

@ -48,6 +48,8 @@ Cambridge, MA 02139, USA. */
/* Enable declarations of GNU extensions, since we are compiling them. */
#define _GNU_SOURCE 1
/* And we also need the data for the reentrant functions. */
#define _REENTRANT 1
#include <config.h>
/*

View File

@ -35,8 +35,8 @@ _IO_fgets (buf, n, fp)
CHECK_FILE (fp, NULL);
if (n <= 0)
return NULL;
__libc_cleanup_region_start (&_IO_funlockfile, fp);
_IO_flockfile (fp);
__libc_cleanup_region_start (&__funlockfile, fp);
__flockfile (fp);
count = _IO_getline (fp, buf, n - 1, '\n', 1);
if (count == 0 || (fp->_IO_file_flags & _IO_ERR_SEEN))
result = NULL;

View File

@ -137,12 +137,15 @@ DEFINE_CATEGORY
DEFINE_ELEMENT (D_FMT, "d_fmt", std, string)
DEFINE_ELEMENT (T_FMT, "t_fmt", std, string)
DEFINE_ELEMENT (T_FMT_AMPM, "t_fmt_ampm", std, string)
DEFINE_ELEMENT (ERA, "era", opt, string)
DEFINE_ELEMENT (ERA, "era", opt, stringarray, 0, 100)/*XXX*/
DEFINE_ELEMENT (ERA_YEAR, "era_year", opt, string)
DEFINE_ELEMENT (ERA_D_FMT, "era_d_fmt", opt, string)
DEFINE_ELEMENT (ALT_DIGITS, "alt_digits", opt, stringarray, 0, 100)
DEFINE_ELEMENT (ERA_D_T_FMT, "era_d_t_fmt", opt, string)
DEFINE_ELEMENT (ERA_T_FMT, "era_t_fmt", opt, string)
DEFINE_ELEMENT (_NL_TIME_ERA_NUM_ENTRIES, "time-era-num-entries", opt, word)
DEFINE_ELEMENT (_NL_TIME_ERA_ENTRIES_EB, "time-era-entries-eb", opt, string)
DEFINE_ELEMENT (_NL_TIME_ERA_ENTRIES_EL, "time-era-entries-el", opt, string)
), NO_POSTLOAD, NULL, NULL, NULL)

View File

@ -101,6 +101,10 @@ typedef enum
ERA_D_T_FMT, /* Date and time in alternate era format. */
ERA_T_FMT, /* Time in alternate era format. */
_NL_TIME_ERA_NUM_ENTRIES, /* Number entries in the era arrays. */
_NL_TIME_ERA_ENTRIES_EB, /* Structure with era entries in usable form.*/
_NL_TIME_ERA_ENTRIES_EL,
_NL_NUM_LC_TIME, /* Number of indices in LC_TIME category. */
/* LC_COLLATE category: text sorting.

View File

@ -64,7 +64,7 @@ enum coll_sort_rule
sort_mask
};
/* We can map the types of the entries into four categories. */
/* We can map the types of the entries into a few categories. */
enum value_type
{
none,

View File

@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA. */
void *xmalloc (size_t __n);
void *xrealloc (void *__p, size_t __n);
/* The real definition of the struct for the LC_TIME locale. */
@ -53,7 +54,8 @@ struct locale_time_t
const char *d_fmt;
const char *t_fmt;
const char *t_fmt_ampm;
const char *era;
const char **era;
size_t era_num;
const char *era_year;
const char *era_d_t_fmt;
const char *era_t_fmt;
@ -115,6 +117,7 @@ time_output (struct localedef_t *locale, const char *output_path)
{
struct locale_time_t *time = locale->categories[LC_TIME].time;
struct iovec iov[2 + _NL_ITEM_INDEX (_NL_NUM_LC_TIME)
+ (time->era_num > 0 ? time->era_num - 1 : 0)
+ time->cur_num_alt_digits];
struct locale_file data;
u_int32_t idx[_NL_ITEM_INDEX (_NL_NUM_LC_TIME)];
@ -203,22 +206,27 @@ time_output (struct localedef_t *locale, const char *output_path)
iov[2 + cnt].iov_base = (void *) (time->t_fmt_ampm ?: "");
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
idx[1 + cnt] = idx[cnt] + iov[2 + cnt].iov_len;
++cnt;
last_idx = ++cnt;
iov[2 + cnt].iov_base = (void *) (time->era ?: "");
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
idx[1 + cnt] = idx[cnt] + iov[2 + cnt].iov_len;
++cnt;
idx[1 + last_idx] = idx[last_idx];
for (num = 0; num < time->era_num; ++num, ++cnt)
{
iov[2 + cnt].iov_base = (void *) time->era[num];
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
}
++last_idx;
iov[2 + cnt].iov_base = (void *) (time->era_year ?: "");
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
idx[1 + cnt] = idx[cnt] + iov[2 + cnt].iov_len;
idx[1 + last_idx] = idx[last_idx] + iov[2 + cnt].iov_len;
++cnt;
++last_idx;
iov[2 + cnt].iov_base = (void *) (time->era_d_fmt ?: "");
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
idx[1 + cnt] = idx[cnt] + iov[2 + cnt].iov_len;
last_idx = ++cnt;
idx[1 + last_idx] = idx[last_idx] + iov[2 + cnt].iov_len;
++cnt;
++last_idx;
idx[1 + last_idx] = idx[last_idx];
for (num = 0; num < time->cur_num_alt_digits; ++num, ++cnt)
@ -267,8 +275,7 @@ too many values for field `%s' in category `LC_TIME'"), \
time->cat[time->cur_num_##cat++] = ""; \
} \
else \
time->cat[time->cur_num_##cat++] \
= code->val.str.start; \
time->cat[time->cur_num_##cat++] = code->val.str.start; \
break
STRARR_ELEM (abday, 7);
@ -278,6 +285,18 @@ too many values for field `%s' in category `LC_TIME'"), \
STRARR_ELEM (am_pm, 2);
STRARR_ELEM (alt_digits, 100);
case tok_era:
if (code->val.str.start == NULL)
lr_error (lr, _("unknown character in field `%s' of category `%s'"),
"era", "LC_TIME");
else
{
++time->era_num;
time->era = xrealloc (time->era, time->era_num * sizeof (char *));
time->era[time->era_num - 1] = code->val.str.start;
}
break;
#define STR_ELEM(cat) \
case tok_##cat: \
if (time->cat != NULL) \
@ -298,7 +317,6 @@ field `%s' in category `%s' declared more than once"), \
STR_ELEM (d_fmt);
STR_ELEM (t_fmt);
STR_ELEM (t_fmt_ampm);
STR_ELEM (era);
STR_ELEM (era_year);
STR_ELEM (era_d_t_fmt);
STR_ELEM (era_d_fmt);

View File

@ -465,33 +465,34 @@ contains at least the following members, which can appear in any order:
@table @code
@item int tm_sec
This is the number of seconds after the minute, normally in the range
@code{0} to @code{59}. (The actual upper limit is @code{60}, to allow
@code{0} through @code{59}. (The actual upper limit is @code{60}, to allow
for leap seconds if leap second support is available.)
@cindex leap second
@item int tm_min
This is the number of minutes after the hour, in the range @code{0} to
This is the number of minutes after the hour, in the range @code{0} through
@code{59}.
@item int tm_hour
This is the number of hours past midnight, in the range @code{0} to
This is the number of hours past midnight, in the range @code{0} through
@code{23}.
@item int tm_mday
This is the day of the month, in the range @code{1} to @code{31}.
This is the day of the month, in the range @code{1} through @code{31}.
@item int tm_mon
This is the number of months since January, in the range @code{0} to
This is the number of months since January, in the range @code{0} through
@code{11}.
@item int tm_year
This is the number of years since @code{1900}.
@item int tm_wday
This is the number of days since Sunday, in the range @code{0} to @code{6}.
This is the number of days since Sunday, in the range @code{0} through
@code{6}.
@item int tm_yday
This is the number of days since January 1, in the range @code{0} to
This is the number of days since January 1, in the range @code{0} through
@code{365}.
@item int tm_isdst
@ -617,6 +618,7 @@ does so. @xref{Time Zone Functions}.
@comment time.h
@comment ANSI
@comment POSIX.2
@deftypefun size_t strftime (char *@var{s}, size_t @var{size}, const char *@var{template}, const struct tm *@var{brokentime})
This function is similar to the @code{sprintf} function (@pxref{Formatted
Input}), but the conversion specifications that can appear in the format
@ -626,9 +628,9 @@ time conversion (@pxref{Locales}).
Ordinary characters appearing in the @var{template} are copied to the
output string @var{s}; this can include multibyte character sequences.
Conversion specifiers are introduced by a @samp{%} character. Now can
follow an optional flag which can be one of the following. These flags
only affect the output of numbers:
Conversion specifiers are introduced by a @samp{%} character, followed
by an optional flag which can be one of the following. These flags,
which are GNU extensions, affect only the output of numbers:
@table @code
@item _
@ -638,9 +640,31 @@ The number is padded with spaces.
The number is not padded at all.
@end table
The default action is to pad the number with zeros. Following to the
flag comes the format specifier. The whole @samp{%} sequence is
replaced in the output string as follows:
The default action is to pad the number with zeros to keep it a constant
width. Numbers that do not have a range indicated below are never
padded, since there is no natural width for them.
An optional modifier can follow the optional flag. The modifiers, which
are POSIX.2 extensions, are:
@table @code
@item E
Use the locale's alternate representation for date and time. This
modifier applies to the @code{%c}, @code{%C}, @code{%x}, @code{%X},
@code{%y} and @code{%Y} format specifiers. In a Japanese locale, for
example, @code{%Ex} might yield a date format based on the Japanese
Emperors' reigns.
@item O
Use the locale's alternate numeric symbols for numbers. This modifier
applies only to numeric format specifiers.
@end table
A modifier is ignored if no alternate representation is available.
The conversion specifier ends with a format specifier taken from the
following list. The whole @samp{%} sequence is replaced in the output
string as follows:
@table @code
@item %a
@ -659,19 +683,38 @@ The full month name according to the current locale.
The preferred date and time representation for the current locale.
@item %C
The century of the year.
The century of the year. This is equivalent to the greatest integer not
greater than the year divided by 100.
This format is a POSIX.2 extension.
@item %d
The day of the month as a decimal number (range @code{01} to @code{31}).
The day of the month as a decimal number (range @code{01} through @code{31}).
@item %D
The date using the format @code{%m/%d/%y}.
This format is a POSIX.2 extension.
@item %e
The day of the month like with @code{%d}, but padded with blank (range
@code{ 1} through @code{31}).
This format is a POSIX.2 extension.
@item %g
The year corresponding to the ISO week number, but without the century
(range @code{00} through @code{99}). This has the same format and value
as @code{%y}, except that if the ISO week number (see @code{%V}) belongs
to the previous or next year, that year is used instead.
This format is a GNU extension.
@item %d
The day of the month like with @code{%d}, but padded with blank (range
@code{ 1} to @code{31}).
@item %G
The year corresponding to the ISO week number. This has the same format
and value as @code{%Y}, except that if the ISO week number (see
@code{%V}) belongs to the previous or next year, that year is used
instead.
This format is a GNU extension.
@ -679,50 +722,51 @@ This format is a GNU extension.
The abbreviated month name according to the current locale. The action
is the same as for @code{%b}.
This format is a GNU extension.
This format is a POSIX.2 extension.
@item %H
The hour as a decimal number, using a 24-hour clock (range @code{00} to
The hour as a decimal number, using a 24-hour clock (range @code{00} through
@code{23}).
@item %I
The hour as a decimal number, using a 12-hour clock (range @code{01} to
The hour as a decimal number, using a 12-hour clock (range @code{01} through
@code{12}).
@item %j
The day of the year as a decimal number (range @code{001} to @code{366}).
The day of the year as a decimal number (range @code{001} through @code{366}).
@item %k
The hour as a decimal number, using a 24-hour clock like @code{%H}, but
padded with blank (range @code{ 0} to @code{23}).
padded with blank (range @code{ 0} through @code{23}).
This format is a GNU extension.
@item %l
The hour as a decimal number, using a 12-hour clock like @code{%I}, but
padded with blank (range @code{ 0} to @code{12}).
padded with blank (range @code{ 1} through @code{12}).
This format is a GNU extension.
@item %m
The month as a decimal number (range @code{01} to @code{12}).
The month as a decimal number (range @code{01} through @code{12}).
@item %M
The minute as a decimal number.
The minute as a decimal number (range @code{00} through @code{59}).
@item %n
A single @samp{\n} (newline) character.
This format is a GNU extension.
This format is a POSIX.2 extension.
@item %p
Either @samp{am} or @samp{pm}, according to the given time value; or the
corresponding strings for the current locale.
Either @samp{AM} or @samp{PM}, according to the given time value; or the
corresponding strings for the current locale. Noon is treated as
@samp{PM} and midnight as @samp{AM}.
@item %r
The time in decinal numbers using the format @code{%I:%M:%S %p}.
The complete time using the AM/PM format of the current locale.
This format is a GNU extension.
This format is a POSIX.2 extension.
@item %R
The hour and minute in decimal numbers using the format @code{%H:%M}.
@ -730,47 +774,58 @@ The hour and minute in decimal numbers using the format @code{%H:%M}.
This format is a GNU extension.
@item %s
The seconds since the epoch, i.e., 1970-01-01 00:00:00 UTC. Note
that this value is the number of seconds between the epoch and the
current date as defined by the @code{localtime} system call.
The number of seconds since the epoch, i.e., since 1970-01-01 00:00:00 UTC.
Leap seconds are not counted unless leap second support is available.
This format is a GNU extension.
@item %S
The second as a decimal number.
The second as a decimal number (range @code{00} through @code{60}).
@item %t
A single @samp{\t} (tabulator) character.
This format is a GNU extension.
This format is a POSIX.2 extension.
@item %T
The time using decimal numbers using the format @code{%H:%M:%S}.
This format is a GNU extension.
This format is a POSIX.2 extension.
@item %u
The day of the week as a decimal number (range @code{1} through
@code{7}), Monday being @code{1}.
This format is a POSIX.2 extension.
@item %U
The week number of the current year as a decimal number, starting with
the first Sunday as the first day of the first week. All days preceding
the first Sunday in the year are considered to be in week @code{0}.
The week number of the current year as a decimal number (range @code{00}
through @code{53}), starting with the first Sunday as the first day of
the first week. Days preceding the first Sunday in the year are
considered to be in week @code{00}.
@item %V
The @w{ISO 8601:1988} week number as a decimal number (range @code{00}
to @code{53}). ISO weeks start with Monday and end with Sunday. Week
01 of a year is the first week which has the majority of its days in
that year; this is equivalent to the week containing the year's first
Thursday, and it is also equivalent to the week containing January 4.
Week 01 of a year can contain days from the previous year. The week
before week 01 of a year is the last week (52 or 53) of the previous
year even if it contains days from the new year.
The @w{ISO 8601:1988} week number as a decimal number (range @code{01}
through @code{53}). ISO weeks start with Monday and end with Sunday.
Week @code{01} of a year is the first week which has the majority of its
days in that year; this is equivalent to the week containing the year's
first Thursday, and it is also equivalent to the week containing January
4. Week @code{01} of a year can contain days from the previous year.
The week before week @code{01} of a year is the last week (@code{52} or
@code{53}) of the previous year even if it contains days from the new
year.
This format is a POSIX.2 extension.
@item %w
The day of the week as a decimal number, Sunday being @code{0}.
The day of the week as a decimal number (range @code{0} through
@code{6}), Sunday being @code{0}.
@item %W
The week number of the current year as a decimal number, starting with
the first Monday as the first day of the first week. All days preceding
the first Monday in the year are considered to be in week @code{0}.
The week number of the current year as a decimal number (range @code{00}
through @code{53}), starting with the first Monday as the first day of
the first week. All days preceding the first Monday in the year are
considered to be in week @code{00}.
@item %x
The preferred date representation for the current locale, but without the
@ -780,20 +835,22 @@ time.
The preferred time representation for the current locale, but with no date.
@item %y
The year as a decimal number, but without a century (range @code{00} to
@code{99}).
The year without a century as a decimal number (range @code{00} through
@code{99}). This is equivalent to the year modulo 100.
@item %Y
The year as a decimal number, including the century.
The year as a decimal number, using the Gregorian calendar. Years
before the year @code{1} are numbered @code{0}, @code{-1}, and so on.
@item %z
@w{RFC 822}/@w{ISO 8601:1988} style numeric time zone (e.g.,
@code{-0600} or @code{+0100}), or nothing if no time zone is
determinable.
This format is a GNU extension.
@item %Z
The time zone or name or abbreviation (empty if the time zone can't be
determined).
The time zone abbreviation (empty if the time zone can't be determined).
@item %%
A literal @samp{%} character.

View File

@ -32,7 +32,7 @@ aux := fpu_control setfpucw
# Build the -lm library.
extra-libs := libm
extra-libs-others = $(extra-libc)
extra-libs-others = $(extra-libs)
libm-support = k_standard s_lib_version s_matherr s_signgam
libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod \

View File

@ -1,4 +1,4 @@
# GNU libc message catalog of translations
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#

1616
po/nl.po

File diff suppressed because it is too large Load Diff

View File

@ -47,10 +47,3 @@ alpha-*-linux* libc=6
# We use libdb.so.2 for the interface in version 1.85 of the Berkeley DB code.
*-*-* libdb=2
# So far libcrypt.so.0 specifies the interface of the traditional `crypt'
# function. The libc distribution installs the stub `nocrypt' library
# with this interface. The separate crypt distribution (which cannot be
# legally exported from the USA) provides real DES encryption in a shared
# library libcrypt.so.0 with the same interface.
*-*-* libcrypt=0

View File

@ -50,3 +50,9 @@ include ../Rules
CFLAGS-_itoa.c = -Wno-unused
CFLAGS-tst-printf.c = -Wno-format
ifeq ($(stdio),libio)
ifneq (,$(filter %REENTRANT, $(defines)))
CPPFLAGS += -D_IO_MTSAFE_IO
endif
endif

View File

@ -7,8 +7,9 @@ DEFUN_VOID(main)
{
FILE *f;
int i;
const char filename[] = "/tmp/bugtest";
f = fopen("/tmp/bugtest", "w+");
f = fopen(filename, "w+");
for (i=0; i<9000; i++)
putc ('x', f);
fseek (f, 8180L, 0);
@ -45,6 +46,7 @@ DEFUN_VOID(main)
}
fclose(f);
remove(filename);
puts ("Test succeeded.");

View File

@ -14,6 +14,7 @@ DEFUN(main, (argc, argv),
FILE *f;
int i;
char buffer[31];
const char filename[] = "/tmp/bugtest";
while ((i = getopt (argc, argv, "rw")) != EOF)
switch (i)
@ -26,7 +27,7 @@ DEFUN(main, (argc, argv),
break;
}
f = fopen("/tmp/bugtest", "w+");
f = fopen(filename, "w+");
for (i=0; i<9000; i++) {
putc('x', f);
}
@ -36,6 +37,7 @@ DEFUN(main, (argc, argv),
fread(buffer, 1, 31, f);
fwrite(buffer, 1, 31, stdout);
fclose(f);
remove(filename);
if (!memcmp (buffer, "Where does this text come from?", 31))
{

View File

@ -17,7 +17,8 @@ DEFUN_VOID(main)
FILE *out;
static char inname[] = "/tmp/bug5.in";
static char outname[] = "/tmp/bug5.out";
int i;
char *printbuf;
int i, result;
/* Create a test file. */
in = fopen (inname, "w+");
@ -54,7 +55,11 @@ DEFUN_VOID(main)
puts ("There should be no further output from this test.");
fflush (stdout);
execlp ("cmp", "cmp", inname, outname, (char *) NULL);
perror ("execlp: cmp");
exit (1);
asprintf (&printbuf, "cmp %s %s", inname, outname);
result = system (printbuf);
remove (inname);
remove (outname);
exit ((result != 0));
}

View File

@ -8,7 +8,7 @@ main ()
n = -1;
ret = sscanf ("1000", "%lld", &n);
printf ("%%lld: ret: %d, n: %Ld, c: %c\n", ret, n);
printf ("%%lld: ret: %d, n: %Ld\n", ret, n);
if (ret != 1 || n != 1000L)
abort ();

View File

@ -58,10 +58,8 @@ DEFUN_VOID(main)
rstatus = pclose (input);
printf ("reading pclose returned %d\n", rstatus);
remove ("/tmp/tstpopen.tmp");
puts (wstatus | rstatus ? "Test FAILED!" : "Test succeeded.");
exit (wstatus | rstatus);
}

View File

@ -45,7 +45,7 @@ struct {
struct {
const char * in, * out, * resolved;
int errno;
int error;
} tests[] = {
/* 0 */
{"/", "/"},
@ -145,10 +145,10 @@ main (int argc, char ** argv)
continue;
}
if (!tests[i].out && errno != tests[i].errno)
if (!tests[i].out && errno != tests[i].error)
{
printf ("%s: flunked test %d (expected errno %d, got %d)\n",
argv[0], i, tests[i].errno, errno);
argv[0], i, tests[i].errno, error);
++errors;
continue;
}

View File

@ -52,17 +52,17 @@ ln2 = 6.931471805599453094287e-01L; /* 0x3FFE, 0xB17217F7, 0xD1CF79AC */
{
long double t;
u_int32_t se,i0,i1;
EXTRACT_LDOUBLE_WORDS(se,i0,i1,x);
GET_LDOUBLE_WORDS(se,i0,i1,x);
if(se<0x3fff) { /* x < 1 */
return (x-x)/(x-x);
} else if(hx >=0x401b) { /* x > 2**28 */
if(hx >=0x7fff) { /* x is inf of NaN */
} else if(se >=0x401b) { /* x > 2**28 */
if(se >=0x7fff) { /* x is inf of NaN */
return x+x;
} else
return __ieee754_logl(x)+ln2; /* acoshl(huge)=logl(2x) */
} else if(((se-0x3fff)|i0|i1)==0) {
return 0.0; /* acosh(1) = 0 */
} else if (hx > 0x4000) { /* 2**28 > x > 2 */
} else if (se > 0x4000) { /* 2**28 > x > 2 */
t=x*x;
return __ieee754_logl(2.0*x-one/(x+__ieee754_sqrtl(t-one)));
} else { /* 1<x<2 */

View File

@ -53,7 +53,6 @@ G = 3.57142857142857150787e-01L; /* 5/14 */
long double x;
#endif
{
int32_t hx;
long double r,s,t=0.0,w;
u_int32_t sign, se, x0, x1;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -39,30 +39,30 @@ Cambridge, MA 02139, USA. */
__m81_inline rettype \
__m81_u(func) args
/* Define the three variants of a math function that has a direct
implementation in the m68k fpu. FUNC is the name for C (which will be
suffixed with f and l for the float and long double version, resp). OP
is the name of the fpu operation (without leading f). */
#define __inline_mathop(func, op) \
__m81_defun (double, func, (double __mathop_x)) \
{ \
double __result; \
__asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
return __result; \
}
#define __inline_mathopf(func, op) \
__m81_defun (float, func, (float __mathop_x)) \
} \
__m81_defun (float, func##f, (float __mathop_x)) \
{ \
float __result; \
__asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
return __result; \
}
#define __inline_mathopl(func, op) \
__m81_defun (long double, func, (long double __mathop_x)) \
} \
__m81_defun (long double, func##l, (long double __mathop_x)) \
{ \
long double __result; \
__asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
return __result; \
}
/* ieee style elementary functions */
__inline_mathop(__ieee754_acos, acos)
__inline_mathop(__ieee754_asin, asin)
@ -74,28 +74,6 @@ __inline_mathop(__ieee754_log, logn)
__inline_mathop(__ieee754_sqrt, sqrt)
__inline_mathop(__ieee754_atanh, atanh)
/* ieee style elementary float functions */
__inline_mathopf(__ieee754_acosf, acos)
__inline_mathopf(__ieee754_asinf, asin)
__inline_mathopf(__ieee754_coshf, cosh)
__inline_mathopf(__ieee754_sinhf, sinh)
__inline_mathopf(__ieee754_expf, etox)
__inline_mathopf(__ieee754_log10f, log10)
__inline_mathopf(__ieee754_logf, logn)
__inline_mathopf(__ieee754_sqrtf, sqrt)
__inline_mathopf(__ieee754_atanhf, atan)
/* ieee style elementary long double functions */
__inline_mathopl(__ieee754_acosl, acos)
__inline_mathopl(__ieee754_asinl, asin)
__inline_mathopl(__ieee754_coshl, cosh)
__inline_mathopl(__ieee754_sinhl, sinh)
__inline_mathopl(__ieee754_expl, etox)
__inline_mathopl(__ieee754_log10l, log10)
__inline_mathopl(__ieee754_logl, logn)
__inline_mathopl(__ieee754_sqrtl, sqrt)
__inline_mathopl(__ieee754_atanhl, atan)
__inline_mathop(__atan, atan)
__inline_mathop(__cos, cos)
__inline_mathop(__sin, sin)
@ -110,517 +88,226 @@ __inline_mathop(__log1p, lognp1)
__inline_mathop(__logb, log2)
__inline_mathop(__significand, getman)
__inline_mathopf(__atanf, atan)
__inline_mathopf(__cosf, cos)
__inline_mathopf(__sinf, sin)
__inline_mathopf(__tanf, tan)
__inline_mathopf(__tanhf, tanh)
__inline_mathopf(__fabsf, abs)
__inline_mathopf(__sqrtf, sqrt)
/* This macro contains the definition for the rest of the inline
functions, using __FLOAT_TYPE as the domain type and __S as the suffix
for the function names. */
__inline_mathopf(__rintf, int)
__inline_mathopf(__expm1f, etoxm1)
__inline_mathopf(__log1pf, lognp1)
__inline_mathopf(__logbf, log2)
__inline_mathopf(__significandf, getman)
__inline_mathopl(__atanl, atan)
__inline_mathopl(__cosl, cos)
__inline_mathopl(__sinl, sin)
__inline_mathopl(__tanl, tan)
__inline_mathopl(__tanhl, tanh)
__inline_mathopl(__fabsl, abs)
__inline_mathopl(__sqrtl, sqrt)
__inline_mathopl(__rintl, int)
__inline_mathopl(__expm1l, etoxm1)
__inline_mathopl(__log1pl, lognp1)
__inline_mathopl(__logbl, log2)
__inline_mathopl(__significandl, getman)
__m81_defun (double, __ieee754_remainder, (double __x, double __y))
{
double __result;
__asm("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x));
return __result;
#define __inline_functions(__float_type, __s) \
__m81_defun (__float_type, \
__ieee754_remainder##__s, (__float_type __x, __float_type __y)) \
{ \
__float_type __result; \
__asm("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); \
return __result; \
} \
\
__m81_defun (__float_type, \
__ieee754_fmod##__s, (__float_type __x, __float_type __y)) \
{ \
__float_type __result; \
__asm("fmod%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); \
return __result; \
} \
\
__m81_defun (__float_type, \
__ieee754_atan2##__s, (__float_type __y, __float_type __x)) \
{ \
__float_type __pi, __pi_2; \
\
__asm ("fmovecr%.x %#0, %0" : "=f" (__pi)); \
__asm ("fscale%.w %#-1, %0" : "=f" (__pi_2) : "0" (__pi)); \
if (__x > 0) \
{ \
if (__y > 0) \
{ \
if (__x > __y) \
return __m81_u(__atan##__s) (__y / __x); \
else \
return __pi_2 - __m81_u(__atan##__s) (__x / __y); \
} \
else \
{ \
if (__x > -__y) \
return __m81_u(__atan##__s) (__y / __x); \
else \
return -__pi_2 - __m81_u(__atan##__s) (__x / __y); \
} \
} \
else \
{ \
if (__y > 0) \
{ \
if (-__x < __y) \
return __pi + __m81_u(__atan##__s) (__y / __x); \
else \
return __pi_2 - __m81_u(__atan##__s) (__x / __y); \
} \
else \
{ \
if (-__x > -__y) \
return -__pi + __m81_u(__atan##__s) (__y / __x); \
else \
return -__pi_2 - __m81_u(__atan##__s) (__x / __y); \
} \
} \
} \
\
__m81_inline __float_type \
__m81_u(__frexp##__s)(__float_type __value, int *__expptr) \
{ \
__float_type __mantissa, __exponent; \
int __iexponent; \
if (__value == 0.0) \
{ \
*__expptr = 0; \
return __value; \
} \
__asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \
__iexponent = (int) __exponent + 1; \
*__expptr = __iexponent; \
__asm("fscale%.l %2, %0" : "=f" (__mantissa) \
: "0" (__value), "dmi" (-__iexponent)); \
return __mantissa; \
} \
\
__m81_defun (__float_type, __floor##__s, (__float_type __x)) \
{ \
__float_type __result; \
unsigned long int __ctrl_reg; \
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \
/* Set rounding towards negative infinity. */ \
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \
: "dmi" ((__ctrl_reg & ~0x10) | 0x20)); \
/* Convert X to an integer, using -Inf rounding. */ \
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \
/* Restore the previous rounding mode. */ \
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \
: "dmi" (__ctrl_reg)); \
return __result; \
} \
\
__m81_defun (__float_type, \
__ieee754_pow##__s, (__float_type __x, __float_type __y)) \
{ \
__float_type __result; \
if (__x == 0.0) \
{ \
if (__y <= 0.0) \
__result = 0.0 / 0.0; \
else \
__result = 0.0; \
} \
else if (__y == 0.0 || __x == 1.0) \
__result = 1.0; \
else if (__y == 1.0) \
__result = __x; \
else if (__y == 2.0) \
__result = __x * __x; \
else if (__x == 10.0) \
__asm("ftentox%.x %1, %0" : "=f" (__result) : "f" (__y)); \
else if (__x == 2.0) \
__asm("ftwotox%.x %1, %0" : "=f" (__result) : "f" (__y)); \
else if (__x < 0.0) \
{ \
__float_type __temp = __m81_u (__rint##__s) (__y); \
if (__y == __temp) \
{ \
int __i = (int) __y; \
__result = (__m81_u(__ieee754_exp##__s) \
(__y * __m81_u(__ieee754_log##__s) (-__x))); \
if (__i & 1) \
__result = -__result; \
} \
else \
__result = 0.0 / 0.0; \
} \
else \
__result = (__m81_u(__ieee754_exp##__s) \
(__y * __m81_u(__ieee754_log##__s) (__x))); \
return __result; \
} \
\
__m81_defun (__float_type, __ceil##__s, (__float_type __x)) \
{ \
__float_type __result; \
unsigned long int __ctrl_reg; \
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \
/* Set rounding towards positive infinity. */ \
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \
: "dmi" (__ctrl_reg | 0x30)); \
/* Convert X to an integer, using +Inf rounding. */ \
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \
/* Restore the previous rounding mode. */ \
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \
: "dmi" (__ctrl_reg)); \
return __result; \
} \
\
__m81_inline __float_type \
__m81_u(__modf##__s)(__float_type __value, __float_type *__iptr) \
{ \
__float_type __modf_int; \
__asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value)); \
*__iptr = __modf_int; \
return __value - __modf_int; \
} \
\
__m81_defun (int, __isinf##__s, (__float_type __value)) \
{ \
/* There is no branch-condition for infinity, \
so we must extract and examine the condition codes manually. */ \
unsigned long int __fpsr; \
__asm("ftst%.x %1\n" \
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \
return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0; \
} \
\
__m81_defun (int, __isnan##__s, (__float_type __value)) \
{ \
char __result; \
__asm("ftst%.x %1\n" \
"fsun %0" : "=dm" (__result) : "f" (__value)); \
return __result; \
} \
\
__m81_defun (int, __finite##__s, (__float_type __value)) \
{ \
/* There is no branch-condition for infinity, so we must extract and \
examine the condition codes manually. */ \
unsigned long int __fpsr; \
__asm ("ftst%.x %1\n" \
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \
return (__fpsr & (3 << 24)) == 0; \
} \
\
__m81_defun (int, __ilogb##__s, (__float_type __x)) \
{ \
__float_type __result; \
if (__x == 0.0) \
return 0x80000001; \
__asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x)); \
return (int) __result; \
} \
\
__m81_defun (__float_type, \
__ieee754_scalb##__s, (__float_type __x, __float_type __n)) \
{ \
__float_type __result; \
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__n), "0" (__x)); \
return __result; \
} \
\
__m81_defun (__float_type, __scalbn##__s, (__float_type __x, int __n)) \
{ \
__float_type __result; \
__asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \
return __result; \
}
__m81_defun (double, __ldexp, (double __x, int __e))
{
double __result;
double __double_e = (double) __e;
__asm("fscale%.x %1, %0" : "=f" (__result) : "f" (__double_e), "0" (__x));
return __result;
}
__m81_defun (double, __ieee754_fmod, (double __x, double __y))
{
double __result;
__asm("fmod%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x));
return __result;
}
__m81_inline double
__m81_u(__frexp)(double __value, int *__expptr)
{
double __mantissa, __exponent;
__asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value));
__asm("fgetman%.x %1, %0" : "=f" (__mantissa) : "f" (__value));
*__expptr = (int) __exponent;
return __mantissa;
}
__m81_defun (double, __floor, (double __x))
{
double __result;
unsigned long int __ctrl_reg;
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));
/* Set rounding towards negative infinity. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" ((__ctrl_reg & ~0x10) | 0x20));
/* Convert X to an integer, using -Inf rounding. */
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));
/* Restore the previous rounding mode. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg));
return __result;
}
__m81_defun (double, __ieee754_pow, (double __x, double __y))
{
double __result;
if (__x == 0.0)
{
if (__y <= 0.0)
__result = 0.0 / 0.0;
else
__result = 0.0;
}
else if (__y == 0.0 || __x == 1.0)
__result = 1.0;
else if (__y == 1.0)
__result = __x;
else if (__y == 2.0)
__result = __x * __x;
else if (__x == 10.0)
__asm("ftentox%.x %1, %0" : "=f" (__result) : "f" (__y));
else if (__x == 2.0)
__asm("ftwotox%.x %1, %0" : "=f" (__result) : "f" (__y));
else if (__x < 0.0)
{
double __temp = __m81_u (__rint) (__y);
if (__y == __temp)
{
int i = (int) __y;
__result = __m81_u(__ieee754_exp)(__y * __m81_u(__ieee754_log)(-__x));
if (i & 1)
__result = -__result;
}
else
__result = 0.0 / 0.0;
}
else
__result = __m81_u(__ieee754_exp)(__y * __m81_u(__ieee754_log)(__x));
return __result;
}
__m81_defun (double, __ceil, (double __x))
{
double __result;
unsigned long int __ctrl_reg;
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));
/* Set rounding towards positive infinity. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg | 0x30));
/* Convert X to an integer, using +Inf rounding. */
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));
/* Restore the previous rounding mode. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg));
return __result;
}
__m81_inline double
__m81_u(__modf)(double __value, double *__iptr)
{
double __modf_int;
__asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value));
*__iptr = __modf_int;
return __value - __modf_int;
}
__m81_defun (int, __isinf, (double __value))
{
/* There is no branch-condition for infinity,
so we must extract and examine the condition codes manually. */
unsigned long int __fpsr;
__asm("ftst%.x %1\n"
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));
return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0;
}
__m81_defun (int, __isnan, (double __value))
{
char __result;
__asm("ftst%.x %1\n"
"fsun %0" : "=dm" (__result) : "f" (__value));
return __result;
}
__m81_defun (int, __finite, (double __value))
{
/* There is no branch-condition for infinity, so we must extract and
examine the condition codes manually. */
unsigned long int __fpsr;
__asm ("ftst%.x %1\n"
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));
return (__fpsr & (3 << 24)) == 0;
}
__m81_defun (int, __ilogb, (double __x))
{
double __result;
__asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x));
return (int) __result;
}
__m81_defun (double, __ieee754_scalb, (double __x, double __n))
{
double __result;
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__n), "0" (__x));
return __result;
}
__m81_defun (double, __scalbn, (double __x, int __n))
{
double __result;
double __double_n = (double) __n;
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__double_n), "0" (__x));
return __result;
}
__m81_defun (float, __ieee754_remainderf, (float __x, float __y))
{
float __result;
__asm("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x));
return __result;
}
__m81_defun (float, __ldexpf, (float __x, int __e))
{
float __result;
float __float_e = (float) __e;
__asm("fscale%.x %1, %0" : "=f" (__result) : "f" (__float_e), "0" (__x));
return __result;
}
__m81_defun (float, __ieee754_fmodf, (float __x, float __y))
{
float __result;
__asm("fmod%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x));
return __result;
}
__m81_inline float
__m81_u(__frexpf)(float __value, int *__expptr)
{
float __mantissa, __exponent;
__asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value));
__asm("fgetman%.x %1, %0" : "=f" (__mantissa) : "f" (__value));
*__expptr = (int) __exponent;
return __mantissa;
}
__m81_defun (float, __floorf, (float __x))
{
float __result;
unsigned long int __ctrl_reg;
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));
/* Set rounding towards negative infinity. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" ((__ctrl_reg & ~0x10) | 0x20));
/* Convert X to an integer, using -Inf rounding. */
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));
/* Restore the previous rounding mode. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg));
return __result;
}
__m81_defun (float, __ieee754_powf, (float __x, float __y))
{
float __result;
if (__x == 0.0f)
{
if (__y <= 0.0f)
__result = 0.0f / 0.0f;
else
__result = 0.0f;
}
else if (__y == 0.0f || __x == 1.0f)
__result = 1.0;
else if (__y == 1.0f)
__result = __x;
else if (__y == 2.0f)
__result = __x * __x;
else if (__x == 10.0f)
__asm("ftentox%.x %1, %0" : "=f" (__result) : "f" (__y));
else if (__x == 2.0f)
__asm("ftwotox%.x %1, %0" : "=f" (__result) : "f" (__y));
else if (__x < 0.0f)
{
float __temp = __m81_u(__rintf)(__y);
if (__y == __temp)
{
int i = (int) __y;
__result = __m81_u(__ieee754_expf)(__y * __m81_u(__ieee754_logf)(-__x));
if (i & 1)
__result = -__result;
}
else
__result = 0.0f / 0.0f;
}
else
__result = __m81_u(__ieee754_expf)(__y * __m81_u(__ieee754_logf)(__x));
return __result;
}
__m81_defun (float, __ceilf, (float __x))
{
float __result;
unsigned long int __ctrl_reg;
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));
/* Set rounding towards positive infinity. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg | 0x30));
/* Convert X to an integer, using +Inf rounding. */
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));
/* Restore the previous rounding mode. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg));
return __result;
}
__m81_inline float
__m81_u(__modff)(float __value, float *__iptr)
{
float __modf_int;
__asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value));
*__iptr = __modf_int;
return __value - __modf_int;
}
__m81_defun (int, __isinff, (float __value))
{
/* There is no branch-condition for infinity,
so we must extract and examine the condition codes manually. */
unsigned long int __fpsr;
__asm("ftst%.x %1\n"
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));
return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0;
}
__m81_defun (int, __isnanf, (float __value))
{
char __result;
__asm("ftst%.x %1\n"
"fsun %0" : "=dm" (__result) : "f" (__value));
return __result;
}
__m81_defun (int, __finitef, (float __value))
{
/* There is no branch-condition for infinity, so we must extract and
examine the condition codes manually. */
unsigned long int __fpsr;
__asm ("ftst%.x %1\n"
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));
return (__fpsr & (3 << 24)) == 0;
}
__m81_defun (int, __ilogbf, (float __x))
{
float __result;
__asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x));
return (int) __result;
}
__m81_defun (float, __ieee754_scalbf, (float __x, float __n))
{
float __result;
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__n), "0" (__x));
return __result;
}
__m81_defun (float, __scalbnf, (float __x, int __n))
{
float __result;
float __float_n = (float) __n;
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__float_n), "0" (__x));
return __result;
}
__m81_defun (long double, __ieee754_remainderl, (long double __x,
long double __y))
{
long double __result;
__asm ("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x));
return __result;
}
__m81_defun (long double, __ldexpl, (long double __x, int __e))
{
long double __result;
long double __float_e = (long double) __e;
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__float_e), "0" (__x));
return __result;
}
__m81_defun (long double, __ieee754_fmodl, (long double __x, long double __y))
{
long double __result;
__asm("fmod%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x));
return __result;
}
__m81_inline long double
__m81_u(__frexpl)(long double __value, int *__expptr)
{
long double __mantissa, __exponent;
__asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value));
__asm("fgetman%.x %1, %0" : "=f" (__mantissa) : "f" (__value));
*__expptr = (int) __exponent;
return __mantissa;
}
__m81_defun (long double, __floorl, (long double __x))
{
long double __result;
unsigned long int __ctrl_reg;
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));
/* Set rounding towards negative infinity. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" ((__ctrl_reg & ~0x10) | 0x20));
/* Convert X to an integer, using -Inf rounding. */
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));
/* Restore the previous rounding mode. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg));
return __result;
}
__m81_defun (long double, __ieee754_powl, (long double __x, long double __y))
{
long double __result;
if (__x == 0.0l)
{
if (__y <= 0.0l)
__result = 0.0l / 0.0l;
else
__result = 0.0l;
}
else if (__y == 0.0l || __x == 1.0l)
__result = 1.0;
else if (__y == 1.0l)
__result = __x;
else if (__y == 2.0l)
__result = __x * __x;
else if (__x == 10.0l)
__asm("ftentox%.x %1, %0" : "=f" (__result) : "f" (__y));
else if (__x == 2.0l)
__asm("ftwotox%.x %1, %0" : "=f" (__result) : "f" (__y));
else if (__x < 0.0l)
{
long double __temp = __m81_u(__rintl)(__y);
if (__y == __temp)
{
int i = (int) __y;
__result
= __m81_u(__ieee754_expl)(__y * __m81_u(__ieee754_logl)(-__x));
if (i & 1)
__result = -__result;
}
else
__result = 0.0l / 0.0l;
}
else
__result = __m81_u(__ieee754_expl)(__y * __m81_u(__ieee754_logl)(__x));
return __result;
}
__m81_defun (long double, __ceill, (long double __x))
{
long double __result;
unsigned long int __ctrl_reg;
__asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));
/* Set rounding towards positive infinity. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg | 0x30));
/* Convert X to an integer, using +Inf rounding. */
__asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));
/* Restore the previous rounding mode. */
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */
: "dmi" (__ctrl_reg));
return __result;
}
__m81_inline long double
__m81_u(__modfl)(long double __value, long double *__iptr)
{
long double __modf_int;
__asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value));
*__iptr = __modf_int;
return __value - __modf_int;
}
__m81_defun (int, __isinfl, (long double __value))
{
/* There is no branch-condition for infinity,
so we must extract and examine the condition codes manually. */
unsigned long int __fpsr;
__asm("ftst%.x %1\n"
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));
return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0;
}
__m81_defun (int, __isnanl, (long double __value))
{
char __result;
__asm("ftst%.x %1\n"
"fsun %0" : "=dm" (__result) : "f" (__value));
return __result;
}
__m81_defun (int, __finitel, (long double __value))
{
/* There is no branch-condition for infinity, so we must extract and
examine the condition codes manually. */
unsigned long int __fpsr;
__asm ("ftst%.x %1\n"
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));
return (__fpsr & (3 << 24)) == 0;
}
__m81_defun (int, __ilogbl, (long double __x))
{
long double __result;
__asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x));
return (int) __result;
}
__m81_defun (long double, __ieee754_scalbl, (long double __x, long double __n))
{
long double __result;
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__n), "0" (__x));
return __result;
}
__m81_defun (long double, __scalbnl, (long double __x, int __n))
{
long double __result;
long double __float_n = (long double) __n;
__asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__float_n), "0" (__x));
return __result;
}
/* This defines the three variants of the inline functions. */
__inline_functions (double, )
__inline_functions (float, f)
__inline_functions (long double, l)
#undef __inline_functions
#endif /* GCC. */

View File

@ -1,39 +0,0 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#define __NO_M81_MATH_INLINES
#include <math.h>
#ifndef FUNC
#define FUNC ldexp
#endif
#ifndef float_type
#define float_type double
#endif
#define __CONCATX(a,b) __CONCAT(a,b)
float_type
DEFUN(__CONCATX(__,FUNC), (x, exp), float_type x AND int exp)
{
return __m81_u(__CONCATX(__,FUNC))(x, exp);
}
#define weak_aliasx(a,b) weak_alias(a,b)
weak_aliasx (__CONCATX(__,FUNC), FUNC)

View File

@ -1,5 +0,0 @@
#ifndef FUNC
#define FUNC ldexpf
#endif
#define float_type float
#include <s_ldexp.c>

View File

@ -1,5 +0,0 @@
#ifndef FUNC
#define FUNC ldexpl
#endif
#define float_type long double
#include <s_ldexp.c>

View File

@ -1,2 +1,40 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#define __NO_M81_MATH_INLINES
#include <math.h>
#ifndef FUNC
#define FUNC scalbn
#include <s_ldexp.c>
#endif
#ifndef float_type
#define float_type double
#endif
#define __CONCATX(a,b) __CONCAT(a,b)
float_type
DEFUN(__CONCATX(__,FUNC), (x, exp), float_type x AND int exp)
{
return __m81_u(__CONCATX(__,FUNC))(x, exp);
}
#define weak_aliasx(a,b) weak_alias(a,b)
weak_aliasx (__CONCATX(__,FUNC), FUNC)

View File

@ -1,2 +1,6 @@
#ifndef FUNC
#define FUNC scalbnf
#include <s_ldexpf.c>
#endif
#define float_type float
#include <s_scalbn.c>

View File

@ -1,2 +1,6 @@
#ifndef FUNC
#define FUNC scalbnl
#include <s_ldexpl.c>
#endif
#define float_type long double
#include <s_scalbn.c>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -16,22 +16,19 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stdio.h>
#include <string.h>
#include <pwd.h>
extern int EXFUN(geteuid, (NOARGS));
/* Return the username of the caller.
If S is not NULL, it points to a buffer of at least L_cuserid bytes
into which the name is copied; otherwise, a static buffer is used. */
char *
DEFUN(cuserid, (s), char *s)
cuserid (s)
char *s;
{
static char name[L_cuserid];
struct passwd *pwent = getpwuid(geteuid());
struct passwd *pwent = getpwuid (geteuid ());
if (pwent == NULL)
{
@ -42,5 +39,5 @@ DEFUN(cuserid, (s), char *s)
if (s == NULL)
s = name;
return strcpy(s, pwent->pw_name);
return strcpy (s, pwent->pw_name);
}

View File

@ -56,7 +56,7 @@ __gettimeofday (tv, tz)
save_tzname[0] = __tzname[0];
save_tzname[1] = __tzname[1];
tmp = localtime (&timer, &tm);
tmp = localtime_r (&timer, &tm);
tz->tz_minuteswest = __timezone / 60;
tz->tz_dsttime = __daylight;

View File

@ -43,4 +43,4 @@ extern void __setfpucw __P ((fpu_control_t));
__END_DECLS
#endif /* _M68K_FPU_CONTROL_H */
#endif /* _FPU_CONTROL_H */

View File

@ -16,6 +16,8 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
/* Because the Linux version is in fact i386/ELF and the start.? file
for this system (sysdeps/i386/elf/start.S) is also used by The Hurd
and therefore this files must not contain the definition of the
@ -43,9 +45,7 @@ _errno = errno /* This name is expected by hj libc.so.5 startup code. */
The code for Linux is almost identical to the canonical Unix/i386
code, except that the error number in %eax is negated. */
.globl __syscall_error
.type __syscall_error,@function
__syscall_error:
ENTRY (__syscall_error)
negl %eax
#define __syscall_error __syscall_error_1
@ -54,10 +54,7 @@ __syscall_error:
#endif /* !PIC */
#ifdef _LIBC_REENTRANT
.globl __errno_location
.type __errno_location,@function
__errno_location:
ENTRY (__errno_location)
#ifdef PIC
call .L2
.L2: popl %ecx
@ -69,4 +66,3 @@ __errno_location:
ret
.Lfe1:
.size __errno_location, .Lfe1-__errno_location
#endif

View File

@ -17,6 +17,9 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#ifndef _LINUX_I386_SYSDEP_H
#define _LINUX_I386_SYSDEP_H 1
/* There is some commonality. */
#include <sysdeps/unix/i386/sysdep.h>
@ -179,3 +182,5 @@ syscall_error: \
#define _POPARGS_5 _POPARGS_4; popl %edi
#endif /* ASSEMBLER */
#endif /* linux/i386/sysdep.h */

View File

@ -62,7 +62,6 @@ __syscall_error:
.size __syscall_error, . - __syscall_error
#endif /* PIC */
#ifdef _LIBC_REENTRANT
.globl __errno_location
.type __errno_location, @function
__errno_location:
@ -73,4 +72,3 @@ __errno_location:
#endif
rts
.size __errno_location, . - __errno_location
#endif

View File

@ -133,11 +133,19 @@ ydhms_tm_diff (year, yday, hour, min, sec, tp)
int year, yday, hour, min, sec;
const struct tm *tp;
{
time_t ay = year + (time_t) (TM_YEAR_BASE - 1);
time_t by = tp->tm_year + (time_t) (TM_YEAR_BASE - 1);
time_t intervening_leap_days =
(ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400);
time_t years = ay - by;
/* Compute intervening leap days correctly even if year is negative.
Take care to avoid int overflow. time_t overflow is OK, since
only the low order bits of the correct time_t answer are needed.
Don't convert to time_t until after all divisions are done, since
time_t might be unsigned. */
int a4 = (year >> 2) + (TM_YEAR_BASE >> 2) - ! (year & 3);
int b4 = (tp->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (tp->tm_year & 3);
int a100 = a4 / 25 - (a4 % 25 < 0);
int b100 = b4 / 25 - (b4 % 25 < 0);
int a400 = a100 >> 2;
int b400 = b100 >> 2;
int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
time_t years = year - (time_t) tp->tm_year;
time_t days = (365 * years + intervening_leap_days
+ (yday - tp->tm_yday));
return (60 * (60 * (24 * days + (hour - tp->tm_hour))

View File

@ -23,8 +23,10 @@ Cambridge, MA 02139, USA. */
#ifdef _LIBC
# define HAVE_LIMITS_H 1
# define HAVE_MBLEN 1
# define HAVE_MBRLEN 1
# define HAVE_TM_GMTOFF 1
# define HAVE_TM_ZONE 1
# define MULTIBYTE_IS_FORMAT_SAFE 1
# define STDC_HEADERS 1
# include <ansidecl.h>
# include "../locale/localeinfo.h"
@ -43,8 +45,24 @@ Cambridge, MA 02139, USA. */
# endif
#endif
#if HAVE_MBLEN
# include <ctype.h>
/* Do multibyte processing if multibytes are supported, unless
multibyte sequences are safe in formats. Multibyte sequences are
safe if they cannot contain byte sequences that look like format
conversion specifications. The GNU C Library uses UTF8 multibyte
encoding, which is safe for formats, but strftime.c can be used
with other C libraries that use unsafe encodings. */
#define DO_MULTIBYTE (HAVE_MBLEN && ! MULTIBYTE_IS_FORMAT_SAFE)
#if DO_MULTIBYTE
# if HAVE_MBRLEN
# include <wchar.h>
# else
/* Simulate mbrlen with mblen as best we can. */
# define mbstate_t int
# define mbrlen(s, n, ps) mblen (s, n)
# define mbsinit(ps) (*(ps) == 0)
# endif
static const mbstate_t mbstate_zero;
#endif
#if HAVE_LIMITS_H
@ -91,6 +109,13 @@ Cambridge, MA 02139, USA. */
#define TM_YEAR_BASE 1900
#ifndef __isleap
/* Nonzero if YEAR is a leap year (every 4 years,
except every 100th isn't, and every 400th is). */
#define __isleap(year) \
((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
#endif
#ifdef _LIBC
# define gmtime_r __gmtime_r
@ -132,9 +157,6 @@ localtime_r (t, tp)
#endif /* ! defined (_LIBC) */
static unsigned int week __P ((const struct tm *const, int, int));
#define add(n, f) \
do \
{ \
@ -159,14 +181,17 @@ tm_diff (a, b)
const struct tm *a;
const struct tm *b;
{
int ay = a->tm_year + TM_YEAR_BASE - 1;
int by = b->tm_year + TM_YEAR_BASE - 1;
/* Divide years by 100, rounding towards minus infinity. */
int ac = ay / 100 - (ay % 100 < 0);
int bc = by / 100 - (by % 100 < 0);
int intervening_leap_days =
((ay >> 2) - (by >> 2)) - (ac - bc) + ((ac >> 2) - (bc >> 2));
int years = ay - by;
/* Compute intervening leap days correctly even if year is negative.
Take care to avoid int overflow in leap day calculations,
but it's OK to assume that A and B are close to each other. */
int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
int a100 = a4 / 25 - (a4 % 25 < 0);
int b100 = b4 / 25 - (b4 % 25 < 0);
int a400 = a100 >> 2;
int b400 = b100 >> 2;
int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
int years = a->tm_year - b->tm_year;
int days = (365 * years + intervening_leap_days
+ (a->tm_yday - b->tm_yday));
return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
@ -177,45 +202,30 @@ tm_diff (a, b)
/* Return the week in the year specified by TP,
with weeks starting on STARTING_DAY. */
#ifdef __GNUC__
/* The number of days from the first day of the first ISO week of this
year to the year day YDAY with week day WDAY. ISO weeks start on
Monday; the first ISO week has the year's first Thursday. YDAY may
be as small as YDAY_MINIMUM. */
#define ISO_WEEK_START_WDAY 1 /* Monday */
#define ISO_WEEK1_WDAY 4 /* Thursday */
#define YDAY_MINIMUM (-366)
static int iso_week_days __P ((int, int));
#ifdef __GNUC__
inline
#endif
static unsigned int
week (tp, starting_day, max_preceding)
const struct tm *const tp;
int starting_day;
int max_preceding;
static int
iso_week_days (yday, wday)
int yday;
int wday;
{
int wday, dl, base;
wday = tp->tm_wday - starting_day;
if (wday < 0)
wday += 7;
/* Set DL to the day in the year of the first day of the week
containing the day specified in TP. */
dl = tp->tm_yday - wday;
/* For the computation following ISO 8601:1988 we set the number of
the week containing January 1st to 1 if this week has more than
MAX_PRECEDING days in the new year. For ISO 8601 this number is
3, for the other representation it is 7 (i.e., not to be
fulfilled). */
base = ((dl + 7) % 7) > max_preceding ? 1 : 0;
/* If DL is negative we compute the result as 0 unless we have to
compute it according ISO 8601. In this case we have to return 53
or 1 if the week containing January 1st has less than 4 days in
the new year or not. If DL is not negative we calculate the
number of complete weeks for our week (DL / 7) plus 1 (because
only for DL < 0 we are in week 0/53 and plus the number of the
first week computed in the last step. */
return dl < 0 ? (dl < -max_preceding ? 53 : base)
: base + 1 + dl / 7;
/* Add enough to the first operand of % to make it nonnegative. */
int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
return (yday
- (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
+ ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
}
#ifndef _NL_CURRENT
static char const weekday_name[][10] =
{
@ -254,8 +264,8 @@ strftime (s, maxsize, format, tp)
size_t am_len = strlen(a_month);
size_t ap_len = strlen (ampm);
const char * const*alt_digits = &_NL_CURRENT (LC_TIME, ALT_DIGITS);
int nr_alt_digits = (_NL_CURRENT (LC_TIME, ALT_DIGITS + 1) - *alt_digits);
const char *alt_digits = _NL_CURRENT (LC_TIME, ALT_DIGITS);
const char *end_alt_digits = _NL_CURRENT (LC_TIME, ALT_DIGITS + 1);
#else
const char *const f_wkday = weekday_name[tp->tm_wday];
const char *const f_month = month_name[tp->tm_mon];
@ -268,9 +278,6 @@ strftime (s, maxsize, format, tp)
#endif
size_t wkday_len = strlen (f_wkday);
size_t month_len = strlen (f_month);
const unsigned int y_week0 = week (tp, 0, 7);
const unsigned int y_week1 = week (tp, 1, 7);
const unsigned int y_week2 = week (tp, 1, 3);
const char *zone;
size_t zonelen;
register size_t i = 0;
@ -285,8 +292,8 @@ strftime (s, maxsize, format, tp)
if (!(zone && *zone) && tp->tm_isdst >= 0)
zone = tzname[tp->tm_isdst];
#endif
if (!(zone && *zone))
zone = "???";
if (! zone)
zone = ""; /* POSIX.2 requires the empty string here. */
zonelen = strlen (zone);
@ -297,50 +304,101 @@ strftime (s, maxsize, format, tp)
for (f = format; *f != '\0'; ++f)
{
enum { pad_zero, pad_space, pad_none } pad; /* Padding for number. */
unsigned int digits; /* Max digits for numeric format. */
unsigned int number_value; /* Numeric value to be printed. */
int pad; /* Padding for number ('-', '_', or 0). */
int modifier; /* Field modifier ('E', 'O', or 0). */
int digits; /* Max digits for numeric format. */
int number_value; /* Numeric value to be printed. */
int negative_number; /* 1 if the number is negative. */
const char *subfmt = "";
enum { none, alternate, era } modifier;
const char *subfmt;
char *bufp;
char buf[1 + (sizeof (int) < sizeof (time_t)
? INT_STRLEN_BOUND (time_t)
: INT_STRLEN_BOUND (int))];
#if HAVE_MBLEN
if (!isascii (*f))
{
/* Non-ASCII, may be a multibyte. */
int len = mblen (f, strlen (f));
if (len > 0)
{
cpy(len, f);
continue;
}
}
#endif
#if DO_MULTIBYTE
switch (*f)
{
case '%':
break;
case '\a': case '\b': case '\t': case '\n':
case '\v': case '\f': case '\r':
case ' ': case '!': case '"': case '#': case '&': case'\'':
case '(': case ')': case '*': case '+': case ',': case '-':
case '.': case '/': case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7': case '8': case '9':
case ':': case ';': case '<': case '=': case '>': case '?':
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
case 'Y': case 'Z': case '[': case'\\': case ']': case '^':
case '_': case 'a': case 'b': case 'c': case 'd': case 'e':
case 'f': case 'g': case 'h': case 'i': case 'j': case 'k':
case 'l': case 'm': case 'n': case 'o': case 'p': case 'q':
case 'r': case 's': case 't': case 'u': case 'v': case 'w':
case 'x': case 'y': case 'z': case '{': case '|': case '}':
case '~':
/* The C Standard requires these 98 characters (plus '%') to
be in the basic execution character set. None of these
characters can start a multibyte sequence, so they need
not be analyzed further. */
add (1, *p = *f);
continue;
default:
/* Copy this multibyte sequence until we reach its end, find
an error, or come back to the initial shift state. */
{
mbstate_t mbstate = mbstate_zero;
size_t len = 0;
do
{
size_t bytes = mbrlen (f + len, (size_t) -1, &mbstate);
if (bytes == 0)
break;
if (bytes == (size_t) -2 || bytes == (size_t) -1)
{
len++;
break;
}
len += bytes;
}
while (! mbsinit (&mbstate));
cpy (len, f);
continue;
}
}
#else /* ! DO_MULTIBYTE */
/* Either multibyte encodings are not supported, or they are
safe for formats, so any non-'%' byte can be copied through. */
if (*f != '%')
{
add (1, *p = *f);
continue;
}
#endif /* ! DO_MULTIBYTE */
/* Check for flags that can modify a number format. */
++f;
switch (*f)
{
case '_':
pad = pad_space;
++f;
break;
case '-':
pad = pad_none;
++f;
pad = *f++;
break;
default:
pad = pad_zero;
pad = 0;
break;
}
@ -348,15 +406,12 @@ strftime (s, maxsize, format, tp)
switch (*f)
{
case 'E':
++f;
modifier = era;
break;
case 'O':
++f;
modifier = alternate;
modifier = *f++;
break;
default:
modifier = none;
modifier = 0;
break;
}
@ -372,43 +427,42 @@ strftime (s, maxsize, format, tp)
--f;
/* Fall through. */
case '%':
if (modifier != none)
if (modifier != 0)
goto bad_format;
add (1, *p = *f);
break;
case 'a':
if (modifier != none)
if (modifier != 0)
goto bad_format;
cpy (aw_len, a_wkday);
break;
case 'A':
if (modifier != none)
if (modifier != 0)
goto bad_format;
cpy (wkday_len, f_wkday);
break;
case 'b':
case 'h': /* GNU extension. */
if (modifier != none)
case 'h': /* POSIX.2 extension. */
if (modifier != 0)
goto bad_format;
cpy (am_len, a_month);
break;
case 'B':
if (modifier != none)
if (modifier != 0)
goto bad_format;
cpy (month_len, f_month);
break;
case 'c':
if (modifier == alternate)
if (modifier == 'O')
goto bad_format;
#ifdef _NL_CURRENT
if (modifier == era)
subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
if (*subfmt == '\0')
if (! (modifier == 'E'
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT)) != '\0'))
subfmt = _NL_CURRENT (LC_TIME, D_T_FMT);
#else
subfmt = "%a %b %e %H:%M:%S %Z %Y";
@ -423,40 +477,41 @@ strftime (s, maxsize, format, tp)
}
break;
case 'C':
if (modifier == alternate)
case 'C': /* POSIX.2 extension. */
if (modifier == 'O')
goto bad_format;
#ifdef _NL_CURRENT
/* XXX I'm not sure about this. --drepper@gnu */
if (modifier == era &&
*(subfmt = _NL_CURRENT (LC_TIME, ERA)) != '\0')
goto subformat;
/* XXX %EC is not implemented yet. */
#endif
DO_NUMBER (2, (1900 + tp->tm_year) / 100);
{
int year = tp->tm_year + TM_YEAR_BASE;
DO_NUMBER (1, year / 100 - (year % 100 < 0));
}
case 'x':
if (modifier == alternate)
if (modifier == 'O')
goto bad_format;
#ifdef _NL_CURRENT
if (modifier == era)
subfmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
if (*subfmt == '\0')
if (! (modifier == 'E'
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_FMT)) != '\0'))
subfmt = _NL_CURRENT (LC_TIME, D_FMT);
goto subformat;
#endif
/* Fall through. */
case 'D': /* GNU extension. */
case 'D': /* POSIX.2 extension. */
if (modifier != 0)
goto bad_format;
subfmt = "%m/%d/%y";
goto subformat;
case 'd':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, tp->tm_mday);
case 'e': /* GNU extension: %d, but blank-padded. */
if (modifier == era)
case 'e': /* POSIX.2 extension. */
if (modifier == 'E')
goto bad_format;
DO_NUMBER_SPACEPAD (2, tp->tm_mday);
@ -466,22 +521,33 @@ strftime (s, maxsize, format, tp)
do_number_spacepad:
/* Force `_' flag. */
pad = pad_space;
pad = '_';
do_number:
/* Format the number according to the MODIFIER flag. */
#ifdef _NL_CURRENT
if (modifier == alternate && 0 <= number_value
&& number_value < (unsigned int) nr_alt_digits)
if (modifier == 'O' && 0 <= number_value)
{
/* ALT_DIGITS is the first entry in an array with
alternative digit symbols. */
size_t digitlen = strlen (*(alt_digits + number_value));
if (digitlen == 0)
break;
cpy (digitlen, *(alt_digits + number_value));
goto done_with_number;
alternative digit symbols. We have to find string
number NUMBER_VALUE, but must not look beyond
END_ALT_DIGITS. */
int run = number_value;
const char *cp = alt_digits;
while (run-- > 0 && cp < end_alt_digits)
cp = strchr (cp, '\0') + 1;
if (cp < end_alt_digits)
{
size_t digitlen = strlen (cp);
if (digitlen != 0)
{
cpy (digitlen, cp);
break;
}
}
}
#endif
{
@ -502,11 +568,11 @@ strftime (s, maxsize, format, tp)
if (negative_number)
*--bufp = '-';
if (pad != pad_none)
if (pad != '-')
{
int padding = digits - (buf + sizeof (buf) - bufp);
if (pad == pad_space)
if (pad == '_')
{
while (0 < padding--)
*--bufp = ' ';
@ -522,56 +588,52 @@ strftime (s, maxsize, format, tp)
}
cpy (buf + sizeof (buf) - bufp, bufp);
#ifdef _NL_CURRENT
done_with_number:
#endif
break;
case 'H':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, tp->tm_hour);
case 'I':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, hour12);
case 'k': /* GNU extension. */
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER_SPACEPAD (2, tp->tm_hour);
case 'l': /* GNU extension. */
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER_SPACEPAD (2, hour12);
case 'j':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (3, 1 + tp->tm_yday);
case 'M':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, tp->tm_min);
case 'm':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, tp->tm_mon + 1);
case 'n': /* GNU extension. */
case 'n': /* POSIX.2 extension. */
add (1, *p = '\n');
break;
@ -583,13 +645,16 @@ strftime (s, maxsize, format, tp)
subfmt = "%H:%M";
goto subformat;
case 'r': /* GNU extension. */
subfmt = "%I:%M:%S %p";
case 'r': /* POSIX.2 extension. */
#ifdef _NL_CURRENT
if (*(subfmt = _NL_CURRENT (LC_TIME, T_FMT_AMPM)) == '\0')
#endif
subfmt = "%I:%M:%S %p";
goto subformat;
case 'S':
if (modifier == era)
return 0;
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, tp->tm_sec);
@ -630,67 +695,101 @@ strftime (s, maxsize, format, tp)
}
case 'X':
if (modifier == alternate)
if (modifier == 'O')
goto bad_format;
#ifdef _NL_CURRENT
if (modifier == era)
subfmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
if (*subfmt == '\0')
if (! (modifier == 'E'
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_T_FMT)) != '\0'))
subfmt = _NL_CURRENT (LC_TIME, T_FMT);
goto subformat;
#endif
/* Fall through. */
case 'T': /* GNU extension. */
case 'T': /* POSIX.2 extension. */
subfmt = "%H:%M:%S";
goto subformat;
case 't': /* GNU extension. */
case 't': /* POSIX.2 extension. */
add (1, *p = '\t');
break;
case 'u': /* POSIX.2 extension. */
DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
case 'U':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, y_week0);
DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7);
case 'V':
if (modifier == era)
case 'g': /* GNU extension. */
case 'G': /* GNU extension. */
if (modifier == 'E')
goto bad_format;
{
int year = tp->tm_year + TM_YEAR_BASE;
int days = iso_week_days (tp->tm_yday, tp->tm_wday);
DO_NUMBER (2, y_week2);
if (days < 0)
{
/* This ISO week belongs to the previous year. */
year--;
days = iso_week_days (tp->tm_yday + (365 + __isleap (year)),
tp->tm_wday);
}
else
{
int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)),
tp->tm_wday);
if (0 <= d)
{
/* This ISO week belongs to the next year. */
year++;
days = d;
}
}
switch (*f)
{
case 'g':
DO_NUMBER (2, (year % 100 + 100) % 100);
case 'G':
DO_NUMBER (1, year);
default:
DO_NUMBER (2, days / 7 + 1);
}
}
case 'W':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, y_week1);
DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7);
case 'w':
if (modifier == era)
if (modifier == 'E')
goto bad_format;
DO_NUMBER (2, tp->tm_wday);
DO_NUMBER (1, tp->tm_wday);
case 'Y':
#ifdef _NL_CURRENT
if (modifier == era
if (modifier == 'E'
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_YEAR)) != '\0')
goto subformat;
else
#endif
if (modifier == alternate)
goto bad_format;
else
DO_NUMBER (4, 1900 + tp->tm_year);
if (modifier == 'O')
goto bad_format;
else
DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE);
case 'y':
#ifdef _NL_CURRENT
if (modifier == era
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_YEAR)) != '\0')
goto subformat;
/* XXX %Ey is not implemented yet. */
#endif
DO_NUMBER (2, tp->tm_year % 100);
DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100);
case 'Z':
cpy(zonelen, zone);
@ -740,26 +839,21 @@ strftime (s, maxsize, format, tp)
else
add (1, *p = '+');
pad = pad_zero;
diff /= 60;
DO_NUMBER (4, (diff / 60) * 100 + diff % 60);
}
default:
/* Bad format. */
/* Unknown format; output the format, including the '%',
since this is most likely the right thing to do if a
multibyte string has been misparsed. */
bad_format:
if (pad == pad_space)
add (1, *p = '_');
else if (pad == pad_zero)
add (1, *p = '0');
if (modifier == era)
add (1, *p = 'E');
else if (modifier == alternate)
add (1, *p = 'O');
add (1, *p = *f);
{
int flen;
for (flen = 2; f[1 - flen] != '%'; flen++)
continue;
cpy (flen, &f[1 - flen]);
}
break;
}
}