annotate src/mktime.c @ 23323:0800a4f84757

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