annotate lib/mktime.c @ 308:5ced6fbbedfe

merge with 1.10n2
author Jim Meyering <jim@meyering.net>
date Tue, 27 Sep 1994 22:02:08 +0000
parents a91524320895
children dcee8dee8752
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
1 /* Copyright (C) 1993, 1994 Free Software Foundation, Inc.
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
2 Contributed by Noel Cragg (noel@cs.oberlin.edu), with fixes by
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
3 Michael E. Calwas (calwas@ttd.teradyne.com) and
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
4 Wade Hampton (tasi029@tmn.com).
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
5
308
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
6
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
7 NOTE: The canonical source of this file is maintained with the GNU C Library.
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
8 Bugs can be reported to bug-glibc@prep.ai.mit.edu.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9
308
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
10 This program is free software; you can redistribute it and/or modify it
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
11 under the terms of the GNU General Public License as published by the
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
12 Free Software Foundation; either version 2, or (at your option) any
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
13 later version.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14
308
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
15 This program is distributed in the hope that it will be useful,
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
308
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
18 GNU General Public License for more details.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19
308
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
20 You should have received a copy of the GNU General Public License
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
21 along with this program; if not, write to the Free Software
5ced6fbbedfe merge with 1.10n2
Jim Meyering <jim@meyering.net>
parents: 295
diff changeset
22 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
24 /* Define this to have a standalone program to test this implementation of
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
25 mktime. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
26 /* #define DEBUG */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
27
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
28 #ifdef HAVE_CONFIG_H
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
29 #include <config.h>
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 #endif
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
32 #include <sys/types.h> /* Some systems define `time_t' here. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
33 #include <time.h>
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
34
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 #ifndef __isleap
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 /* Nonzero if YEAR is a leap year (every 4 years,
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
38 except every 100th isn't, and every 400th is). */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 #define __isleap(year) \
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
40 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 #endif
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
43 #ifndef __P
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
44 #if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
45 #define __P(args) args
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
46 #else
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
47 #define __P(args) ()
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
48 #endif /* GCC. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
49 #endif /* Not __P. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
50
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 /* How many days are in each month. */
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
52 const unsigned short int __mon_lengths[2][12] =
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
53 {
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
54 /* Normal years. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
55 { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
56 /* Leap years. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
57 { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
58 };
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
59
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
60
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
61 static int times_through_search; /* This library routine should never
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
62 hang -- make sure we always return
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
63 when we're searching for a value */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
65
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
66 #ifdef DEBUG
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
67
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
68 #include <stdio.h>
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
69 #include <ctype.h>
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
70
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
71 int debugging_enabled = 0;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
73 /* Print the values in a `struct tm'. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
74 static void
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
75 printtm (it)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
76 struct tm *it;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 {
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
78 printf ("%02d/%02d/%04d %02d:%02d:%02d (%s) yday:%03d dst:%d gmtoffset:%ld",
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
79 it->tm_mon + 1,
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
80 it->tm_mday,
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
81 it->tm_year + 1900,
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
82 it->tm_hour,
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
83 it->tm_min,
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
84 it->tm_sec,
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
85 it->tm_zone,
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
86 it->tm_yday,
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
87 it->tm_isdst,
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
88 it->tm_gmtoff);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
89 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
90 #endif
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
91
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
92
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
93 static time_t
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
94 dist_tm (t1, t2)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
95 struct tm *t1;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
96 struct tm *t2;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
97 {
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
98 time_t distance = 0;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
99 unsigned long int v1, v2;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
100 int diff_flag = 0;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
101
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
102 v1 = v2 = 0;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
104 #define doit(x, secs) \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
105 v1 += t1->x * secs; \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
106 v2 += t2->x * secs; \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
107 if (!diff_flag) \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
108 { \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
109 if (t1->x < t2->x) \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
110 diff_flag = -1; \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
111 else if (t1->x > t2->x) \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
112 diff_flag = 1; \
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
113 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
114
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
115 doit (tm_year, 31536000); /* Okay, not all years have 365 days. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
116 doit (tm_mon, 2592000); /* Okay, not all months have 30 days. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
117 doit (tm_mday, 86400);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
118 doit (tm_hour, 3600);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
119 doit (tm_min, 60);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
120 doit (tm_sec, 1);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
121
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
122 #undef doit
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
123
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
124 /* We should also make sure that the sign of DISTANCE is correct -- if
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
125 DIFF_FLAG is positive, the distance should be positive and vice versa. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
126
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
127 distance = (v1 > v2) ? (v1 - v2) : (v2 - v1);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
128 if (diff_flag < 0)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
129 distance = -distance;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
131 if (times_through_search > 20) /* Arbitrary # of calls, but makes sure we
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
132 never hang if there's a problem with
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
133 this algorithm. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 {
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
135 distance = diff_flag;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
138 /* We need this DIFF_FLAG business because it is forseeable that the
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
139 distance may be zero when, in actuality, the two structures are
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
140 different. This is usually the case when the dates are 366 days apart
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
141 and one of the years is a leap year. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
142
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
143 if (distance == 0 && diff_flag)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
144 distance = 86400 * diff_flag;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
145
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
146 return distance;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
147 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
148
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
149
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
150 /* MKTIME converts the values in a struct tm to a time_t. The values
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
151 in tm_wday and tm_yday are ignored; other values can be put outside
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
152 of legal ranges since they will be normalized. This routine takes
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
153 care of that normalization. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
155 void
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
156 do_normalization (tmptr)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
157 struct tm *tmptr;
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
158 {
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
159
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
160 #define normalize(foo,x,y,bar); \
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
161 while (tmptr->foo < x) \
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
162 { \
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
163 tmptr->bar--; \
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
164 tmptr->foo = (y - (x - tmptr->foo) + 1); \
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
165 } \
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
166 while (tmptr->foo > y) \
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
167 { \
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
168 tmptr->foo = (x + (tmptr->foo - y) - 1); \
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
169 tmptr->bar++; \
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170 }
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
171
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 normalize (tm_sec, 0, 59, tm_min);
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 normalize (tm_min, 0, 59, tm_hour);
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
174 normalize (tm_hour, 0, 23, tm_mday);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
175
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
176 /* Do the month first, so day range can be found. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177 normalize (tm_mon, 0, 11, tm_year);
283
63297bb8f1dd merge with 1.10f
Jim Meyering <jim@meyering.net>
parents: 187
diff changeset
178
63297bb8f1dd merge with 1.10f
Jim Meyering <jim@meyering.net>
parents: 187
diff changeset
179 /* Since the day range modifies the month, we should be careful how
63297bb8f1dd merge with 1.10f
Jim Meyering <jim@meyering.net>
parents: 187
diff changeset
180 we reference the array of month lengths -- it is possible that
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
181 the month will go negative, hence the modulo...
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
182
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
183 Also, tm_year is the year - 1900, so we have to 1900 to have it
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
184 work correctly. */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
185
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
186 normalize (tm_mday, 1,
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
187 __mon_lengths[__isleap (tmptr->tm_year + 1900)]
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
188 [((tmptr->tm_mon < 0)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
189 ? (12 + (tmptr->tm_mon % 12))
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
190 : (tmptr->tm_mon % 12)) ],
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191 tm_mon);
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
193 /* Do the month again, because the day may have pushed it out of range. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 normalize (tm_mon, 0, 11, tm_year);
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
196 /* Do the day again, because the month may have changed the range. */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
197 normalize (tm_mday, 1,
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
198 __mon_lengths[__isleap (tmptr->tm_year + 1900)]
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
199 [((tmptr->tm_mon < 0)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
200 ? (12 + (tmptr->tm_mon % 12))
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
201 : (tmptr->tm_mon % 12)) ],
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202 tm_mon);
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
203
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
204 #ifdef DEBUG
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
205 if (debugging_enabled)
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
206 {
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
207 printf (" After normalizing:\n ");
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
208 printtm (tmptr);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
209 putchar ('\n');
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
210 }
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
211 #endif
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
212
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
213 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
214
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
215
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
216 /* Here's where the work gets done. */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
217
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
218 #define BAD_STRUCT_TM ((time_t) -1)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
219
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
220 time_t
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
221 _mktime_internal (timeptr, producer)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
222 struct tm *timeptr;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
223 struct tm *(*producer) __P ((const time_t *));
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
224 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
225 struct tm our_tm; /* our working space */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
226 struct tm *me = &our_tm; /* a pointer to the above */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
227 time_t result; /* the value we return */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
228
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
229 *me = *timeptr; /* copy the struct tm that was passed
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
230 in by the caller */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
231
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
232
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
233 /***************************/
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
234 /* Normalize the structure */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
235 /***************************/
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
236
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
237 /* This routine assumes that the value of TM_ISDST is -1, 0, or 1.
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
238 If the user didn't pass it in that way, fix it. */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
239
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
240 if (me->tm_isdst > 0)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
241 me->tm_isdst = 1;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
242 else if (me->tm_isdst < 0)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
243 me->tm_isdst = -1;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
244
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
245 do_normalization (me);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
246
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
247 /* Get out of here if it's not possible to represent this struct.
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
248 If any of the values in the normalized struct tm are negative,
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
249 our algorithms won't work. Luckily, we only need to check the
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
250 year at this point; normalization guarantees that all values will
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
251 be in correct ranges EXCEPT the year. */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
252
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
253 if (me->tm_year < 0)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
254 return BAD_STRUCT_TM;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
255
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
256 /*************************************************/
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
257 /* Find the appropriate time_t for the structure */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
258 /*************************************************/
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
259
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
260 /* Modified b-search -- make intelligent guesses as to where the
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
261 time might lie along the timeline, assuming that our target time
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
262 lies a linear distance (w/o considering time jumps of a
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
263 particular region).
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
264
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
265 Assume that time does not fluctuate at all along the timeline --
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
266 e.g., assume that a day will always take 86400 seconds, etc. --
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
267 and come up with a hypothetical value for the time_t
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
268 representation of the struct tm TARGET, in relation to the guess
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
269 variable -- it should be pretty close!
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
270
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
271 After testing this, the maximum number of iterations that I had
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
272 on any number that I tried was 3! Not bad.
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
273
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
274 The reason this is not a subroutine is that we will modify some
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
275 fields in the struct tm (yday and mday). I've never felt good
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
276 about side-effects when writing structured code... */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
277
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
278 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
279 struct tm *guess_tm;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
280 time_t guess = 0;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
281 time_t distance = 0;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
282 time_t last_distance = 0;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
283
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
284 times_through_search = 0;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
285
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
286 do
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
287 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
288 guess += distance;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
289
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
290 times_through_search++;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
291
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
292 guess_tm = (*producer) (&guess);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
293
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
294 #ifdef DEBUG
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
295 if (debugging_enabled)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
296 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
297 printf (" Guessing time_t == %d\n ", (int) guess);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
298 printtm (guess_tm);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
299 putchar ('\n');
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
300 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
301 #endif
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
302
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
303 /* How far is our guess from the desired struct tm? */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
304 distance = dist_tm (me, guess_tm);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
305
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
306 /* Handle periods of time where a period of time is skipped.
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
307 For example, 2:15 3 April 1994 does not exist, because DST
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
308 is in effect. The distance function will alternately
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
309 return values of 3600 and -3600, because it doesn't know
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
310 that the requested time doesn't exist. In these situations
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
311 (even if the skip is not exactly an hour) the distances
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
312 returned will be the same, but alternating in sign. We
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
313 want the later time, so check to see that the distance is
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
314 oscillating and we've chosen the correct of the two
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
315 possibilities.
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
316
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
317 Useful: 3 Apr 94 765356300, 30 Oct 94 783496000 */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
318
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
319 if ((distance == -last_distance) && (distance < last_distance))
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
320 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
321 /* If the caller specified that the DST flag was off, it's
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
322 not possible to represent this time. */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
323 if (me->tm_isdst == 0)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
324 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
325 #ifdef DEBUG
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
326 printf (" Distance is oscillating -- dst flag nixes struct!\n");
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
327 #endif
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
328 return BAD_STRUCT_TM;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
329 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
330
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
331 #ifdef DEBUG
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
332 printf (" Distance is oscillating -- chose the later time.\n");
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
333 #endif
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
334 distance = 0;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
335 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
336
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
337 if ((distance == 0) && (me->tm_isdst != -1)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
338 && (me->tm_isdst != guess_tm->tm_isdst))
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
339 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
340 /* If we're in this code, we've got the right time but the
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
341 wrong daylight savings flag. We need to move away from
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
342 the time that we have and approach the other time from
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
343 the other direction. That is, if I've requested the
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
344 non-DST version of a time and I get the DST version
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
345 instead, I want to put us forward in time and search
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
346 backwards to get the other time. I checked all of the
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
347 configuration files for the tz package -- no entry
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
348 saves more than two hours, so I think we'll be safe by
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
349 moving 24 hours in one direction. IF THE AMOUNT OF
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
350 TIME SAVED IN THE CONFIGURATION FILES CHANGES, THIS
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
351 VALUE MAY NEED TO BE ADJUSTED. Luckily, we can never
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
352 have more than one level of overlaps, or this would
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
353 never work. */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
354
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
355 #define SKIP_VALUE 86400
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
356
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
357 if (guess_tm->tm_isdst == 0)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
358 /* we got the later one, but want the earlier one */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
359 distance = -SKIP_VALUE;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
360 else
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
361 distance = SKIP_VALUE;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
362
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
363 #ifdef DEBUG
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
364 printf (" Got the right time, wrong DST value -- adjusting\n");
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
365 #endif
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
366 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
367
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
368 last_distance = distance;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
369
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
370 } while (distance != 0);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
371
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
372 /* Check to see that the dst flag matches */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
373
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
374 if (me->tm_isdst != -1)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
375 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
376 if (me->tm_isdst != guess_tm->tm_isdst)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
377 {
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
378 #ifdef DEBUG
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
379 printf (" DST flag doesn't match! FIXME?\n");
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
380 #endif
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
381 return BAD_STRUCT_TM;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
382 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
383 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
384
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
385 result = guess; /* Success! */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
386
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
387 /* On successful completion, the values of tm_wday and tm_yday
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
388 have to be set appropriately. */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
389
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
390 /* me->tm_yday = guess_tm->tm_yday;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
391 me->tm_mday = guess_tm->tm_mday; */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
392
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
393 *me = *guess_tm;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
394 }
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
395
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
396 /* Update the caller's version of the structure */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
397
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
398 *timeptr = *me;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
399
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
400 return result;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
401 }
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
402
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
403 time_t
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
404 #ifdef DEBUG /* make it work even if the system's
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
405 libc has it's own mktime routine */
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
406 my_mktime (timeptr)
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
407 #else
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
408 mktime (timeptr)
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
409 #endif
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
410 struct tm *timeptr;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
411 {
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
412 return _mktime_internal (timeptr, localtime);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
413 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
414
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
415 #ifdef DEBUG
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
416 void
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
417 main (argc, argv)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
418 int argc;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
419 char *argv[];
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
420 {
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
421 int time;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
422 int result_time;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
423 struct tm *tmptr;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
424
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
425 if (argc == 1)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
426 {
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
427 long q;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
428
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
429 printf ("starting long test...\n");
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
430
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
431 for (q = 10000000; q < 1000000000; q += 599)
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
432 {
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
433 struct tm *tm = localtime ((time_t *) &q);
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
434 if ((q % 10000) == 0) { printf ("%ld\n", q); fflush (stdout); }
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
435 if (q != my_mktime (tm))
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
436 { printf ("failed for %ld\n", q); fflush (stdout); }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
437 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
438
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
439 printf ("test finished\n");
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
440
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
441 exit (0);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
442 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
443
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
444 if (argc != 2)
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
445 {
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
446 printf ("wrong # of args\n");
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
447 exit (0);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
448 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
449
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
450 debugging_enabled = 1; /* We want to see the info */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
451
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
452 ++argv;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
453 time = atoi (*argv);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
454
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
455 tmptr = localtime ((time_t *) &time);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
456 printf ("Localtime tells us that a time_t of %d represents\n ", time);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
457 printtm (tmptr);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
458 putchar ('\n');
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
459
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
460 printf (" Given localtime's return val, mktime returns %d which is\n ",
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
461 (int) my_mktime (tmptr));
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
462 printtm (tmptr);
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
463 putchar ('\n');
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
464
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
465 #if 0
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
466 tmptr->tm_sec -= 20;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
467 tmptr->tm_min -= 20;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
468 tmptr->tm_hour -= 20;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
469 tmptr->tm_mday -= 20;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
470 tmptr->tm_mon -= 20;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
471 tmptr->tm_year -= 20;
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
472 tmptr->tm_gmtoff -= 20000; /* This has no effect! */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
473 tmptr->tm_zone = NULL; /* Nor does this! */
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
474 tmptr->tm_isdst = -1;
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
475 #endif
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
476
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
477 tmptr->tm_hour += 1;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
478 tmptr->tm_isdst = -1;
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
479
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
480 printf ("\n\nchanged ranges: ");
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
481 printtm (tmptr);
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
482 putchar ('\n');
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
483
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
484 result_time = my_mktime (tmptr);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
485 printf ("\nmktime: %d\n", result_time);
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
486
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
487 tmptr->tm_isdst = 0;
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
488
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
489 printf ("\n\nchanged ranges: ");
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
490 printtm (tmptr);
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
491 putchar ('\n');
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
492
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
493 result_time = my_mktime (tmptr);
187
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
494 printf ("\nmktime: %d\n", result_time);
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
495 }
a6805e98cb7f merge with 1.9.2i
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
496 #endif /* DEBUG */
295
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
497
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
498
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
499 /*
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
500 Local Variables:
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
501 compile-command: "gcc -g mktime.c -o mktime -DDEBUG"
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
502 End:
a91524320895 merge with 1.10g
Jim Meyering <jim@meyering.net>
parents: 283
diff changeset
503 */