3 <ENTRY ITIME QTIME LTIME ETIME BTIME IDAY TIME-ZONE DAY DAY-PART TIME-PART
10 <MANIFEST TM-SECONDS TM-MICRO TZ-MINUTES TZ-DST>
14 <SETG MONTHS '["JAN" "FEB" "MAR" "APR" "MAY" "JUN" "JUL"
15 "AUG" "SEP" "OCT" "NOV" "DEC"]>
16 <GDECL (MONTHS) <VECTOR [REST STRING]>>
17 <SETG TIME-STRING <ISTRING 22 !\ >>
18 <GDECL (TIME-STRING) STRING>
20 <DEFINE DTIME ("OPT" (F <ITIME>) (DS ,TIME-STRING) "AUX" (DL ,TIME-LIST) L T S)
21 #DECL ((F) <OR FIX FALSE> (DS) STRING (DL) !<LIST [2 LIST] STRING>
22 (L) !<LIST [3 FIX]> (T) FIX (S) STRING)
23 <COND (<NOT .F> <SET F <ITIME>>)>
24 <COND (<G=? <LENGTH .DS> 22>
25 <SET DS <REST .DS <- <LENGTH .DS> 22>>>
29 <1 .DS <CHTYPE <+ </ .T 10> %<ASCII !\0>> CHARACTER>>
30 <2 .DS <CHTYPE <+ <MOD .T 10> %<ASCII !\0>> CHARACTER>>
32 <SET S <NTH ,MONTHS <2 .L>>>
38 <8 .DS <CHTYPE <+ </ .T 10> %<ASCII !\0>> CHARACTER>>
39 <9 .DS <CHTYPE <+ <MOD .T 10> %<ASCII !\0>> CHARACTER>>
43 <11 .DS <CHTYPE <+ </ .T 10> %<ASCII !\0>> CHARACTER>>
44 <12 .DS <CHTYPE <+ <MOD .T 10> %<ASCII !\0>> CHARACTER>>
47 <14 .DS <CHTYPE <+ </ .T 10> %<ASCII !\0>> CHARACTER>>
48 <15 .DS <CHTYPE <+ <MOD .T 10> %<ASCII !\0>> CHARACTER>>
51 <17 .DS <CHTYPE <+ </ .T 10> %<ASCII !\0>> CHARACTER>>
52 <18 .DS <CHTYPE <+ <MOD .T 10> %<ASCII !\0>> CHARACTER>>
60 <DEFINE DAY-PART (DT "OPT" D)
62 <COND (<NOT <ASSIGNED? D>> <LHW .DT>)
63 (ELSE <ORB <LSH .D 16> <ANDB .DT *177777*>>)>>
65 <DEFINE TIME-PART (DT "OPT" T)
67 <COND (<NOT <ASSIGNED? T>> <ANDB .DT *177777*>)
68 (ELSE <ORB <ANDB .DT *37777600000*> <ANDB .T *177777*>>)>>
70 <SETG TIME-LIST ((0 0 0) (0 0 0) "EST")>
71 <GDECL (TIME-LIST) <LIST LIST LIST STRING>>
73 <DEFINE LTIME ("OPTIONAL" (FF <ITIME>) (LST ,TIME-LIST))
74 #DECL ((VALUE LST) <LIST [2 LIST] STRING>
75 (FF) <OR FIX UVECTOR>)
76 <COND (<TYPE? .FF UVECTOR>
77 <ETIME <1 .FF> <2 .FF> .LST>)
80 <DEFINE ETIME ("OPTIONAL" (FF <ITIME>) Z (LST ,TIME-LIST)
81 "AUX" F S D LY? Y M (DATE <1 .LST>) (TIME <2 .LST>))
82 #DECL ((VALUE LST) <LIST [2 LIST] STRING> (F D S Y M Z) FIX
83 (FF) <OR FIX UVECTOR> (LY?) <OR ATOM FALSE>
84 (DATE TIME) <LIST [3 FIX]>)
85 <SET F <COND (<TYPE? .FF FIX> .FF) (ELSE <1 .FF>)>>
88 <COND (<ASSIGNED? Z> <TIME-ZONE .Z>)
90 <TIME-ZONE <SET Z <TIME-ZONE <> .FF>>>)
91 (ELSE <TIME-ZONE <SET Z <2 .FF>> <1 .FF>>)>>
92 <COND (<NOT <0? <ANDB .Z *200000*>>>
94 <SET F <- .F <* <ANDB .Z *77*> </ ,DAY 24>>>>
95 <SET D <+ <DAY-PART .F> 366 365>>
96 <SET Y <+ 68 <* 4 </ .D <+ 366 365 365 365>>>>>
97 <SET D <MOD .D <+ 366 365 365 365>>>
98 <COND (<SET LY? <L? <SET D <- .D 366>> 0>> <SET D <+ .D 366>>)
99 (<AND <SET Y <+ .Y 1>> <L? <SET D <- .D 365>> 0>>
101 (<AND <SET Y <+ .Y 1>> <L? <SET D <- .D 365>> 0>>
103 (ELSE <SET Y <+ .Y 1>>)>
109 <COND (<AND .LY? <==? .N 28>> <SET N 29>)>
110 <COND (<L? <- .D .N> 0>
112 <PUT .DATE 3 <+ 1 .D>>
114 (ELSE <SET D <- .D .N>> <SET M <+ .M 1>>)>>
115 '![31 28 31 30 31 30 31 31 30 31 30 31!]>
116 <SET S <QTIME <TIME-PART .F>>>
117 <PUT .TIME 1 </ .S 3600>>
118 <SET S <MOD .S 3600>>
119 <PUT .TIME 2 </ .S 60>>
120 <PUT .TIME 3 <MOD .S 60>>
125 <DEFINE TIME-ZONE ("OPTIONAL" (Z <>) TIM
126 "AUX" (ZL ,ZONELIST) ZS IZ (UV ,ZONE-UV))
127 #DECL ((Z) <OR FIX STRING FALSE> (ZL) VECTOR (IZ) FIX
128 (ZS) <OR FALSE VECTOR>
129 (UV) <UVECTOR [3 FIX]>)
130 <COND (<OR <NOT .Z> <NOT <ASSIGNED? TIM>>>
132 <SET IZ </ <TZ-MINUTES .UV> 60>>
133 <COND (<NOT <ASSIGNED? TIM>>
134 <SET TIM <ITIME>>)>)>
135 <COND (<AND <G? <TZ-DST .UV> 0> <IN-DST? .TIM .IZ>>
136 <SET IZ <ORB .IZ *200000*>>)>
139 <COND (<SET ZS <MEMQ .Z .ZL>> <1 <BACK .ZS>>)
141 (<SET ZS <MEMBER .Z .ZL>> <2 .ZS>)
142 (ELSE #FALSE ("Unknown time zone"))>>
144 "IN-DST? - are we in daylight savings time"
146 <DEFINE IN-DST? (F Z "AUX" Y M D LY? DOW)
147 #DECL ((F Z Y M D DOW) FIX)
148 <SET F <- .F <+ <* <ANDB .Z *77*> 2> </ ,DAY 24>>>>
149 <SET D <+ <LHW .F> 366 365>>
150 <SET Y <+ 68 <* 4 </ .D <+ 366 365 365 365>>>>>
151 <SET D <MOD .D <+ 366 365 365 365>>>
152 <COND (<SET LY? <L? <SET D <- .D 366>> 0>> <SET D <+ .D 366>>)
153 (<AND <SET Y <+ .Y 1>> <L? <SET D <- .D 365>> 0>>
155 (<AND <SET Y <+ .Y 1>> <L? <SET D <- .D 365>> 0>>
157 (ELSE <SET Y <+ .Y 1>>)>
162 <COND (<AND .LY? <==? .N 28>> <SET N 29>)>
163 <COND (<L? <- .D .N> 0>
166 (ELSE <SET D <- .D .N>> <SET M <+ .M 1>>)>>
167 '![31 28 31 30 31 30 31 31 30 31 30 31!]>
168 <COND (<AND <G? .M 4> <L? .M 10>> T)
169 (<OR <==? .M 4> <==? .M 10>>
172 <COND (<==? .DOW 6> -7)
177 <G? <+ 31 .DOW> .D>)>)>>
179 <DEFINE DO-FTIME (UV)
180 <CALL SYSCALL GETTIMEOFDAY ,TIME-UV .UV>>
182 <DEFINE DO-TIME () <CALL SYSCALL GETTIMEOFDAY ,TIME-UV ,ZONE-UV>>
184 <SETG TIME-UV <UVECTOR 0 0>>
185 <SETG ZONE-UV <UVECTOR 0 0>>
186 <GDECL (TIME-UV ZONE-UV) UVECTOR>
189 '["EST" 5 "EDT" *200005*
190 "CST" 6 "CDT" *200006*
191 "MST" 7 "MDT" *200007*
192 "PST" 8 "PDT" *200010*
193 "YST" 9 "YDT" *200011*
194 "HST" 10 "HDT" *200012*
195 "BST" 11 "BDT" *200013*
196 "AST" 4 "ADT" *200004*
200 <GDECL (ZONELIST) <VECTOR [REST STRING FIX]>>
204 <DEFINE BTIME ("OPTIONAL" (Y 0) (M 1) (D 1) (HH 0) (MM 0) (SS 0)
205 "AUX" S (LOSSAGE ,LOSSAGE) Z)
206 #DECL ((VALUE Y M D HH MM SS Z) FIX (LOSSAGE) <UVECTOR [REST FIX]>)
209 <SET S <TM-SECONDS ,TIME-UV>>
210 <SET Y </ .S %<* 365 24 60 60>>>)
211 (<G=? .Y 1970> <SET Y <- .Y 1970>>)
212 (<G=? .Y 70> <SET Y <- .Y 70>>)>
216 <COND (<AND <0? <MOD <+ .Y 2> 4>> <G? .M 2>> 1)
221 <SET HH <+ .HH <SET Z <ANDB <TIME-ZONE> 63>>>>
222 <SET HH <- .HH <LHW .Z>>>
223 <ORB <LSH .D 16> <STIME <+ .SS <* .MM 60> <* .HH 3600>>>>>
225 <SETG LOSSAGE '![0 31 59 90 120 151 181 212 243 273 304 334]>
229 <DEFINE ITIME ("AUX" S)
232 <SET S <TM-SECONDS ,TIME-UV>>
233 <ORB <LSH </ .S %<* 24 60 60>> 16>
234 <STIME <MOD .S %<* 24 60 60>>>>>
236 "STIME - convert seconds to fraction of day"
240 <ANDB <FIX </ <* <FLOAT .T> *200000*> %<* 24 3600>>>
243 "QTIME - convert fraction of day to seconds"
247 <FIX </ <* <FLOAT <ANDB .T *177777*>> %<* 24 3600>>
250 "IDAY - day of week, MON=0, SUN=6"
252 <DEFINE IDAY ("OPTIONAL" (T <ITIME>))
254 <MOD <+ <LHW .T> 3> 7>>