summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--generic/tclDate.c207
-rw-r--r--generic/tclGetDate.y85
-rw-r--r--generic/tclInt.h37
4 files changed, 199 insertions, 134 deletions
diff --git a/ChangeLog b/ChangeLog
index e5cf0d3..0125012 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,8 +2,8 @@
* generic/tclDate.c: Revised tclGetDate.y to use bison instead
* generic/tclGetDate.y: of yacc to build the parser, eliminating
- * unix/Makefile.in: all the complicated hackery involving
- 'sed' postprocessing. Rebuilt the parser.
+ * generic/tclInt.h: all the complicated hackery involving
+ * unix/Makefile.in: 'sed' postprocessing. Rebuilt the parser.
2004-09-14 Kevin B. Kenny <kennykb@acm.org>
diff --git a/generic/tclDate.c b/generic/tclDate.c
index 7633373..8369a85 100644
--- a/generic/tclDate.c
+++ b/generic/tclDate.c
@@ -131,6 +131,35 @@
#pragma warning( disable : 4102 )
#endif /* _MSC_VER */
+/*
+ * yyparse will accept a 'struct TclGetDateInfo' as its parameter;
+ * that's where the parsed fields will be returned.
+ */
+
+#define YYPARSE_PARAM info
+
+#define yyDSTmode (((TclGetDateInfo*)info)->dateDSTmode)
+#define yyDayOrdinal (((TclGetDateInfo*)info)->dateDayOrdinal)
+#define yyDayNumber (((TclGetDateInfo*)info)->dateDayNumber)
+#define yyMonthOrdinal (((TclGetDateInfo*)info)->dateMonthOrdinal)
+#define yyHaveDate (((TclGetDateInfo*)info)->dateHaveDate)
+#define yyHaveDay (((TclGetDateInfo*)info)->dateHaveDay)
+#define yyHaveOrdinalMonth (((TclGetDateInfo*)info)->dateHaveOrdinalMonth)
+#define yyHaveRel (((TclGetDateInfo*)info)->dateHaveRel)
+#define yyHaveTime (((TclGetDateInfo*)info)->dateHaveTime)
+#define yyHaveZone (((TclGetDateInfo*)info)->dateHaveZone)
+#define yyTimezone (((TclGetDateInfo*)info)->dateTimezone)
+#define yyDay (((TclGetDateInfo*)info)->dateDay)
+#define yyMonth (((TclGetDateInfo*)info)->dateMonth)
+#define yyYear (((TclGetDateInfo*)info)->dateYear)
+#define yyHour (((TclGetDateInfo*)info)->dateHour)
+#define yyMinutes (((TclGetDateInfo*)info)->dateMinutes)
+#define yySeconds (((TclGetDateInfo*)info)->dateSeconds)
+#define yyMeridian (((TclGetDateInfo*)info)->dateMeridian)
+#define yyRelMonth (((TclGetDateInfo*)info)->dateRelMonth)
+#define yyRelDay (((TclGetDateInfo*)info)->dateRelDay)
+#define yyRelSeconds (((TclGetDateInfo*)info)->dateRelSeconds)
+
#include "tclInt.h"
#define EPOCH 1970
@@ -183,27 +212,6 @@ typedef enum _MERIDIAN {
*/
static char *yyInput;
-static DSTMODE yyDSTmode;
-static time_t yyDayOrdinal;
-static time_t yyDayNumber;
-static time_t yyMonthOrdinal;
-static int yyHaveDate;
-static int yyHaveDay;
-static int yyHaveOrdinalMonth;
-static int yyHaveRel;
-static int yyHaveTime;
-static int yyHaveZone;
-static time_t yyTimezone;
-static time_t yyDay;
-static time_t yyHour;
-static time_t yyMinutes;
-static time_t yyMonth;
-static time_t yySeconds;
-static time_t yyYear;
-static MERIDIAN yyMeridian;
-static time_t yyRelMonth;
-static time_t yyRelDay;
-static time_t yyRelSeconds;
static time_t *yyRelPointer;
/*
@@ -214,14 +222,15 @@ static time_t ToSeconds _ANSI_ARGS_((time_t Hours, time_t Minutes,
time_t Seconds, MERIDIAN Meridian));
static int Convert _ANSI_ARGS_((time_t Month, time_t Day, time_t Year,
time_t Hours, time_t Minutes, time_t Seconds,
- MERIDIAN Meridia, DSTMODE DSTmode, time_t *TimePtr));
+ MERIDIAN Meridia, DSTMODE DSTmode, time_t *TimePtr,
+ VOID* info));
static time_t DSTcorrect _ANSI_ARGS_((time_t Start, time_t Future));
static time_t NamedDay _ANSI_ARGS_((time_t Start, time_t DayOrdinal,
time_t DayNumber));
static time_t NamedMonth _ANSI_ARGS_((time_t Start, time_t MonthOrdinal,
- time_t MonthNumber));
+ time_t MonthNumber, VOID* info));
static int RelativeMonth _ANSI_ARGS_((time_t Start, time_t RelMonth,
- time_t *TimePtr));
+ time_t *TimePtr, VOID* info));
static int RelativeDay _ANSI_ARGS_((time_t Start, time_t RelDay,
time_t *TimePtr));
static int LookupWord _ANSI_ARGS_((char *buff));
@@ -244,13 +253,13 @@ static int TclDatelex _ANSI_ARGS_((void));
#endif
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 141 "../unix/../generic/tclGetDate.y"
+#line 150 "../unix/../generic/tclGetDate.y"
typedef union YYSTYPE {
time_t Number;
enum _MERIDIAN Meridian;
} YYSTYPE;
/* Line 191 of yacc.c. */
-#line 253 "../unix/../generic/tclDate.c"
+#line 262 "../unix/../generic/tclDate.c"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
@@ -262,7 +271,7 @@ typedef union YYSTYPE {
/* Line 214 of yacc.c. */
-#line 265 "../unix/../generic/tclDate.c"
+#line 274 "../unix/../generic/tclDate.c"
#if ! defined (yyoverflow) || YYERROR_VERBOSE
@@ -451,12 +460,12 @@ static const yysigned_char yyrhs[] =
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const unsigned short yyrline[] =
{
- 0, 157, 157, 158, 161, 164, 167, 170, 173, 176,
- 179, 183, 188, 191, 197, 203, 210, 216, 226, 230,
- 234, 240, 244, 248, 252, 256, 262, 266, 271, 276,
- 281, 286, 290, 295, 299, 304, 311, 315, 321, 330,
- 339, 349, 362, 367, 369, 370, 371, 372, 373, 375,
- 376, 378, 379, 380, 383, 402, 405
+ 0, 166, 166, 167, 170, 173, 176, 179, 182, 185,
+ 188, 192, 197, 200, 206, 212, 219, 225, 235, 239,
+ 243, 249, 253, 257, 261, 265, 271, 275, 280, 285,
+ 290, 295, 299, 304, 308, 313, 320, 324, 330, 339,
+ 348, 358, 371, 376, 378, 379, 380, 381, 382, 384,
+ 385, 387, 388, 389, 392, 411, 414
};
#endif
@@ -1205,49 +1214,49 @@ yyreduce:
switch (yyn)
{
case 4:
-#line 161 "../unix/../generic/tclGetDate.y"
+#line 170 "../unix/../generic/tclGetDate.y"
{
yyHaveTime++;
;}
break;
case 5:
-#line 164 "../unix/../generic/tclGetDate.y"
+#line 173 "../unix/../generic/tclGetDate.y"
{
yyHaveZone++;
;}
break;
case 6:
-#line 167 "../unix/../generic/tclGetDate.y"
+#line 176 "../unix/../generic/tclGetDate.y"
{
yyHaveDate++;
;}
break;
case 7:
-#line 170 "../unix/../generic/tclGetDate.y"
+#line 179 "../unix/../generic/tclGetDate.y"
{
yyHaveOrdinalMonth++;
;}
break;
case 8:
-#line 173 "../unix/../generic/tclGetDate.y"
+#line 182 "../unix/../generic/tclGetDate.y"
{
yyHaveDay++;
;}
break;
case 9:
-#line 176 "../unix/../generic/tclGetDate.y"
+#line 185 "../unix/../generic/tclGetDate.y"
{
yyHaveRel++;
;}
break;
case 10:
-#line 179 "../unix/../generic/tclGetDate.y"
+#line 188 "../unix/../generic/tclGetDate.y"
{
yyHaveTime++;
yyHaveDate++;
@@ -1255,7 +1264,7 @@ yyreduce:
break;
case 11:
-#line 183 "../unix/../generic/tclGetDate.y"
+#line 192 "../unix/../generic/tclGetDate.y"
{
yyHaveTime++;
yyHaveDate++;
@@ -1264,7 +1273,7 @@ yyreduce:
break;
case 13:
-#line 191 "../unix/../generic/tclGetDate.y"
+#line 200 "../unix/../generic/tclGetDate.y"
{
yyHour = yyvsp[-1].Number;
yyMinutes = 0;
@@ -1274,7 +1283,7 @@ yyreduce:
break;
case 14:
-#line 197 "../unix/../generic/tclGetDate.y"
+#line 206 "../unix/../generic/tclGetDate.y"
{
yyHour = yyvsp[-3].Number;
yyMinutes = yyvsp[-1].Number;
@@ -1284,7 +1293,7 @@ yyreduce:
break;
case 15:
-#line 203 "../unix/../generic/tclGetDate.y"
+#line 212 "../unix/../generic/tclGetDate.y"
{
yyHour = yyvsp[-4].Number;
yyMinutes = yyvsp[-2].Number;
@@ -1295,7 +1304,7 @@ yyreduce:
break;
case 16:
-#line 210 "../unix/../generic/tclGetDate.y"
+#line 219 "../unix/../generic/tclGetDate.y"
{
yyHour = yyvsp[-5].Number;
yyMinutes = yyvsp[-3].Number;
@@ -1305,7 +1314,7 @@ yyreduce:
break;
case 17:
-#line 216 "../unix/../generic/tclGetDate.y"
+#line 225 "../unix/../generic/tclGetDate.y"
{
yyHour = yyvsp[-6].Number;
yyMinutes = yyvsp[-4].Number;
@@ -1317,7 +1326,7 @@ yyreduce:
break;
case 18:
-#line 226 "../unix/../generic/tclGetDate.y"
+#line 235 "../unix/../generic/tclGetDate.y"
{
yyTimezone = yyvsp[-1].Number;
yyDSTmode = DSTon;
@@ -1325,7 +1334,7 @@ yyreduce:
break;
case 19:
-#line 230 "../unix/../generic/tclGetDate.y"
+#line 239 "../unix/../generic/tclGetDate.y"
{
yyTimezone = yyvsp[0].Number;
yyDSTmode = DSToff;
@@ -1333,7 +1342,7 @@ yyreduce:
break;
case 20:
-#line 234 "../unix/../generic/tclGetDate.y"
+#line 243 "../unix/../generic/tclGetDate.y"
{
yyTimezone = yyvsp[0].Number;
yyDSTmode = DSTon;
@@ -1341,7 +1350,7 @@ yyreduce:
break;
case 21:
-#line 240 "../unix/../generic/tclGetDate.y"
+#line 249 "../unix/../generic/tclGetDate.y"
{
yyDayOrdinal = 1;
yyDayNumber = yyvsp[0].Number;
@@ -1349,7 +1358,7 @@ yyreduce:
break;
case 22:
-#line 244 "../unix/../generic/tclGetDate.y"
+#line 253 "../unix/../generic/tclGetDate.y"
{
yyDayOrdinal = 1;
yyDayNumber = yyvsp[-1].Number;
@@ -1357,7 +1366,7 @@ yyreduce:
break;
case 23:
-#line 248 "../unix/../generic/tclGetDate.y"
+#line 257 "../unix/../generic/tclGetDate.y"
{
yyDayOrdinal = yyvsp[-1].Number;
yyDayNumber = yyvsp[0].Number;
@@ -1365,7 +1374,7 @@ yyreduce:
break;
case 24:
-#line 252 "../unix/../generic/tclGetDate.y"
+#line 261 "../unix/../generic/tclGetDate.y"
{
yyDayOrdinal = yyvsp[-2].Number * yyvsp[-1].Number;
yyDayNumber = yyvsp[0].Number;
@@ -1373,7 +1382,7 @@ yyreduce:
break;
case 25:
-#line 256 "../unix/../generic/tclGetDate.y"
+#line 265 "../unix/../generic/tclGetDate.y"
{
yyDayOrdinal = 2;
yyDayNumber = yyvsp[0].Number;
@@ -1381,7 +1390,7 @@ yyreduce:
break;
case 26:
-#line 262 "../unix/../generic/tclGetDate.y"
+#line 271 "../unix/../generic/tclGetDate.y"
{
yyMonth = yyvsp[-2].Number;
yyDay = yyvsp[0].Number;
@@ -1389,7 +1398,7 @@ yyreduce:
break;
case 27:
-#line 266 "../unix/../generic/tclGetDate.y"
+#line 275 "../unix/../generic/tclGetDate.y"
{
yyMonth = yyvsp[-4].Number;
yyDay = yyvsp[-2].Number;
@@ -1398,7 +1407,7 @@ yyreduce:
break;
case 28:
-#line 271 "../unix/../generic/tclGetDate.y"
+#line 280 "../unix/../generic/tclGetDate.y"
{
yyYear = yyvsp[0].Number / 10000;
yyMonth = (yyvsp[0].Number % 10000)/100;
@@ -1407,7 +1416,7 @@ yyreduce:
break;
case 29:
-#line 276 "../unix/../generic/tclGetDate.y"
+#line 285 "../unix/../generic/tclGetDate.y"
{
yyDay = yyvsp[-4].Number;
yyMonth = yyvsp[-2].Number;
@@ -1416,7 +1425,7 @@ yyreduce:
break;
case 30:
-#line 281 "../unix/../generic/tclGetDate.y"
+#line 290 "../unix/../generic/tclGetDate.y"
{
yyMonth = yyvsp[-2].Number;
yyDay = yyvsp[0].Number;
@@ -1425,7 +1434,7 @@ yyreduce:
break;
case 31:
-#line 286 "../unix/../generic/tclGetDate.y"
+#line 295 "../unix/../generic/tclGetDate.y"
{
yyMonth = yyvsp[-1].Number;
yyDay = yyvsp[0].Number;
@@ -1433,7 +1442,7 @@ yyreduce:
break;
case 32:
-#line 290 "../unix/../generic/tclGetDate.y"
+#line 299 "../unix/../generic/tclGetDate.y"
{
yyMonth = yyvsp[-3].Number;
yyDay = yyvsp[-2].Number;
@@ -1442,7 +1451,7 @@ yyreduce:
break;
case 33:
-#line 295 "../unix/../generic/tclGetDate.y"
+#line 304 "../unix/../generic/tclGetDate.y"
{
yyMonth = yyvsp[0].Number;
yyDay = yyvsp[-1].Number;
@@ -1450,7 +1459,7 @@ yyreduce:
break;
case 34:
-#line 299 "../unix/../generic/tclGetDate.y"
+#line 308 "../unix/../generic/tclGetDate.y"
{
yyMonth = 1;
yyDay = 1;
@@ -1459,7 +1468,7 @@ yyreduce:
break;
case 35:
-#line 304 "../unix/../generic/tclGetDate.y"
+#line 313 "../unix/../generic/tclGetDate.y"
{
yyMonth = yyvsp[-1].Number;
yyDay = yyvsp[-2].Number;
@@ -1468,7 +1477,7 @@ yyreduce:
break;
case 36:
-#line 311 "../unix/../generic/tclGetDate.y"
+#line 320 "../unix/../generic/tclGetDate.y"
{
yyMonthOrdinal = 1;
yyMonth = yyvsp[0].Number;
@@ -1476,7 +1485,7 @@ yyreduce:
break;
case 37:
-#line 315 "../unix/../generic/tclGetDate.y"
+#line 324 "../unix/../generic/tclGetDate.y"
{
yyMonthOrdinal = yyvsp[-1].Number;
yyMonth = yyvsp[0].Number;
@@ -1484,7 +1493,7 @@ yyreduce:
break;
case 38:
-#line 321 "../unix/../generic/tclGetDate.y"
+#line 330 "../unix/../generic/tclGetDate.y"
{
if (yyvsp[-1].Number != HOUR(- 7)) YYABORT;
yyYear = yyvsp[-2].Number / 10000;
@@ -1497,7 +1506,7 @@ yyreduce:
break;
case 39:
-#line 330 "../unix/../generic/tclGetDate.y"
+#line 339 "../unix/../generic/tclGetDate.y"
{
if (yyvsp[-5].Number != HOUR(- 7)) YYABORT;
yyYear = yyvsp[-6].Number / 10000;
@@ -1510,7 +1519,7 @@ yyreduce:
break;
case 40:
-#line 339 "../unix/../generic/tclGetDate.y"
+#line 348 "../unix/../generic/tclGetDate.y"
{
yyYear = yyvsp[-1].Number / 10000;
yyMonth = (yyvsp[-1].Number % 10000)/100;
@@ -1522,7 +1531,7 @@ yyreduce:
break;
case 41:
-#line 349 "../unix/../generic/tclGetDate.y"
+#line 358 "../unix/../generic/tclGetDate.y"
{
/*
* Offset computed year by -377 so that the returned years will
@@ -1537,7 +1546,7 @@ yyreduce:
break;
case 42:
-#line 362 "../unix/../generic/tclGetDate.y"
+#line 371 "../unix/../generic/tclGetDate.y"
{
yyRelSeconds *= -1;
yyRelMonth *= -1;
@@ -1546,57 +1555,57 @@ yyreduce:
break;
case 44:
-#line 369 "../unix/../generic/tclGetDate.y"
+#line 378 "../unix/../generic/tclGetDate.y"
{ *yyRelPointer += yyvsp[-2].Number * yyvsp[-1].Number * yyvsp[0].Number; ;}
break;
case 45:
-#line 370 "../unix/../generic/tclGetDate.y"
+#line 379 "../unix/../generic/tclGetDate.y"
{ *yyRelPointer += yyvsp[-1].Number * yyvsp[0].Number; ;}
break;
case 46:
-#line 371 "../unix/../generic/tclGetDate.y"
+#line 380 "../unix/../generic/tclGetDate.y"
{ *yyRelPointer += yyvsp[0].Number; ;}
break;
case 47:
-#line 372 "../unix/../generic/tclGetDate.y"
+#line 381 "../unix/../generic/tclGetDate.y"
{ *yyRelPointer += yyvsp[-1].Number * yyvsp[0].Number; ;}
break;
case 48:
-#line 373 "../unix/../generic/tclGetDate.y"
+#line 382 "../unix/../generic/tclGetDate.y"
{ *yyRelPointer += yyvsp[0].Number; ;}
break;
case 49:
-#line 375 "../unix/../generic/tclGetDate.y"
+#line 384 "../unix/../generic/tclGetDate.y"
{ yyval.Number = -1; ;}
break;
case 50:
-#line 376 "../unix/../generic/tclGetDate.y"
+#line 385 "../unix/../generic/tclGetDate.y"
{ yyval.Number = 1; ;}
break;
case 51:
-#line 378 "../unix/../generic/tclGetDate.y"
+#line 387 "../unix/../generic/tclGetDate.y"
{ yyval.Number = yyvsp[0].Number; yyRelPointer = &yyRelSeconds; ;}
break;
case 52:
-#line 379 "../unix/../generic/tclGetDate.y"
+#line 388 "../unix/../generic/tclGetDate.y"
{ yyval.Number = yyvsp[0].Number; yyRelPointer = &yyRelDay; ;}
break;
case 53:
-#line 380 "../unix/../generic/tclGetDate.y"
+#line 389 "../unix/../generic/tclGetDate.y"
{ yyval.Number = yyvsp[0].Number; yyRelPointer = &yyRelMonth; ;}
break;
case 54:
-#line 384 "../unix/../generic/tclGetDate.y"
+#line 393 "../unix/../generic/tclGetDate.y"
{
if (yyHaveTime && yyHaveDate && !yyHaveRel) {
yyYear = yyvsp[0].Number;
@@ -1616,14 +1625,14 @@ yyreduce:
break;
case 55:
-#line 402 "../unix/../generic/tclGetDate.y"
+#line 411 "../unix/../generic/tclGetDate.y"
{
yyval.Meridian = MER24;
;}
break;
case 56:
-#line 405 "../unix/../generic/tclGetDate.y"
+#line 414 "../unix/../generic/tclGetDate.y"
{
yyval.Meridian = yyvsp[0].Meridian;
;}
@@ -1633,7 +1642,7 @@ yyreduce:
}
/* Line 991 of yacc.c. */
-#line 1636 "../unix/../generic/tclDate.c"
+#line 1645 "../unix/../generic/tclDate.c"
yyvsp -= yylen;
yyssp -= yylen;
@@ -1844,7 +1853,7 @@ yyreturn:
}
-#line 410 "../unix/../generic/tclGetDate.y"
+#line 419 "../unix/../generic/tclGetDate.y"
/*
@@ -2094,7 +2103,7 @@ ToSeconds(Hours, Minutes, Seconds, Meridian)
*-----------------------------------------------------------------------------
*/
static int
-Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode, TimePtr)
+Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode, TimePtr, info)
time_t Month;
time_t Day;
time_t Year;
@@ -2104,6 +2113,7 @@ Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode, TimePtr)
MERIDIAN Meridian;
DSTMODE DSTmode;
time_t *TimePtr;
+ VOID* info;
{
static int DaysInMonth[12] = {
31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
@@ -2186,10 +2196,11 @@ NamedDay(Start, DayOrdinal, DayNumber)
}
static time_t
-NamedMonth(Start, MonthOrdinal, MonthNumber)
+NamedMonth(Start, MonthOrdinal, MonthNumber, info)
time_t Start;
time_t MonthOrdinal;
time_t MonthNumber;
+ VOID* info;
{
struct tm *tm;
time_t now;
@@ -2208,7 +2219,7 @@ NamedMonth(Start, MonthOrdinal, MonthNumber)
tm->tm_year--;
}
result = Convert(MonthNumber, (time_t) 1, tm->tm_year + TM_YEAR_BASE,
- (time_t) 0, (time_t) 0, (time_t) 0, MER24, DSTmaybe, &now);
+ (time_t) 0, (time_t) 0, (time_t) 0, MER24, DSTmaybe, &now, info);
if (result < 0) {
return 0;
}
@@ -2216,10 +2227,11 @@ NamedMonth(Start, MonthOrdinal, MonthNumber)
}
static int
-RelativeMonth(Start, RelMonth, TimePtr)
+RelativeMonth(Start, RelMonth, TimePtr, info)
time_t Start;
time_t RelMonth;
time_t *TimePtr;
+ VOID* info;
{
struct tm *tm;
time_t Month;
@@ -2237,7 +2249,7 @@ RelativeMonth(Start, RelMonth, TimePtr)
Month = Month % 12 + 1;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
- MER24, DSTmaybe, &Julian);
+ MER24, DSTmaybe, &Julian, info);
/*
* The Julian time returned above is behind by one day, if "month"
@@ -2267,7 +2279,7 @@ RelativeMonth(Start, RelMonth, TimePtr)
tm->tm_mday--;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
- MER24, DSTmaybe, &Julian);
+ MER24, DSTmaybe, &Julian, info);
}
if (result != 0) {
return -1;
@@ -2500,6 +2512,9 @@ TclGetDate(p, now, zone, timePtr)
time_t Time;
time_t tod;
int thisyear;
+ TclGetDateInfo dateInfo;
+
+ void* info = (void*) &dateInfo;
yyInput = p;
/* now has to be cast to a time_t for 64bit compliance */
@@ -2532,7 +2547,7 @@ TclGetDate(p, now, zone, timePtr)
yyHaveTime = 0;
yyHaveZone = 0;
- if (yyparse() || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 ||
+ if (yyparse(info) || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 ||
yyHaveDay > 1 || yyHaveOrdinalMonth > 1) {
return -1;
}
@@ -2559,7 +2574,7 @@ TclGetDate(p, now, zone, timePtr)
}
}
if (Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
- yyMeridian, yyDSTmode, &Start) < 0) {
+ yyMeridian, yyDSTmode, &Start, info) < 0) {
return -1;
}
} else {
@@ -2571,7 +2586,7 @@ TclGetDate(p, now, zone, timePtr)
}
Start += yyRelSeconds;
- if (RelativeMonth(Start, yyRelMonth, &Time) < 0) {
+ if (RelativeMonth(Start, yyRelMonth, &Time, info) < 0) {
return -1;
}
Start += Time;
@@ -2587,7 +2602,7 @@ TclGetDate(p, now, zone, timePtr)
}
if (yyHaveOrdinalMonth) {
- tod = NamedMonth(Start, yyMonthOrdinal, yyMonth);
+ tod = NamedMonth(Start, yyMonthOrdinal, yyMonth, info);
Start += tod;
}
diff --git a/generic/tclGetDate.y b/generic/tclGetDate.y
index 3c41d9b..7dfd205 100644
--- a/generic/tclGetDate.y
+++ b/generic/tclGetDate.y
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclGetDate.y,v 1.23 2004/09/17 19:41:07 kennykb Exp $
+ * RCS: @(#) $Id: tclGetDate.y,v 1.24 2004/09/17 22:06:24 kennykb Exp $
*/
%{
@@ -39,6 +39,35 @@
#pragma warning( disable : 4102 )
#endif /* _MSC_VER */
+/*
+ * yyparse will accept a 'struct TclGetDateInfo' as its parameter;
+ * that's where the parsed fields will be returned.
+ */
+
+#define YYPARSE_PARAM info
+
+#define yyDSTmode (((TclGetDateInfo*)info)->dateDSTmode)
+#define yyDayOrdinal (((TclGetDateInfo*)info)->dateDayOrdinal)
+#define yyDayNumber (((TclGetDateInfo*)info)->dateDayNumber)
+#define yyMonthOrdinal (((TclGetDateInfo*)info)->dateMonthOrdinal)
+#define yyHaveDate (((TclGetDateInfo*)info)->dateHaveDate)
+#define yyHaveDay (((TclGetDateInfo*)info)->dateHaveDay)
+#define yyHaveOrdinalMonth (((TclGetDateInfo*)info)->dateHaveOrdinalMonth)
+#define yyHaveRel (((TclGetDateInfo*)info)->dateHaveRel)
+#define yyHaveTime (((TclGetDateInfo*)info)->dateHaveTime)
+#define yyHaveZone (((TclGetDateInfo*)info)->dateHaveZone)
+#define yyTimezone (((TclGetDateInfo*)info)->dateTimezone)
+#define yyDay (((TclGetDateInfo*)info)->dateDay)
+#define yyMonth (((TclGetDateInfo*)info)->dateMonth)
+#define yyYear (((TclGetDateInfo*)info)->dateYear)
+#define yyHour (((TclGetDateInfo*)info)->dateHour)
+#define yyMinutes (((TclGetDateInfo*)info)->dateMinutes)
+#define yySeconds (((TclGetDateInfo*)info)->dateSeconds)
+#define yyMeridian (((TclGetDateInfo*)info)->dateMeridian)
+#define yyRelMonth (((TclGetDateInfo*)info)->dateRelMonth)
+#define yyRelDay (((TclGetDateInfo*)info)->dateRelDay)
+#define yyRelSeconds (((TclGetDateInfo*)info)->dateRelSeconds)
+
#include "tclInt.h"
#define EPOCH 1970
@@ -91,27 +120,6 @@ typedef enum _MERIDIAN {
*/
static char *yyInput;
-static DSTMODE yyDSTmode;
-static time_t yyDayOrdinal;
-static time_t yyDayNumber;
-static time_t yyMonthOrdinal;
-static int yyHaveDate;
-static int yyHaveDay;
-static int yyHaveOrdinalMonth;
-static int yyHaveRel;
-static int yyHaveTime;
-static int yyHaveZone;
-static time_t yyTimezone;
-static time_t yyDay;
-static time_t yyHour;
-static time_t yyMinutes;
-static time_t yyMonth;
-static time_t yySeconds;
-static time_t yyYear;
-static MERIDIAN yyMeridian;
-static time_t yyRelMonth;
-static time_t yyRelDay;
-static time_t yyRelSeconds;
static time_t *yyRelPointer;
/*
@@ -122,14 +130,15 @@ static time_t ToSeconds _ANSI_ARGS_((time_t Hours, time_t Minutes,
time_t Seconds, MERIDIAN Meridian));
static int Convert _ANSI_ARGS_((time_t Month, time_t Day, time_t Year,
time_t Hours, time_t Minutes, time_t Seconds,
- MERIDIAN Meridia, DSTMODE DSTmode, time_t *TimePtr));
+ MERIDIAN Meridia, DSTMODE DSTmode, time_t *TimePtr,
+ VOID* info));
static time_t DSTcorrect _ANSI_ARGS_((time_t Start, time_t Future));
static time_t NamedDay _ANSI_ARGS_((time_t Start, time_t DayOrdinal,
time_t DayNumber));
static time_t NamedMonth _ANSI_ARGS_((time_t Start, time_t MonthOrdinal,
- time_t MonthNumber));
+ time_t MonthNumber, VOID* info));
static int RelativeMonth _ANSI_ARGS_((time_t Start, time_t RelMonth,
- time_t *TimePtr));
+ time_t *TimePtr, VOID* info));
static int RelativeDay _ANSI_ARGS_((time_t Start, time_t RelDay,
time_t *TimePtr));
static int LookupWord _ANSI_ARGS_((char *buff));
@@ -656,7 +665,7 @@ ToSeconds(Hours, Minutes, Seconds, Meridian)
*-----------------------------------------------------------------------------
*/
static int
-Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode, TimePtr)
+Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode, TimePtr, info)
time_t Month;
time_t Day;
time_t Year;
@@ -666,6 +675,7 @@ Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode, TimePtr)
MERIDIAN Meridian;
DSTMODE DSTmode;
time_t *TimePtr;
+ VOID* info;
{
static int DaysInMonth[12] = {
31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
@@ -748,10 +758,11 @@ NamedDay(Start, DayOrdinal, DayNumber)
}
static time_t
-NamedMonth(Start, MonthOrdinal, MonthNumber)
+NamedMonth(Start, MonthOrdinal, MonthNumber, info)
time_t Start;
time_t MonthOrdinal;
time_t MonthNumber;
+ VOID* info;
{
struct tm *tm;
time_t now;
@@ -770,7 +781,7 @@ NamedMonth(Start, MonthOrdinal, MonthNumber)
tm->tm_year--;
}
result = Convert(MonthNumber, (time_t) 1, tm->tm_year + TM_YEAR_BASE,
- (time_t) 0, (time_t) 0, (time_t) 0, MER24, DSTmaybe, &now);
+ (time_t) 0, (time_t) 0, (time_t) 0, MER24, DSTmaybe, &now, info);
if (result < 0) {
return 0;
}
@@ -778,10 +789,11 @@ NamedMonth(Start, MonthOrdinal, MonthNumber)
}
static int
-RelativeMonth(Start, RelMonth, TimePtr)
+RelativeMonth(Start, RelMonth, TimePtr, info)
time_t Start;
time_t RelMonth;
time_t *TimePtr;
+ VOID* info;
{
struct tm *tm;
time_t Month;
@@ -799,7 +811,7 @@ RelativeMonth(Start, RelMonth, TimePtr)
Month = Month % 12 + 1;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
- MER24, DSTmaybe, &Julian);
+ MER24, DSTmaybe, &Julian, info);
/*
* The Julian time returned above is behind by one day, if "month"
@@ -829,7 +841,7 @@ RelativeMonth(Start, RelMonth, TimePtr)
tm->tm_mday--;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
- MER24, DSTmaybe, &Julian);
+ MER24, DSTmaybe, &Julian, info);
}
if (result != 0) {
return -1;
@@ -1062,6 +1074,9 @@ TclGetDate(p, now, zone, timePtr)
time_t Time;
time_t tod;
int thisyear;
+ TclGetDateInfo dateInfo;
+
+ void* info = (void*) &dateInfo;
yyInput = p;
/* now has to be cast to a time_t for 64bit compliance */
@@ -1094,7 +1109,7 @@ TclGetDate(p, now, zone, timePtr)
yyHaveTime = 0;
yyHaveZone = 0;
- if (yyparse() || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 ||
+ if (yyparse(info) || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 ||
yyHaveDay > 1 || yyHaveOrdinalMonth > 1) {
return -1;
}
@@ -1121,7 +1136,7 @@ TclGetDate(p, now, zone, timePtr)
}
}
if (Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
- yyMeridian, yyDSTmode, &Start) < 0) {
+ yyMeridian, yyDSTmode, &Start, info) < 0) {
return -1;
}
} else {
@@ -1133,7 +1148,7 @@ TclGetDate(p, now, zone, timePtr)
}
Start += yyRelSeconds;
- if (RelativeMonth(Start, yyRelMonth, &Time) < 0) {
+ if (RelativeMonth(Start, yyRelMonth, &Time, info) < 0) {
return -1;
}
Start += Time;
@@ -1149,7 +1164,7 @@ TclGetDate(p, now, zone, timePtr)
}
if (yyHaveOrdinalMonth) {
- tod = NamedMonth(Start, yyMonthOrdinal, yyMonth);
+ tod = NamedMonth(Start, yyMonthOrdinal, yyMonth, info);
Start += tod;
}
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 8633e6e..079a01a 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclInt.h,v 1.172 2004/08/18 19:58:59 kennykb Exp $
+ * RCS: @(#) $Id: tclInt.h,v 1.173 2004/09/17 22:06:24 kennykb Exp $
*/
#ifndef _TCLINT
@@ -2553,5 +2553,40 @@ EXTERN void TclDbInitNewObj _ANSI_ARGS_((Tcl_Obj *objPtr));
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT
+/*
+ * Data structure used to hold information returned from TclGetDate
+ */
+
+typedef struct TclGetDateInfo {
+
+ time_t dateYear;
+ time_t dateMonth;
+ time_t dateDay;
+ int dateHaveDate;
+
+ time_t dateHour;
+ time_t dateMinutes;
+ time_t dateSeconds;
+ int dateMeridian;
+ int dateHaveTime;
+
+ time_t dateTimezone;
+ int dateDSTmode;
+ int dateHaveZone;
+
+ time_t dateRelMonth;
+ time_t dateRelDay;
+ time_t dateRelSeconds;
+ int dateHaveRel;
+
+ time_t dateMonthOrdinal;
+ int dateHaveOrdinalMonth;
+
+ time_t dateDayOrdinal;
+ time_t dateDayNumber;
+ int dateHaveDay;
+
+} TclGetDateInfo;
+
#endif /* _TCLINT */