2 /*Revision 1.2 2002-09-28 06:58:45 arjen
3 /*Bugfix: conversion of an empty string to a date or hour object
4 /*now makes the values of such an object 0 (null) instead of giving
5 /*a segmentation fault.
6 /*The class UTC combines the date and hour classes. The most basic
7 /*functions of the UTC class are now implemented.
8 /*These include constructors and conversion to and from String objects.
9 /*New functions: date::proper(), hour::proper() and UTC::proper().
10 /*Return true if the object holds a proper clock time and/or calendar
11 /*date; false if at least one value is out of range.
13 /*Revision 1.1 2002/07/25 08:01:26 arjen
14 /*First checkin, AXE release 0.2
16 * Revision 1.1 84/09/01 15:01:22 wales
19 * Copyright (c) 1984 by Richard B. Wales
23 * YACC parser for "parsedate" routine.
27 * Called as needed by the "parsedate" routine in "parsedate.c".
28 * Not intended to be called from any other routine.
35 * Parses the date string pointed to by the global variable
36 * "yyinbuf". Sets the appropriate fields in the global data
37 * structure "yyans". The returned value is 1 if there was a
38 * syntax error, 0 if there was no error.
46 * ajs Code added on 850314 to allow goal := year.date '.' time
47 * ajs and year.date := [CC]YYMMDD (YY > 23)
48 * ajs All added lines contain "ajs" for easy searching.
53 static char rcsident[] = "$Header: /cvsroot/lib/AXE/src/dateyacc.y,v 1.2 2002-09-28 06:58:45 arjen Exp $";
57 #include "parsedate.h"
58 struct parseddate yyans;
60 /* No error routine is needed here. */
70 %token NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
71 %token NUM991231 NUM99991231 /* ajs */
73 %token STD_ZONE DST_ZONE DST_SUFFIX
75 %type <IntVal> DAY_NAME
76 %type <IntVal> MONTH_NAME
77 %type <IntVal> NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
78 %type <IntVal> NUM991231 NUM99991231 /* ajs */
80 %type <IntVal> STD_ZONE DST_ZONE
81 %type <IntVal> num59 num zone.offset
100 | date dayname time year
102 | date dayname year time
105 | date time dayname year
107 | date time year dayname
110 | date.year dayname time
112 | date.year time dayname
115 | dayname date time year
117 | dayname date.year time
119 | dayname time date.year
120 | dayname time year.date
122 | dayname year.date time
123 | dayname year time date
127 | time date dayname year
129 | time date.year dayname
131 | time dayname date.year
132 | time dayname year.date
134 | time year.date dayname
135 | time year dayname date
138 | year.date dayname time
140 | year.date time dayname
142 | year dayname date time
143 | year dayname time date
145 | year time date dayname
146 | year time dayname date
148 { yyans.hour = $1 / 100;
149 yyans.minute = $1 % 100;
150 yyans.second = -1; /* unspecified */
153 | yymmdd '.' time2359 /* ajs */
154 | yymmdd '.' time /* ajs */
155 | yymmdd '.' time dayname /* ajs */
157 { extern char *yyinbuf;
158 if (yyans.error == NULL) yyans.error = yyinbuf;
164 { yyans.c_weekday = $1; }
166 { yyans.c_weekday = $1; }
171 | hyphen.date '-' year
172 | num '-' num '-' year
173 { yyans.day = $1; yyans.month = $3; }
174 | slash.date '/' year
179 | year '-' hyphen.date
180 | year '-' num '-' num
181 { yyans.day = $5; yyans.month = $3; }
182 | year '/' slash.date
188 { yyans.year = ($1 / 10000) + 1900; /* ajs */
189 yyans.month = ($1 % 10000) / 100; /* ajs */
190 yyans.day = ($1 % 100); /* ajs */
192 /*| NUM235959 (leads to parser conflict) */ /* ajs */
193 | NUM99991231 /* ajs */
194 { yyans.year = ($1 / 10000); /* ajs */
195 yyans.month = ($1 % 10000) / 100; /* ajs */
196 yyans.day = ($1 % 100); /* ajs */
206 { yyans.month = $1; yyans.day = $2; }
222 { yyans.month = $1; yyans.day = $3; }
226 NUM59 /* 2-digit year < 60 : after 2000 */
227 { yyans.year = 2000 + $1; }
229 { yyans.year = 2000 + $1; }
230 | NUM99 /* precludes two-digit date before 1960 */
231 { yyans.year = 1900 + $1; }
240 { yyans.month = $1; }
242 { yyans.month = $1; }
254 { yyans.hour = $1 / 100;
255 yyans.minute = $1 % 100;
256 yyans.second = -1; /* unspecified */
265 yyans.second = -1; /* unspecified */
270 yyans.second = -1; /* unspecified */
272 | NUM9 ':' num59 ':' num59
277 | NUM9 '.' num59 '.' num59
285 yyans.second = -1; /* unspecified */
290 yyans.second = -1; /* unspecified */
292 | NUM23 ':' num59 ':' num59
297 | NUM23 '.' num59 '.' num59
303 { yyans.hour = $1 / 100;
304 yyans.minute = $1 % 100;
308 { yyans.hour = $1 / 100;
309 yyans.minute = $1 % 100;
313 { yyans.hour = $1 / 10000;
314 yyans.minute = ($1 % 10000) / 100;
315 yyans.second = $1 % 100;
321 { if (yyans.hour < 1 || yyans.hour > 12)
322 yyans.hour = -1; /* invalid */
324 { if (yyans.hour == 12) yyans.hour = 0;
325 yyans.hour += $1; /* 0 for AM, 12 for PM */
331 { yyans.zone = $1; yyans.dst = 0; }
332 | STD_ZONE DST_SUFFIX
333 { yyans.zone = $1 + 60; yyans.dst = 1; }
335 { yyans.zone = $2; yyans.dst = 0; }
336 | '-' STD_ZONE DST_SUFFIX
337 { yyans.zone = $2 + 60; yyans.dst = 1; }
339 { yyans.zone = $1; yyans.dst = 1; }
341 { yyans.zone = $2; yyans.dst = 1; }
343 { yyans.zone = $2; yyans.dst = 0; }
344 | '-' '+' zone.offset
345 { yyans.zone = $3; yyans.dst = 0; }
347 { yyans.zone = - $2; yyans.dst = 0; }
348 | '-' '-' zone.offset
349 { yyans.zone = - $3; yyans.dst = 0; }
356 { $$ = 60 * $1 + $3; }
358 { $$ = 60 * $1 + $3; }
362 { $$ = 60 * $1 + $3; }
364 { $$ = 60 * $1 + $3; }
366 { $$ = 60 * ($1 / 100) | ($1 % 100); }
371 { yyans.hour = $1 / 100; /* ajs */
372 yyans.minute = $1 % 100; /* ajs */
373 yyans.second = -1; /* ajs */