table local_time_zone_table[3];
};
+#define PC (* (struct parser_control *) parm)
#define YYLEX_PARAM parm
#define YYPARSE_PARAM parm
#define YYSTYPE int
item:
time
- { ((struct parser_control *) parm)->times_seen++; }
+ { PC.times_seen++; }
| local_zone
- { ((struct parser_control *) parm)->local_zones_seen++; }
+ { PC.local_zones_seen++; }
| zone
- { ((struct parser_control *) parm)->zones_seen++; }
+ { PC.zones_seen++; }
| date
- { ((struct parser_control *) parm)->dates_seen++; }
+ { PC.dates_seen++; }
| day
- { ((struct parser_control *) parm)->days_seen++; }
+ { PC.days_seen++; }
| rel
- { ((struct parser_control *) parm)->rels_seen++; }
+ { PC.rels_seen++; }
| number
;
time:
tUNUMBER tMERIDIAN
{
- ((struct parser_control *) parm)->hour = $1;
- ((struct parser_control *) parm)->minutes = 0;
- ((struct parser_control *) parm)->seconds = 0;
- ((struct parser_control *) parm)->meridian = $2;
+ PC.hour = $1;
+ PC.minutes = 0;
+ PC.seconds = 0;
+ PC.meridian = $2;
}
| tUNUMBER ':' tUNUMBER o_merid
{
- ((struct parser_control *) parm)->hour = $1;
- ((struct parser_control *) parm)->minutes = $3;
- ((struct parser_control *) parm)->seconds = 0;
- ((struct parser_control *) parm)->meridian = $4;
+ PC.hour = $1;
+ PC.minutes = $3;
+ PC.seconds = 0;
+ PC.meridian = $4;
}
| tUNUMBER ':' tUNUMBER tSNUMBER
{
- ((struct parser_control *) parm)->hour = $1;
- ((struct parser_control *) parm)->minutes = $3;
- ((struct parser_control *) parm)->meridian = MER24;
- ((struct parser_control *) parm)->zones_seen++;
- ((struct parser_control *) parm)->time_zone =
- $4 % 100 + ($4 / 100) * 60;
+ PC.hour = $1;
+ PC.minutes = $3;
+ PC.meridian = MER24;
+ PC.zones_seen++;
+ PC.time_zone = $4 % 100 + ($4 / 100) * 60;
}
| tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid
{
- ((struct parser_control *) parm)->hour = $1;
- ((struct parser_control *) parm)->minutes = $3;
- ((struct parser_control *) parm)->seconds = $5;
- ((struct parser_control *) parm)->meridian = $6;
+ PC.hour = $1;
+ PC.minutes = $3;
+ PC.seconds = $5;
+ PC.meridian = $6;
}
| tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER
{
- ((struct parser_control *) parm)->hour = $1;
- ((struct parser_control *) parm)->minutes = $3;
- ((struct parser_control *) parm)->seconds = $5;
- ((struct parser_control *) parm)->meridian = MER24;
- ((struct parser_control *) parm)->zones_seen++;
- ((struct parser_control *) parm)->time_zone =
- $6 % 100 + ($6 / 100) * 60;
+ PC.hour = $1;
+ PC.minutes = $3;
+ PC.seconds = $5;
+ PC.meridian = MER24;
+ PC.zones_seen++;
+ PC.time_zone = $6 % 100 + ($6 / 100) * 60;
}
;
local_zone:
tLOCAL_ZONE
- { ((struct parser_control *) parm)->local_isdst = $1; }
+ { PC.local_isdst = $1; }
| tLOCAL_ZONE tDST
- { ((struct parser_control *) parm)->local_isdst = $1 < 0 ? 1 : $1 + 1; }
+ { PC.local_isdst = $1 < 0 ? 1 : $1 + 1; }
;
zone:
tZONE
- { ((struct parser_control *) parm)->time_zone = $1; }
+ { PC.time_zone = $1; }
| tDAYZONE
- { ((struct parser_control *) parm)->time_zone = $1 + 60; }
+ { PC.time_zone = $1 + 60; }
| tZONE tDST
- { ((struct parser_control *) parm)->time_zone = $1 + 60; }
+ { PC.time_zone = $1 + 60; }
;
day:
tDAY
{
- ((struct parser_control *) parm)->day_ordinal = 1;
- ((struct parser_control *) parm)->day_number = $1;
+ PC.day_ordinal = 1;
+ PC.day_number = $1;
}
| tDAY ','
{
- ((struct parser_control *) parm)->day_ordinal = 1;
- ((struct parser_control *) parm)->day_number = $1;
+ PC.day_ordinal = 1;
+ PC.day_number = $1;
}
| tUNUMBER tDAY
{
- ((struct parser_control *) parm)->day_ordinal = $1;
- ((struct parser_control *) parm)->day_number = $2;
+ PC.day_ordinal = $1;
+ PC.day_number = $2;
}
;
date:
tUNUMBER '/' tUNUMBER
{
- ((struct parser_control *) parm)->month = $1;
- ((struct parser_control *) parm)->day = $3;
+ PC.month = $1;
+ PC.day = $3;
}
| tUNUMBER '/' tUNUMBER '/' tUNUMBER
{
you want portability, use the ISO 8601 format. */
if (1000 <= $1)
{
- ((struct parser_control *) parm)->year = $1;
- ((struct parser_control *) parm)->month = $3;
- ((struct parser_control *) parm)->day = $5;
+ PC.year = $1;
+ PC.month = $3;
+ PC.day = $5;
}
else
{
- ((struct parser_control *) parm)->month = $1;
- ((struct parser_control *) parm)->day = $3;
- ((struct parser_control *) parm)->year = $5;
+ PC.month = $1;
+ PC.day = $3;
+ PC.year = $5;
}
}
| tUNUMBER tSNUMBER tSNUMBER
{
/* ISO 8601 format. YYYY-MM-DD. */
- ((struct parser_control *) parm)->year = $1;
- ((struct parser_control *) parm)->month = -$2;
- ((struct parser_control *) parm)->day = -$3;
+ PC.year = $1;
+ PC.month = -$2;
+ PC.day = -$3;
}
| tUNUMBER tMONTH tSNUMBER
{
/* e.g. 17-JUN-1992. */
- ((struct parser_control *) parm)->day = $1;
- ((struct parser_control *) parm)->month = $2;
- ((struct parser_control *) parm)->year = -$3;
+ PC.day = $1;
+ PC.month = $2;
+ PC.year = -$3;
}
| tMONTH tUNUMBER
{
- ((struct parser_control *) parm)->month = $1;
- ((struct parser_control *) parm)->day = $2;
+ PC.month = $1;
+ PC.day = $2;
}
| tMONTH tUNUMBER ',' tUNUMBER
{
- ((struct parser_control *) parm)->month = $1;
- ((struct parser_control *) parm)->day = $2;
- ((struct parser_control *) parm)->year = $4;
+ PC.month = $1;
+ PC.day = $2;
+ PC.year = $4;
}
| tUNUMBER tMONTH
{
- ((struct parser_control *) parm)->month = $2;
- ((struct parser_control *) parm)->day = $1;
+ PC.month = $2;
+ PC.day = $1;
}
| tUNUMBER tMONTH tUNUMBER
{
- ((struct parser_control *) parm)->month = $2;
- ((struct parser_control *) parm)->day = $1;
- ((struct parser_control *) parm)->year = $3;
+ PC.month = $2;
+ PC.day = $1;
+ PC.year = $3;
}
;
rel:
relunit tAGO
{
- ((struct parser_control *) parm)->rel_seconds = -((struct parser_control *) parm)->rel_seconds;
- ((struct parser_control *) parm)->rel_minutes = -((struct parser_control *) parm)->rel_minutes;
- ((struct parser_control *) parm)->rel_hour = -((struct parser_control *) parm)->rel_hour;
- ((struct parser_control *) parm)->rel_day = -((struct parser_control *) parm)->rel_day;
- ((struct parser_control *) parm)->rel_month = -((struct parser_control *) parm)->rel_month;
- ((struct parser_control *) parm)->rel_year = -((struct parser_control *) parm)->rel_year;
+ PC.rel_seconds = -PC.rel_seconds;
+ PC.rel_minutes = -PC.rel_minutes;
+ PC.rel_hour = -PC.rel_hour;
+ PC.rel_day = -PC.rel_day;
+ PC.rel_month = -PC.rel_month;
+ PC.rel_year = -PC.rel_year;
}
| relunit
;
relunit:
tUNUMBER tYEAR_UNIT
- { ((struct parser_control *) parm)->rel_year += $1 * $2; }
+ { PC.rel_year += $1 * $2; }
| tSNUMBER tYEAR_UNIT
- { ((struct parser_control *) parm)->rel_year += $1 * $2; }
+ { PC.rel_year += $1 * $2; }
| tYEAR_UNIT
- { ((struct parser_control *) parm)->rel_year += $1; }
+ { PC.rel_year += $1; }
| tUNUMBER tMONTH_UNIT
- { ((struct parser_control *) parm)->rel_month += $1 * $2; }
+ { PC.rel_month += $1 * $2; }
| tSNUMBER tMONTH_UNIT
- { ((struct parser_control *) parm)->rel_month += $1 * $2; }
+ { PC.rel_month += $1 * $2; }
| tMONTH_UNIT
- { ((struct parser_control *) parm)->rel_month += $1; }
+ { PC.rel_month += $1; }
| tUNUMBER tDAY_UNIT
- { ((struct parser_control *) parm)->rel_day += $1 * $2; }
+ { PC.rel_day += $1 * $2; }
| tSNUMBER tDAY_UNIT
- { ((struct parser_control *) parm)->rel_day += $1 * $2; }
+ { PC.rel_day += $1 * $2; }
| tDAY_UNIT
- { ((struct parser_control *) parm)->rel_day += $1; }
+ { PC.rel_day += $1; }
| tUNUMBER tHOUR_UNIT
- { ((struct parser_control *) parm)->rel_hour += $1 * $2; }
+ { PC.rel_hour += $1 * $2; }
| tSNUMBER tHOUR_UNIT
- { ((struct parser_control *) parm)->rel_hour += $1 * $2; }
+ { PC.rel_hour += $1 * $2; }
| tHOUR_UNIT
- { ((struct parser_control *) parm)->rel_hour += $1; }
+ { PC.rel_hour += $1; }
| tUNUMBER tMINUTE_UNIT
- { ((struct parser_control *) parm)->rel_minutes += $1 * $2; }
+ { PC.rel_minutes += $1 * $2; }
| tSNUMBER tMINUTE_UNIT
- { ((struct parser_control *) parm)->rel_minutes += $1 * $2; }
+ { PC.rel_minutes += $1 * $2; }
| tMINUTE_UNIT
- { ((struct parser_control *) parm)->rel_minutes += $1; }
+ { PC.rel_minutes += $1; }
| tUNUMBER tSEC_UNIT
- { ((struct parser_control *) parm)->rel_seconds += $1 * $2; }
+ { PC.rel_seconds += $1 * $2; }
| tSNUMBER tSEC_UNIT
- { ((struct parser_control *) parm)->rel_seconds += $1 * $2; }
+ { PC.rel_seconds += $1 * $2; }
| tSEC_UNIT
- { ((struct parser_control *) parm)->rel_seconds += $1; }
+ { PC.rel_seconds += $1; }
;
number:
tUNUMBER
{
- if (((struct parser_control *) parm)->times_seen
- && ((struct parser_control *) parm)->dates_seen
- && ! ((struct parser_control *) parm)->rels_seen)
- ((struct parser_control *) parm)->year = $1;
+ if (PC.dates_seen && ! PC.rels_seen && (PC.times_seen || 100 <= $1))
+ PC.year = $1;
else
{
if (10000 < $1)
{
- ((struct parser_control *) parm)->dates_seen++;
- ((struct parser_control *) parm)->day = $1 % 100;
- ((struct parser_control *) parm)->month = ($1 / 100) % 100;
- ((struct parser_control *) parm)->year = $1 / 10000;
+ PC.dates_seen++;
+ PC.day = $1 % 100;
+ PC.month = ($1 / 100) % 100;
+ PC.year = $1 / 10000;
}
else
{
- ((struct parser_control *) parm)->times_seen++;
+ PC.times_seen++;
if ($1 < 100)
{
- ((struct parser_control *) parm)->hour = $1;
- ((struct parser_control *) parm)->minutes = 0;
+ PC.hour = $1;
+ PC.minutes = 0;
}
else
{
- ((struct parser_control *) parm)->hour = $1 / 100;
- ((struct parser_control *) parm)->minutes = $1 % 100;
+ PC.hour = $1 / 100;
+ PC.minutes = $1 % 100;
}
- ((struct parser_control *) parm)->seconds = 0;
- ((struct parser_control *) parm)->meridian = MER24;
+ PC.seconds = 0;
+ PC.meridian = MER24;
}
}
}