1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

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 __funlockfile can't be protected the way the use of __flockfile
can be. 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> 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/sched.h: Change `sched_params' to `sched_param' to follow
POSIX.4. POSIX.4.
@ -76,6 +311,20 @@ Thu Sep 12 12:33:52 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
macro. macro.
(__libc_cleanup_region_end): New 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> Thu Sep 12 03:35:27 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/i386/Dist: Remove init-first.h. * 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 include $(common-objpfx)version.mk
# Combine all the messages into the final sorted template translation file. # Combine all the messages into the final sorted template translation file.
# The following code requires GNU date.
$P/libc.pot: $(all-pot) $P/libc.pot: $(all-pot)
@rm -f $@.new @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 po/header.pot > $@.new
$(XGETTEXT) -d - --omit-header -n -s $^ >> $@.new $(XGETTEXT) -d - --omit-header -n -s $^ >> $@.new
mv -f $@.new $@ mv -f $@.new $@

View File

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

47
configure vendored
View File

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

View File

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

View File

@ -29,6 +29,8 @@ Cambridge, MA 02139, USA. */
_BSD_SOURCE ANSI, POSIX, and 4.3BSD things. _BSD_SOURCE ANSI, POSIX, and 4.3BSD things.
_SVID_SOURCE ANSI, POSIX, and SVID things. _SVID_SOURCE ANSI, POSIX, and SVID things.
_GNU_SOURCE All of the above, plus GNU extensions. _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__. The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__.
If none of these are defined, the default is all but _GNU_SOURCE. 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 #define __USE_GNU 1
#endif #endif
#if defined (__USE_GNU) || defined (__USE_MISC) #if defined (_REENTRANT) || defined (_THREAD_SAFE)
#define __USE_REENTRANT 1 #define __USE_REENTRANT 1
#endif #endif

View File

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

View File

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

View File

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

View File

@ -137,12 +137,15 @@ DEFINE_CATEGORY
DEFINE_ELEMENT (D_FMT, "d_fmt", std, string) DEFINE_ELEMENT (D_FMT, "d_fmt", std, string)
DEFINE_ELEMENT (T_FMT, "t_fmt", std, string) DEFINE_ELEMENT (T_FMT, "t_fmt", std, string)
DEFINE_ELEMENT (T_FMT_AMPM, "t_fmt_ampm", 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_YEAR, "era_year", opt, string)
DEFINE_ELEMENT (ERA_D_FMT, "era_d_fmt", opt, string) DEFINE_ELEMENT (ERA_D_FMT, "era_d_fmt", opt, string)
DEFINE_ELEMENT (ALT_DIGITS, "alt_digits", opt, stringarray, 0, 100) 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_D_T_FMT, "era_d_t_fmt", opt, string)
DEFINE_ELEMENT (ERA_T_FMT, "era_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) ), 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_D_T_FMT, /* Date and time in alternate era format. */
ERA_T_FMT, /* 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. */ _NL_NUM_LC_TIME, /* Number of indices in LC_TIME category. */
/* LC_COLLATE category: text sorting. /* LC_COLLATE category: text sorting.

View File

@ -64,7 +64,7 @@ enum coll_sort_rule
sort_mask 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 enum value_type
{ {
none, none,

View File

@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA. */
void *xmalloc (size_t __n); void *xmalloc (size_t __n);
void *xrealloc (void *__p, size_t __n);
/* The real definition of the struct for the LC_TIME locale. */ /* 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 *d_fmt;
const char *t_fmt; const char *t_fmt;
const char *t_fmt_ampm; const char *t_fmt_ampm;
const char *era; const char **era;
size_t era_num;
const char *era_year; const char *era_year;
const char *era_d_t_fmt; const char *era_d_t_fmt;
const char *era_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 locale_time_t *time = locale->categories[LC_TIME].time;
struct iovec iov[2 + _NL_ITEM_INDEX (_NL_NUM_LC_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]; + time->cur_num_alt_digits];
struct locale_file data; struct locale_file data;
u_int32_t idx[_NL_ITEM_INDEX (_NL_NUM_LC_TIME)]; 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_base = (void *) (time->t_fmt_ampm ?: "");
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1; iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
idx[1 + cnt] = idx[cnt] + iov[2 + cnt].iov_len; idx[1 + cnt] = idx[cnt] + iov[2 + cnt].iov_len;
++cnt; last_idx = ++cnt;
iov[2 + cnt].iov_base = (void *) (time->era ?: ""); idx[1 + last_idx] = idx[last_idx];
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1; for (num = 0; num < time->era_num; ++num, ++cnt)
idx[1 + cnt] = idx[cnt] + iov[2 + cnt].iov_len; {
++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_base = (void *) (time->era_year ?: "");
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1; 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; ++cnt;
++last_idx;
iov[2 + cnt].iov_base = (void *) (time->era_d_fmt ?: ""); iov[2 + cnt].iov_base = (void *) (time->era_d_fmt ?: "");
iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1; 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;
last_idx = ++cnt; ++cnt;
++last_idx;
idx[1 + last_idx] = idx[last_idx]; idx[1 + last_idx] = idx[last_idx];
for (num = 0; num < time->cur_num_alt_digits; ++num, ++cnt) 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++] = ""; \ time->cat[time->cur_num_##cat++] = ""; \
} \ } \
else \ else \
time->cat[time->cur_num_##cat++] \ time->cat[time->cur_num_##cat++] = code->val.str.start; \
= code->val.str.start; \
break break
STRARR_ELEM (abday, 7); 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 (am_pm, 2);
STRARR_ELEM (alt_digits, 100); 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) \ #define STR_ELEM(cat) \
case tok_##cat: \ case tok_##cat: \
if (time->cat != NULL) \ if (time->cat != NULL) \
@ -298,7 +317,6 @@ field `%s' in category `%s' declared more than once"), \
STR_ELEM (d_fmt); STR_ELEM (d_fmt);
STR_ELEM (t_fmt); STR_ELEM (t_fmt);
STR_ELEM (t_fmt_ampm); STR_ELEM (t_fmt_ampm);
STR_ELEM (era);
STR_ELEM (era_year); STR_ELEM (era_year);
STR_ELEM (era_d_t_fmt); STR_ELEM (era_d_t_fmt);
STR_ELEM (era_d_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 @table @code
@item int tm_sec @item int tm_sec
This is the number of seconds after the minute, normally in the range 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.) for leap seconds if leap second support is available.)
@cindex leap second @cindex leap second
@item int tm_min @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}. @code{59}.
@item int tm_hour @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}. @code{23}.
@item int tm_mday @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 @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}. @code{11}.
@item int tm_year @item int tm_year
This is the number of years since @code{1900}. This is the number of years since @code{1900}.
@item int tm_wday @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 @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}. @code{365}.
@item int tm_isdst @item int tm_isdst
@ -617,6 +618,7 @@ does so. @xref{Time Zone Functions}.
@comment time.h @comment time.h
@comment ANSI @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}) @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 This function is similar to the @code{sprintf} function (@pxref{Formatted
Input}), but the conversion specifications that can appear in the format 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 Ordinary characters appearing in the @var{template} are copied to the
output string @var{s}; this can include multibyte character sequences. output string @var{s}; this can include multibyte character sequences.
Conversion specifiers are introduced by a @samp{%} character. Now can Conversion specifiers are introduced by a @samp{%} character, followed
follow an optional flag which can be one of the following. These flags by an optional flag which can be one of the following. These flags,
only affect the output of numbers: which are GNU extensions, affect only the output of numbers:
@table @code @table @code
@item _ @item _
@ -638,9 +640,31 @@ The number is padded with spaces.
The number is not padded at all. The number is not padded at all.
@end table @end table
The default action is to pad the number with zeros. Following to the The default action is to pad the number with zeros to keep it a constant
flag comes the format specifier. The whole @samp{%} sequence is width. Numbers that do not have a range indicated below are never
replaced in the output string as follows: 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 @table @code
@item %a @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. The preferred date and time representation for the current locale.
@item %C @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 @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 @item %D
The date using the format @code{%m/%d/%y}. 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. This format is a GNU extension.
@item %d @item %G
The day of the month like with @code{%d}, but padded with blank (range The year corresponding to the ISO week number. This has the same format
@code{ 1} to @code{31}). 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. 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 The abbreviated month name according to the current locale. The action
is the same as for @code{%b}. is the same as for @code{%b}.
This format is a GNU extension. This format is a POSIX.2 extension.
@item %H @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}). @code{23}).
@item %I @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}). @code{12}).
@item %j @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 @item %k
The hour as a decimal number, using a 24-hour clock like @code{%H}, but 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. This format is a GNU extension.
@item %l @item %l
The hour as a decimal number, using a 12-hour clock like @code{%I}, but 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. This format is a GNU extension.
@item %m @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 @item %M
The minute as a decimal number. The minute as a decimal number (range @code{00} through @code{59}).
@item %n @item %n
A single @samp{\n} (newline) character. A single @samp{\n} (newline) character.
This format is a GNU extension. This format is a POSIX.2 extension.
@item %p @item %p
Either @samp{am} or @samp{pm}, according to the given time value; or the Either @samp{AM} or @samp{PM}, according to the given time value; or the
corresponding strings for the current locale. corresponding strings for the current locale. Noon is treated as
@samp{PM} and midnight as @samp{AM}.
@item %r @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 @item %R
The hour and minute in decimal numbers using the format @code{%H:%M}. 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. This format is a GNU extension.
@item %s @item %s
The seconds since the epoch, i.e., 1970-01-01 00:00:00 UTC. Note The number of seconds since the epoch, i.e., since 1970-01-01 00:00:00 UTC.
that this value is the number of seconds between the epoch and the Leap seconds are not counted unless leap second support is available.
current date as defined by the @code{localtime} system call.
This format is a GNU extension. This format is a GNU extension.
@item %S @item %S
The second as a decimal number. The second as a decimal number (range @code{00} through @code{60}).
@item %t @item %t
A single @samp{\t} (tabulator) character. A single @samp{\t} (tabulator) character.
This format is a GNU extension. This format is a POSIX.2 extension.
@item %T @item %T
The time using decimal numbers using the format @code{%H:%M:%S}. 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 @item %U
The week number of the current year as a decimal number, starting with The week number of the current year as a decimal number (range @code{00}
the first Sunday as the first day of the first week. All days preceding through @code{53}), starting with the first Sunday as the first day of
the first Sunday in the year are considered to be in week @code{0}. the first week. Days preceding the first Sunday in the year are
considered to be in week @code{00}.
@item %V @item %V
The @w{ISO 8601:1988} week number as a decimal number (range @code{00} The @w{ISO 8601:1988} week number as a decimal number (range @code{01}
to @code{53}). ISO weeks start with Monday and end with Sunday. Week through @code{53}). ISO weeks start with Monday and end with Sunday.
01 of a year is the first week which has the majority of its days in Week @code{01} of a year is the first week which has the majority of its
that year; this is equivalent to the week containing the year's first days in that year; this is equivalent to the week containing the year's
Thursday, and it is also equivalent to the week containing January 4. first Thursday, and it is also equivalent to the week containing January
Week 01 of a year can contain days from the previous year. The week 4. Week @code{01} of a year can contain days from the previous year.
before week 01 of a year is the last week (52 or 53) of the previous The week before week @code{01} of a year is the last week (@code{52} or
year even if it contains days from the new year. @code{53}) of the previous year even if it contains days from the new
year.
This format is a POSIX.2 extension.
@item %w @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 @item %W
The week number of the current year as a decimal number, starting with The week number of the current year as a decimal number (range @code{00}
the first Monday as the first day of the first week. All days preceding through @code{53}), starting with the first Monday as the first day of
the first Monday in the year are considered to be in week @code{0}. the first week. All days preceding the first Monday in the year are
considered to be in week @code{00}.
@item %x @item %x
The preferred date representation for the current locale, but without the 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. The preferred time representation for the current locale, but with no date.
@item %y @item %y
The year as a decimal number, but without a century (range @code{00} to The year without a century as a decimal number (range @code{00} through
@code{99}). @code{99}). This is equivalent to the year modulo 100.
@item %Y @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 @item %z
@w{RFC 822}/@w{ISO 8601:1988} style numeric time zone (e.g., @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 @code{-0600} or @code{+0100}), or nothing if no time zone is
determinable. determinable.
This format is a GNU extension.
@item %Z @item %Z
The time zone or name or abbreviation (empty if the time zone can't be The time zone abbreviation (empty if the time zone can't be determined).
determined).
@item %% @item %%
A literal @samp{%} character. A literal @samp{%} character.

View File

@ -32,7 +32,7 @@ aux := fpu_control setfpucw
# Build the -lm library. # Build the -lm library.
extra-libs := libm 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-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 \ 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. # Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # 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. # We use libdb.so.2 for the interface in version 1.85 of the Berkeley DB code.
*-*-* libdb=2 *-*-* 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-_itoa.c = -Wno-unused
CFLAGS-tst-printf.c = -Wno-format 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; FILE *f;
int i; int i;
const char filename[] = "/tmp/bugtest";
f = fopen("/tmp/bugtest", "w+"); f = fopen(filename, "w+");
for (i=0; i<9000; i++) for (i=0; i<9000; i++)
putc ('x', f); putc ('x', f);
fseek (f, 8180L, 0); fseek (f, 8180L, 0);
@ -45,6 +46,7 @@ DEFUN_VOID(main)
} }
fclose(f); fclose(f);
remove(filename);
puts ("Test succeeded."); puts ("Test succeeded.");

View File

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

View File

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

View File

@ -8,7 +8,7 @@ main ()
n = -1; n = -1;
ret = sscanf ("1000", "%lld", &n); 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) if (ret != 1 || n != 1000L)
abort (); abort ();

View File

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

View File

@ -45,7 +45,7 @@ struct {
struct { struct {
const char * in, * out, * resolved; const char * in, * out, * resolved;
int errno; int error;
} tests[] = { } tests[] = {
/* 0 */ /* 0 */
{"/", "/"}, {"/", "/"},
@ -145,10 +145,10 @@ main (int argc, char ** argv)
continue; 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", 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; ++errors;
continue; continue;
} }

View File

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

View File

@ -53,7 +53,6 @@ G = 3.57142857142857150787e-01L; /* 5/14 */
long double x; long double x;
#endif #endif
{ {
int32_t hx;
long double r,s,t=0.0,w; long double r,s,t=0.0,w;
u_int32_t sign, se, x0, x1; 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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_inline rettype \
__m81_u(func) args __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) \ #define __inline_mathop(func, op) \
__m81_defun (double, func, (double __mathop_x)) \ __m81_defun (double, func, (double __mathop_x)) \
{ \ { \
double __result; \ double __result; \
__asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\ __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
return __result; \ return __result; \
} } \
__m81_defun (float, func##f, (float __mathop_x)) \
#define __inline_mathopf(func, op) \
__m81_defun (float, func, (float __mathop_x)) \
{ \ { \
float __result; \ float __result; \
__asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\ __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
return __result; \ return __result; \
} } \
__m81_defun (long double, func##l, (long double __mathop_x)) \
#define __inline_mathopl(func, op) \
__m81_defun (long double, func, (long double __mathop_x)) \
{ \ { \
long double __result; \ long double __result; \
__asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\ __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
return __result; \ return __result; \
} }
/* ieee style elementary functions */ /* ieee style elementary functions */
__inline_mathop(__ieee754_acos, acos) __inline_mathop(__ieee754_acos, acos)
__inline_mathop(__ieee754_asin, asin) __inline_mathop(__ieee754_asin, asin)
@ -74,28 +74,6 @@ __inline_mathop(__ieee754_log, logn)
__inline_mathop(__ieee754_sqrt, sqrt) __inline_mathop(__ieee754_sqrt, sqrt)
__inline_mathop(__ieee754_atanh, atanh) __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(__atan, atan)
__inline_mathop(__cos, cos) __inline_mathop(__cos, cos)
__inline_mathop(__sin, sin) __inline_mathop(__sin, sin)
@ -110,517 +88,226 @@ __inline_mathop(__log1p, lognp1)
__inline_mathop(__logb, log2) __inline_mathop(__logb, log2)
__inline_mathop(__significand, getman) __inline_mathop(__significand, getman)
__inline_mathopf(__atanf, atan) /* This macro contains the definition for the rest of the inline
__inline_mathopf(__cosf, cos) functions, using __FLOAT_TYPE as the domain type and __S as the suffix
__inline_mathopf(__sinf, sin) for the function names. */
__inline_mathopf(__tanf, tan)
__inline_mathopf(__tanhf, tanh)
__inline_mathopf(__fabsf, abs)
__inline_mathopf(__sqrtf, sqrt)
__inline_mathopf(__rintf, int) #define __inline_functions(__float_type, __s) \
__inline_mathopf(__expm1f, etoxm1) __m81_defun (__float_type, \
__inline_mathopf(__log1pf, lognp1) __ieee754_remainder##__s, (__float_type __x, __float_type __y)) \
__inline_mathopf(__logbf, log2) { \
__inline_mathopf(__significandf, getman) __float_type __result; \
__asm("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); \
__inline_mathopl(__atanl, atan) return __result; \
__inline_mathopl(__cosl, cos) } \
__inline_mathopl(__sinl, sin) \
__inline_mathopl(__tanl, tan) __m81_defun (__float_type, \
__inline_mathopl(__tanhl, tanh) __ieee754_fmod##__s, (__float_type __x, __float_type __y)) \
__inline_mathopl(__fabsl, abs) { \
__inline_mathopl(__sqrtl, sqrt) __float_type __result; \
__asm("fmod%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); \
__inline_mathopl(__rintl, int) return __result; \
__inline_mathopl(__expm1l, etoxm1) } \
__inline_mathopl(__log1pl, lognp1) \
__inline_mathopl(__logbl, log2) __m81_defun (__float_type, \
__inline_mathopl(__significandl, getman) __ieee754_atan2##__s, (__float_type __y, __float_type __x)) \
{ \
__m81_defun (double, __ieee754_remainder, (double __x, double __y)) __float_type __pi, __pi_2; \
{ \
double __result; __asm ("fmovecr%.x %#0, %0" : "=f" (__pi)); \
__asm("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); __asm ("fscale%.w %#-1, %0" : "=f" (__pi_2) : "0" (__pi)); \
return __result; 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)) /* This defines the three variants of the inline functions. */
{ __inline_functions (double, )
double __result; __inline_functions (float, f)
double __double_e = (double) __e; __inline_functions (long double, l)
__asm("fscale%.x %1, %0" : "=f" (__result) : "f" (__double_e), "0" (__x)); #undef __inline_functions
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;
}
#endif /* GCC. */ #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 #define FUNC scalbn
#include <s_ldexp.c> #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 #define FUNC scalbnf
#include <s_ldexpf.c> #include <s_ldexpf.c>
#endif
#define float_type float
#include <s_scalbn.c>

View File

@ -1,2 +1,6 @@
#ifndef FUNC
#define FUNC scalbnl #define FUNC scalbnl
#include <s_ldexpl.c> #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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <pwd.h> #include <pwd.h>
extern int EXFUN(geteuid, (NOARGS));
/* Return the username of the caller. /* Return the username of the caller.
If S is not NULL, it points to a buffer of at least L_cuserid bytes 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. */ into which the name is copied; otherwise, a static buffer is used. */
char * char *
DEFUN(cuserid, (s), char *s) cuserid (s)
char *s;
{ {
static char name[L_cuserid]; static char name[L_cuserid];
struct passwd *pwent = getpwuid(geteuid()); struct passwd *pwent = getpwuid (geteuid ());
if (pwent == NULL) if (pwent == NULL)
{ {
@ -42,5 +39,5 @@ DEFUN(cuserid, (s), char *s)
if (s == NULL) if (s == NULL)
s = name; 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[0] = __tzname[0];
save_tzname[1] = __tzname[1]; save_tzname[1] = __tzname[1];
tmp = localtime (&timer, &tm); tmp = localtime_r (&timer, &tm);
tz->tz_minuteswest = __timezone / 60; tz->tz_minuteswest = __timezone / 60;
tz->tz_dsttime = __daylight; tz->tz_dsttime = __daylight;

View File

@ -43,4 +43,4 @@ extern void __setfpucw __P ((fpu_control_t));
__END_DECLS __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, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <sysdep.h>
/* Because the Linux version is in fact i386/ELF and the start.? file /* 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 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 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 The code for Linux is almost identical to the canonical Unix/i386
code, except that the error number in %eax is negated. */ code, except that the error number in %eax is negated. */
.globl __syscall_error ENTRY (__syscall_error)
.type __syscall_error,@function
__syscall_error:
negl %eax negl %eax
#define __syscall_error __syscall_error_1 #define __syscall_error __syscall_error_1
@ -54,10 +54,7 @@ __syscall_error:
#endif /* !PIC */ #endif /* !PIC */
#ifdef _LIBC_REENTRANT ENTRY (__errno_location)
.globl __errno_location
.type __errno_location,@function
__errno_location:
#ifdef PIC #ifdef PIC
call .L2 call .L2
.L2: popl %ecx .L2: popl %ecx
@ -69,4 +66,3 @@ __errno_location:
ret ret
.Lfe1: .Lfe1:
.size __errno_location, .Lfe1-__errno_location .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, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#ifndef _LINUX_I386_SYSDEP_H
#define _LINUX_I386_SYSDEP_H 1
/* There is some commonality. */ /* There is some commonality. */
#include <sysdeps/unix/i386/sysdep.h> #include <sysdeps/unix/i386/sysdep.h>
@ -179,3 +182,5 @@ syscall_error: \
#define _POPARGS_5 _POPARGS_4; popl %edi #define _POPARGS_5 _POPARGS_4; popl %edi
#endif /* ASSEMBLER */ #endif /* ASSEMBLER */
#endif /* linux/i386/sysdep.h */

View File

@ -62,7 +62,6 @@ __syscall_error:
.size __syscall_error, . - __syscall_error .size __syscall_error, . - __syscall_error
#endif /* PIC */ #endif /* PIC */
#ifdef _LIBC_REENTRANT
.globl __errno_location .globl __errno_location
.type __errno_location, @function .type __errno_location, @function
__errno_location: __errno_location:
@ -73,4 +72,3 @@ __errno_location:
#endif #endif
rts rts
.size __errno_location, . - __errno_location .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; int year, yday, hour, min, sec;
const struct tm *tp; const struct tm *tp;
{ {
time_t ay = year + (time_t) (TM_YEAR_BASE - 1); /* Compute intervening leap days correctly even if year is negative.
time_t by = tp->tm_year + (time_t) (TM_YEAR_BASE - 1); Take care to avoid int overflow. time_t overflow is OK, since
time_t intervening_leap_days = only the low order bits of the correct time_t answer are needed.
(ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400); Don't convert to time_t until after all divisions are done, since
time_t years = ay - by; 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 time_t days = (365 * years + intervening_leap_days
+ (yday - tp->tm_yday)); + (yday - tp->tm_yday));
return (60 * (60 * (24 * days + (hour - tp->tm_hour)) return (60 * (60 * (24 * days + (hour - tp->tm_hour))

View File

@ -23,8 +23,10 @@ Cambridge, MA 02139, USA. */
#ifdef _LIBC #ifdef _LIBC
# define HAVE_LIMITS_H 1 # define HAVE_LIMITS_H 1
# define HAVE_MBLEN 1 # define HAVE_MBLEN 1
# define HAVE_MBRLEN 1
# define HAVE_TM_GMTOFF 1 # define HAVE_TM_GMTOFF 1
# define HAVE_TM_ZONE 1 # define HAVE_TM_ZONE 1
# define MULTIBYTE_IS_FORMAT_SAFE 1
# define STDC_HEADERS 1 # define STDC_HEADERS 1
# include <ansidecl.h> # include <ansidecl.h>
# include "../locale/localeinfo.h" # include "../locale/localeinfo.h"
@ -43,8 +45,24 @@ Cambridge, MA 02139, USA. */
# endif # endif
#endif #endif
#if HAVE_MBLEN /* Do multibyte processing if multibytes are supported, unless
# include <ctype.h> 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 #endif
#if HAVE_LIMITS_H #if HAVE_LIMITS_H
@ -91,6 +109,13 @@ Cambridge, MA 02139, USA. */
#define TM_YEAR_BASE 1900 #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 #ifdef _LIBC
# define gmtime_r __gmtime_r # define gmtime_r __gmtime_r
@ -132,9 +157,6 @@ localtime_r (t, tp)
#endif /* ! defined (_LIBC) */ #endif /* ! defined (_LIBC) */
static unsigned int week __P ((const struct tm *const, int, int));
#define add(n, f) \ #define add(n, f) \
do \ do \
{ \ { \
@ -159,14 +181,17 @@ tm_diff (a, b)
const struct tm *a; const struct tm *a;
const struct tm *b; const struct tm *b;
{ {
int ay = a->tm_year + TM_YEAR_BASE - 1; /* Compute intervening leap days correctly even if year is negative.
int by = b->tm_year + TM_YEAR_BASE - 1; Take care to avoid int overflow in leap day calculations,
/* Divide years by 100, rounding towards minus infinity. */ but it's OK to assume that A and B are close to each other. */
int ac = ay / 100 - (ay % 100 < 0); int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
int bc = by / 100 - (by % 100 < 0); int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
int intervening_leap_days = int a100 = a4 / 25 - (a4 % 25 < 0);
((ay >> 2) - (by >> 2)) - (ac - bc) + ((ac >> 2) - (bc >> 2)); int b100 = b4 / 25 - (b4 % 25 < 0);
int years = ay - by; 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 int days = (365 * years + intervening_leap_days
+ (a->tm_yday - b->tm_yday)); + (a->tm_yday - b->tm_yday));
return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) 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, /* The number of days from the first day of the first ISO week of this
with weeks starting on STARTING_DAY. */ year to the year day YDAY with week day WDAY. ISO weeks start on
#ifdef __GNUC__ 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 inline
#endif #endif
static unsigned int static int
week (tp, starting_day, max_preceding) iso_week_days (yday, wday)
const struct tm *const tp; int yday;
int starting_day; int wday;
int max_preceding;
{ {
int wday, dl, base; /* Add enough to the first operand of % to make it nonnegative. */
int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
wday = tp->tm_wday - starting_day; return (yday
if (wday < 0) - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
wday += 7; + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
/* 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;
} }
#ifndef _NL_CURRENT #ifndef _NL_CURRENT
static char const weekday_name[][10] = static char const weekday_name[][10] =
{ {
@ -254,8 +264,8 @@ strftime (s, maxsize, format, tp)
size_t am_len = strlen(a_month); size_t am_len = strlen(a_month);
size_t ap_len = strlen (ampm); size_t ap_len = strlen (ampm);
const char * const*alt_digits = &_NL_CURRENT (LC_TIME, ALT_DIGITS); const char *alt_digits = _NL_CURRENT (LC_TIME, ALT_DIGITS);
int nr_alt_digits = (_NL_CURRENT (LC_TIME, ALT_DIGITS + 1) - *alt_digits); const char *end_alt_digits = _NL_CURRENT (LC_TIME, ALT_DIGITS + 1);
#else #else
const char *const f_wkday = weekday_name[tp->tm_wday]; const char *const f_wkday = weekday_name[tp->tm_wday];
const char *const f_month = month_name[tp->tm_mon]; const char *const f_month = month_name[tp->tm_mon];
@ -268,9 +278,6 @@ strftime (s, maxsize, format, tp)
#endif #endif
size_t wkday_len = strlen (f_wkday); size_t wkday_len = strlen (f_wkday);
size_t month_len = strlen (f_month); 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; const char *zone;
size_t zonelen; size_t zonelen;
register size_t i = 0; register size_t i = 0;
@ -285,8 +292,8 @@ strftime (s, maxsize, format, tp)
if (!(zone && *zone) && tp->tm_isdst >= 0) if (!(zone && *zone) && tp->tm_isdst >= 0)
zone = tzname[tp->tm_isdst]; zone = tzname[tp->tm_isdst];
#endif #endif
if (!(zone && *zone)) if (! zone)
zone = "???"; zone = ""; /* POSIX.2 requires the empty string here. */
zonelen = strlen (zone); zonelen = strlen (zone);
@ -297,50 +304,101 @@ strftime (s, maxsize, format, tp)
for (f = format; *f != '\0'; ++f) for (f = format; *f != '\0'; ++f)
{ {
enum { pad_zero, pad_space, pad_none } pad; /* Padding for number. */ int pad; /* Padding for number ('-', '_', or 0). */
unsigned int digits; /* Max digits for numeric format. */ int modifier; /* Field modifier ('E', 'O', or 0). */
unsigned int number_value; /* Numeric value to be printed. */ int digits; /* Max digits for numeric format. */
int number_value; /* Numeric value to be printed. */
int negative_number; /* 1 if the number is negative. */ int negative_number; /* 1 if the number is negative. */
const char *subfmt = ""; const char *subfmt;
enum { none, alternate, era } modifier;
char *bufp; char *bufp;
char buf[1 + (sizeof (int) < sizeof (time_t) char buf[1 + (sizeof (int) < sizeof (time_t)
? INT_STRLEN_BOUND (time_t) ? INT_STRLEN_BOUND (time_t)
: INT_STRLEN_BOUND (int))]; : INT_STRLEN_BOUND (int))];
#if HAVE_MBLEN #if DO_MULTIBYTE
if (!isascii (*f))
{
/* Non-ASCII, may be a multibyte. */
int len = mblen (f, strlen (f));
if (len > 0)
{
cpy(len, f);
continue;
}
}
#endif
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 != '%') if (*f != '%')
{ {
add (1, *p = *f); add (1, *p = *f);
continue; continue;
} }
#endif /* ! DO_MULTIBYTE */
/* Check for flags that can modify a number format. */ /* Check for flags that can modify a number format. */
++f; ++f;
switch (*f) switch (*f)
{ {
case '_': case '_':
pad = pad_space;
++f;
break;
case '-': case '-':
pad = pad_none; pad = *f++;
++f;
break; break;
default: default:
pad = pad_zero; pad = 0;
break; break;
} }
@ -348,15 +406,12 @@ strftime (s, maxsize, format, tp)
switch (*f) switch (*f)
{ {
case 'E': case 'E':
++f;
modifier = era;
break;
case 'O': case 'O':
++f; modifier = *f++;
modifier = alternate;
break; break;
default: default:
modifier = none; modifier = 0;
break; break;
} }
@ -372,43 +427,42 @@ strftime (s, maxsize, format, tp)
--f; --f;
/* Fall through. */ /* Fall through. */
case '%': case '%':
if (modifier != none) if (modifier != 0)
goto bad_format; goto bad_format;
add (1, *p = *f); add (1, *p = *f);
break; break;
case 'a': case 'a':
if (modifier != none) if (modifier != 0)
goto bad_format; goto bad_format;
cpy (aw_len, a_wkday); cpy (aw_len, a_wkday);
break; break;
case 'A': case 'A':
if (modifier != none) if (modifier != 0)
goto bad_format; goto bad_format;
cpy (wkday_len, f_wkday); cpy (wkday_len, f_wkday);
break; break;
case 'b': case 'b':
case 'h': /* GNU extension. */ case 'h': /* POSIX.2 extension. */
if (modifier != none) if (modifier != 0)
goto bad_format; goto bad_format;
cpy (am_len, a_month); cpy (am_len, a_month);
break; break;
case 'B': case 'B':
if (modifier != none) if (modifier != 0)
goto bad_format; goto bad_format;
cpy (month_len, f_month); cpy (month_len, f_month);
break; break;
case 'c': case 'c':
if (modifier == alternate) if (modifier == 'O')
goto bad_format; goto bad_format;
#ifdef _NL_CURRENT #ifdef _NL_CURRENT
if (modifier == era) if (! (modifier == 'E'
subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT); && *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT)) != '\0'))
if (*subfmt == '\0')
subfmt = _NL_CURRENT (LC_TIME, D_T_FMT); subfmt = _NL_CURRENT (LC_TIME, D_T_FMT);
#else #else
subfmt = "%a %b %e %H:%M:%S %Z %Y"; subfmt = "%a %b %e %H:%M:%S %Z %Y";
@ -423,40 +477,41 @@ strftime (s, maxsize, format, tp)
} }
break; break;
case 'C': case 'C': /* POSIX.2 extension. */
if (modifier == alternate) if (modifier == 'O')
goto bad_format; goto bad_format;
#ifdef _NL_CURRENT #ifdef _NL_CURRENT
/* XXX I'm not sure about this. --drepper@gnu */ /* XXX %EC is not implemented yet. */
if (modifier == era &&
*(subfmt = _NL_CURRENT (LC_TIME, ERA)) != '\0')
goto subformat;
#endif #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': case 'x':
if (modifier == alternate) if (modifier == 'O')
goto bad_format; goto bad_format;
#ifdef _NL_CURRENT #ifdef _NL_CURRENT
if (modifier == era) if (! (modifier == 'E'
subfmt = _NL_CURRENT (LC_TIME, ERA_D_FMT); && *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_FMT)) != '\0'))
if (*subfmt == '\0')
subfmt = _NL_CURRENT (LC_TIME, D_FMT); subfmt = _NL_CURRENT (LC_TIME, D_FMT);
goto subformat; goto subformat;
#endif #endif
/* Fall through. */ /* Fall through. */
case 'D': /* GNU extension. */ case 'D': /* POSIX.2 extension. */
if (modifier != 0)
goto bad_format;
subfmt = "%m/%d/%y"; subfmt = "%m/%d/%y";
goto subformat; goto subformat;
case 'd': case 'd':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, tp->tm_mday); DO_NUMBER (2, tp->tm_mday);
case 'e': /* GNU extension: %d, but blank-padded. */ case 'e': /* POSIX.2 extension. */
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER_SPACEPAD (2, tp->tm_mday); DO_NUMBER_SPACEPAD (2, tp->tm_mday);
@ -466,22 +521,33 @@ strftime (s, maxsize, format, tp)
do_number_spacepad: do_number_spacepad:
/* Force `_' flag. */ /* Force `_' flag. */
pad = pad_space; pad = '_';
do_number: do_number:
/* Format the number according to the MODIFIER flag. */ /* Format the number according to the MODIFIER flag. */
#ifdef _NL_CURRENT #ifdef _NL_CURRENT
if (modifier == alternate && 0 <= number_value if (modifier == 'O' && 0 <= number_value)
&& number_value < (unsigned int) nr_alt_digits)
{ {
/* ALT_DIGITS is the first entry in an array with /* ALT_DIGITS is the first entry in an array with
alternative digit symbols. */ alternative digit symbols. We have to find string
size_t digitlen = strlen (*(alt_digits + number_value)); number NUMBER_VALUE, but must not look beyond
if (digitlen == 0) END_ALT_DIGITS. */
break; int run = number_value;
cpy (digitlen, *(alt_digits + number_value)); const char *cp = alt_digits;
goto done_with_number;
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 #endif
{ {
@ -502,11 +568,11 @@ strftime (s, maxsize, format, tp)
if (negative_number) if (negative_number)
*--bufp = '-'; *--bufp = '-';
if (pad != pad_none) if (pad != '-')
{ {
int padding = digits - (buf + sizeof (buf) - bufp); int padding = digits - (buf + sizeof (buf) - bufp);
if (pad == pad_space) if (pad == '_')
{ {
while (0 < padding--) while (0 < padding--)
*--bufp = ' '; *--bufp = ' ';
@ -522,56 +588,52 @@ strftime (s, maxsize, format, tp)
} }
cpy (buf + sizeof (buf) - bufp, bufp); cpy (buf + sizeof (buf) - bufp, bufp);
#ifdef _NL_CURRENT
done_with_number:
#endif
break; break;
case 'H': case 'H':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, tp->tm_hour); DO_NUMBER (2, tp->tm_hour);
case 'I': case 'I':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, hour12); DO_NUMBER (2, hour12);
case 'k': /* GNU extension. */ case 'k': /* GNU extension. */
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER_SPACEPAD (2, tp->tm_hour); DO_NUMBER_SPACEPAD (2, tp->tm_hour);
case 'l': /* GNU extension. */ case 'l': /* GNU extension. */
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER_SPACEPAD (2, hour12); DO_NUMBER_SPACEPAD (2, hour12);
case 'j': case 'j':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (3, 1 + tp->tm_yday); DO_NUMBER (3, 1 + tp->tm_yday);
case 'M': case 'M':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, tp->tm_min); DO_NUMBER (2, tp->tm_min);
case 'm': case 'm':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, tp->tm_mon + 1); DO_NUMBER (2, tp->tm_mon + 1);
case 'n': /* GNU extension. */ case 'n': /* POSIX.2 extension. */
add (1, *p = '\n'); add (1, *p = '\n');
break; break;
@ -583,13 +645,16 @@ strftime (s, maxsize, format, tp)
subfmt = "%H:%M"; subfmt = "%H:%M";
goto subformat; goto subformat;
case 'r': /* GNU extension. */ case 'r': /* POSIX.2 extension. */
subfmt = "%I:%M:%S %p"; #ifdef _NL_CURRENT
if (*(subfmt = _NL_CURRENT (LC_TIME, T_FMT_AMPM)) == '\0')
#endif
subfmt = "%I:%M:%S %p";
goto subformat; goto subformat;
case 'S': case 'S':
if (modifier == era) if (modifier == 'E')
return 0; goto bad_format;
DO_NUMBER (2, tp->tm_sec); DO_NUMBER (2, tp->tm_sec);
@ -630,67 +695,101 @@ strftime (s, maxsize, format, tp)
} }
case 'X': case 'X':
if (modifier == alternate) if (modifier == 'O')
goto bad_format; goto bad_format;
#ifdef _NL_CURRENT #ifdef _NL_CURRENT
if (modifier == era) if (! (modifier == 'E'
subfmt = _NL_CURRENT (LC_TIME, ERA_T_FMT); && *(subfmt = _NL_CURRENT (LC_TIME, ERA_T_FMT)) != '\0'))
if (*subfmt == '\0')
subfmt = _NL_CURRENT (LC_TIME, T_FMT); subfmt = _NL_CURRENT (LC_TIME, T_FMT);
goto subformat; goto subformat;
#endif #endif
/* Fall through. */ /* Fall through. */
case 'T': /* GNU extension. */ case 'T': /* POSIX.2 extension. */
subfmt = "%H:%M:%S"; subfmt = "%H:%M:%S";
goto subformat; goto subformat;
case 't': /* GNU extension. */ case 't': /* POSIX.2 extension. */
add (1, *p = '\t'); add (1, *p = '\t');
break; break;
case 'u': /* POSIX.2 extension. */
DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
case 'U': case 'U':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, y_week0); DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7);
case 'V': case 'V':
if (modifier == era) case 'g': /* GNU extension. */
case 'G': /* GNU extension. */
if (modifier == 'E')
goto bad_format; 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': case 'W':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, y_week1); DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7);
case 'w': case 'w':
if (modifier == era) if (modifier == 'E')
goto bad_format; goto bad_format;
DO_NUMBER (2, tp->tm_wday); DO_NUMBER (1, tp->tm_wday);
case 'Y': case 'Y':
#ifdef _NL_CURRENT #ifdef _NL_CURRENT
if (modifier == era if (modifier == 'E'
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_YEAR)) != '\0') && *(subfmt = _NL_CURRENT (LC_TIME, ERA_YEAR)) != '\0')
goto subformat; goto subformat;
else
#endif #endif
if (modifier == alternate) if (modifier == 'O')
goto bad_format; goto bad_format;
else else
DO_NUMBER (4, 1900 + tp->tm_year); DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE);
case 'y': case 'y':
#ifdef _NL_CURRENT #ifdef _NL_CURRENT
if (modifier == era /* XXX %Ey is not implemented yet. */
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_YEAR)) != '\0')
goto subformat;
#endif #endif
DO_NUMBER (2, tp->tm_year % 100); DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100);
case 'Z': case 'Z':
cpy(zonelen, zone); cpy(zonelen, zone);
@ -740,26 +839,21 @@ strftime (s, maxsize, format, tp)
else else
add (1, *p = '+'); add (1, *p = '+');
pad = pad_zero;
diff /= 60; diff /= 60;
DO_NUMBER (4, (diff / 60) * 100 + diff % 60); DO_NUMBER (4, (diff / 60) * 100 + diff % 60);
} }
default: 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: bad_format:
if (pad == pad_space) {
add (1, *p = '_'); int flen;
else if (pad == pad_zero) for (flen = 2; f[1 - flen] != '%'; flen++)
add (1, *p = '0'); continue;
cpy (flen, &f[1 - flen]);
if (modifier == era) }
add (1, *p = 'E');
else if (modifier == alternate)
add (1, *p = 'O');
add (1, *p = *f);
break; break;
} }
} }