diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2005-02-23 19:08:58 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2005-02-23 19:08:58 +0000 |
commit | 6b9a74f9e625e8e4d96e325b959ebead48e4a192 (patch) | |
tree | 40ba541db2e02522847b1e3f91746bb75ebc5078 /newlib/libc/time | |
parent | 3a021c19f42cfcbc585de089966c279e665592bc (diff) | |
download | newlib-6b9a74f9e625e8e4d96e325b959ebead48e4a192.zip newlib-6b9a74f9e625e8e4d96e325b959ebead48e4a192.tar.gz newlib-6b9a74f9e625e8e4d96e325b959ebead48e4a192.tar.bz2 |
2005-02-23 Jeff Johnston <jjohnstn@redhat.com>
* libc/include/time.h [!CYGWIN](_timezone): Change to long.
(__tzrule_type, __tzinfo_type): New types.
(__gettzinfo): New function.
* libc/sys/linux/include/time.h: Ditto.
* libc/time/Makefile.am: Add gettzinfo.c.
* libc/time/Makefile.in: Regenerated.
* libc/time/local.h: Moved __tzrule_type to time.h.
* libc/time/mktime.c: Call __gettzinfo to reference
__tznorth, __tzyear, and __tzrule array.
* libc/time/mktm_r.c: Ditto.
* libc/time/strftime.c: Ditto.
* libc/time/tzset_r.c: Ditto. Also remove definition
of __tzrule which is now in gettzinfo.c. Change _timezone
references to not cast to time_t.
* libc/time/gettzinfo.c: New file.
Diffstat (limited to 'newlib/libc/time')
-rw-r--r-- | newlib/libc/time/Makefile.am | 1 | ||||
-rw-r--r-- | newlib/libc/time/Makefile.in | 17 | ||||
-rw-r--r-- | newlib/libc/time/gettzinfo.c | 15 | ||||
-rw-r--r-- | newlib/libc/time/local.h | 18 | ||||
-rw-r--r-- | newlib/libc/time/mktime.c | 17 | ||||
-rw-r--r-- | newlib/libc/time/mktm_r.c | 39 | ||||
-rw-r--r-- | newlib/libc/time/strftime.c | 3 | ||||
-rw-r--r-- | newlib/libc/time/tzset_r.c | 54 |
8 files changed, 83 insertions, 81 deletions
diff --git a/newlib/libc/time/Makefile.am b/newlib/libc/time/Makefile.am index 3735def..3e0ae57 100644 --- a/newlib/libc/time/Makefile.am +++ b/newlib/libc/time/Makefile.am @@ -11,6 +11,7 @@ LIB_SOURCES = \ ctime.c \ ctime_r.c \ difftime.c \ + gettzinfo.c \ gmtime.c \ gmtime_r.c \ lcltime.c \ diff --git a/newlib/libc/time/Makefile.in b/newlib/libc/time/Makefile.in index 20ad1f0..c56c998 100644 --- a/newlib/libc/time/Makefile.in +++ b/newlib/libc/time/Makefile.in @@ -110,7 +110,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) -LIB_SOURCES = asctime.c asctime_r.c clock.c ctime.c ctime_r.c difftime.c gmtime.c gmtime_r.c lcltime.c lcltime_r.c mktime.c mktm_r.c strftime.c strptime.c time.c tzlock.c tzset.c tzset_r.c +LIB_SOURCES = asctime.c asctime_r.c clock.c ctime.c ctime_r.c difftime.c gettzinfo.c gmtime.c gmtime_r.c lcltime.c lcltime_r.c mktime.c mktm_r.c strftime.c strptime.c time.c tzlock.c tzset.c tzset_r.c libtime_la_LDFLAGS = -Xcompiler -nostdlib @@ -144,19 +144,20 @@ lib_a_LIBADD = @USE_LIBTOOL_FALSE@lib_a_OBJECTS = asctime.$(OBJEXT) \ @USE_LIBTOOL_FALSE@asctime_r.$(OBJEXT) clock.$(OBJEXT) ctime.$(OBJEXT) \ @USE_LIBTOOL_FALSE@ctime_r.$(OBJEXT) difftime.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@gmtime.$(OBJEXT) gmtime_r.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@lcltime.$(OBJEXT) lcltime_r.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@mktime.$(OBJEXT) mktm_r.$(OBJEXT) strftime.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@gettzinfo.$(OBJEXT) gmtime.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@gmtime_r.$(OBJEXT) lcltime.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@lcltime_r.$(OBJEXT) mktime.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@mktm_r.$(OBJEXT) strftime.$(OBJEXT) \ @USE_LIBTOOL_FALSE@strptime.$(OBJEXT) time.$(OBJEXT) tzlock.$(OBJEXT) \ @USE_LIBTOOL_FALSE@tzset.$(OBJEXT) tzset_r.$(OBJEXT) LTLIBRARIES = $(noinst_LTLIBRARIES) libtime_la_LIBADD = @USE_LIBTOOL_TRUE@libtime_la_OBJECTS = asctime.lo asctime_r.lo clock.lo \ -@USE_LIBTOOL_TRUE@ctime.lo ctime_r.lo difftime.lo gmtime.lo gmtime_r.lo \ -@USE_LIBTOOL_TRUE@lcltime.lo lcltime_r.lo mktime.lo mktm_r.lo \ -@USE_LIBTOOL_TRUE@strftime.lo strptime.lo time.lo tzlock.lo tzset.lo \ -@USE_LIBTOOL_TRUE@tzset_r.lo +@USE_LIBTOOL_TRUE@ctime.lo ctime_r.lo difftime.lo gettzinfo.lo \ +@USE_LIBTOOL_TRUE@gmtime.lo gmtime_r.lo lcltime.lo lcltime_r.lo \ +@USE_LIBTOOL_TRUE@mktime.lo mktm_r.lo strftime.lo strptime.lo time.lo \ +@USE_LIBTOOL_TRUE@tzlock.lo tzset.lo tzset_r.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) diff --git a/newlib/libc/time/gettzinfo.c b/newlib/libc/time/gettzinfo.c new file mode 100644 index 0000000..be754f3 --- /dev/null +++ b/newlib/libc/time/gettzinfo.c @@ -0,0 +1,15 @@ +#include <sys/types.h> +#include <local.h> + +/* Shared timezone information for libc/time functions. */ +static __tzinfo_type tzinfo = {1, 0, + { {'J', 0, 0, 0, 0, (time_t)0, 0 }, + {'J', 0, 0, 0, 0, (time_t)0, 0 } + } +}; + +__tzinfo_type * +__gettzinfo (void) +{ + return &tzinfo; +} diff --git a/newlib/libc/time/local.h b/newlib/libc/time/local.h index 7228087..9d9ef87 100644 --- a/newlib/libc/time/local.h +++ b/newlib/libc/time/local.h @@ -19,24 +19,6 @@ #define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) -extern time_t __tzstart_std; -extern time_t __tzstart_dst; -extern int __tznorth; -extern int __tzyear; - -typedef struct __tzrule_struct -{ - char ch; - int m; - int n; - int d; - int s; - time_t change; - int offset; -} __tzrule_type; - -extern __tzrule_type __tzrule[2]; - struct tm * _EXFUN (_mktm_r, (_CONST time_t *, struct tm *, int __is_gmtime)); int _EXFUN (__tzcalc_limits, (int __year)); diff --git a/newlib/libc/time/mktime.c b/newlib/libc/time/mktime.c index f6f080d..8cd9564 100644 --- a/newlib/libc/time/mktime.c +++ b/newlib/libc/time/mktime.c @@ -158,6 +158,7 @@ mktime (tim_p) time_t tim = 0; long days = 0; int year, isdst; + __tzinfo_type *tz = __gettzinfo (); /* validate structure */ validate_structure (tim_p); @@ -206,19 +207,19 @@ mktime (tim_p) if (_daylight) { int y = tim_p->tm_year + YEAR_BASE; - if (y == __tzyear || __tzcalc_limits (y)) + if (y == tz->__tzyear || __tzcalc_limits (y)) { /* calculate start of dst in dst local time and start of std in both std local time and dst local time */ - time_t startdst_dst = __tzrule[0].change - __tzrule[1].offset; - time_t startstd_dst = __tzrule[1].change - __tzrule[1].offset; - time_t startstd_std = __tzrule[1].change - __tzrule[0].offset; + time_t startdst_dst = tz->__tzrule[0].change - tz->__tzrule[1].offset; + time_t startstd_dst = tz->__tzrule[1].change - tz->__tzrule[1].offset; + time_t startstd_std = tz->__tzrule[1].change - tz->__tzrule[0].offset; /* if the time is in the overlap between dst and std local times */ if (tim >= startstd_std && tim < startstd_dst) ; /* we let user decide or leave as -1 */ else { - isdst = (__tznorth + isdst = (tz->__tznorth ? (tim >= startdst_dst && tim < startstd_std) : (tim >= startdst_dst || tim < startstd_std)); /* if user committed and was wrong, perform correction */ @@ -226,7 +227,7 @@ mktime (tim_p) { /* we either subtract or add the difference between time zone offsets, depending on which way the user got it wrong */ - int diff = __tzrule[0].offset - __tzrule[1].offset; + int diff = tz->__tzrule[0].offset - tz->__tzrule[1].offset; if (!isdst) diff = -diff; tim_p->tm_sec += diff; @@ -239,9 +240,9 @@ mktime (tim_p) /* add appropriate offset to put time in gmt format */ if (isdst == 1) - tim += __tzrule[1].offset; + tim += tz->__tzrule[1].offset; else /* otherwise assume std time */ - tim += __tzrule[0].offset; + tim += tz->__tzrule[0].offset; /* reset isdst flag to what we have calculated */ tim_p->tm_isdst = isdst; diff --git a/newlib/libc/time/mktm_r.c b/newlib/libc/time/mktm_r.c index 0ad568c..9cea60b 100644 --- a/newlib/libc/time/mktm_r.c +++ b/newlib/libc/time/mktm_r.c @@ -32,10 +32,10 @@ _DEFUN (_mktm_r, (tim_p, res, is_gmtime), { long days, rem; time_t lcltime; - int i; int y; int yleap; _CONST int *ip; + __tzinfo_type *tz = __gettzinfo (); /* base decision about std/dst time on current time */ lcltime = *tim_p; @@ -101,17 +101,21 @@ _DEFUN (_mktm_r, (tim_p, res, is_gmtime), TZ_LOCK; if (_daylight) { - if (y == __tzyear || __tzcalc_limits (y)) - res->tm_isdst = (__tznorth - ? (*tim_p >= __tzrule[0].change && *tim_p < __tzrule[1].change) - : (*tim_p >= __tzrule[0].change || *tim_p < __tzrule[1].change)); + if (y == tz->__tzyear || __tzcalc_limits (y)) + res->tm_isdst = (tz->__tznorth + ? (*tim_p >= tz->__tzrule[0].change + && *tim_p < tz->__tzrule[1].change) + : (*tim_p >= tz->__tzrule[0].change + || *tim_p < tz->__tzrule[1].change)); else res->tm_isdst = -1; } else res->tm_isdst = 0; - offset = (res->tm_isdst == 1 ? __tzrule[1].offset : __tzrule[0].offset); + offset = (res->tm_isdst == 1 + ? tz->__tzrule[1].offset + : tz->__tzrule[0].offset); hours = offset / SECSPERHOUR; offset = offset % SECSPERHOUR; @@ -197,11 +201,12 @@ _DEFUN (__tzcalc_limits, (year), { int days, year_days, years; int i, j; + __tzinfo_type *tz = __gettzinfo (); if (year < EPOCH_YEAR) return 0; - __tzyear = year; + tz->__tzyear = year; years = (year - EPOCH_YEAR); @@ -211,10 +216,11 @@ _DEFUN (__tzcalc_limits, (year), for (i = 0; i < 2; ++i) { - if (__tzrule[i].ch == 'J') - days = year_days + __tzrule[i].d + (isleap(year) && __tzrule[i].d >= 60); - else if (__tzrule[i].ch == 'D') - days = year_days + __tzrule[i].d; + if (tz->__tzrule[i].ch == 'J') + days = year_days + tz->__tzrule[i].d + + (isleap(year) && tz->__tzrule[i].d >= 60); + else if (tz->__tzrule[i].ch == 'D') + days = year_days + tz->__tzrule[i].d; else { int yleap = isleap(year); @@ -223,15 +229,15 @@ _DEFUN (__tzcalc_limits, (year), days = year_days; - for (j = 1; j < __tzrule[i].m; ++j) + for (j = 1; j < tz->__tzrule[i].m; ++j) days += ip[j-1]; m_wday = (EPOCH_WDAY + days) % DAYSPERWEEK; - wday_diff = __tzrule[i].d - m_wday; + wday_diff = tz->__tzrule[i].d - m_wday; if (wday_diff < 0) wday_diff += DAYSPERWEEK; - m_day = (__tzrule[i].n - 1) * DAYSPERWEEK + wday_diff; + m_day = (tz->__tzrule[i].n - 1) * DAYSPERWEEK + wday_diff; while (m_day >= ip[j-1]) m_day -= DAYSPERWEEK; @@ -240,10 +246,11 @@ _DEFUN (__tzcalc_limits, (year), } /* store the change-over time in GMT form by adding offset */ - __tzrule[i].change = days * SECSPERDAY + __tzrule[i].s + __tzrule[i].offset; + tz->__tzrule[i].change = days * SECSPERDAY + + tz->__tzrule[i].s + tz->__tzrule[i].offset; } - __tznorth = (__tzrule[0].change < __tzrule[1].change); + tz->__tznorth = (tz->__tzrule[0].change < tz->__tzrule[1].change); return 1; } diff --git a/newlib/libc/time/strftime.c b/newlib/libc/time/strftime.c index 28b00ee..395f8f3 100644 --- a/newlib/libc/time/strftime.c +++ b/newlib/libc/time/strftime.c @@ -757,11 +757,12 @@ _DEFUN (strftime, (s, maxsize, format, tim_p), if (count < maxsize - 5) { int offset; + __tzinfo_type *tz = __gettzinfo (); TZ_LOCK; /* The sign of this is exactly opposite the envvar TZ. We could directly use the global _timezone for tm_isdst==0, but have to use __tzrule for daylight savings. */ - offset = -__tzrule[tim_p->tm_isdst > 0].offset; + offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset; TZ_UNLOCK; sprintf (&s[count], "%+03ld%.2d", offset / SECSPERHOUR, abs (offset / SECSPERMIN) % 60); diff --git a/newlib/libc/time/tzset_r.c b/newlib/libc/time/tzset_r.c index d689441..49e519d 100644 --- a/newlib/libc/time/tzset_r.c +++ b/newlib/libc/time/tzset_r.c @@ -14,14 +14,7 @@ static char *prev_tzenv = NULL; /* default to GMT */ char *_tzname[2] = {"GMT", "GMT"}; int _daylight = 0; -time_t _timezone = (time_t)0; - -int __tzyear = 0; - -int __tznorth = 1; - -__tzrule_type __tzrule[2] = { {'J', 0, 0, 0, 0, (time_t)0, 0 }, - {'J', 0, 0, 0, 0, (time_t)0, 0 } }; +long _timezone = 0; _VOID _DEFUN (_tzset_r, (reent_ptr), @@ -31,11 +24,12 @@ _DEFUN (_tzset_r, (reent_ptr), unsigned short hh, mm, ss, m, w, d; int sign, n; int i, ch; + __tzinfo_type *tz = __gettzinfo (); if ((tzenv = _getenv_r (reent_ptr, "TZ")) == NULL) { TZ_LOCK; - _timezone = (time_t)0; + _timezone = 0; _daylight = 0; _tzname[0] = "GMT"; _tzname[1] = "GMT"; @@ -86,7 +80,7 @@ _DEFUN (_tzset_r, (reent_ptr), return; } - __tzrule[0].offset = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh); + tz->__tzrule[0].offset = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh); _tzname[0] = __tzname_std; tzenv += n; @@ -116,9 +110,9 @@ _DEFUN (_tzset_r, (reent_ptr), ss = 0; if (sscanf (tzenv, "%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n) <= 0) - __tzrule[1].offset = __tzrule[0].offset - 3600; + tz->__tzrule[1].offset = tz->__tzrule[0].offset - 3600; else - __tzrule[1].offset = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh); + tz->__tzrule[1].offset = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh); tzenv += n; @@ -136,10 +130,10 @@ _DEFUN (_tzset_r, (reent_ptr), return; } - __tzrule[i].ch = 'M'; - __tzrule[i].m = m; - __tzrule[i].n = w; - __tzrule[i].d = d; + tz->__tzrule[i].ch = 'M'; + tz->__tzrule[i].m = m; + tz->__tzrule[i].n = w; + tz->__tzrule[i].d = d; tzenv += n; } @@ -161,23 +155,23 @@ _DEFUN (_tzset_r, (reent_ptr), { if (i == 0) { - __tzrule[0].ch = 'M'; - __tzrule[0].m = 4; - __tzrule[0].n = 1; - __tzrule[0].d = 0; + tz->__tzrule[0].ch = 'M'; + tz->__tzrule[0].m = 4; + tz->__tzrule[0].n = 1; + tz->__tzrule[0].d = 0; } else { - __tzrule[1].ch = 'M'; - __tzrule[1].m = 10; - __tzrule[1].n = 5; - __tzrule[1].d = 0; + tz->__tzrule[1].ch = 'M'; + tz->__tzrule[1].m = 10; + tz->__tzrule[1].n = 5; + tz->__tzrule[1].d = 0; } } else { - __tzrule[i].ch = ch; - __tzrule[i].d = d; + tz->__tzrule[i].ch = ch; + tz->__tzrule[i].d = d; } tzenv = end; @@ -192,14 +186,14 @@ _DEFUN (_tzset_r, (reent_ptr), if (*tzenv == '/') sscanf (tzenv, "/%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n); - __tzrule[i].s = ss + SECSPERMIN * mm + SECSPERHOUR * hh; + tz->__tzrule[i].s = ss + SECSPERMIN * mm + SECSPERHOUR * hh; tzenv += n; } - __tzcalc_limits (__tzyear); - _timezone = (time_t)(__tzrule[0].offset); - _daylight = __tzrule[0].offset != __tzrule[1].offset; + __tzcalc_limits (tz->__tzyear); + _timezone = tz->__tzrule[0].offset; + _daylight = tz->__tzrule[0].offset != tz->__tzrule[1].offset; TZ_UNLOCK; } |