annotate src/mktime.c @ 99492:ee792794d888

(isearch-search-fun): Compare the length of the current search string with the length of the string from the previous search state to detect the situation when the user adds or removes characters in the search string. Use word-search-forward-lax and word-search-backward-lax in this case, and otherwise word-search-forward and word-search-backward.
author Juri Linkov <juri@jurta.org>
date Tue, 11 Nov 2008 19:43:09 +0000
parents e90d04cd455a
children 95d0cdf160ea 1dc371b29285
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.
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
3 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
4 Contributed by Paul Eggert (eggert@twinsun.com).
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
5
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
6 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
7 Bugs can be reported to bug-glibc@gnu.org.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
8
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
9 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
10 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
11 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
12 later version.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
13
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
14 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
15 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
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
17 GNU General Public License for more details.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
18
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
19 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
20 along with this program; if not, write to the Free Software
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 52401
diff changeset
21 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
22 USA. */
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
23
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
24 /* 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
25 mktime. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
26 /* #define DEBUG 1 */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
27
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
28 #ifdef HAVE_CONFIG_H
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
29 # include <config.h>
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
30 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
31
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
32 #ifdef _LIBC
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
33 # define HAVE_LIMITS_H 1
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
34 # define STDC_HEADERS 1
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
35 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
36
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
37 /* Assume that leap seconds are possible, unless told otherwise.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
38 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
39 then it supports leap seconds; otherwise it probably doesn't. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
40 #ifndef LEAP_SECONDS_POSSIBLE
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
41 # define LEAP_SECONDS_POSSIBLE 1
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
42 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
43
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
44 #include <sys/types.h> /* Some systems define `time_t' here. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
45 #include <time.h>
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
46
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
47 #if HAVE_LIMITS_H
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
48 # include <limits.h>
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
49 #endif
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 DEBUG
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
52 # include <stdio.h>
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
53 # if STDC_HEADERS
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
54 # include <stdlib.h>
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
55 # endif
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
56 /* 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
57 # define mktime my_mktime
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
58 #endif /* DEBUG */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
59
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
60 #ifndef __P
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
61 # if defined __GNUC__ || (defined __STDC__ && __STDC__)
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
62 # define __P(args) args
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
63 # else
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
64 # define __P(args) ()
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
65 # endif /* GCC. */
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
66 #endif /* Not __P. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
67
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
68 #ifndef CHAR_BIT
18671
0d7f42d3ddc0 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 16962
diff changeset
69 # define CHAR_BIT 8
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
70 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
71
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
72 /* The extra casts work around common compiler bugs. */
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
73 #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
74 /* 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
75 It is necessary at least when t == time_t. */
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
76 #define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
77 ? ~ (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
78 #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
79
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
80 #ifndef INT_MIN
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
81 # define INT_MIN TYPE_MINIMUM (int)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
82 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
83 #ifndef INT_MAX
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
84 # define INT_MAX TYPE_MAXIMUM (int)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
85 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
86
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
87 #ifndef TIME_T_MIN
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
88 # define TIME_T_MIN TYPE_MINIMUM (time_t)
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 #ifndef TIME_T_MAX
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
91 # define TIME_T_MAX TYPE_MAXIMUM (time_t)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
92 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
93
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
94 #define TM_YEAR_BASE 1900
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
95 #define EPOCH_YEAR 1970
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
96
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
97 #ifndef __isleap
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
98 /* Nonzero if YEAR is a leap year (every 4 years,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
99 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
100 # define __isleap(year) \
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
101 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
102 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
103
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
104 /* How many days come before each month (0-12). */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
105 const unsigned short int __mon_yday[2][13] =
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
106 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
107 /* Normal years. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
108 { 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
109 /* Leap years. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
110 { 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
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
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
114 #ifdef _LIBC
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
115 # define my_mktime_localtime_r __localtime_r
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
116 #else
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
117 /* 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
118 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
119 are buggy. */
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
120 static struct tm *
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
121 my_mktime_localtime_r (t, tp)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
122 const time_t *t;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
123 struct tm *tp;
16961
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 struct tm *l = localtime (t);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
126 if (! l)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
127 return 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
128 *tp = *l;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
129 return tp;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
130 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
131 #endif /* ! _LIBC */
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
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
134 /* 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
135 measured in seconds, ignoring leap seconds.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
136 YEAR uses the same numbering as TM->tm_year.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
137 All values are in range, except possibly YEAR.
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
138 If TP is null, return a nonzero value.
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
139 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
140 static time_t
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
141 ydhms_tm_diff (year, yday, hour, min, sec, tp)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
142 int year, yday, hour, min, sec;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
143 const struct tm *tp;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
144 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
145 if (!tp)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
146 return 1;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
147 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
148 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
149 /* 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
150 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
151 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
152 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
153 time_t might be unsigned. */
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
154 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
155 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
156 int a100 = a4 / 25 - (a4 % 25 < 0);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
157 int b100 = b4 / 25 - (b4 % 25 < 0);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
158 int a400 = a100 >> 2;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
159 int b400 = b100 >> 2;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
160 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
161 time_t years = year - (time_t) tp->tm_year;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
162 time_t days = (365 * years + intervening_leap_days
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
163 + (yday - tp->tm_yday));
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
164 return (60 * (60 * (24 * days + (hour - tp->tm_hour))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
165 + (min - tp->tm_min))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
166 + (sec - tp->tm_sec));
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
167 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
168 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
169
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
170 /* 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
171 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
172 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
173 static struct tm *
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
174 ranged_convert (convert, t, tp)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
175 #ifdef PROTOTYPES
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
176 struct tm *(*convert) (const time_t *, struct tm *);
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
177 #else
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
178 struct tm *(*convert)();
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
179 #endif
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
180 time_t *t;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
181 struct tm *tp;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
182 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
183 struct tm *r;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
184
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
185 if (! (r = (*convert) (t, tp)) && *t)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
186 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
187 time_t bad = *t;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
188 time_t ok = 0;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
189 struct tm tm;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
190
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
191 /* 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
192 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
193 they differ by 1. */
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
194 while (bad != ok + (bad < 0 ? -1 : 1))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
195 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
196 time_t mid = *t = (bad < 0
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
197 ? bad + ((ok - bad) >> 1)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
198 : ok + ((bad - ok) >> 1));
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
199 if ((r = (*convert) (t, tp)))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
200 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
201 tm = *r;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
202 ok = mid;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
203 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
204 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
205 bad = mid;
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
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
208 if (!r && ok)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
209 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
210 /* The last conversion attempt failed;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
211 revert to the most recent successful attempt. */
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
212 *t = ok;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
213 *tp = tm;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
214 r = tp;
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
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
218 return r;
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
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
221
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
222 /* Convert *TP to a time_t value, inverting
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
223 the monotonic and mostly-unit-linear conversion function CONVERT.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
224 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
225 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
226 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
227 time_t
29737
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
228 __mktime_internal (tp, convert, offset)
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
229 struct tm *tp;
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
230 #ifdef PROTOTYPES
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
231 struct tm *(*convert) (const time_t *, struct tm *);
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
232 #else
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
233 struct tm *(*convert)();
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
234 #endif
7568310ea7d6 Unprotoized.
Dave Love <fx@gnu.org>
parents: 26088
diff changeset
235 time_t *offset;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
236 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
237 time_t t, dt, t0, t1, t2;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
238 struct tm tm;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
239
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
240 /* 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
241 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
242 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
243 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
244 int remaining_probes = 6;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
245
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
246 /* 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
247 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
248 int sec = tp->tm_sec;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
249 int min = tp->tm_min;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
250 int hour = tp->tm_hour;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
251 int mday = tp->tm_mday;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
252 int mon = tp->tm_mon;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
253 int year_requested = tp->tm_year;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
254 int isdst = tp->tm_isdst;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
255
51484
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
256 /* 1 if the previous probe was DST. */
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
257 int dst2;
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
258
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
259 /* Ensure that mon is in range, and set year accordingly. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
260 int mon_remainder = mon % 12;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
261 int negative_mon_remainder = mon_remainder < 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
262 int mon_years = mon / 12 - negative_mon_remainder;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
263 int year = year_requested + mon_years;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
264
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
265 /* The other values need not be in range:
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
266 the remaining code handles minor overflows correctly,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
267 assuming int and time_t arithmetic wraps around.
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
268 Major overflows are caught at the end. */
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 /* 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
271 The result need not be in range. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
272 int yday = ((__mon_yday[__isleap (year + TM_YEAR_BASE)]
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
273 [mon_remainder + 12 * negative_mon_remainder])
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
274 + mday - 1);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
275
19875
278944a16af3 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents: 18672
diff changeset
276 int sec_requested = sec;
51484
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
277
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
278 /* Only years after 1970 are defined.
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
279 If year is 69, it might still be representable due to
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
280 timezone differences. */
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
281 if (year < 69)
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
282 return -1;
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
283
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
284 #if LEAP_SECONDS_POSSIBLE
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
285 /* Handle out-of-range seconds specially,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
286 since ydhms_tm_diff assumes every minute has 60 seconds. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
287 if (sec < 0)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
288 sec = 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
289 if (59 < sec)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
290 sec = 59;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
291 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
292
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
293 /* 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
294 Then repeatedly use the error to improve the guess. */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
295
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
296 tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
297 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
298 t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
299
51484
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
300 for (t = t1 = t2 = t0 + *offset, dst2 = 0;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
301 (dt = ydhms_tm_diff (year, yday, hour, min, sec,
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
302 ranged_convert (convert, &t, &tm)));
51484
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
303 t1 = t2, t2 = t, t += dt, dst2 = tm.tm_isdst != 0)
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
304 if (t == t1 && t != t2
51484
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
305 && (tm.tm_isdst < 0
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
306 || (isdst < 0
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
307 ? dst2 <= (tm.tm_isdst != 0)
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
308 : (isdst != 0) != (tm.tm_isdst != 0))))
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
309 /* 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
310 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
311 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
312 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
313 away from the requested time, preferring a time whose
51484
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
314 tm_isdst differs from the requested value. (If no tm_isdst
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
315 was requested and only one of the two values has a nonzero
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
316 tm_isdst, prefer that value.) In practice, this is more
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
317 useful than returning -1. */
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
318 break;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
319 else if (--remaining_probes == 0)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
320 return -1;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
321
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
322 /* 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
323 value, if any. */
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
324 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
325 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
326 /* 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
327 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
328 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
329 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
330 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
331 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
332 int i;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
333
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
334 /* 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
335 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
336 quarter = -quarter;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
337
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
338 for (i = 1; i <= 3; i++)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
339 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
340 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
341 struct tm otm;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
342 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
343 if (otm.tm_isdst == isdst)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
344 {
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
345 /* 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
346 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
347 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
348 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
349 break;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
350 }
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 }
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 *offset = t - t0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
355
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
356 #if LEAP_SECONDS_POSSIBLE
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
357 if (sec_requested != tm.tm_sec)
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 /* 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
360 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
361 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
362 if (! (*convert) (&t, &tm))
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
363 return -1;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
364 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
365 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
366
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
367 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
368 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
369 /* 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
370 so check for major overflows. A gross check suffices,
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
371 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
372 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
373 the difference that is bounded by a small value. */
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 double dyear = (double) year_requested + mon_years - tm.tm_year;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
376 double dday = 366 * dyear + mday;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
377 double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
378
20903
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
379 /* 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
380 correct results, ie., it erroneously gives a positive value
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
381 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
382 seems to work. (ghazi@caip.rutgers.edu) */
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
383
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
384 const time_t time_t_max = TIME_T_MAX;
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
385 const time_t time_t_min = TIME_T_MIN;
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
386
ba17c544eb9e automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20276
diff changeset
387 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
388 return -1;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
389 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
390
51484
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
391 if (year == 69)
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
392 {
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
393 /* If year was 69, need to check whether the time was representable
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
394 or not. */
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
395 if (t < 0 || t > 2 * 24 * 60 * 60)
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
396 return -1;
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
397 }
bd73ed6af906 (__mktime_internal): Merge changes from gnulib
Dave Love <fx@gnu.org>
parents: 29737
diff changeset
398
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
399 *tp = tm;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
400 return t;
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
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
403
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
404 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
405
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
406 /* 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
407 time_t
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
408 mktime (tp)
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
409 struct tm *tp;
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
410 {
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
411 #ifdef _LIBC
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
412 /* 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
413 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
414 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
415 __tzset ();
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
416 #endif
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
417
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
418 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
419 }
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
420
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
421 #ifdef weak_alias
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
422 weak_alias (mktime, timelocal)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
423 #endif
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
424
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
425 #if DEBUG
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
426
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
427 static int
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
428 not_equal_tm (a, b)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
429 struct tm *a;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
430 struct tm *b;
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 return ((a->tm_sec ^ b->tm_sec)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
433 | (a->tm_min ^ b->tm_min)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
434 | (a->tm_hour ^ b->tm_hour)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
435 | (a->tm_mday ^ b->tm_mday)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
436 | (a->tm_mon ^ b->tm_mon)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
437 | (a->tm_year ^ b->tm_year)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
438 | (a->tm_mday ^ b->tm_mday)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
439 | (a->tm_yday ^ b->tm_yday)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
440 | (a->tm_isdst ^ b->tm_isdst));
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
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
443 static void
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
444 print_tm (tp)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
445 struct tm *tp;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
446 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
447 if (tp)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
448 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
449 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
450 tp->tm_hour, tp->tm_min, tp->tm_sec,
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
451 tp->tm_yday, tp->tm_wday, tp->tm_isdst);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
452 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
453 printf ("0");
16961
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
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
456 static int
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
457 check_result (tk, tmk, tl, lt)
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
458 time_t tk;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
459 struct tm tmk;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
460 time_t tl;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
461 struct tm *lt;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
462 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
463 if (tk != tl || !lt || not_equal_tm (&tmk, lt))
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
464 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
465 printf ("mktime (");
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
466 print_tm (&tmk);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
467 printf (")\nyields (");
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
468 print_tm (lt);
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
469 printf (") == %ld, should be %ld\n", (long) tl, (long) tk);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
470 return 1;
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
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
473 return 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
474 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
475
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
476 int
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
477 main (argc, argv)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
478 int argc;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
479 char **argv;
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 int status = 0;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
482 struct tm tm, tmk, tml;
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
483 struct tm *lt;
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
484 time_t tk, tl;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
485 char trailer;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
486
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
487 if ((argc == 3 || argc == 4)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
488 && (sscanf (argv[1], "%d-%d-%d%c",
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
489 &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
490 == 3)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
491 && (sscanf (argv[2], "%d:%d:%d%c",
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
492 &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
493 == 3))
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
494 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
495 tm.tm_year -= TM_YEAR_BASE;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
496 tm.tm_mon--;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
497 tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
498 tmk = tm;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
499 tl = mktime (&tmk);
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
500 lt = localtime (&tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
501 if (lt)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
502 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
503 tml = *lt;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
504 lt = &tml;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
505 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
506 printf ("mktime returns %ld == ", (long) tl);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
507 print_tm (&tmk);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
508 printf ("\n");
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
509 status = check_result (tl, tmk, tl, lt);
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
510 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
511 else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
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 time_t from = atol (argv[1]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
514 time_t by = atol (argv[2]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
515 time_t to = atol (argv[3]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
516
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
517 if (argc == 4)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
518 for (tl = from; tl <= to; tl += by)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
519 {
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
520 lt = localtime (&tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
521 if (lt)
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 tmk = tml = *lt;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
524 tk = mktime (&tmk);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
525 status |= check_result (tk, tmk, tl, tml);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
526 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
527 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
528 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
529 printf ("localtime (%ld) yields 0\n", (long) tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
530 status = 1;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
531 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
532 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
533 else
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
534 for (tl = from; tl <= to; tl += by)
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
535 {
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
536 /* Null benchmark. */
20253
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
537 lt = localtime (&tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
538 if (lt)
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
539 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
540 tmk = tml = *lt;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
541 tk = tl;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
542 status |= check_result (tk, tmk, tl, tml);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
543 }
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
544 else
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
545 {
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
546 printf ("localtime (%ld) yields 0\n", (long) tl);
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
547 status = 1;
a7d1d668f57f automatically generated from GPLed version
Ulrich Drepper <drepper@redhat.com>
parents: 20252
diff changeset
548 }
16961
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
549 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
550 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
551 else
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
552 printf ("Usage:\
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
553 \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
554 \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
555 \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
556 argv[0], argv[0], argv[0]);
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
557
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
558 return status;
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
559 }
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
560
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
561 #endif /* DEBUG */
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
562
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
563 /*
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
564 Local Variables:
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 21501
diff changeset
565 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
566 End:
6e1ae1c00446 automatically generated from GPLed version
Paul Eggert <eggert@twinsun.com>
parents:
diff changeset
567 */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51484
diff changeset
568
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51484
diff changeset
569 /* arch-tag: 9456752f-7ddd-47cb-8286-fa807b1355ae
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51484
diff changeset
570 (do not change this comment) */