aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--time/tzset.c17
2 files changed, 17 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 81a1348614..67279cedbb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+1999-09-06 Andreas Schwab <schwab@suse.de>
+
+ * time/tzset.c (compute_change): Replace slow loop to compute T by
+ simple algorithm.
+
1999-09-06 Ulrich Drepper <drepper@cygnus.com>
* iconvdata/iso-2022-jp.c: When translating to ISO-2022-JP* write
diff --git a/time/tzset.c b/time/tzset.c
index 24624fa188..6af2fbaf00 100644
--- a/time/tzset.c
+++ b/time/tzset.c
@@ -418,16 +418,23 @@ compute_change (rule, year)
int year;
{
register time_t t;
- int y;
if (year != -1 && rule->computed_for == year)
- /* Operations on times in 1969 will be slower. Oh well. */
+ /* Operations on times in 2 BC will be slower. Oh well. */
return 1;
/* First set T to January 1st, 0:00:00 GMT in YEAR. */
- t = 0;
- for (y = 1970; y < year; ++y)
- t += SECSPERDAY * (__isleap (y) ? 366 : 365);
+ if (year > 1970)
+ t = ((year - 1970) * 365
+ + /* Compute the number of leapdays between 1970 and YEAR
+ (exclusive). There is a leapday every 4th year ... */
+ + ((year - 1) / 4 - 1970 / 4)
+ /* ... except every 100th year ... */
+ - ((year - 1) / 100 - 1970 / 100)
+ /* ... but still every 400th year. */
+ + ((year - 1) / 400 - 1970 / 400)) * SECSPERDAY;
+ else
+ t = 0;
switch (rule->type)
{