annotate zotnet/tws/phoon/dtime.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* dtime.c - routines to do ``ARPA-style'' time structures
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 ver date who remarks
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 --- ------- --- -------------------------------------------------------------
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5 01B 15nov86 JP Thouroughly hacked by Jef Poskanzer.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 01A ??????? MTR Original version from the MH 6.5 distribution, courtesy
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 of Marshall Rose.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include "tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #include <sys/time.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #include <string.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #else SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #include <strings.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #include <sys/timeb.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #endif SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 extern int daylight;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 extern long timezone;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 extern char *tzname[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #endif SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #define abs(a) ( a >= 0 ? a : -a )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 char *tw_moty[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 char *tw_dotw[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 char *tw_ldotw[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 "Sunday", "Monday", "Tuesday", "Wednesday",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 "Thursday", "Friday", "Saturday", NULL };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 static struct zone
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 char *std;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 char *dst;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 int shift;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 zones[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 "GMT", "BST", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 "EST", "EDT", -5,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 "CST", "CDT", -6,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 "MST", NULL, -7,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 "PST", "PDT", -8,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 "A", NULL, -1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 "B", NULL, -2,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 "C", NULL, -3,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 "D", NULL, -4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 "E", NULL, -5,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 "F", NULL, -6,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 "G", NULL, -7,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 "H", NULL, -8,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 "I", NULL, -9,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 "K", NULL, -10,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 "L", NULL, -11,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 "M", NULL, -12,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 "N", NULL, 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 #ifndef HUJI
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 "O", NULL, 2,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 #else HUJI
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 "JST", "JDT", 2,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 #endif HUJI
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 "P", NULL, 3,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 "Q", NULL, 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 "R", NULL, 5,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 "S", NULL, 6,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 "T", NULL, 7,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 "U", NULL, 8,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 "V", NULL, 9,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 "W", NULL, 10,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 "X", NULL, 11,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 "Y", NULL, 12,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 NULL };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 #define CENTURY 19
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 long time( );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 struct tm *localtime( );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 char *dtimenow( )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 long clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 (void) time( &clock );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 return ( dtime( &clock ) );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 dctime( tw )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 struct tws *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 static char buffer[25];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 if ( tw == NULL )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 return ( NULL );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 (void) sprintf( buffer, "%.3s %.3s %02d %02d:%02d:%02d %.4d\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 tw_dotw[tw -> tw_wday], tw_moty[tw -> tw_mon], tw -> tw_mday,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 tw -> tw_hour, tw -> tw_min, tw -> tw_sec,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 tw -> tw_year >= 100 ? tw -> tw_year : 1900 + tw -> tw_year );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 return ( buffer );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 struct tws *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 dtwstime( )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 long clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 (void) time( &clock );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 return ( dlocaltime( &clock ) );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 struct tws *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 dlocaltime( clock )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 long *clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 register struct tm *tm;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 struct timeb tb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 #endif not SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 static struct tws tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 if ( clock == NULL )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 return ( NULL );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 tw.tw_flags = TW_NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 tm = localtime( clock );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 tw.tw_sec = tm -> tm_sec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 tw.tw_min = tm -> tm_min;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 tw.tw_hour = tm -> tm_hour;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 tw.tw_mday = tm -> tm_mday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 tw.tw_mon = tm -> tm_mon;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 tw.tw_year = tm -> tm_year;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 tw.tw_wday = tm -> tm_wday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 tw.tw_yday = tm -> tm_yday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 if ( tm -> tm_isdst )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 tw.tw_flags |= TW_DST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 ftime( &tb );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 tw.tw_zone = -tb.timezone;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 #else SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 tzset( );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 tw.tw_zone = -(timezone / 60);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 #endif SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 tw.tw_flags &= ~TW_SDAY;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 tw.tw_flags |= TW_SEXP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 tw.tw_clock = *clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 return ( &tw );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 struct tws *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 dgmtime( clock )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 long *clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 register struct tm *tm;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 static struct tws tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 if ( clock == NULL )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 return ( NULL );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 tw.tw_flags = TW_NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 tm = gmtime( clock );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 tw.tw_sec = tm -> tm_sec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 tw.tw_min = tm -> tm_min;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 tw.tw_hour = tm -> tm_hour;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 tw.tw_mday = tm -> tm_mday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 tw.tw_mon = tm -> tm_mon;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 tw.tw_year = tm -> tm_year;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 tw.tw_wday = tm -> tm_wday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 tw.tw_yday = tm -> tm_yday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 if ( tm -> tm_isdst )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 tw.tw_flags |= TW_DST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 tw.tw_zone = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 tw.tw_flags &= ~TW_SDAY;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 tw.tw_flags |= TW_SEXP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 tw.tw_clock = *clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 return( &tw );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 dasctime( tw, flags )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 struct tws *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 int flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 static char buffer[80], result[80];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 if ( tw == NULL )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 return ( NULL );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 (void) sprintf( buffer, "%02d %s %02d %02d:%02d:%02d %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 tw -> tw_mday, tw_moty[tw -> tw_mon], tw -> tw_year,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 tw -> tw_hour, tw -> tw_min, tw -> tw_sec,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 dtimezone( tw -> tw_zone, tw -> tw_flags | flags ) );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 if ( (tw -> tw_flags & TW_SDAY) == TW_SEXP )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 (void) sprintf( result, "%s, %s", tw_dotw[tw -> tw_wday], buffer );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 if ( (tw -> tw_flags & TW_SDAY) == TW_SNIL )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 (void) strcpy( result, buffer );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 (void) sprintf( result, "%s (%s)", buffer, tw_dotw[tw -> tw_wday] );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 return ( result );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 dtimezone( offset, flags )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 int offset, flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 register int hours, mins;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 register struct zone *z;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 static char buffer[10];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 if ( offset < 0 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 mins = -((-offset) % 60);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 hours = -((-offset) / 60);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 mins = offset % 60;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 hours = offset / 60;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 if ( !(flags & TW_ZONE) && mins == 0 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 for ( z = zones; z -> std; z++ )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 if ( z -> shift == hours )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 return ( z -> dst && (flags & TW_DST) ? z -> dst : z -> std );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 #ifdef DSTXXX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 if ( flags & TW_DST )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 hours += 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 #endif DSTXXX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 (void) sprintf( buffer, "%s%02d%02d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 offset < 0 ? "-" : "+", abs( hours ), abs( mins ) );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 return ( buffer );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 twscopy( tb, tw )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 struct tws *tb, *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 tb -> tw_sec = tw -> tw_sec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 tb -> tw_min = tw -> tw_min;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 tb -> tw_hour = tw -> tw_hour;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 tb -> tw_mday = tw -> tw_mday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 tb -> tw_mon = tw -> tw_mon;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 tb -> tw_year = tw -> tw_year;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 tb -> tw_wday = tw -> tw_wday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 tb -> tw_yday = tw -> tw_yday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 tb -> tw_zone = tw -> tw_zone;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 tb -> tw_clock = tw -> tw_clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 tb -> tw_flags = tw -> tw_flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 #else not notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 *tb = *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 #endif not notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 twsort( tw1, tw2 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 struct tws *tw1, *tw2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 register long c1, c2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 (void) twclock( tw1 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 (void) twclock( tw2 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 return ( (c1 = tw1 -> tw_clock) > (c2 = tw2 -> tw_clock) ? 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 : c1 == c2 ? 0 : -1 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 /* Julian day number of the Unix clock's origin, 01 Jan 1970. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 #define JD1970 2440587L
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 long
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 twjuliandate( tw )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 struct tws *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 register int mday, mon, year;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 register long a, b;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 double jd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 if ( (mday = tw -> tw_mday) < 1 || mday > 31 ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 (mon = tw -> tw_mon + 1) < 1 || mon > 12 ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 (year = tw -> tw_year) < 1 || year > 10000 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 return ( -1L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 if ( year < 100 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 year += CENTURY * 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 if ( mon == 1 || mon == 2 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 --year;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 mon += 12;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 if ( year < 1583 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 return ( -1L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 a = year / 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 b = 2 - a + a / 4;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 b += (long) ( (double) year * 365.25 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 b += (long) ( 30.6001 * ( (double) mon + 1.0 ) );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 jd = mday + b + 1720994.5;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 return ( (long) jd );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 long
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 twsubdayclock( tw )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 struct tws *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 register int i, sec, min, hour;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 register long result;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 if ( (sec = tw -> tw_sec) < 0 || sec > 59 ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 (min = tw -> tw_min) < 0 || min > 59 ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 (hour = tw -> tw_hour) < 0 || hour > 23 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 return ( -1L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 result = ( hour * 60 + min ) * 60 + sec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 result -= 60 * tw -> tw_zone;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 if ( tw -> tw_flags & TW_DST )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 result -= 60 * 60;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 return ( result );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 long
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 twclock( tw )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 struct tws *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 register long jd, sdc, result;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 if ( tw -> tw_clock != 0L )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 return ( tw -> tw_clock );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 if ( ( jd = twjuliandate( tw ) ) == -1L )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 return ( tw -> tw_clock = -1L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 if ( ( sdc = twsubdayclock( tw ) ) == -1L )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 return ( tw -> tw_clock = -1L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 result = ( jd - JD1970 ) * 24 * 60 * 60 + sdc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 return ( tw -> tw_clock = result );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 /*** twsubtract - subtract tw2 from tw1, returning result in seconds
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 The point of this routine is that using twclock( tw1 ) - twclock( tw2 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 would limit you to dates after the Unix Epoch ( 01 January 1970 ). This
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 routine avoids that limit. However, because the result is represented
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 by 32 bits, it is still limited to a span of two billion seconds, which is
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 about 66 years.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 long
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 twsubtract( tw1, tw2 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 struct tws *tw1, *tw2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 register long jd1, jd2, sdc1, sdc2, result;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 if ( ( jd1 = twjuliandate( tw1 ) ) == -1L )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 return ( 0L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 if ( ( sdc1 = twsubdayclock( tw1 ) ) == -1L )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 return ( 0L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 if ( ( jd2 = twjuliandate( tw2 ) ) == -1L )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 return ( 0L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 if ( ( sdc2 = twsubdayclock( tw2 ) ) == -1L )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 return ( 0L );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 result = ( jd1 - jd2 ) * 24 * 60 * 60 + ( sdc1 - sdc2 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 return ( result );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 * Simple calculation of day of the week. Algorithm used is Zeller's
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 * congruence. Currently, we assume if tw -> tw_year < 100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 * then the century is CENTURY.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 set_dotw( tw )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 struct tws *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 register int month, day, year, century;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 month = tw -> tw_mon - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 day = tw -> tw_mday;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 year = tw -> tw_year % 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 century = tw -> tw_year >= 100 ? tw -> tw_year / 100 : CENTURY;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 if ( month <= 0 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 month += 12;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 if ( --year < 0 )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 year += 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 century--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 tw -> tw_wday =
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 ((26 * month - 2) / 10 + day + year + year / 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 - 3 * century / 4 + 1) % 7;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 tw -> tw_flags &= ~TW_SDAY;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 tw -> tw_flags |= TW_SIMP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 }