Updated to fedora-glibc-20041012T1128

This commit is contained in:
Jakub Jelinek 2004-10-12 12:00:26 +00:00
parent 7dbf6a6cd5
commit 3ee87ca7d4
58 changed files with 565 additions and 205 deletions

View File

@ -1,3 +1,93 @@
2004-10-11 Ulrich Drepper <drepper@redhat.com>
* timezone/asia: Update from tzdata2004e.
* timezone/southamerica: Likewise.
* timezone/private.h: Update from tzcode2004e.
* timezone/zdump.c: Likewise.
* stdio-common/vfscanf.c: Add support for reading localized
digits. Patch mainly by Hamed Malek <hamed@bamdad.org>.
* resolv/res_init.c (res_thread_freeres): Reset _res.options.
[BZ #434]
* resolv/res_send.c (send_dg): Use nonblocking sockets. Add
appropriate poll/select calls and restart operation if necessary.
Also handle EINTR.
* elf/tst-dlopenrpath.c (do_test): Enable code which was disabled
for debugging.
* elf/dl-sym.c (do_sym): Avoid using global variable.
* elf/dl-addr.c (_dl_addr): Really use match everywhere.
2004-10-09 Andreas Schwab <schwab@suse.de>
* sysdeps/m68k/memcopy.h (WORD_COPY_BWD): Remove use of cast as
lvalue.
* sysdeps/m68k/fpu/bits/mathinline.h: Remove __THROW from inline
definitions.
2004-10-07 Andreas Schwab <schwab@suse.de>
* misc/sys/uio.h: Change __vector to __iovec to avoid clash with
altivec.
2004-10-06 Alan Modra <amodra@bigpond.net.au>
* gmon/Makefile (CFLAGS-mcount.c): Move before inclusion of "Rules".
* sysdeps/powerpc/powerpc64/Makefile (CFLAGS-mcount.c): Add
-msoft-float.
* sysdeps/powerpc/powerpc64/sysdep.h (SAVE_ARG, REST_ARG): New macros.
(CALL_MCOUNT): Replace with a gas macro implementation.
(EALIGN): Delete PROF version.
* sysdeps/powerpc/powerpc64/__longjmp-common.S: Invoke CALL_MCOUNT.
* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Likewise.
* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
* sysdeps/powerpc/powerpc64/setjmp-common.S: Likewise.
* sysdeps/powerpc/powerpc64/memcpy.S: Likewise.
* sysdeps/powerpc/powerpc64/memset.S: Likewise.
* sysdeps/powerpc/powerpc64/stpcpy.S: Likewise.
* sysdeps/powerpc/powerpc64/strchr.S: Likewise.
* sysdeps/powerpc/powerpc64/strcmp.S: Likewise.
* sysdeps/powerpc/powerpc64/strcpy.S: Likewise.
* sysdeps/powerpc/powerpc64/strlen.S: Likewise.
* sysdeps/powerpc/powerpc64/strncmp.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_ceil.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_ceilf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_copysign.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_floor.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_floorf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llrint.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llrintf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llround.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llroundf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rint.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rintf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_round.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_roundf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_trunc.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_truncf.S: Likewise.
* sysdeps/powerpc/powerpc64/setjmp-common.S: Add extra entry point
past _mcount call.
* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Use it.
* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
2004-10-06 Ulrich Drepper <drepper@redhat.com>
* resolv/res_mkquery.c (res_nmkquery): Reject randombits value if
low 16 bits are zero.
2004-10-06 Jakub Jelinek <jakub@redhat.com>
* posix/tst-getaddrinfo2.c: Include stdlib.h and string.h.
(do_test): Use %p instead of 0x%08X to print a pointer.
* malloc/malloc.c: Include stdio-common/_itoa.h.
2004-10-05 Ulrich Drepper <drepper@redhat.com>
* elf/rtld.c (dl_main): Use _dl_debug_printf instead of _dl_printf

View File

@ -1,6 +1,6 @@
Open jobs for finishing GNU libc:
---------------------------------
Status: September 2002
Status: October 2004
If you have time and talent to take over any of the jobs below please
contact <bug-glibc@gnu.org>.
@ -53,7 +53,7 @@ contact <bug-glibc@gnu.org>.
[11] Write access function for netmasks, bootparams, and automount
databases for nss_files and nss_db module.
databases for nss_files, nss_nis, and nss_nisplus modules.
The functions should be embedded in the nss scheme. This is not
hard and not all services must be supported at once.
@ -76,7 +76,7 @@ contact <bug-glibc@gnu.org>.
[18] Based on the sprof program we need tools to analyze the output. The
result should be a link map which specifies in which order the .o
files are placed in the shared object. This should help to improve
code locality and result in a smaller foorprint (in code and data
code locality and result in a smaller footprint (in code and data
memory) since less pages are only used in small parts.
@ -93,29 +93,6 @@ contact <bug-glibc@gnu.org>.
available.
[21] The nscd program and the stubs in the libc should be changed so
that each program uses only one socket connect. Take a look at
http://people.redhat.com/drepper/nscd.html
An alternative approach is to use an mmap()ed file. The idea is
the following:
- the nscd creates the hash tables and the information it stores
in it in a mmap()ed region. This means no pointers must be
used, only offsets.
OR
if POSIX shared memory is available use a named shared memory
region to put the data in
- each program using NSS functionality tries to open the file
with the data.
- by checking some timestamp (which the nscd renews frequently)
the programs can test whether the file is still valid
- if the file is valid look through the nscd and locate the
appropriate hash table for the database and lookup the data.
If it is included we are set.
- if the data is not yet in the database we contact the nscd using
the currently implemented methods.
[23] The `strptime' function needs to be completed. This includes among
other things that it must get teached about timezones. The solution
envisioned is to extract the timezones from the ADO timezone
@ -127,18 +104,4 @@ contact <bug-glibc@gnu.org>.
Australia/Canberra or if the current locale is en_AU.
[25] Sun's nscd version implements a feature where the nscd keeps N entries
for each database current. I.e., if an entries lifespan is over and
it is one of the N entries to be kept the nscd updates the information
instead of removing the entry.
How to decide about which N entries to keep has to be examined.
Factors should be number of uses (of course), influenced by aging.
Just imagine a computer used by several people. The IDs of the current
user should be preferred even if the last user spent more time.
[27] We need a second test suite with tests which cannot run during a normal
`make check' run. This test suite can require root priviledges and
can test things like DNS (i.e., require network access),
user-interaction, networking in general, and probably many other things.
[27] ...deleted...

View File

@ -28,7 +28,7 @@ _dl_addr (const void *address, Dl_info *info,
struct link_map **mapp, const ElfW(Sym) **symbolp)
{
const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address);
struct link_map *l, *match;
struct link_map *match;
const ElfW(Sym) *symtab, *matchsym, *symtabend;
const char *strtab;
ElfW(Word) strtabsize;
@ -38,7 +38,7 @@ _dl_addr (const void *address, Dl_info *info,
/* Find the highest-addressed object that ADDRESS is not below. */
match = NULL;
for (l = GL(dl_loaded); l; l = l->l_next)
for (struct link_map *l = GL(dl_loaded); l; l = l->l_next)
if (addr >= l->l_map_start && addr < l->l_map_end)
{
/* We know ADDRESS lies within L if in any shared object.
@ -67,8 +67,8 @@ _dl_addr (const void *address, Dl_info *info,
info->dli_fbase = (void *) match->l_map_start;
/* If this is the main program the information is incomplete. */
if (__builtin_expect (l->l_name[0], 'a') == '\0'
&& l->l_type == lt_executable)
if (__builtin_expect (match->l_name[0], 'a') == '\0'
&& match->l_type == lt_executable)
info->dli_fname = _dl_argv[0];
symtab = (const void *) D_PTR (match, l_info[DT_SYMTAB]);

View File

@ -90,9 +90,9 @@ do_sym (void *handle, const char *name, void *who,
{
if (__builtin_expect (match == GL(dl_loaded), 0))
{
if (! GL(dl_loaded)
|| caller < GL(dl_loaded)->l_map_start
|| caller >= GL(dl_loaded)->l_map_end)
if (match == NULL
|| caller < match->l_map_start
|| caller >= match->l_map_end)
GLRO(dl_signal_error) (0, NULL, NULL, N_("\
RTLD_NEXT used in code not dynamically loaded"));
}

View File

@ -62,10 +62,8 @@ do_test (void)
result = foo ();
out:
#if 0
unlink (PFX "test-subdir/in-subdir.so");
rmdir (testsubdir);
#endif
return result;
}

View File

@ -1,5 +1,5 @@
# This file is updated automatically by Makefile.
glibc-branch := fedora
glibc-base := HEAD
fedora-sync-date := 2004-10-06 09:00 UTC
fedora-sync-tag := fedora-glibc-20041006T0900
fedora-sync-date := 2004-10-12 11:28 UTC
fedora-sync-tag := fedora-glibc-20041012T1128

View File

@ -1,4 +1,4 @@
%define glibcrelease 66
%define glibcrelease 67
%define auxarches i586 i686 athlon sparcv9 alphaev6
%define prelinkarches noarch
%define nptlarches i386 i686 athlon x86_64 ia64 s390 s390x sparcv9 ppc ppc64
@ -1239,6 +1239,13 @@ rm -f *.filelist*
%endif
%changelog
* Tue Oct 12 2004 Jakub Jelinek <jakub@redhat.com> 2.3.3-67
- update from CVS
- use non-blocking sockets in resolver (#135234)
- reset pd->res options on thread exit, so that threads
reusing cached stacks get resolver state properly initialized
(BZ #434)
* Wed Oct 6 2004 Jakub Jelinek <jakub@redhat.com> 2.3.3-66
- update from CVS
- avoid using perl in the spec file, buildrequire sed >= 3.95

View File

@ -29,11 +29,11 @@ elide-routines.os = bb_init_func bb_exit_func
tests := tst-sprofil
include ../Rules
# The mcount code won't work without a frame pointer.
CFLAGS-mcount.c := -fno-omit-frame-pointer
include ../Rules
# We cannot compile mcount.c with -pg because that would
# create recursive calls. Just copy the normal static object.
# On systems where `profil' is not a system call, the same

View File

@ -1,3 +1,8 @@
2004-10-11 Ulrich Drepper <drepper@redhat.com>
* locales/fa_IR: Add to_inpunct map.
Patch by Hamed Malek <hamed@bamdad.org>.
2004-10-04 Ulrich Drepper <drepper@redhat.com>
* locales/gu_IN: Update various incorrect and missing information.

View File

@ -10,8 +10,8 @@ escape_char /
% Fax: +98 21 6019568
% Language: fa
% Territory: IR
% Revision: 2.3
% Date: 2004-03-16
% Revision: 2.4
% Date: 2004-09-04
% Users: general
% Repertoiremap:
% Charset: UTF-8
@ -50,6 +50,20 @@ copy "i18n"
outdigit <U06F0>..<U06F9>
map to_inpunct; /
(<U0030>,<U06F0>); /
(<U0031>,<U06F1>); /
(<U0032>,<U06F2>); /
(<U0033>,<U06F3>); /
(<U0034>,<U06F4>); /
(<U0035>,<U06F5>); /
(<U0036>,<U06F6>); /
(<U0037>,<U06F7>); /
(<U0038>,<U06F8>); /
(<U0039>,<U06F9>); /
(<U002E>,<U066B>); /
(<U002C>,<U066C>)
map to_outpunct; /
(<U002E>,<U066B>); /
(<U002C>,<U066C>)

View File

@ -257,6 +257,10 @@
#include <malloc-machine.h>
#ifdef _LIBC
#include <stdio-common/_itoa.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -30,24 +30,24 @@ __BEGIN_DECLS
/* Read data from file descriptor FD, and put the result in the
buffers described by VECTOR, which is a vector of COUNT `struct iovec's.
buffers described by IOVEC, which is a vector of COUNT `struct iovec's.
The buffers are filled in the order specified.
Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer.
put in IOVEC instead of a contiguous buffer.
This function is a cancellation point and therefore not marked with
__THROW. */
extern ssize_t readv (int __fd, __const struct iovec *__vector, int __count);
extern ssize_t readv (int __fd, __const struct iovec *__iovec, int __count);
/* Write data pointed by the buffers described by VECTOR, which
/* Write data pointed by the buffers described by IOVEC, which
is a vector of COUNT `struct iovec's, to file descriptor FD.
The data is written in the order specified.
Operates just like `write' (see <unistd.h>) except that the data
are taken from VECTOR instead of a contiguous buffer.
are taken from IOVEC instead of a contiguous buffer.
This function is a cancellation point and therefore not marked with
__THROW. */
extern ssize_t writev (int __fd, __const struct iovec *__vector, int __count);
extern ssize_t writev (int __fd, __const struct iovec *__iovec, int __count);
__END_DECLS

View File

@ -4,9 +4,17 @@
of pthread-functions.h and pthreaddef.h.
* sysdeps/unix/sysv/linux/s390/jmp-unwind.c: Likewise.
* sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h (pthread_cond_t):
Change __data.__nwaiters from int to unsigned int.
* tst-clock2.c (do_test): Don't fail if _POSIX_THREAD_CPUTIME == 0 and
sysconf (_SC_THREAD_CPUTIME) returns negative value.
* allocatestack.c (__find_thread_by_id): Move attribute_hidden
before return type.
* sysdeps/s390/jmpbuf-unwind.h: Include bits/wordsize.h.
(JMPBUF_CFA_UNWINDS_ADJ): Subtract 96 resp. 160 bytes from
CFA.
(JMPBUF_CFA_UNWINDS_ADJ): Subtract 96 resp. 160 bytes from CFA.
2004-10-06 Ulrich Drepper <drepper@redhat.com>

View File

@ -772,8 +772,8 @@ __reclaim_stacks (void)
#if HP_TIMING_AVAIL
/* Find a thread given the thread ID. */
struct pthread *
attribute_hidden
struct pthread *
__find_thread_by_id (pid_t tid)
{
struct pthread *result = NULL;

View File

@ -28,7 +28,7 @@ extern int __libc_allocate_rtsig_private (int high);
/* We reserve __SIGRTMIN for use as the cancellation signal and
__SIGRTMIN+1 to andle setuid et.al. These signals are used
__SIGRTMIN+1 to handle setuid et.al. These signals are used
internally. */
int
__libc_current_sigrtmin (void)

View File

@ -33,7 +33,7 @@ __pthread_attr_getstackaddr (attr, stackaddr)
iattr = (struct pthread_attr *) attr;
/* Some code assumes this function to work even if no stack address
has been set. Let them figure it our for themselves what the
has been set. Let them figure it out for themselves what the
value means. Simply store the result. */
*stackaddr = iattr->stackaddr;

View File

@ -100,7 +100,7 @@ typedef union
__extension__ unsigned long long int __wakeup_seq;
__extension__ unsigned long long int __woken_seq;
void *__mutex;
int __nwaiters;
unsigned int __nwaiters;
unsigned int __broadcast_seq;
} __data;
char __size[__SIZEOF_PTHREAD_COND_T];

View File

@ -58,6 +58,14 @@ do_test (void)
#if defined _POSIX_THREAD_CPUTIME && _POSIX_THREAD_CPUTIME >= 0
# define N 10
# if _POSIX_THREAD_CPUTIME == 0
if (sysconf (_SC_THREAD_CPUTIME) < 0)
{
puts ("_POSIX_THREAD_CPUTIME option not available");
return 0;
}
# endif
if (pthread_barrier_init (&b2, NULL, 2) != 0
|| pthread_barrier_init (&bN, NULL, N + 1) != 0)
{

View File

@ -2,6 +2,8 @@
#include <errno.h>
#include <netdb.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
static int
@ -47,7 +49,7 @@ do_test (void)
if (err)
{
printf ("FAIL getaddrinfo IPv4 socktype 0,513: "
"fam %d alen %d addr 0x%08X addr/fam %d "
"fam %d alen %d addr %p addr/fam %d "
"addr/port %d H[%d]\n",
pai->ai_family, pai->ai_addrlen, psin,
psin ? psin->sin_family : 0,

View File

@ -597,6 +597,9 @@ res_thread_freeres (void)
free (_res._u._ext.nsaddrs[ns]);
_res._u._ext.nsaddrs[ns] = NULL;
}
/* Make sure we do a full re-initialization the next time. */
_res.options = 0;
}
text_set_element (__libc_thread_subfreeres, res_thread_freeres);
text_set_element (__libc_subfreeres, res_thread_freeres);

View File

@ -141,7 +141,7 @@ res_nmkquery(res_state statp,
randombits = (tv.tv_sec << 8) ^ tv.tv_usec;
#endif
}
while (randombits == 0);
while ((randombits & 0xffff) == 0);
statp->id = (statp->id + randombits) & 0xffff;
#endif
hp->opcode = op;

View File

@ -88,6 +88,7 @@ static const char rcsid[] = "$BINDId: res_send.c,v 8.38 2000/03/30 20:16:51 vixi
#include <sys/ioctl.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <resolv.h>
#include <signal.h>
@ -965,12 +966,73 @@ send_dg(res_state statp,
return (0);
}
#endif /* !CANNOT_CONNECT_DGRAM */
/* Make socket non-blocking. */
int fl = __fcntl (EXT(statp).nssocks[ns], F_GETFL);
if (fl != -1)
__fcntl (EXT(statp).nssocks[ns], F_SETFL,
fl | O_NONBLOCK);
Dprint(statp->options & RES_DEBUG,
(stdout, ";; new DG socket\n"))
}
s = EXT(statp).nssocks[ns];
/*
* Compute time for the total operation.
*/
seconds = (statp->retrans << ns);
if (ns > 0)
seconds /= statp->nscount;
if (seconds <= 0)
seconds = 1;
evNowTime(&now);
evConsTime(&timeout, seconds, 0);
evAddTime(&finish, &now, &timeout);
int need_recompute = 0;
resend:
#ifdef _LIBC
/* Convert struct timespec in milliseconds. */
ptimeout = timeout.tv_sec * 1000 + timeout.tv_nsec / 1000000;
pfd[0].fd = s;
pfd[0].events = POLLOUT;
n = __poll (pfd, 1, 0);
if (__builtin_expect (n == 0, 0)) {
n = __poll (pfd, 1, ptimeout);
need_recompute = 1;
}
#else
FD_ZERO(&dsmask);
FD_SET(s, &dsmask);
struct timeval zerotime = { 0, 0 };
n = pselect(s + 1, NULL, &dsmask, NULL, &zerotime, NULL);
if (n == 0) {
n = pselect(s + 1, NULL, &dsmask, NULL, &timeout, NULL);
need_recompute = 1;
}
#endif
if (n == 0) {
Dprint(statp->options & RES_DEBUG, (stdout,
";; timeout sending\n"));
*gotsomewhere = 1;
return (0);
}
if (n < 0) {
if (errno == EINTR) {
recompute_resend:
evNowTime(&now);
if (evCmpTime(finish, now) > 0) {
evSubTime(&timeout, &finish, &now);
goto resend;
}
}
Perror(statp, stderr, "select", errno);
res_nclose(statp);
return (0);
}
__set_errno (0);
#ifndef CANNOT_CONNECT_DGRAM
if (send(s, (char*)buf, buflen, 0) != buflen) {
if (errno == EINTR || errno == EAGAIN)
goto recompute_resend;
Perror(statp, stderr, "send", errno);
res_nclose(statp);
return (0);
@ -984,6 +1046,8 @@ send_dg(res_state statp,
if (sendto(s, (char*)buf, buflen, 0,
(struct sockaddr *)nsap, sizeof *nsap) != buflen)
{
if (errno == EINTR || errno == EAGAIN)
goto recompute_resend;
Aerror(statp, stderr, "sendto", errno,
(struct sockaddr *) nsap);
res_nclose(statp);
@ -991,46 +1055,38 @@ send_dg(res_state statp,
}
#endif /* !CANNOT_CONNECT_DGRAM */
/*
* Wait for reply.
*/
seconds = (statp->retrans << ns);
if (ns > 0)
seconds /= statp->nscount;
if (seconds <= 0)
seconds = 1;
evNowTime(&now);
evConsTime(&timeout, seconds, 0);
evAddTime(&finish, &now, &timeout);
wait:
if (need_recompute) {
evNowTime(&now);
if (evCmpTime(finish, now) <= 0) {
err_return:
Perror(statp, stderr, "select", errno);
res_nclose(statp);
return (0);
}
evSubTime(&timeout, &finish, &now);
}
#ifdef _LIBC
/* Convert struct timespec in milliseconds. */
ptimeout = timeout.tv_sec * 1000 + timeout.tv_nsec / 1000000;
pfd[0].fd = s;
pfd[0].events = POLLIN;
n = __poll (pfd, 1, ptimeout);
#else
FD_ZERO(&dsmask);
FD_SET(s, &dsmask);
n = pselect(s + 1, &dsmask, NULL, NULL, &timeout, NULL);
#endif
if (n == 0) {
Dprint(statp->options & RES_DEBUG, (stdout, ";; timeout\n"));
Dprint(statp->options & RES_DEBUG, (stdout,
";; timeout receiving\n"));
*gotsomewhere = 1;
return (0);
}
if (n < 0) {
if (errno == EINTR) {
evNowTime(&now);
if (evCmpTime(finish, now) > 0) {
evSubTime(&timeout, &finish, &now);
goto wait;
}
need_recompute = 1;
goto wait;
}
Perror(statp, stderr, "select", errno);
res_nclose(statp);
return (0);
goto err_return;
}
__set_errno (0);
#ifdef _LIBC
@ -1056,6 +1112,10 @@ send_dg(res_state statp,
resplen = recvfrom(s, (char*)ans, anssiz,0,
(struct sockaddr *)&from, &fromlen);
if (resplen <= 0) {
if (errno == EINTR || errno == EAGAIN) {
need_recompute = 1;
goto wait;
}
Perror(statp, stderr, "recvfrom", errno);
res_nclose(statp);
return (0);

View File

@ -1163,9 +1163,15 @@ _IO_vfscanf (s, format, argptr, errp)
int level;
#ifdef COMPILE_WSCANF
const wchar_t *wcdigits[10];
const wchar_t *wcdigits_extended[10];
#else
const char *mbdigits[10];
const char *mbdigits_extended[10];
#endif
/* "to_inpunct" is a map from ASCII digits to their
equivalent in locale. This is defined for locales
which use an extra digits set. */
wctrans_t map = __wctrans ("to_inpunct");
int n;
from_level = 0;
@ -1176,6 +1182,66 @@ _IO_vfscanf (s, format, argptr, errp)
to_level = (uint32_t) curctype->values[_NL_ITEM_INDEX (_NL_CTYPE_INDIGITS_MB_LEN)].word - 1;
#endif
/* Get the alternative digit forms if there are any. */
if (__builtin_expect (map != NULL, 0))
{
/* Adding new level for extra digits set in locale file. */
++to_level;
for (n = 0; n < 10; ++n)
{
#ifdef COMPILE_WSCANF
wcdigits[n] = (const wchar_t *)
_NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
wchar_t *wc_extended = (wchar_t *)
alloca ((to_level + 2) * sizeof (wchar_t));
__wmemcpy (wc_extended, wcdigits[n], to_level);
wc_extended[to_level] = __towctrans (L'0' + n, map);
wc_extended[to_level + 1] = '\0';
wcdigits_extended[n] = wc_extended;
#else
mbdigits[n]
= curctype->values[_NL_CTYPE_INDIGITS0_MB + n].string;
/* Get the equivalent wide char in map. */
wint_t extra_wcdigit = __towctrans (L'0' + n, map);
/* Convert it to multibyte representation. */
mbstate_t state;
memset (&state, '\0', sizeof (state));
char extra_mbdigit[MB_LEN_MAX];
size_t mblen
= __wcrtomb (extra_mbdigit, extra_wcdigit, &state);
if (mblen == (size_t) -1)
{
/* Ignore this new level. */
map = NULL;
break;
}
/* Calculate the length of mbdigits[n]. */
const char *last_char = mbdigits[n];
for (level = 0; level < to_level; ++level)
last_char = strchr (last_char, '\0') + 1;
size_t mbdigits_len = last_char - mbdigits[n];
/* Allocate memory for extended multibyte digit. */
char *mb_extended;
mb_extended = (char *) alloca (mbdigits_len + mblen + 1);
/* And get the mbdigits + extra_digit string. */
*(char *) __mempcpy (__mempcpy (mb_extended, mbdigits[n],
mbdigits_len),
extra_mbdigit, mblen) = '\0';
mbdigits_extended[n] = mb_extended;
#endif
}
}
/* Read the number into workspace. */
while (c != EOF && width != 0)
{
@ -1185,8 +1251,11 @@ _IO_vfscanf (s, format, argptr, errp)
{
/* Get the string for the digits with value N. */
#ifdef COMPILE_WSCANF
wcdigits[n] = (const wchar_t *)
_NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
if (__builtin_expect (map != NULL, 0))
wcdigits[n] = wcdigits_extended[n];
else
wcdigits[n] = (const wchar_t *)
_NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
wcdigits[n] += from_level;
if (c == (wint_t) *wcdigits[n])
@ -1201,8 +1270,11 @@ _IO_vfscanf (s, format, argptr, errp)
const char *cmpp;
int avail = width > 0 ? width : INT_MAX;
mbdigits[n]
= curctype->values[_NL_CTYPE_INDIGITS0_MB + n].string;
if (__builtin_expect (map != NULL, 0))
mbdigits[n] = mbdigits_extended[n];
else
mbdigits[n]
= curctype->values[_NL_CTYPE_INDIGITS0_MB + n].string;
for (level = 0; level < from_level; level++)
mbdigits[n] = strchr (mbdigits[n], '\0') + 1;

View File

@ -1,5 +1,5 @@
/* Definitions of inline math functions implemented by the m68881/2.
Copyright (C) 1991,92,93,94,96,97,98,99,2000,2002, 2003
Copyright (C) 1991,92,93,94,96,97,98,99,2000,2002, 2003, 2004
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@ -110,7 +110,7 @@
#if defined __USE_MISC || defined __USE_ISOC99
# define __inline_mathop(func, op) \
__inline_mathop1(double, func, op) \
__inline_mathop1(float, __CONCAT(func,f), op) \
__inline_mathop1(float, __CONCAT(func,f), op) \
__inline_mathop1(long double, __CONCAT(func,l), op)
#else
# define __inline_mathop(func, op) \
@ -118,7 +118,7 @@
#endif
#define __inline_mathop1(float_type,func, op) \
__m81_defun (float_type, func, (float_type __mathop_x)) __THROW \
__m81_defun (float_type, func, (float_type __mathop_x)) \
{ \
float_type __result; \
__asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\
@ -175,7 +175,7 @@ __inline_mathop(trunc, intrz)
for the function names. */
#define __inline_functions(float_type, s) \
__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) __THROW \
__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) \
{ \
float_type __result; \
unsigned long int __ctrl_reg; \
@ -191,7 +191,7 @@ __m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) __THROW \
return __result; \
} \
\
__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) __THROW \
__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) \
{ \
float_type __result; \
unsigned long int __ctrl_reg; \
@ -217,7 +217,7 @@ __inline_functions(long double,l)
#ifdef __USE_MISC
# define __inline_functions(float_type, s) \
__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) __THROW \
__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) \
{ \
/* There is no branch-condition for infinity, \
so we must extract and examine the condition codes manually. */ \
@ -227,7 +227,7 @@ __m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) __THROW \
return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0; \
} \
\
__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) __THROW \
__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) \
{ \
/* There is no branch-condition for infinity, so we must extract and \
examine the condition codes manually. */ \
@ -238,7 +238,7 @@ __m81_defun (int, __CONCAT(__finite,s), (float_type __value)) __THROW \
} \
\
__m81_defun (float_type, __CONCAT(__scalbn,s), \
(float_type __x, int __n)) __THROW \
(float_type __x, int __n)) \
{ \
float_type __result; \
__asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \
@ -255,7 +255,7 @@ __inline_functions(long double,l)
#if defined __USE_MISC || defined __USE_XOPEN
# define __inline_functions(float_type, s) \
__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) __THROW \
__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) \
{ \
char __result; \
__asm("ftst%.x %1\n" \
@ -275,7 +275,7 @@ __inline_functions(long double,l)
#ifdef __USE_ISOC99
# define __inline_functions(float_type, s) \
__m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) __THROW \
__m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) \
{ \
/* There is no branch-condition for the sign bit, so we must extract \
and examine the condition codes manually. */ \
@ -285,13 +285,13 @@ __m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) __THROW \
return (__fpsr >> 27) & 1; \
} \
\
__m81_defun (float_type, __CONCAT(__scalbln,s), \
(float_type __x, long int __n)) __THROW \
__m81_defun (float_type, __CONCAT(__scalbln,s), \
(float_type __x, long int __n)) \
{ \
return __CONCAT(__scalbn,s) (__x, __n); \
} \
\
__m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) __THROW \
__m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) \
{ \
float_type __result; \
unsigned long int __ctrl_reg; \
@ -305,7 +305,7 @@ __m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) __THROW \
return __result; \
} \
\
__m81_defun (long int, __CONCAT(__lrint,s), (float_type __x)) __THROW \
__m81_defun (long int, __CONCAT(__lrint,s), (float_type __x)) \
{ \
long int __result; \
__asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x)); \
@ -314,7 +314,7 @@ __m81_defun (long int, __CONCAT(__lrint,s), (float_type __x)) __THROW \
\
__m81_inline float_type \
__m81_u(__CONCAT(__fma,s))(float_type __x, float_type __y, \
float_type __z) __THROW \
float_type __z) \
{ \
return (__x * __y) + __z; \
}
@ -331,7 +331,7 @@ __inline_functions (long double,l)
# define __inline_functions(float_type, s) \
__m81_inline void \
__m81_u(__CONCAT(__sincos,s))(float_type __x, float_type *__sinx, \
float_type *__cosx) __THROW \
float_type *__cosx) \
{ \
__asm ("fsincos%.x %2,%1:%0" \
: "=f" (*__sinx), "=f" (*__cosx) : "f" (__x)); \
@ -351,14 +351,14 @@ __inline_functions (long double,l)
/* Note that there must be no whitespace before the argument passed for
NAME, to make token pasting work correctly with -traditional. */
# define __inline_forward_c(rettype, name, args1, args2) \
extern __inline rettype __attribute__((__const__)) \
name args1 __THROW \
{ \
return __CONCAT(__,name) args2; \
extern __inline rettype __attribute__((__const__)) \
name args1 \
{ \
return __CONCAT(__,name) args2; \
}
# define __inline_forward(rettype, name, args1, args2) \
extern __inline rettype name args1 __THROW \
extern __inline rettype name args1 \
{ \
return __CONCAT(__,name) args2; \
}

View File

@ -1,5 +1,5 @@
/* memcopy.h -- definitions for memory copy functions. Motorola 68020 version.
Copyright (C) 1991, 1997 Free Software Foundation, Inc.
Copyright (C) 1991, 1997, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Torbjorn Granlund (tege@sics.se).
@ -68,29 +68,33 @@
do \
{ \
size_t __nblocks = (nbytes) / 32 + 1; \
op_t *__dst_ep = (op_t *) (dst_ep); \
op_t *__src_ep = (op_t *) (src_ep); \
switch ((nbytes) / sizeof (op_t) % 8) \
do \
{ \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 7: \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 6: \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 5: \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 4: \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 3: \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 2: \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 1: \
*--((op_t *) dst_ep) = *--((op_t *) src_ep); \
*--__dst_ep = *--__src_ep; \
case 0: \
__nblocks--; \
} \
while (__nblocks != 0); \
(nbytes_left) = (nbytes) % sizeof (op_t); \
(dst_ep) = (unsigned long) __dst_ep; \
(src_ep) = (unsigned long) __src_ep; \
} while (0)
#endif

View File

@ -22,3 +22,10 @@ ifeq ($(subdir),elf)
# help gcc inline asm code from dl-machine.h
+cflags += -finline-limit=2000
endif
ifeq ($(subdir),gmon)
# The assembly functions assume that fp arg regs are not trashed.
# Compiling with -msoft-float ensures that fp regs are not used
# for moving memory around.
CFLAGS-mcount.c += -msoft-float
endif

View File

@ -42,6 +42,7 @@
.machine "altivec"
ENTRY (BP_SYM (__longjmp))
CALL_MCOUNT 2
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
#ifndef __NO_VMX__
ld r5,.LC__dl_hwcap@toc(r2)

View File

@ -25,8 +25,9 @@
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
ENTRY (BP_SYM (_setjmp))
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__sigsetjmp))
b JUMPTARGET (__sigsetjmp_ent)
END (BP_SYM (_setjmp))
libc_hidden_def (_setjmp)
@ -36,8 +37,9 @@ libc_hidden_def (_setjmp)
symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.3);
ENTRY (BP_SYM (__novmx_setjmp))
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__novmx__sigsetjmp))
b JUMPTARGET (__novmx__sigsetjmp_ent)
END (BP_SYM (__novmx_setjmp))
libc_hidden_def (__novmx_setjmp)
# endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4) */
@ -50,13 +52,15 @@ ENTRY (BP_SYM (__GI__setjmp))
#if defined SHARED && !defined IS_IN_rtld
std r2,40(r1) /* Save the callers TOC in the save area. */
#endif
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__vmx__sigsetjmp))
b JUMPTARGET (__vmx__sigsetjmp_ent)
END (BP_SYM (__GI__setjmp))
ENTRY (BP_SYM (__vmx_setjmp))
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__vmx__sigsetjmp))
b JUMPTARGET (__vmx__sigsetjmp_ent)
END (BP_SYM (__vmx_setjmp))
libc_hidden_def (__vmx_setjmp)
#endif /* !NOT_IN_libc */

View File

@ -25,8 +25,9 @@
ENTRY (__novmxsetjmp)
CALL_MCOUNT 1
li r4,1 /* Set second argument to 1. */
b JUMPTARGET (__novmx__sigsetjmp)
b JUMPTARGET (__novmx__sigsetjmp_ent)
END (__novmxsetjmp)
strong_alias (__novmxsetjmp, __novmx__setjmp)
symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3)
@ -35,8 +36,9 @@ symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3)
ENTRY (__vmxsetjmp)
CALL_MCOUNT 1
li r4,1 /* Set second argument to 1. */
b JUMPTARGET (__vmx__sigsetjmp)
b JUMPTARGET (__vmx__sigsetjmp_ent)
END (__vmxsetjmp)
strong_alias (__vmxsetjmp, __vmx__setjmp)
strong_alias (__vmx__sigsetjmp, __setjmp)

View File

@ -27,6 +27,7 @@
.section ".text"
ENTRY (__ceil)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -27,6 +27,7 @@
.section ".text"
ENTRY (__ceilf)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -23,6 +23,7 @@
#include <sysdep.h>
ENTRY(__copysign)
CALL_MCOUNT 0
/* double [f1] copysign (double [f1] x, double [f2] y);
copysign(x,y) returns a value with the magnitude of x and
with the sign bit of y. */

View File

@ -25,6 +25,7 @@
.section ".text"
ENTRY (__floor)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -25,6 +25,7 @@
.section ".text"
ENTRY (__floorf)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -21,6 +21,7 @@
/* long long int[r3] __llrint (double x[fp1]) */
ENTRY (__llrint)
CALL_MCOUNT 0
fctid fp13,fp1
stfd fp13,-16(r1)
nop /* Insure the following load is in a different dispatch group */

View File

@ -21,6 +21,7 @@
/* long long int[r3] __llrintf (float x[fp1]) */
ENTRY (__llrintf)
CALL_MCOUNT 0
fctid fp13,fp1
stfd fp13,-16(r1)
nop /* Insure the following load is in a different dispatch group */

View File

@ -37,6 +37,7 @@
to the integer value. */
ENTRY (__llround)
CALL_MCOUNT 0
lfd fp12,.LC0@toc(2)
lfd fp10,.LC1@toc(2)
fcmpu cr6,fp1,fp12 /* if (x > 0.0) */

View File

@ -37,6 +37,7 @@
to the integer value. */
ENTRY (__llroundf)
CALL_MCOUNT 0
lfd fp12,.LC0@toc(2)
lfd fp10,.LC1@toc(2)
fcmpu cr6,fp1,fp12 /* if (x < 0.0) */

View File

@ -28,6 +28,7 @@
.section ".text"
ENTRY (__rint)
CALL_MCOUNT 0
lfd fp13,.LC0@toc(2)
fabs fp0,fp1
fsub fp12,fp13,fp13 /* generate 0.0 */

View File

@ -25,6 +25,7 @@
.section ".text"
ENTRY (__rintf)
CALL_MCOUNT 0
lfd fp13,.LC0@toc(2)
fabs fp0,fp1
fsubs fp12,fp13,fp13 /* generate 0.0 */

View File

@ -39,6 +39,7 @@
to the integer value. */
ENTRY (__round)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -39,6 +39,7 @@
to the integer value. */
ENTRY (__roundf )
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -34,6 +34,7 @@
subtracting +-2**52. */
ENTRY (__trunc)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -34,6 +34,7 @@
subtracting +-2**23. */
ENTRY (__truncf)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2)
fabs fp0,fp1

View File

@ -37,6 +37,8 @@
Each case has a optimized unrolled loop. */
EALIGN (BP_SYM (memcpy), 5, 0)
CALL_MCOUNT 3
cmpldi cr1,5,31
neg 0,3
std 3,-16(1)

View File

@ -41,6 +41,7 @@
to 0, to take advantage of the dcbz instruction. */
EALIGN (BP_SYM (memset), 5, 0)
CALL_MCOUNT 3
#define rTMP r0
#define rRTN r3 /* Initial value of 1st argument. */
@ -274,6 +275,7 @@ libc_hidden_builtin_def (memset)
/* Copied from bzero.S to prevent the linker from inserting a stub
between bzero and memset. */
ENTRY (BP_SYM (__bzero))
CALL_MCOUNT 3
#if __BOUNDED_POINTERS__
mr r6,r4
li r5,0

View File

@ -41,6 +41,10 @@
.machine "altivec"
ENTRY (BP_SYM (__sigsetjmp))
CALL_MCOUNT 2
.globl JUMPTARGET(GLUE(__sigsetjmp,_ent))
.hidden JUMPTARGET(GLUE(__sigsetjmp,_ent))
JUMPTARGET(GLUE(__sigsetjmp,_ent)):
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
std r1,(JB_GPR1*8)(3)
mflr r0

View File

@ -26,6 +26,7 @@
/* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */
EALIGN (BP_SYM (__stpcpy), 4, 0)
CALL_MCOUNT 2
#define rTMP r0
#define rRTN r3

View File

@ -26,6 +26,7 @@
/* char * [r3] strchr (const char *s [r3] , int c [r4] ) */
ENTRY (BP_SYM (strchr))
CALL_MCOUNT 2
#define rTMP1 r0
#define rRTN r3 /* outgoing result */

View File

@ -26,6 +26,7 @@
/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */
EALIGN (BP_SYM(strcmp), 4, 0)
CALL_MCOUNT 2
#define rTMP r0
#define rRTN r3

View File

@ -26,6 +26,7 @@
/* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */
EALIGN (BP_SYM (strcpy), 4, 0)
CALL_MCOUNT 2
#define rTMP r0
#define rRTN r3 /* incoming DEST arg preserved as result */

View File

@ -79,6 +79,7 @@
/* int [r3] strlen (char *s [r3]) */
ENTRY (BP_SYM (strlen))
CALL_MCOUNT 1
#define rTMP1 r0
#define rRTN r3 /* incoming STR arg, outgoing result */

View File

@ -26,6 +26,7 @@
/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
EALIGN (BP_SYM(strncmp), 4, 0)
CALL_MCOUNT 3
#define rTMP r0
#define rRTN r3

View File

@ -23,37 +23,36 @@
#ifdef __ASSEMBLER__
/* Support macros for CALL_MCOUNT. */
.macro SAVE_ARG NARG
.if \NARG
SAVE_ARG \NARG-1
std 2+\NARG,-72+8*(\NARG)(1)
.endif
.endm
.macro REST_ARG NARG
.if \NARG
REST_ARG \NARG-1
ld 2+\NARG,40+8*(\NARG)(1)
.endif
.endm
/* If compiled for profiling, call `_mcount' at the start of each function.
see ppc-mcount.S for more details. */
.macro CALL_MCOUNT NARG
#ifdef PROF
/* The mcount code relies on a the return address being on the stack
to locate our caller and so it can restore it; so store one just
for its benefit. */
#ifdef SYSV_ELF_PROFILING
#define CALL_MCOUNT \
.pushsection; \
.section ".data"; \
.align ALIGNARG(2); \
__mcount: \
.long 0; \
.previous; \
.section ".toc","aw"; \
.LC__mcount:; \
.tc __mcount[TC],__mcount; \
.previous; \
mflr r0; \
std r0,16(r1); \
ld r0,.LC__mcount@toc(r2); \
bl JUMPTARGET(_mcount);
#else /* SYSV_ELF_PROFILING */
#define CALL_MCOUNT \
mflr r0; \
std r0,16(r1); \
bl JUMPTARGET(_mcount);
#endif /* SYSV_ELF_PROFILING */
#else /* PROF */
#define CALL_MCOUNT /* Do nothing. */
#endif /* PROF */
mflr r0
SAVE_ARG \NARG
std r0,16(r1)
stdu r1,-112(r1)
bl JUMPTARGET (_mcount)
ld r0,128(r1)
REST_ARG \NARG
addi r1,r1,112
mtlr r0
#endif
.endm
#ifdef USE_PPC64_OVERLAPPING_OPD
# define OPD_ENT(name) .quad BODY_LABEL (name), .TOC.@tocbase
@ -106,24 +105,11 @@ BODY_LABEL(name):
/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
past a 2^alignt boundary. */
#ifdef PROF
#define EALIGN(name, alignt, words) \
ENTRY_2(name) \
.align ALIGNARG(alignt); \
EALIGN_W_##words; \
BODY_LABEL(name): \
CALL_MCOUNT \
b 0f; \
.align ALIGNARG(alignt); \
EALIGN_W_##words; \
0:
#else /* PROF */
#define EALIGN(name, alignt, words) \
ENTRY_2(name) \
.align ALIGNARG(alignt); \
EALIGN_W_##words; \
BODY_LABEL(name):
#endif
/* Local labels stripped out by the linker. */
#undef L

View File

@ -1,4 +1,4 @@
# @(#)asia 7.75
# @(#)asia 7.77
# This data is by no means authoritative; if you think you know better,
# go ahead and edit the file (and please send any changes to
@ -761,6 +761,26 @@ Zone Asia/Jerusalem 2:20:56 - LMT 1880
# direction is expected until the latter part of 2004 which is a long
# time off in terms of Israeli politics.
# (2004-09-20):
# The latest rumour, however, is that in 2005, when the clock changes to
# Daylight Saving Time (date as yet unknown), the move will be a two-hour leap
# forward (from UTC+0200 to UTC+0400) and then, in the fall, the clock will
# move back only an hour to UTC+0300 thus effectively moving Israel's timezone
# from UTC+0200 to UTC+0300. However, no actual draft has been put before the
# Knesset (Israel's Parliament) though the intention is to do so this
# month [2004-09].
# (2004-09-26):
# Even though the draft law for the above did pass the Ministerial Committee
# for Legislative Matters three months ago, it was voted down in today's
# Cabinet meeting. The current suggestion is to keep the current timezone at
# UTC+0200 but have an extended period of Daylight Saving Time (UTC+0300) from
# the beginning of Passover holiday in the spring to after the Tabernacle
# holiday in the fall (i.e. the dates of which are governed by the Hebrew
# calendar but this means at least 184 days of DST). However, this is only a
# suggestion that was raised in today's cabinet meeting and has not yet been
# drafted.
###############################################################################

View File

@ -21,7 +21,7 @@
#ifndef lint
#ifndef NOID
static char privatehid[] = "@(#)private.h 7.53";
static char privatehid[] = "@(#)private.h 7.54";
#endif /* !defined NOID */
#endif /* !defined lint */
@ -190,10 +190,21 @@ extern int unlink P((const char * filename));
** But some newer errno.h implementations define it as a macro.
** Fix the former without affecting the latter.
*/
#ifndef errno
extern int errno;
#endif /* !defined errno */
/*
** Some time.h implementations don't declare asctime_r.
** Others might define it as a macro.
** Fix the former without affecting the latter.
*/
#ifndef asctime_r
extern char * asctime_r();
#endif
/*
** Private function declarations.
*/

View File

@ -1,4 +1,4 @@
# @(#)southamerica 7.52
# @(#)southamerica 7.54
# This data is by no means authoritative; if you think you know better,
# go ahead and edit the file (and please send any changes to
@ -186,6 +186,20 @@ Rule Arg 2000 only - Mar Sun>=1 0:00 0 -
# contains a contradiction. I would give more credence to the Saturday/Sunday
# date than the "three days earlier" phrase, and conclude that Tierra del
# Fuego set its clocks back at 2004-05-30 00:00.
#
# From Steffen Thorsen (2004-10-05):
# The previous law 7210 which changed the province of Mendoza's time zone
# back in May have been modified slightly in a new law 7277, which set the
# new end date to 2004-09-26 (original date was 2004-10-17).
# http://www.gobernac.mendoza.gov.ar/boletin/pdf/20040924-27244-normas.pdf
#
# From Mariano Absatz (2004-10-05):
# San Juan changed from UTC-03:00 to UTC-04:00 at midnight between
# Sunday, May 30th and Monday, May 31st. It changed back to UTC-03:00
# at midnight between Saturday, July 24th and Sunday, July 25th....
# http://www.sanjuan.gov.ar/prensa/archivo/000329.html
# http://www.sanjuan.gov.ar/prensa/archivo/000426.html
# http://www.sanjuan.gov.ar/prensa/archivo/000441.html
# Unless otherwise specified, data are from Shanks through 1992, from
# the IATA otherwise. As noted below, Shanks says that
@ -261,8 +275,8 @@ Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
-4:00 - WART 1991 May 7
-3:00 Arg AR%sT 1999 Oct 3
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 Jun 1
-4:00 - WART 2004 Oct 17
-3:00 - ART 2004 May 31
-4:00 - WART 2004 Jul 25
-3:00 - ART
#
# Jujuy (JY)
@ -306,7 +320,7 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
-3:00 Arg AR%sT 1999 Oct 3
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 May 23
-4:00 - WART 2004 Oct 17
-4:00 - WART 2004 Sep 26
-3:00 - ART
#
# Chubut (CH)
@ -420,6 +434,11 @@ Zone America/La_Paz -4:32:36 - LMT 1890
# the Government decided to postpone DST, instead of changing the Constitution
# (maybe, for the next elections, it will be possible to change the clock)...
# From Rodrigo Severo (2004-10-04):
# It's just the biannual change made necessary by the much hyped, supposedly
# modern Brazilian eletronic voting machines which, apparently, can't deal
# with a time change between the first and the second rounds of the elections.
# From Paul Eggert (2002-10-10):
# The official decrees referenced below are mostly taken from
# <a href="http://pcdsh01.on.br/DecHV.html">
@ -556,11 +575,15 @@ Rule Brazil 2001 max - Feb Sun>=15 0:00 0 -
Rule Brazil 2002 only - Nov 3 0:00 1:00 S
# Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
# <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm"></a>
Rule Brazil 2003 max - Oct Sun>=15 0:00 1:00 S
Rule Brazil 2003 only - Oct 19 0:00 1:00 S
# Decree 5,223 (2004-10-01) reestablishes DST in MT.
# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm"></a>
Rule Brazil 2004 only - Nov 2 0:00 1:00 S
# The latest ruleset listed above says that the following states observe DST:
# DF, ES, GO, MG, MS, PR, RJ, RS, SC, SP.
# DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP.
#
# For dates after mid-2004, the above rules with TO="max" are guesses
Rule Brazil 2005 max - Oct Sun>=15 0:00 1:00 S
# For dates after mid-2005, the above rules with TO="max" are guesses
# and are quite possibly wrong, but are more likely than no DST at all.
@ -648,7 +671,8 @@ Zone America/Campo_Grande -3:38:28 - LMT 1914
# Mato Grosso (MT)
Zone America/Cuiaba -3:44:20 - LMT 1914
-4:00 Brazil AM%sT 2003 Sep 24
-4:00 - AMT
-4:00 - AMT 2004 Oct 4
-4:00 Brazil AM%sT
#
# west Para (PA), Rondonia (RO)
# West Para includes Altamira, Oribidos, Prainha, Oriximina, and Santarem.
@ -1029,6 +1053,11 @@ Rule Uruguay 1990 1992 - Mar Sun>=1 0:00 0 -
Rule Uruguay 1990 1991 - Oct Sun>=21 0:00 1:00 S
Rule Uruguay 1992 only - Oct 18 0:00 1:00 S
Rule Uruguay 1993 only - Feb 28 0:00 0 -
# From Eduardo Cota (2004-09-20):
# The uruguayan government has decreed a change in the local time....
# http://www.presidencia.gub.uy/decretos/2004091502.htm
Rule Uruguay 2004 only - Sep Sun>=15 0:00 1:00 S
Rule Uruguay 2005 only - Mar Sun>=8 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Montevideo -3:44:44 - LMT 1898 Jun 28
-3:44:44 - MMT 1920 May 1 # Montevideo MT

View File

@ -1,4 +1,4 @@
static char elsieid[] = "@(#)zdump.c 7.31";
static char elsieid[] = "@(#)zdump.c 7.40";
/*
** This code has been made independent of the rest of the time
@ -64,16 +64,15 @@ static char elsieid[] = "@(#)zdump.c 7.31";
#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
#endif /* !defined isleap */
#if HAVE_GETTEXT - 0
#if HAVE_GETTEXT
#include "locale.h" /* for setlocale */
#include "libintl.h"
#endif /* HAVE_GETTEXT - 0 */
#endif /* HAVE_GETTEXT */
#ifndef GNUC_or_lint
#ifdef lint
#define GNUC_or_lint
#endif /* defined lint */
#ifndef lint
#else /* !defined lint */
#ifdef __GNUC__
#define GNUC_or_lint
#endif /* defined __GNUC__ */
@ -83,8 +82,7 @@ static char elsieid[] = "@(#)zdump.c 7.31";
#ifndef INITIALIZE
#ifdef GNUC_or_lint
#define INITIALIZE(x) ((x) = 0)
#endif /* defined GNUC_or_lint */
#ifndef GNUC_or_lint
#else /* !defined GNUC_or_lint */
#define INITIALIZE(x)
#endif /* !defined GNUC_or_lint */
#endif /* !defined INITIALIZE */
@ -96,11 +94,11 @@ static char elsieid[] = "@(#)zdump.c 7.31";
*/
#ifndef _
#if HAVE_GETTEXT - 0
#if HAVE_GETTEXT
#define _(msgid) gettext(msgid)
#else /* !(HAVE_GETTEXT - 0) */
#else /* !HAVE_GETTEXT */
#define _(msgid) msgid
#endif /* !(HAVE_GETTEXT - 0) */
#endif /* !HAVE_GETTEXT */
#endif /* !defined _ */
#ifndef TZ_DOMAIN
@ -110,8 +108,7 @@ static char elsieid[] = "@(#)zdump.c 7.31";
#ifndef P
#ifdef __STDC__
#define P(x) x
#endif /* defined __STDC__ */
#ifndef __STDC__
#else /* !defined __STDC__ */
#define P(x) ()
#endif /* !defined __STDC__ */
#endif /* !defined P */
@ -129,6 +126,7 @@ static time_t hunt P((char * name, time_t lot, time_t hit));
static size_t longest;
static char * progname;
static void show P((char * zone, time_t t, int v));
static void dumptime P((const struct tm * tmp));
int
main(argc, argv)
@ -150,14 +148,13 @@ char * argv[];
struct tm newtm;
INITIALIZE(cuttime);
#if HAVE_GETTEXT - 0
(void) setlocale(LC_CTYPE, "");
#if HAVE_GETTEXT
(void) setlocale(LC_MESSAGES, "");
#ifdef TZ_DOMAINDIR
(void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
#endif /* defined(TEXTDOMAINDIR) */
#endif /* defined TEXTDOMAINDIR */
(void) textdomain(TZ_DOMAIN);
#endif /* HAVE_GETTEXT - 0 */
#endif /* HAVE_GETTEXT */
progname = argv[0];
for (i = 1; i < argc; ++i)
if (strcmp(argv[i], "--version") == 0) {
@ -324,7 +321,7 @@ struct tm * oldp;
return -delta(oldp, newp);
result = 0;
for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy)
result += DAYSPERNYEAR + isleap(tmy + TM_YEAR_BASE);
result += DAYSPERNYEAR + isleap(tmy + (long) TM_YEAR_BASE);
result += newp->tm_yday - oldp->tm_yday;
result *= HOURSPERDAY;
result += newp->tm_hour - oldp->tm_hour;
@ -344,10 +341,12 @@ int v;
struct tm * tmp;
(void) printf("%-*s ", (int) longest, zone);
if (v)
(void) printf("%.24s UTC = ", asctime(gmtime(&t)));
if (v) {
dumptime(gmtime(&t));
(void) printf(" UTC = ");
}
tmp = localtime(&t);
(void) printf("%.24s", asctime(tmp));
dumptime(tmp);
if (*abbr(tmp) != '\0')
(void) printf(" %s", abbr(tmp));
if (v) {
@ -371,3 +370,37 @@ struct tm * tmp;
result = tzname[tmp->tm_isdst];
return (result == NULL) ? &nada : result;
}
static void
dumptime(timeptr)
register const struct tm * timeptr;
{
static const char wday_name[][3] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
static const char mon_name[][3] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
register const char * wn;
register const char * mn;
/*
** The packaged versions of localtime and gmtime never put out-of-range
** values in tm_wday or tm_mon, but since this code might be compiled
** with other (perhaps experimental) versions, paranoia is in order.
*/
if (timeptr->tm_wday < 0 || timeptr->tm_wday >=
(int) (sizeof wday_name / sizeof wday_name[0]))
wn = "???";
else wn = wday_name[timeptr->tm_wday];
if (timeptr->tm_mon < 0 || timeptr->tm_mon >=
(int) (sizeof mon_name / sizeof mon_name[0]))
mn = "???";
else mn = mon_name[timeptr->tm_mon];
(void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d %ld",
wn, mn,
timeptr->tm_mday, timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec,
timeptr->tm_year + (long) TM_YEAR_BASE);
}