Mercurial > emacs
annotate src/mktime.c @ 23323:0800a4f84757
(underlying_strftime):
Set the buffer to a nonzero value before calling
strftime, and check to see whether strftime has set the buffer to zero.
This lets us distinguish between an empty buffer and an error.
I'm installing this patch by hand now; it will be superseded whenever
the glibc sources are propagated back to fsf.org.
| author | Paul Eggert <eggert@twinsun.com> |
|---|---|
| date | Fri, 25 Sep 1998 21:40:23 +0000 |
| parents | c8c409640bf3 |
| children | b7aa6ac26872 |
| rev | line source |
|---|---|
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
1 /* Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc. |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
2 Contributed by Paul Eggert (eggert@twinsun.com). |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
3 |
|
19875
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
4 NOTE: The canonical source of this file is maintained with the GNU C Library. |
|
21501
c8c409640bf3
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
21500
diff
changeset
|
5 Bugs can be reported to bug-glibc@gnu.org. |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
6 |
|
19875
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
7 This program is free software; you can redistribute it and/or modify it |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
8 under the terms of the GNU General Public License as published by the |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
9 Free Software Foundation; either version 2, or (at your option) any |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
10 later version. |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
11 |
|
19875
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
12 This program is distributed in the hope that it will be useful, |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
15 GNU General Public License for more details. |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
16 |
|
19875
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
17 You should have received a copy of the GNU General Public License |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
18 along with this program; if not, write to the Free Software |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
|
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
20 USA. */ |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
21 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
22 /* Define this to have a standalone program to test this implementation of |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
23 mktime. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
24 /* #define DEBUG 1 */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
25 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
26 #ifdef HAVE_CONFIG_H |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
27 # include <config.h> |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
28 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
29 |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
30 /* Some systems need this in order to declare localtime_r properly. */ |
|
20276
b53b022d2239
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20253
diff
changeset
|
31 #ifndef _REENTRANT |
|
b53b022d2239
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20253
diff
changeset
|
32 # define _REENTRANT 1 |
|
b53b022d2239
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20253
diff
changeset
|
33 #endif |
|
b53b022d2239
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20253
diff
changeset
|
34 |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
35 #ifdef _LIBC |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
36 # define HAVE_LIMITS_H 1 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
37 # define HAVE_LOCALTIME_R 1 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
38 # define STDC_HEADERS 1 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
39 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
40 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
41 /* Assume that leap seconds are possible, unless told otherwise. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
42 If the host has a `zic' command with a `-L leapsecondfilename' option, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
43 then it supports leap seconds; otherwise it probably doesn't. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
44 #ifndef LEAP_SECONDS_POSSIBLE |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
45 # define LEAP_SECONDS_POSSIBLE 1 |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
46 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
47 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
48 #include <sys/types.h> /* Some systems define `time_t' here. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
49 #include <time.h> |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
50 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
51 #if HAVE_LIMITS_H |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
52 # include <limits.h> |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
53 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
54 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
55 #if DEBUG |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
56 # include <stdio.h> |
|
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
57 # if STDC_HEADERS |
|
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
58 # include <stdlib.h> |
|
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
59 # endif |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
60 /* Make it work even if the system's libc has its own mktime routine. */ |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
61 # define mktime my_mktime |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
62 #endif /* DEBUG */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
63 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
64 #ifndef __P |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
65 # if defined (__GNUC__) || (defined (__STDC__) && __STDC__) |
|
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
66 # define __P(args) args |
|
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
67 # else |
|
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
68 # define __P(args) () |
|
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
69 # endif /* GCC. */ |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
70 #endif /* Not __P. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
71 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
72 #ifndef CHAR_BIT |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
73 # define CHAR_BIT 8 |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
74 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
75 |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
76 /* The extra casts work around common compiler bugs. */ |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
77 #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
78 /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
79 It is necessary at least when t == time_t. */ |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
80 #define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
81 ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) |
|
21500
4c72cf4eeedb
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20903
diff
changeset
|
82 #define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
83 |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
84 #ifndef INT_MIN |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
85 # define INT_MIN TYPE_MINIMUM (int) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
86 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
87 #ifndef INT_MAX |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
88 # define INT_MAX TYPE_MAXIMUM (int) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
89 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
90 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
91 #ifndef TIME_T_MIN |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
92 # define TIME_T_MIN TYPE_MINIMUM (time_t) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
93 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
94 #ifndef TIME_T_MAX |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
95 # define TIME_T_MAX TYPE_MAXIMUM (time_t) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
96 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
97 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
98 #define TM_YEAR_BASE 1900 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
99 #define EPOCH_YEAR 1970 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
100 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
101 #ifndef __isleap |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
102 /* Nonzero if YEAR is a leap year (every 4 years, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
103 except every 100th isn't, and every 400th is). */ |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
104 # define __isleap(year) \ |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
105 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
106 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
107 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
108 /* How many days come before each month (0-12). */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
109 const unsigned short int __mon_yday[2][13] = |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
110 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
111 /* Normal years. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
112 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
113 /* Leap years. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
114 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
115 }; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
116 |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
117 static struct tm *ranged_convert __P ((struct tm *(*) __P ((const time_t *, |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
118 struct tm *)), |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
119 time_t *, struct tm *)); |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
120 static time_t ydhms_tm_diff __P ((int, int, int, int, int, const struct tm *)); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
121 time_t __mktime_internal __P ((struct tm *, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
122 struct tm *(*) (const time_t *, struct tm *), |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
123 time_t *)); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
124 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
125 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
126 #ifdef _LIBC |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
127 # define localtime_r __localtime_r |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
128 #else |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
129 # if ! HAVE_LOCALTIME_R && ! defined localtime_r |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
130 /* Approximate localtime_r as best we can in its absence. */ |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
131 # define localtime_r my_mktime_localtime_r |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
132 static struct tm *localtime_r __P ((const time_t *, struct tm *)); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
133 static struct tm * |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
134 localtime_r (t, tp) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
135 const time_t *t; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
136 struct tm *tp; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
137 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
138 struct tm *l = localtime (t); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
139 if (! l) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
140 return 0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
141 *tp = *l; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
142 return tp; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
143 } |
|
18671
0d7f42d3ddc0
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
16962
diff
changeset
|
144 # endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */ |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
145 #endif /* ! _LIBC */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
146 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
147 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
148 /* Yield the difference between (YEAR-YDAY HOUR:MIN:SEC) and (*TP), |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
149 measured in seconds, ignoring leap seconds. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
150 YEAR uses the same numbering as TM->tm_year. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
151 All values are in range, except possibly YEAR. |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
152 If TP is null, return a nonzero value. |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
153 If overflow occurs, yield the low order bits of the correct answer. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
154 static time_t |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
155 ydhms_tm_diff (year, yday, hour, min, sec, tp) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
156 int year, yday, hour, min, sec; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
157 const struct tm *tp; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
158 { |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
159 if (!tp) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
160 return 1; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
161 else |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
162 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
163 /* Compute intervening leap days correctly even if year is negative. |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
164 Take care to avoid int overflow. time_t overflow is OK, since |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
165 only the low order bits of the correct time_t answer are needed. |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
166 Don't convert to time_t until after all divisions are done, since |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
167 time_t might be unsigned. */ |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
168 int a4 = (year >> 2) + (TM_YEAR_BASE >> 2) - ! (year & 3); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
169 int b4 = (tp->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (tp->tm_year & 3); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
170 int a100 = a4 / 25 - (a4 % 25 < 0); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
171 int b100 = b4 / 25 - (b4 % 25 < 0); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
172 int a400 = a100 >> 2; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
173 int b400 = b100 >> 2; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
174 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
175 time_t years = year - (time_t) tp->tm_year; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
176 time_t days = (365 * years + intervening_leap_days |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
177 + (yday - tp->tm_yday)); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
178 return (60 * (60 * (24 * days + (hour - tp->tm_hour)) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
179 + (min - tp->tm_min)) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
180 + (sec - tp->tm_sec)); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
181 } |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
182 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
183 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
184 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
185 static time_t localtime_offset; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
186 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
187 /* Convert *TP to a time_t value. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
188 time_t |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
189 mktime (tp) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
190 struct tm *tp; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
191 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
192 #ifdef _LIBC |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
193 /* POSIX.1 8.1.1 requires that whenever mktime() is called, the |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
194 time zone names contained in the external variable `tzname' shall |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
195 be set as if the tzset() function had been called. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
196 __tzset (); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
197 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
198 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
199 return __mktime_internal (tp, localtime_r, &localtime_offset); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
200 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
201 |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
202 /* Use CONVERT to convert *T to a broken down time in *TP. |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
203 If *T is out of range for conversion, adjust it so that |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
204 it is the nearest in-range value and then convert that. */ |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
205 static struct tm * |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
206 ranged_convert (convert, t, tp) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
207 struct tm *(*convert) __P ((const time_t *, struct tm *)); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
208 time_t *t; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
209 struct tm *tp; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
210 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
211 struct tm *r; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
212 |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
213 if (! (r = (*convert) (t, tp)) && *t) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
214 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
215 time_t bad = *t; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
216 time_t ok = 0; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
217 struct tm tm; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
218 |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
219 /* BAD is a known unconvertible time_t, and OK is a known good one. |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
220 Use binary search to narrow the range between BAD and OK until |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
221 they differ by 1. */ |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
222 while (bad != ok + (bad < 0 ? -1 : 1)) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
223 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
224 time_t mid = *t = (bad < 0 |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
225 ? bad + ((ok - bad) >> 1) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
226 : ok + ((bad - ok) >> 1)); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
227 if ((r = (*convert) (t, tp))) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
228 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
229 tm = *r; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
230 ok = mid; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
231 } |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
232 else |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
233 bad = mid; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
234 } |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
235 |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
236 if (!r && ok) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
237 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
238 /* The last conversion attempt failed; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
239 revert to the most recent successful attempt. */ |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
240 *t = ok; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
241 *tp = tm; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
242 r = tp; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
243 } |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
244 } |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
245 |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
246 return r; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
247 } |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
248 |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
249 |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
250 /* Convert *TP to a time_t value, inverting |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
251 the monotonic and mostly-unit-linear conversion function CONVERT. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
252 Use *OFFSET to keep track of a guess at the offset of the result, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
253 compared to what the result would be for UTC without leap seconds. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
254 If *OFFSET's guess is correct, only one CONVERT call is needed. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
255 time_t |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
256 __mktime_internal (tp, convert, offset) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
257 struct tm *tp; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
258 struct tm *(*convert) __P ((const time_t *, struct tm *)); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
259 time_t *offset; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
260 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
261 time_t t, dt, t0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
262 struct tm tm; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
263 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
264 /* The maximum number of probes (calls to CONVERT) should be enough |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
265 to handle any combinations of time zone rule changes, solar time, |
|
20252
cb1aec706f64
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
19875
diff
changeset
|
266 and leap seconds. POSIX.1 prohibits leap seconds, but some hosts |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
267 have them anyway. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
268 int remaining_probes = 4; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
269 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
270 /* Time requested. Copy it in case CONVERT modifies *TP; this can |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
271 occur if TP is localtime's returned value and CONVERT is localtime. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
272 int sec = tp->tm_sec; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
273 int min = tp->tm_min; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
274 int hour = tp->tm_hour; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
275 int mday = tp->tm_mday; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
276 int mon = tp->tm_mon; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
277 int year_requested = tp->tm_year; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
278 int isdst = tp->tm_isdst; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
279 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
280 /* Ensure that mon is in range, and set year accordingly. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
281 int mon_remainder = mon % 12; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
282 int negative_mon_remainder = mon_remainder < 0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
283 int mon_years = mon / 12 - negative_mon_remainder; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
284 int year = year_requested + mon_years; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
285 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
286 /* The other values need not be in range: |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
287 the remaining code handles minor overflows correctly, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
288 assuming int and time_t arithmetic wraps around. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
289 Major overflows are caught at the end. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
290 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
291 /* Calculate day of year from year, month, and day of month. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
292 The result need not be in range. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
293 int yday = ((__mon_yday[__isleap (year + TM_YEAR_BASE)] |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
294 [mon_remainder + 12 * negative_mon_remainder]) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
295 + mday - 1); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
296 |
|
19875
278944a16af3
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
18672
diff
changeset
|
297 int sec_requested = sec; |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
298 #if LEAP_SECONDS_POSSIBLE |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
299 /* Handle out-of-range seconds specially, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
300 since ydhms_tm_diff assumes every minute has 60 seconds. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
301 if (sec < 0) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
302 sec = 0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
303 if (59 < sec) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
304 sec = 59; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
305 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
306 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
307 /* Invert CONVERT by probing. First assume the same offset as last time. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
308 Then repeatedly use the error to improve the guess. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
309 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
310 tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
311 tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
312 t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
313 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
314 for (t = t0 + *offset; |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
315 (dt = ydhms_tm_diff (year, yday, hour, min, sec, |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
316 ranged_convert (convert, &t, &tm))); |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
317 t += dt) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
318 if (--remaining_probes == 0) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
319 return -1; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
320 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
321 /* Check whether tm.tm_isdst has the requested value, if any. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
322 if (0 <= isdst && 0 <= tm.tm_isdst) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
323 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
324 int dst_diff = (isdst != 0) - (tm.tm_isdst != 0); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
325 if (dst_diff) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
326 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
327 /* Move two hours in the direction indicated by the disagreement, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
328 probe some more, and switch to a new time if found. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
329 The largest known fallback due to daylight savings is two hours: |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
330 once, in Newfoundland, 1988-10-30 02:00 -> 00:00. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
331 time_t ot = t - 2 * 60 * 60 * dst_diff; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
332 while (--remaining_probes != 0) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
333 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
334 struct tm otm; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
335 if (! (dt = ydhms_tm_diff (year, yday, hour, min, sec, |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
336 ranged_convert (convert, &ot, &otm)))) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
337 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
338 t = ot; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
339 tm = otm; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
340 break; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
341 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
342 if ((ot += dt) == t) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
343 break; /* Avoid a redundant probe. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
344 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
345 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
346 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
347 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
348 *offset = t - t0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
349 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
350 #if LEAP_SECONDS_POSSIBLE |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
351 if (sec_requested != tm.tm_sec) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
352 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
353 /* Adjust time to reflect the tm_sec requested, not the normalized value. |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
354 Also, repair any damage from a false match due to a leap second. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
355 t += sec_requested - sec + (sec == 0 && tm.tm_sec == 60); |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
356 if (! (*convert) (&t, &tm)) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
357 return -1; |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
358 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
359 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
360 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
361 if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
362 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
363 /* time_t isn't large enough to rule out overflows in ydhms_tm_diff, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
364 so check for major overflows. A gross check suffices, |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
365 since if t has overflowed, it is off by a multiple of |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
366 TIME_T_MAX - TIME_T_MIN + 1. So ignore any component of |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
367 the difference that is bounded by a small value. */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
368 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
369 double dyear = (double) year_requested + mon_years - tm.tm_year; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
370 double dday = 366 * dyear + mday; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
371 double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
372 |
|
20903
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
373 /* On Irix4.0.5 cc, dividing TIME_T_MIN by 3 does not produce |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
374 correct results, ie., it erroneously gives a positive value |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
375 of 715827882. Setting a variable first then doing math on it |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
376 seems to work. (ghazi@caip.rutgers.edu) */ |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
377 |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
378 const time_t time_t_max = TIME_T_MAX; |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
379 const time_t time_t_min = TIME_T_MIN; |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
380 |
|
ba17c544eb9e
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20276
diff
changeset
|
381 if (time_t_max / 3 - time_t_min / 3 < (dsec < 0 ? - dsec : dsec)) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
382 return -1; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
383 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
384 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
385 *tp = tm; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
386 return t; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
387 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
388 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
389 #ifdef weak_alias |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
390 weak_alias (mktime, timelocal) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
391 #endif |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
392 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
393 #if DEBUG |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
394 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
395 static int |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
396 not_equal_tm (a, b) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
397 struct tm *a; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
398 struct tm *b; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
399 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
400 return ((a->tm_sec ^ b->tm_sec) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
401 | (a->tm_min ^ b->tm_min) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
402 | (a->tm_hour ^ b->tm_hour) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
403 | (a->tm_mday ^ b->tm_mday) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
404 | (a->tm_mon ^ b->tm_mon) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
405 | (a->tm_year ^ b->tm_year) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
406 | (a->tm_mday ^ b->tm_mday) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
407 | (a->tm_yday ^ b->tm_yday) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
408 | (a->tm_isdst ^ b->tm_isdst)); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
409 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
410 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
411 static void |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
412 print_tm (tp) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
413 struct tm *tp; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
414 { |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
415 if (tp) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
416 printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d", |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
417 tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday, |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
418 tp->tm_hour, tp->tm_min, tp->tm_sec, |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
419 tp->tm_yday, tp->tm_wday, tp->tm_isdst); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
420 else |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
421 printf ("0"); |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
422 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
423 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
424 static int |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
425 check_result (tk, tmk, tl, lt) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
426 time_t tk; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
427 struct tm tmk; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
428 time_t tl; |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
429 struct tm *lt; |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
430 { |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
431 if (tk != tl || !lt || not_equal_tm (&tmk, lt)) |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
432 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
433 printf ("mktime ("); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
434 print_tm (&tmk); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
435 printf (")\nyields ("); |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
436 print_tm (lt); |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
437 printf (") == %ld, should be %ld\n", (long) tl, (long) tk); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
438 return 1; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
439 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
440 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
441 return 0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
442 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
443 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
444 int |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
445 main (argc, argv) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
446 int argc; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
447 char **argv; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
448 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
449 int status = 0; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
450 struct tm tm, tmk, tml; |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
451 struct tm *lt; |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
452 time_t tk, tl; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
453 char trailer; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
454 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
455 if ((argc == 3 || argc == 4) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
456 && (sscanf (argv[1], "%d-%d-%d%c", |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
457 &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
458 == 3) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
459 && (sscanf (argv[2], "%d:%d:%d%c", |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
460 &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
461 == 3)) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
462 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
463 tm.tm_year -= TM_YEAR_BASE; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
464 tm.tm_mon--; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
465 tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
466 tmk = tm; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
467 tl = mktime (&tmk); |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
468 lt = localtime (&tl); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
469 if (lt) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
470 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
471 tml = *lt; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
472 lt = &tml; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
473 } |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
474 printf ("mktime returns %ld == ", (long) tl); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
475 print_tm (&tmk); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
476 printf ("\n"); |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
477 status = check_result (tl, tmk, tl, lt); |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
478 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
479 else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0)) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
480 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
481 time_t from = atol (argv[1]); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
482 time_t by = atol (argv[2]); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
483 time_t to = atol (argv[3]); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
484 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
485 if (argc == 4) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
486 for (tl = from; tl <= to; tl += by) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
487 { |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
488 lt = localtime (&tl); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
489 if (lt) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
490 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
491 tmk = tml = *lt; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
492 tk = mktime (&tmk); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
493 status |= check_result (tk, tmk, tl, tml); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
494 } |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
495 else |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
496 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
497 printf ("localtime (%ld) yields 0\n", (long) tl); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
498 status = 1; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
499 } |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
500 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
501 else |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
502 for (tl = from; tl <= to; tl += by) |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
503 { |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
504 /* Null benchmark. */ |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
505 lt = localtime (&tl); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
506 if (lt) |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
507 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
508 tmk = tml = *lt; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
509 tk = tl; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
510 status |= check_result (tk, tmk, tl, tml); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
511 } |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
512 else |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
513 { |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
514 printf ("localtime (%ld) yields 0\n", (long) tl); |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
515 status = 1; |
|
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
516 } |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
517 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
518 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
519 else |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
520 printf ("Usage:\ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
521 \t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
522 \t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
523 \t%s FROM BY TO - # Do not test those values (for benchmark).\n", |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
524 argv[0], argv[0], argv[0]); |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
525 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
526 return status; |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
527 } |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
528 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
529 #endif /* DEBUG */ |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
530 |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
531 /* |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
532 Local Variables: |
|
20253
a7d1d668f57f
automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents:
20252
diff
changeset
|
533 compile-command: "gcc -DDEBUG -D__EXTENSIONS__ -DHAVE_LIMITS_H -DHAVE_LOCALTIME_R -DSTDC_HEADERS -Wall -W -O -g mktime.c -o mktime" |
|
16961
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
534 End: |
|
6e1ae1c00446
automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff
changeset
|
535 */ |
