|
|
1.1 root 1: %{
2: #ifndef lint
3: static char rcsid[] =
4: #ifdef FLEX_SCANNER
5: "@(#) $Header: dtimep.lex,v 1.14 89/12/16 00:29:17 leres Locked $ (LBL) (flex generated scanner)";
6: #else
7: "@(#) $Header: dtimep.lex,v 1.14 89/12/16 00:29:17 leres Locked $ (LBL) (lex generated scanner)";
8: #endif
9: #endif
10: %}
11: /*
12: %e 2000
13: %p 5000
14: %n 1000
15: %a 4000
16: */
17:
18: %START Z
19: sun (sun(day)?)
20: mon (mon(day)?)
21: tue (tue(sday)?)
22: wed (wed(nesday)?)
23: thu (thu(rsday)?)
24: fri (fri(day)?)
25: sat (sat(urday)?)
26:
27: DAY ({sun}|{mon}|{tue}|{wed}|{thu}|{fri}|{sat})
28:
29: jan (jan(uary)?)
30: feb (feb(ruary)?)
31: mar (mar(ch)?)
32: apr (apr(il)?)
33: may (may)
34: jun (jun(e)?)
35: jul (jul(y)?)
36: aug (aug(ust)?)
37: sep (sep(tember)?)
38: oct (oct(ober)?)
39: nov (nov(ember)?)
40: dec (dec(ember)?)
41:
42: MONTH ({jan}|{feb}|{mar}|{apr}|{may}|{jun}|{jul}|{aug}|{sep}|{oct}|{nov}|{dec})
43:
44: w ([ \t]*)
45: W ([ \t]+)
46: D ([0-9]?[0-9])
47: d [0-9]
48: %{
49: #include "tws.h"
50: #include <ctype.h>
51:
52: /*
53: * Patchable flag that says how to interpret NN/NN/NN dates. When
54: * true, we do it European style: DD/MM/YY. When false, we do it
55: * American style: MM/DD/YY.
56: */
57: int europeandate = 0;
58:
59: /*
60: * Table to convert month names to numeric month. We use the
61: * fact that the low order 5 bits of the sum of the 2nd & 3rd
62: * characters of the name is a hash with no collisions for the 12
63: * valid month names. (The mask to 5 bits maps any combination of
64: * upper and lower case into the same hash value).
65: */
66: static int month_map[] = {
67: 0,
68: 6, /* 1 - Jul */
69: 3, /* 2 - Apr */
70: 5, /* 3 - Jun */
71: 0,
72: 10, /* 5 - Nov */
73: 0,
74: 1, /* 7 - Feb */
75: 11, /* 8 - Dec */
76: 0,
77: 0,
78: 0,
79: 0,
80: 0,
81: 0,
82: 0, /*15 - Jan */
83: 0,
84: 0,
85: 0,
86: 2, /*19 - Mar */
87: 0,
88: 8, /*21 - Sep */
89: 0,
90: 9, /*23 - Oct */
91: 0,
92: 0,
93: 4, /*26 - May */
94: 0,
95: 7 /*28 - Aug */
96: };
97: /*
98: * Same trick for day-of-week using the hash function
99: * (c1 & 7) + (c2 & 4)
100: */
101: static int day_map[] = {
102: 0,
103: 0,
104: 0,
105: 6, /* 3 - Sat */
106: 4, /* 4 - Thu */
107: 0,
108: 5, /* 6 - Fri */
109: 0, /* 7 - Sun */
110: 2, /* 8 - Tue */
111: 1 /* 9 - Mon */,
112: 0,
113: 3 /*11 - Wed */
114: };
115: #define SETDAY { tw.tw_wday= day_map[(cp[0] & 7) + (cp[1] & 4)];\
116: tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP;\
117: cp += 2; }
118: #define SETMONTH { tw.tw_mon = month_map[(cp[0] + cp[1]) & 0x1f]; gotdate++;\
119: cp += 2;\
120: SKIPD;}
121: #define CVT2 (i=(*cp++ - '0'),isdigit(*cp)? i*10 + (*cp++ - '0') : i)
122: #define SKIPD { while ( !isdigit(*cp++) ) ; --cp; }
123: #define EXPZONE { tw.tw_flags &= ~TW_SZONE; tw.tw_flags |= TW_SZEXP; }
124: #define ZONE(x) { tw.tw_zone=(x); EXPZONE; }
125: #define ZONED(x) { ZONE(x); tw.tw_flags |= TW_DST; }
126: #define LC(c) (isupper(c) ? tolower(c) : (c))
127:
128: #ifdef FLEX_SCANNER
129: /* We get passed a string and return a pointer to a static tws struct */
130: #undef YY_DECL
131: #define YY_DECL struct tws *dparsetime(str) char *str;
132:
133: /* We assume that we're never passed more than max_size characters */
134: #undef YY_INPUT
135: #define YY_INPUT(buf,result,max_size) \
136: if (gstr) { \
137: register char *xp; \
138: xp = gstr; \
139: while (isspace(*xp)) \
140: xp++; \
141: gstr = xp; \
142: while (*xp != '\0') \
143: ++xp; \
144: result = xp - gstr; \
145: bcopy(gstr, buf, result); \
146: gstr = 0; \
147: } else \
148: result = YY_NULL;
149:
150: /* Date strings aren't usually very long */
151: #undef YY_READ_BUF_SIZE
152: #define YY_READ_BUF_SIZE 128
153:
154: /* Use mh error reporting routine */
155: #undef YY_FATAL_ERROR
156: #define YY_FATAL_ERROR(s) adios("dparsetime()", s);
157:
158: /* We need a pointer to the matched text we can modify */
159: #undef YY_USER_ACTION
160: #define YY_USER_ACTION cp = yytext
161:
162: /* Used to initialize */
163: static struct tws ztw = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
164:
165: /* Global for use by YY_INPUT() macro */
166: static char *gstr;
167: #endif
168:
169: %}
170:
171: %%
172: register int i, gotdate;
173: register char *cp;
174: static struct tws tw;
175: static void zonehack();
176:
177: BEGIN(INITIAL);
178: yy_init = 1;
179: tw = ztw;
180: gstr = str;
181: gotdate = 0;
182:
183: {DAY}","?{w} SETDAY;
184: "("{DAY}")"(","?) {
185: cp++;
186: SETDAY;
187: }
188:
189: {D}"/"{D}"/"(19)?[0-9][0-9]{w} {
190: if (europeandate) {
191: /* European: DD/MM/YY */
192: tw.tw_mday = CVT2;
193: cp++;
194: tw.tw_mon = CVT2 - 1;
195: } else {
196: /* American: MM/DD/YY */
197: tw.tw_mon = CVT2 - 1;
198: cp++;
199: tw.tw_mday = CVT2;
200: }
201: cp++;
202: for (i = 0; isdigit(*cp); )
203: i = i*10 + (*cp++ - '0');
204: tw.tw_year = i % 100;
205: gotdate++;
206: }
207: {D}{w}(-)?{w}{MONTH}{w}(-)?{w}(19)?{D}{w}(\,{w}|at{W})? {
208: tw.tw_mday = CVT2;
209: while (!isalpha(*cp++))
210: ;
211: SETMONTH;
212: for (i = 0; isdigit(*cp); )
213: i = i*10 + (*cp++ - '0');
214: tw.tw_year = i % 100;
215: }
216: {MONTH}{W}{D}","{W}(19)?{D}{w} {
217: cp++;
218: SETMONTH;
219: tw.tw_mday = CVT2;
220: SKIPD;
221: for (i = 0; isdigit(*cp); )
222: i = i*10 + (*cp++ - '0');
223: tw.tw_year = i % 100;
224: }
225:
226: {MONTH}{W}{D}{w} {
227: cp++;
228: SETMONTH;
229: tw.tw_mday = CVT2;
230: }
231:
232: {D}:{D}:{D}{w} {
233: tw.tw_hour = CVT2; cp++;
234: tw.tw_min = CVT2; cp++;
235: tw.tw_sec = CVT2;
236: BEGIN Z;
237: }
238: {D}:{D}{w} {
239: tw.tw_hour = CVT2; cp++;
240: tw.tw_min = CVT2;
241: BEGIN Z;
242: }
243: {D}:{D}{w}am{w} {
244: tw.tw_hour = CVT2; cp++;
245: if (tw.tw_hour == 12)
246: tw.tw_hour = 0;
247: tw.tw_min = CVT2;
248: BEGIN Z;
249: }
250: {D}:{D}{w}pm{w} {
251: tw.tw_hour = CVT2; cp++;
252: if (tw.tw_hour != 12)
253: tw.tw_hour += 12;
254: tw.tw_min = CVT2;
255: BEGIN Z;
256: }
257: [0-2]{d}{d}{d}{d}{d}{w} {
258: tw.tw_hour = CVT2;
259: tw.tw_min = CVT2;
260: tw.tw_sec = CVT2;
261: BEGIN Z;
262: }
263: 19[6-9]{d}{w} {
264: /*
265: * Luckly, 4 digit times in the range
266: * 1960-1999 aren't legal as hour
267: * and minutes. This rule must come
268: * the 4 digit hour and minute rule.
269: */
270: cp += 2;
271: tw.tw_year = CVT2;
272: }
273: [0-2]{d}{d}{d}{w} {
274: tw.tw_hour = CVT2;
275: tw.tw_min = CVT2;
276: BEGIN Z;
277: }
278: <Z>"-"?ut ZONE(0 * 60);
279: <Z>"-"?gmt ZONE(0 * 60);
280: <Z>"-"?jst ZONE(2 * 60);
281: <Z>"-"?jdt ZONED(2 * 60);
282: <Z>"-"?est ZONE(-5 * 60);
283: <Z>"-"?edt ZONED(-5 * 60);
284: <Z>"-"?cst ZONE(-6 * 60);
285: <Z>"-"?cdt ZONED(-6 * 60);
286: <Z>"-"?mst ZONE(-7 * 60);
287: <Z>"-"?mdt ZONED(-7 * 60);
288: <Z>"-"?pst ZONE(-8 * 60);
289: <Z>"-"?pdt ZONED(-8 * 60);
290: <Z>"-"?nst ZONE(-(3 * 60 + 30));
291: <Z>"-"?ast ZONE(-4 * 60);
292: <Z>"-"?adt ZONED(-4 * 60);
293: <Z>"-"?yst ZONE(-9 * 60);
294: <Z>"-"?ydt ZONED(-9 * 60);
295: <Z>"-"?hst ZONE(-10 * 60);
296: <Z>"-"?hdt ZONED(-10 * 60);
297: <Z>"-"?bst ZONED(-1 * 60);
298: <Z>[a-i] {
299: tw.tw_zone = 60 * (('a'-1) - LC(*cp));
300: EXPZONE;
301: }
302: <Z>[k-m] {
303: tw.tw_zone = 60 * ('a' - LC(*cp));
304: EXPZONE;
305: }
306: <Z>[n-y] {
307: tw.tw_zone = 60 * (LC(*cp) - 'm');
308: EXPZONE;
309: }
310: <Z>"+"[0-1]{d}{d}{d} {
311: cp++;
312: tw.tw_zone = ((cp[0] * 10 + cp[1])
313: -('0' * 10 + '0'))*60
314: +((cp[2] * 10 + cp[3])
315: -('0' * 10 + '0'));
316: #ifdef DSTXXX
317: zonehack (&tw);
318: #endif DSTXXX
319: cp += 4;
320: EXPZONE;
321: }
322: <Z>"-"[0-1]{d}{d}{d} {
323: cp++;
324: tw.tw_zone = (('0' * 10 + '0')
325: -(cp[0] * 10 + cp[1]))*60
326: +(('0' * 10 + '0')
327: -(cp[2] * 10 + cp[3]));
328: #ifdef DSTXXX
329: zonehack (&tw);
330: #endif DSTXXX
331: cp += 4;
332: EXPZONE;
333: }
334:
335: \n |
336: {W} ;
337:
338: <INITIAL,Z><<EOF>> return(&tw);
339:
340: . {
341: /*
342: * We jammed; it's an error if we
343: * didn't parse anything.
344: */
345: if (!gotdate || tw.tw_year == 0)
346: return(0);
347: return(&tw);
348: }
349:
350: %%
351:
352: #ifdef DSTXXX
353: #include <sys/types.h>
354: #ifndef BSD42
355: #include <time.h>
356: #else BSD42
357: #include <sys/time.h>
358: #endif BSD42
359:
360: static void
361: zonehack(tw)
362: register struct tws *tw;
363: {
364: register struct tm *tm;
365:
366: if (twclock (tw) == -1L)
367: return;
368:
369: tm = localtime (&tw -> tw_clock);
370: if (tm -> tm_isdst) {
371: tw -> tw_flags |= TW_DST;
372: tw -> tw_zone -= 60;
373: }
374: }
375: #endif DSTXXX
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.