annotate src/mktime.c @ 51242:661e2fe7e775

(autoconf-mode setups): Recognise AH_ and AU_ entries in "(autoconf)Autoconf Macro Index". Add "(autoconf)M4 Macro Index" and "(autoconf)Autotest Macro Index". Remove duplicate copy of "(automake)Macro and Variable Index". Keep automake after all autoconf possibilities, so as to prefer those.
author Juanma Barranquero <lekktu@gmail.com>
date Sun, 25 May 2003 21:03:57 +0000
parents 7568310ea7d6
children bd73ed6af906 d7ddb3e565de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
1 /* Convert a `struct tm' to a time_t value.
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
2 Copyright (C) 1993, 94, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
3 Contributed by Paul Eggert (eggert@twinsun.com).
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
4
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
5 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
6 Bugs can be reported to bug-glibc@gnu.org.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
7
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
8 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
9 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
10 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
11 later version.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
12
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
13 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
14 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
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
16 GNU General Public License for more details.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
17
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
18 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
19 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
20 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
21 USA. */
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
22
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
23 /* 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
24 mktime. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
25 /* #define DEBUG 1 */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
26
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
27 #ifdef HAVE_CONFIG_H
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
28 # include <config.h>
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
29 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
30
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
31 #ifdef _LIBC
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
32 # define HAVE_LIMITS_H 1
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
33 # define STDC_HEADERS 1
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
34 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
35
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
36 /* Assume that leap seconds are possible, unless told otherwise.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
37 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
38 then it supports leap seconds; otherwise it probably doesn't. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
39 #ifndef LEAP_SECONDS_POSSIBLE
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
40 # define LEAP_SECONDS_POSSIBLE 1
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
41 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
42
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
43 #include <sys/types.h> /* Some systems define `time_t' here. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
44 #include <time.h>
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
45
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
46 #if HAVE_LIMITS_H
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
47 # include <limits.h>
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
48 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
49
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
50 #if DEBUG
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
51 # include <stdio.h>
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
52 # if STDC_HEADERS
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
53 # include <stdlib.h>
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
54 # endif
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
55 /* 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
56 # define mktime my_mktime
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
57 #endif /* DEBUG */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
58
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
59 #ifndef __P
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
60 # if defined __GNUC__ || (defined __STDC__ && __STDC__)
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
61 # define __P(args) args
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
62 # else
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
63 # define __P(args) ()
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
64 # endif /* GCC. */
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
65 #endif /* Not __P. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
66
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
67 #ifndef CHAR_BIT
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
68 # define CHAR_BIT 8
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
69 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
70
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
71 /* The extra casts work around common compiler bugs. */
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
72 #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
73 /* 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
74 It is necessary at least when t == time_t. */
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
75 #define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
76 ? ~ (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
77 #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
78
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
79 #ifndef INT_MIN
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
80 # define INT_MIN TYPE_MINIMUM (int)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
81 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
82 #ifndef INT_MAX
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
83 # define INT_MAX TYPE_MAXIMUM (int)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
84 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
85
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
86 #ifndef TIME_T_MIN
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
87 # define TIME_T_MIN TYPE_MINIMUM (time_t)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
88 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
89 #ifndef TIME_T_MAX
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
90 # define TIME_T_MAX TYPE_MAXIMUM (time_t)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
91 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
92
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
93 #define TM_YEAR_BASE 1900
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
94 #define EPOCH_YEAR 1970
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
95
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
96 #ifndef __isleap
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
97 /* Nonzero if YEAR is a leap year (every 4 years,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
98 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
99 # define __isleap(year) \
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
100 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
101 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
102
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
103 /* How many days come before each month (0-12). */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
104 const unsigned short int __mon_yday[2][13] =
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
105 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
106 /* Normal years. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
107 { 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
108 /* Leap years. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
109 { 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
110 };
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
111
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
112
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
113 #ifdef _LIBC
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
114 # define my_mktime_localtime_r __localtime_r
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
115 #else
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
116 /* If we're a mktime substitute in a GNU program, then prefer
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
117 localtime to localtime_r, since many localtime_r implementations
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
118 are buggy. */
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
119 static struct tm *
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
120 my_mktime_localtime_r (t, tp)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
121 const time_t *t;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
122 struct tm *tp;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
123 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
124 struct tm *l = localtime (t);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
125 if (! l)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
126 return 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
127 *tp = *l;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
128 return tp;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
129 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
130 #endif /* ! _LIBC */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
131
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
132
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
133 /* 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
134 measured in seconds, ignoring leap seconds.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
135 YEAR uses the same numbering as TM->tm_year.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
136 All values are in range, except possibly YEAR.
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
137 If TP is null, return a nonzero value.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
138 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
139 static time_t
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
140 ydhms_tm_diff (year, yday, hour, min, sec, tp)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
141 int year, yday, hour, min, sec;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
142 const struct tm *tp;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
143 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
144 if (!tp)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
145 return 1;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
146 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
147 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
148 /* 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
149 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
150 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
151 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
152 time_t might be unsigned. */
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
153 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
154 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
155 int a100 = a4 / 25 - (a4 % 25 < 0);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
156 int b100 = b4 / 25 - (b4 % 25 < 0);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
157 int a400 = a100 >> 2;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
158 int b400 = b100 >> 2;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
159 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
160 time_t years = year - (time_t) tp->tm_year;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
161 time_t days = (365 * years + intervening_leap_days
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
162 + (yday - tp->tm_yday));
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
163 return (60 * (60 * (24 * days + (hour - tp->tm_hour))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
164 + (min - tp->tm_min))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
165 + (sec - tp->tm_sec));
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
166 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
167 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
168
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
169 /* 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
170 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
171 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
172 static struct tm *
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
173 ranged_convert (convert, t, tp)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
174 #ifdef PROTOTYPES
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
175 struct tm *(*convert) (const time_t *, struct tm *);
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
176 #else
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
177 struct tm *(*convert)();
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
178 #endif
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
179 time_t *t;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
180 struct tm *tp;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
181 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
182 struct tm *r;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
183
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
184 if (! (r = (*convert) (t, tp)) && *t)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
185 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
186 time_t bad = *t;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
187 time_t ok = 0;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
188 struct tm tm;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
189
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
190 /* 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
191 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
192 they differ by 1. */
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
193 while (bad != ok + (bad < 0 ? -1 : 1))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
194 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
195 time_t mid = *t = (bad < 0
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
196 ? bad + ((ok - bad) >> 1)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
197 : ok + ((bad - ok) >> 1));
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
198 if ((r = (*convert) (t, tp)))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
199 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
200 tm = *r;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
201 ok = mid;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
202 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
203 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
204 bad = mid;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
205 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
206
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
207 if (!r && ok)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
208 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
209 /* The last conversion attempt failed;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
210 revert to the most recent successful attempt. */
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
211 *t = ok;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
212 *tp = tm;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
213 r = tp;
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 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
216
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
217 return r;
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
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
220
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
221 /* Convert *TP to a time_t value, inverting
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
222 the monotonic and mostly-unit-linear conversion function CONVERT.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
223 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
224 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
225 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
226 time_t
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
227 __mktime_internal (tp, convert, offset)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
228 struct tm *tp;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
229 #ifdef PROTOTYPES
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
230 struct tm *(*convert) (const time_t *, struct tm *);
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
231 #else
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
232 struct tm *(*convert)();
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
233 #endif
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
234 time_t *offset;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
235 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
236 time_t t, dt, t0, t1, t2;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
237 struct tm tm;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
238
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
239 /* 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
240 to handle any combinations of time zone rule changes, solar time,
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
241 leap seconds, and oscillations around a spring-forward gap.
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
242 POSIX.1 prohibits leap seconds, but some hosts have them anyway. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
243 int remaining_probes = 6;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
244
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
245 /* 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
246 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
247 int sec = tp->tm_sec;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
248 int min = tp->tm_min;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
249 int hour = tp->tm_hour;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
250 int mday = tp->tm_mday;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
251 int mon = tp->tm_mon;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
252 int year_requested = tp->tm_year;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
253 int isdst = tp->tm_isdst;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
254
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
255 /* Ensure that mon is in range, and set year accordingly. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
256 int mon_remainder = mon % 12;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
257 int negative_mon_remainder = mon_remainder < 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
258 int mon_years = mon / 12 - negative_mon_remainder;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
259 int year = year_requested + mon_years;
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 /* The other values need not be in range:
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
262 the remaining code handles minor overflows correctly,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
263 assuming int and time_t arithmetic wraps around.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
264 Major overflows are caught at the end. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
265
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
266 /* 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
267 The result need not be in range. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
268 int yday = ((__mon_yday[__isleap (year + TM_YEAR_BASE)]
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
269 [mon_remainder + 12 * negative_mon_remainder])
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
270 + mday - 1);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
271
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
272 int sec_requested = sec;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
273 #if LEAP_SECONDS_POSSIBLE
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
274 /* Handle out-of-range seconds specially,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
275 since ydhms_tm_diff assumes every minute has 60 seconds. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
276 if (sec < 0)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
277 sec = 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
278 if (59 < sec)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
279 sec = 59;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
280 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
281
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
282 /* 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
283 Then repeatedly use the error to improve the guess. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
284
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
285 tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
286 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
287 t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
288
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
289 for (t = t1 = t2 = t0 + *offset;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
290 (dt = ydhms_tm_diff (year, yday, hour, min, sec,
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
291 ranged_convert (convert, &t, &tm)));
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
292 t1 = t2, t2 = t, t += dt)
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
293 if (t == t1 && t != t2
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
294 && (isdst < 0 || tm.tm_isdst < 0
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
295 || (isdst != 0) != (tm.tm_isdst != 0)))
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
296 /* We can't possibly find a match, as we are oscillating
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
297 between two values. The requested time probably falls
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
298 within a spring-forward gap of size DT. Follow the common
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
299 practice in this case, which is to return a time that is DT
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
300 away from the requested time, preferring a time whose
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
301 tm_isdst differs from the requested value. In practice,
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
302 this is more useful than returning -1. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
303 break;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
304 else if (--remaining_probes == 0)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
305 return -1;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
306
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
307 /* If we have a match, check whether tm.tm_isdst has the requested
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
308 value, if any. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
309 if (dt == 0 && isdst != tm.tm_isdst && 0 <= isdst && 0 <= tm.tm_isdst)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
310 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
311 /* tm.tm_isdst has the wrong value. Look for a neighboring
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
312 time with the right value, and use its UTC offset.
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
313 Heuristic: probe the previous three calendar quarters (approximately),
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
314 looking for the desired isdst. This isn't perfect,
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
315 but it's good enough in practice. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
316 int quarter = 7889238; /* seconds per average 1/4 Gregorian year */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
317 int i;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
318
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
319 /* If we're too close to the time_t limit, look in future quarters. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
320 if (t < TIME_T_MIN + 3 * quarter)
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
321 quarter = -quarter;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
322
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
323 for (i = 1; i <= 3; i++)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
324 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
325 time_t ot = t - i * quarter;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
326 struct tm otm;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
327 ranged_convert (convert, &ot, &otm);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
328 if (otm.tm_isdst == isdst)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
329 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
330 /* We found the desired tm_isdst.
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
331 Extrapolate back to the desired time. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
332 t = ot + ydhms_tm_diff (year, yday, hour, min, sec, &otm);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
333 ranged_convert (convert, &t, &tm);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
334 break;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
335 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
336 }
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
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
339 *offset = t - t0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
340
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
341 #if LEAP_SECONDS_POSSIBLE
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
342 if (sec_requested != tm.tm_sec)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
343 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
344 /* 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
345 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
346 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
347 if (! (*convert) (&t, &tm))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
348 return -1;
16961
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 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
351
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
352 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
353 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
354 /* 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
355 so check for major overflows. A gross check suffices,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
356 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
357 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
358 the difference that is bounded by a small value. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
359
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
360 double dyear = (double) year_requested + mon_years - tm.tm_year;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
361 double dday = 366 * dyear + mday;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
362 double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
363
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
364 /* 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
365 correct results, ie., it erroneously gives a positive value
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
366 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
367 seems to work. (ghazi@caip.rutgers.edu) */
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
368
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
369 const time_t time_t_max = TIME_T_MAX;
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
370 const time_t time_t_min = TIME_T_MIN;
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
371
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
372 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
373 return -1;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
374 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
375
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
376 *tp = tm;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
377 return t;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
378 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
379
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
380
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
381 static time_t localtime_offset;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
382
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
383 /* Convert *TP to a time_t value. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
384 time_t
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
385 mktime (tp)
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
386 struct tm *tp;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
387 {
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
388 #ifdef _LIBC
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
389 /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
390 time zone names contained in the external variable `tzname' shall
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
391 be set as if the tzset() function had been called. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
392 __tzset ();
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
393 #endif
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
394
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
395 return __mktime_internal (tp, my_mktime_localtime_r, &localtime_offset);
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
396 }
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
397
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
398 #ifdef weak_alias
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
399 weak_alias (mktime, timelocal)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
400 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
401
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
402 #if DEBUG
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
403
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
404 static int
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
405 not_equal_tm (a, b)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
406 struct tm *a;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
407 struct tm *b;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
408 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
409 return ((a->tm_sec ^ b->tm_sec)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
410 | (a->tm_min ^ b->tm_min)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
411 | (a->tm_hour ^ b->tm_hour)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
412 | (a->tm_mday ^ b->tm_mday)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
413 | (a->tm_mon ^ b->tm_mon)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
414 | (a->tm_year ^ b->tm_year)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
415 | (a->tm_mday ^ b->tm_mday)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
416 | (a->tm_yday ^ b->tm_yday)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
417 | (a->tm_isdst ^ b->tm_isdst));
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
418 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
419
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
420 static void
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
421 print_tm (tp)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
422 struct tm *tp;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
423 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
424 if (tp)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
425 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
426 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
427 tp->tm_hour, tp->tm_min, tp->tm_sec,
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
428 tp->tm_yday, tp->tm_wday, tp->tm_isdst);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
429 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
430 printf ("0");
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
431 }
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 static int
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
434 check_result (tk, tmk, tl, lt)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
435 time_t tk;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
436 struct tm tmk;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
437 time_t tl;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
438 struct tm *lt;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
439 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
440 if (tk != tl || !lt || not_equal_tm (&tmk, lt))
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
441 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
442 printf ("mktime (");
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
443 print_tm (&tmk);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
444 printf (")\nyields (");
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
445 print_tm (lt);
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
446 printf (") == %ld, should be %ld\n", (long) tl, (long) tk);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
447 return 1;
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
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
450 return 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
451 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
452
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
453 int
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
454 main (argc, argv)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
455 int argc;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
456 char **argv;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
457 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
458 int status = 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
459 struct tm tm, tmk, tml;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
460 struct tm *lt;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
461 time_t tk, tl;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
462 char trailer;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
463
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
464 if ((argc == 3 || argc == 4)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
465 && (sscanf (argv[1], "%d-%d-%d%c",
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
466 &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
467 == 3)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
468 && (sscanf (argv[2], "%d:%d:%d%c",
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
469 &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
470 == 3))
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
471 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
472 tm.tm_year -= TM_YEAR_BASE;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
473 tm.tm_mon--;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
474 tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
475 tmk = tm;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
476 tl = mktime (&tmk);
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
477 lt = localtime (&tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
478 if (lt)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
479 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
480 tml = *lt;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
481 lt = &tml;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
482 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
483 printf ("mktime returns %ld == ", (long) tl);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
484 print_tm (&tmk);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
485 printf ("\n");
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
486 status = check_result (tl, tmk, tl, lt);
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
487 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
488 else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
489 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
490 time_t from = atol (argv[1]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
491 time_t by = atol (argv[2]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
492 time_t to = atol (argv[3]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
493
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
494 if (argc == 4)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
495 for (tl = from; tl <= to; tl += by)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
496 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
497 lt = localtime (&tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
498 if (lt)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
499 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
500 tmk = tml = *lt;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
501 tk = mktime (&tmk);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
502 status |= check_result (tk, tmk, tl, tml);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
503 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
504 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
505 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
506 printf ("localtime (%ld) yields 0\n", (long) tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
507 status = 1;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
508 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
509 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
510 else
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
511 for (tl = from; tl <= to; tl += by)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
512 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
513 /* Null benchmark. */
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
514 lt = localtime (&tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
515 if (lt)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
516 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
517 tmk = tml = *lt;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
518 tk = tl;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
519 status |= check_result (tk, tmk, tl, tml);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
520 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
521 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
522 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
523 printf ("localtime (%ld) yields 0\n", (long) tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
524 status = 1;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
525 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
526 }
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 else
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
529 printf ("Usage:\
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
530 \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
531 \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
532 \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
533 argv[0], argv[0], argv[0]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
534
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
535 return status;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
536 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
537
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
538 #endif /* DEBUG */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
539
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
540 /*
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
541 Local Variables:
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
542 compile-command: "gcc -DDEBUG -DHAVE_LIMITS_H -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
543 End:
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
544 */