|
|
1.1 root 1: %e 2000
2: %p 5000
3: %n 1000
4: %a 4000
5: %START Z
6: sun (sun(day)?)
7: mon (mon(day)?)
8: tue (tue(sday)?)
9: wed (wed(nesday)?)
10: thu (thu(rsday)?)
11: fri (fri(day)?)
12: sat (sat(urday)?)
13:
14: DAY ({sun}|{mon}|{tue}|{wed}|{thu}|{fri}|{sat})
15:
16: jan (jan(uary)?)
17: feb (feb(ruary)?)
18: mar (mar(ch)?)
19: apr (apr(il)?)
20: may (may)
21: jun (jun(e)?)
22: jul (jul(y)?)
23: aug (aug(est)?)
24: sep (sep(tember)?)
25: oct (oct(ober)?)
26: nov (nov(ember)?)
27: dec (dec(ember)?)
28:
29: MONTH ({jan}|{feb}|{mar}|{apr}|{may}|{jun}|{jul}|{aug}|{sep}|{oct}|{nov}|{dec})
30:
31: w ([ \t]*)
32: W ([ \t]+)
33: D ([0-9]?[0-9])
34: d [0-9]
35: %{
36: #include "tws.h"
37: #include <ctype.h>
38:
39: /*
40: * Table to convert month names to numeric month. We use the
41: * fact that the low order 5 bits of the sum of the 2nd & 3rd
42: * characters of the name is a hash with no collisions for the 12
43: * valid month names. (The mask to 5 bits maps any combination of
44: * upper and lower case into the same hash value).
45: */
46: static int month_map[] = {
47: 0,
48: 6, /* 1 - Jul */
49: 3, /* 2 - Apr */
50: 5, /* 3 - Jun */
51: 0,
52: 10, /* 5 - Nov */
53: 0,
54: 1, /* 7 - Feb */
55: 11, /* 8 - Dec */
56: 0,
57: 0,
58: 0,
59: 0,
60: 0,
61: 0,
62: 0, /*15 - Jan */
63: 0,
64: 0,
65: 0,
66: 2, /*19 - Mar */
67: 0,
68: 8, /*21 - Sep */
69: 0,
70: 9, /*23 - Oct */
71: 0,
72: 0,
73: 4, /*26 - May */
74: 0,
75: 7 /*28 - Aug */
76: };
77: /*
78: * Same trick for day-of-week using the hash function
79: * (c1 & 7) + (c2 & 4)
80: */
81: static int day_map[] = {
82: 0,
83: 0,
84: 0,
85: 6, /* 3 - Sat */
86: 4, /* 4 - Thu */
87: 0,
88: 5, /* 6 - Fri */
89: 0, /* 7 - Sun */
90: 2, /* 8 - Tue */
91: 1 /* 9 - Mon */,
92: 0,
93: 3 /*11 - Wed */
94: };
95: #define SETDAY tw.tw_wday= day_map[(cp[0] & 7) + (cp[1] & 4)];\
96: tw.tw_flags |= TW_SEXP;\
97: cp += 2;
98: #define SETMONTH tw.tw_mon = month_map[(cp[0] + cp[1]) & 0x1f]; gotdate++;\
99: cp += 2;\
100: SKIPD;
101: #define CVT2 (i=(*cp++ - '0'),isdigit(*cp)? i*10 + (*cp++ - '0') : i)
102: #define SKIPD while ( !isdigit(*cp++) ) ; --cp;
103: #define ZONE(x) tw.tw_zone=(x);
104: #define ZONED(x) tw.tw_zone=(x); tw.tw_flags |= TW_DST;
105: #define LC(c) (isupper(c) ? tolower(c) : (c))
106: %}
107: %%
108: %{
109: struct tws *dparsetime (str)
110: char *str;
111: {
112: register int i;
113: static struct tws tw;
114: register char *cp;
115: register int gotdate = 0;
116:
117: start_cond = 0;
118: bzero( (char *) &tw, sizeof tw);
119: while (isspace(*str))
120: str++;
121: while ( 1 )
122: switch (cp = str, *cp? lex_string( &str, start_cond) : 0) {
123:
124: case -1:
125: if (!gotdate || tw.tw_year == 0)
126: return 0;
127: /* fall through */
128: case 0:
129: return &tw;
130:
131: %}
132: {DAY}","?{w} SETDAY;
133: "("{DAY}")"(","?) cp++, SETDAY;
134:
135: {D}"/"{D}"/"19[0-9][0-9]{w} {
136: tw.tw_mday = CVT2; cp++;
137: tw.tw_mon = CVT2 - 1; cp += 3;
138: tw.tw_year = CVT2;
139: gotdate++;
140: }
141: {D}"/"{D}"/"[0-9][0-9]{w} {
142: tw.tw_mday = CVT2; cp++;
143: tw.tw_mon = CVT2 - 1; cp++;
144: tw.tw_year = CVT2;
145: gotdate++;
146: }
147: {D}[- ]?{MONTH}[- ]?(19)?{D}{w}(at{W})? {
148: tw.tw_mday = CVT2;
149: while ( !isalpha(*cp++) )
150: ;
151: SETMONTH;
152: for (i = 0; isdigit(*cp); )
153: i = i*10 + (*cp++ - '0');
154: tw.tw_year = i % 100;
155: }
156: {MONTH}{W}{D}","{W}(19)?{D}{w} {
157: cp++;
158: SETMONTH;
159: tw.tw_mday = CVT2;
160: SKIPD;
161: for (i = 0; isdigit(*cp); )
162: i = i*10 + (*cp++ - '0');
163: tw.tw_year = i % 100;
164: }
165:
166: {MONTH}{W}{D}{w} {
167: cp++;
168: SETMONTH;
169: tw.tw_mday = CVT2;
170: }
171:
172: {D}:{D}:{D}{w} {
173: tw.tw_hour = CVT2; cp++;
174: tw.tw_min = CVT2; cp++;
175: tw.tw_sec = CVT2;
176: BEGIN Z;
177: }
178: {D}:{D}{w} |
179: {D}:{D}{w}am{w} {
180: tw.tw_hour = CVT2; cp++;
181: tw.tw_min = CVT2;
182: BEGIN Z;
183: }
184: {D}:{D}{w}pm{w} {
185: tw.tw_hour = CVT2 + 12; cp++;
186: tw.tw_min = CVT2;
187: BEGIN Z;
188: }
189: [0-2]{d}{d}{d}{d}{d}{w} {
190: tw.tw_hour = CVT2;
191: tw.tw_min = CVT2;
192: tw.tw_sec = CVT2;
193: BEGIN Z;
194: }
195: [0-2]{d}{d}{d}{w} {
196: tw.tw_hour = CVT2;
197: tw.tw_min = CVT2;
198: BEGIN Z;
199: }
200: <Z>"-"?ut ZONE(0 * 60);
201: <Z>"-"?gmt ZONE(0 * 60);
202: <Z>"-"?jst ZONE(2 * 60);
203: <Z>"-"?jdt ZONED(2 * 60);
204: <Z>"-"?est ZONE(-5 * 60);
205: <Z>"-"?edt ZONED(-5 * 60);
206: <Z>"-"?cst ZONE(-6 * 60);
207: <Z>"-"?cdt ZONED(-6 * 60);
208: <Z>"-"?mst ZONE(-7 * 60);
209: <Z>"-"?mdt ZONED(-7 * 60);
210: <Z>"-"?pst ZONE(-8 * 60);
211: <Z>"-"?pdt ZONED(-8 * 60);
212: <Z>"-"?nst ZONE(-(3 * 60 + 30));
213: <Z>"-"?ast ZONE(-4 * 60);
214: <Z>"-"?adt ZONED(-4 * 60);
215: <Z>"-"?yst ZONE(-9 * 60);
216: <Z>"-"?ydt ZONED(-9 * 60);
217: <Z>"-"?hst ZONE(-10 * 60);
218: <Z>"-"?hdt ZONED(-10 * 60);
219: <Z>"-"?bst ZONED(-1 * 60);
220: <Z>[a-i] tw.tw_zone = 60 * (('a'-1) - LC(*cp));
221: <Z>[k-m] tw.tw_zone = 60 * ('a' - LC(*cp));
222: <Z>[n-y] tw.tw_zone = 60 * (LC(*cp) - 'm');
223: <Z>"+"[0-1]{d}{d}{d} {
224: cp++;
225: tw.tw_zone = ((cp[0] * 10 + cp[1])
226: -('0' * 10 + '0'))*60
227: +((cp[2] * 10 + cp[3])
228: -('0' * 10 + '0'));
229: cp += 4;
230: }
231: <Z>"-"[0-1]{d}{d}{d} {
232: cp++;
233: tw.tw_zone = (('0' * 10 + '0')
234: -(cp[0] * 10 + cp[1]))*60
235: +(('0' * 10 + '0')
236: -(cp[2] * 10 + cp[3]));
237: cp += 4;
238: }
239: <Z>{W}19[6-9]{d} {
240: while( !isdigit(*cp++) )
241: ;
242: cp++;
243: tw.tw_year = CVT2;
244: }
245:
246: \n |
247: {W} ;
248: %%
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.