# HG changeset patch # User Paul Eggert # Date 1098683416 0 # Node ID d7bc1d77db6d56372857384c9c9e2cf136f585fb # Parent f5292cff01dd99537be0d57e2c4c43277fa6db40 Use Bison 1.875 features, and some minor code cleanups. This change does not affect semantics. Don't include ; no longer needed. Don't include unlocked-io.h; only the "#if TEST" code uses stdio, and performance isn't crucial there. (PC, YYLEX_PARAM, YYPARSE_PARAM): Remove; replaced by Bison 1.875 features as described below. All uses of "PC." replaced by "pc->". (YYSTYPE): Add a forward declaration. (yylex, yyerror): Use full prototypes in forward decls. Use "%pure-parser" rather than obsolescent "%pure_parser". Use %parse-param and %lex-param instead of obsolescent YYPARSE_PARAM and YYLEX_PARAM. (meridian_table, month_and_day_table, time_units_table, relative_time_table, time_zone_table, military_table, lookup_zone, lookup_word, get_date): Use NULL instead of 0 where appropriate. (to_hour): Avoid abort (), to avoid a dependency on stdlib.h. (yyerror, yylex): Now accepts parser_control * arg. (main) [TEST]: Use '\0' rather than 0 for char. diff --git a/lib/getdate.y b/lib/getdate.y --- a/lib/getdate.y +++ b/lib/getdate.y @@ -53,7 +53,6 @@ #include #include -#include /* for `free'; used by Bison 1.27 */ #if STDC_HEADERS || (! defined isascii && ! HAVE_ISASCII) # define IN_CTYPE_DOMAIN(c) 1 @@ -77,10 +76,6 @@ #include -#if USE_UNLOCKED_IO -# include "unlocked-io.h" -#endif - #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ # define __attribute__(x) #endif @@ -166,17 +161,16 @@ table local_time_zone_table[3]; } parser_control; -#define PC (* (parser_control *) parm) -#define YYLEX_PARAM parm -#define YYPARSE_PARAM parm - -static int yyerror (); -static int yylex (); +union YYSTYPE; +static int yylex (union YYSTYPE *, parser_control *); +static int yyerror (parser_control *, char *); %} /* We want a reentrant parser. */ -%pure_parser +%pure-parser +%parse-param { parser_control *pc } +%lex-param { parser_control *pc } /* This grammar has 13 shift/reduce conflicts. */ %expect 13 @@ -209,8 +203,8 @@ timespec: '@' seconds { - PC.seconds = $2; - PC.timespec_seen = true; + pc->seconds = $2; + pc->timespec_seen = true; } ; @@ -221,104 +215,104 @@ item: time - { PC.times_seen++; } + { pc->times_seen++; } | local_zone - { PC.local_zones_seen++; } + { pc->local_zones_seen++; } | zone - { PC.zones_seen++; } + { pc->zones_seen++; } | date - { PC.dates_seen++; } + { pc->dates_seen++; } | day - { PC.days_seen++; } + { pc->days_seen++; } | rel - { PC.rels_seen++; } + { pc->rels_seen++; } | number ; time: tUNUMBER tMERIDIAN { - PC.hour = $1.value; - PC.minutes = 0; - PC.seconds.tv_sec = 0; - PC.seconds.tv_nsec = 0; - PC.meridian = $2; + pc->hour = $1.value; + pc->minutes = 0; + pc->seconds.tv_sec = 0; + pc->seconds.tv_nsec = 0; + pc->meridian = $2; } | tUNUMBER ':' tUNUMBER o_merid { - PC.hour = $1.value; - PC.minutes = $3.value; - PC.seconds.tv_sec = 0; - PC.seconds.tv_nsec = 0; - PC.meridian = $4; + pc->hour = $1.value; + pc->minutes = $3.value; + pc->seconds.tv_sec = 0; + pc->seconds.tv_nsec = 0; + pc->meridian = $4; } | tUNUMBER ':' tUNUMBER tSNUMBER { - PC.hour = $1.value; - PC.minutes = $3.value; - PC.seconds.tv_sec = 0; - PC.seconds.tv_nsec = 0; - PC.meridian = MER24; - PC.zones_seen++; - PC.time_zone = $4.value % 100 + ($4.value / 100) * 60; + pc->hour = $1.value; + pc->minutes = $3.value; + pc->seconds.tv_sec = 0; + pc->seconds.tv_nsec = 0; + pc->meridian = MER24; + pc->zones_seen++; + pc->time_zone = $4.value % 100 + ($4.value / 100) * 60; } | tUNUMBER ':' tUNUMBER ':' unsigned_seconds o_merid { - PC.hour = $1.value; - PC.minutes = $3.value; - PC.seconds = $5; - PC.meridian = $6; + pc->hour = $1.value; + pc->minutes = $3.value; + pc->seconds = $5; + pc->meridian = $6; } | tUNUMBER ':' tUNUMBER ':' unsigned_seconds tSNUMBER { - PC.hour = $1.value; - PC.minutes = $3.value; - PC.seconds = $5; - PC.meridian = MER24; - PC.zones_seen++; - PC.time_zone = $6.value % 100 + ($6.value / 100) * 60; + pc->hour = $1.value; + pc->minutes = $3.value; + pc->seconds = $5; + pc->meridian = MER24; + pc->zones_seen++; + pc->time_zone = $6.value % 100 + ($6.value / 100) * 60; } ; local_zone: tLOCAL_ZONE - { PC.local_isdst = $1; } + { pc->local_isdst = $1; } | tLOCAL_ZONE tDST - { PC.local_isdst = $1 < 0 ? 1 : $1 + 1; } + { pc->local_isdst = $1 < 0 ? 1 : $1 + 1; } ; zone: tZONE - { PC.time_zone = $1; } + { pc->time_zone = $1; } | tDAYZONE - { PC.time_zone = $1 + 60; } + { pc->time_zone = $1 + 60; } | tZONE tDST - { PC.time_zone = $1 + 60; } + { pc->time_zone = $1 + 60; } ; day: tDAY { - PC.day_ordinal = 1; - PC.day_number = $1; + pc->day_ordinal = 1; + pc->day_number = $1; } | tDAY ',' { - PC.day_ordinal = 1; - PC.day_number = $1; + pc->day_ordinal = 1; + pc->day_number = $1; } | tUNUMBER tDAY { - PC.day_ordinal = $1.value; - PC.day_number = $2; + pc->day_ordinal = $1.value; + pc->day_number = $2; } ; date: tUNUMBER '/' tUNUMBER { - PC.month = $1.value; - PC.day = $3.value; + pc->month = $1.value; + pc->day = $3.value; } | tUNUMBER '/' tUNUMBER '/' tUNUMBER { @@ -329,119 +323,119 @@ you want portability, use the ISO 8601 format. */ if (4 <= $1.digits) { - PC.year = $1; - PC.month = $3.value; - PC.day = $5.value; + pc->year = $1; + pc->month = $3.value; + pc->day = $5.value; } else { - PC.month = $1.value; - PC.day = $3.value; - PC.year = $5; + pc->month = $1.value; + pc->day = $3.value; + pc->year = $5; } } | tUNUMBER tSNUMBER tSNUMBER { /* ISO 8601 format. YYYY-MM-DD. */ - PC.year = $1; - PC.month = -$2.value; - PC.day = -$3.value; + pc->year = $1; + pc->month = -$2.value; + pc->day = -$3.value; } | tUNUMBER tMONTH tSNUMBER { /* e.g. 17-JUN-1992. */ - PC.day = $1.value; - PC.month = $2; - PC.year.value = -$3.value; - PC.year.digits = $3.digits; + pc->day = $1.value; + pc->month = $2; + pc->year.value = -$3.value; + pc->year.digits = $3.digits; } | tMONTH tSNUMBER tSNUMBER { /* e.g. JUN-17-1992. */ - PC.month = $1; - PC.day = -$2.value; - PC.year.value = -$3.value; - PC.year.digits = $3.digits; + pc->month = $1; + pc->day = -$2.value; + pc->year.value = -$3.value; + pc->year.digits = $3.digits; } | tMONTH tUNUMBER { - PC.month = $1; - PC.day = $2.value; + pc->month = $1; + pc->day = $2.value; } | tMONTH tUNUMBER ',' tUNUMBER { - PC.month = $1; - PC.day = $2.value; - PC.year = $4; + pc->month = $1; + pc->day = $2.value; + pc->year = $4; } | tUNUMBER tMONTH { - PC.day = $1.value; - PC.month = $2; + pc->day = $1.value; + pc->month = $2; } | tUNUMBER tMONTH tUNUMBER { - PC.day = $1.value; - PC.month = $2; - PC.year = $3; + pc->day = $1.value; + pc->month = $2; + pc->year = $3; } ; rel: relunit tAGO { - PC.rel_ns = -PC.rel_ns; - 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; + pc->rel_ns = -pc->rel_ns; + 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 - { PC.rel_year += $1.value * $2; } + { pc->rel_year += $1.value * $2; } | tSNUMBER tYEAR_UNIT - { PC.rel_year += $1.value * $2; } + { pc->rel_year += $1.value * $2; } | tYEAR_UNIT - { PC.rel_year += $1; } + { pc->rel_year += $1; } | tUNUMBER tMONTH_UNIT - { PC.rel_month += $1.value * $2; } + { pc->rel_month += $1.value * $2; } | tSNUMBER tMONTH_UNIT - { PC.rel_month += $1.value * $2; } + { pc->rel_month += $1.value * $2; } | tMONTH_UNIT - { PC.rel_month += $1; } + { pc->rel_month += $1; } | tUNUMBER tDAY_UNIT - { PC.rel_day += $1.value * $2; } + { pc->rel_day += $1.value * $2; } | tSNUMBER tDAY_UNIT - { PC.rel_day += $1.value * $2; } + { pc->rel_day += $1.value * $2; } | tDAY_UNIT - { PC.rel_day += $1; } + { pc->rel_day += $1; } | tUNUMBER tHOUR_UNIT - { PC.rel_hour += $1.value * $2; } + { pc->rel_hour += $1.value * $2; } | tSNUMBER tHOUR_UNIT - { PC.rel_hour += $1.value * $2; } + { pc->rel_hour += $1.value * $2; } | tHOUR_UNIT - { PC.rel_hour += $1; } + { pc->rel_hour += $1; } | tUNUMBER tMINUTE_UNIT - { PC.rel_minutes += $1.value * $2; } + { pc->rel_minutes += $1.value * $2; } | tSNUMBER tMINUTE_UNIT - { PC.rel_minutes += $1.value * $2; } + { pc->rel_minutes += $1.value * $2; } | tMINUTE_UNIT - { PC.rel_minutes += $1; } + { pc->rel_minutes += $1; } | tUNUMBER tSEC_UNIT - { PC.rel_seconds += $1.value * $2; } + { pc->rel_seconds += $1.value * $2; } | tSNUMBER tSEC_UNIT - { PC.rel_seconds += $1.value * $2; } + { pc->rel_seconds += $1.value * $2; } | tSDECIMAL_NUMBER tSEC_UNIT - { PC.rel_seconds += $1.tv_sec * $2; PC.rel_ns += $1.tv_nsec * $2; } + { pc->rel_seconds += $1.tv_sec * $2; pc->rel_ns += $1.tv_nsec * $2; } | tUDECIMAL_NUMBER tSEC_UNIT - { PC.rel_seconds += $1.tv_sec * $2; PC.rel_ns += $1.tv_nsec * $2; } + { pc->rel_seconds += $1.tv_sec * $2; pc->rel_ns += $1.tv_nsec * $2; } | tSEC_UNIT - { PC.rel_seconds += $1; } + { pc->rel_seconds += $1; } ; seconds: signed_seconds | unsigned_seconds; @@ -461,35 +455,35 @@ number: tUNUMBER { - if (PC.dates_seen - && ! PC.rels_seen && (PC.times_seen || 2 < $1.digits)) - PC.year = $1; + if (pc->dates_seen + && ! pc->rels_seen && (pc->times_seen || 2 < $1.digits)) + pc->year = $1; else { if (4 < $1.digits) { - PC.dates_seen++; - PC.day = $1.value % 100; - PC.month = ($1.value / 100) % 100; - PC.year.value = $1.value / 10000; - PC.year.digits = $1.digits - 4; + pc->dates_seen++; + pc->day = $1.value % 100; + pc->month = ($1.value / 100) % 100; + pc->year.value = $1.value / 10000; + pc->year.digits = $1.digits - 4; } else { - PC.times_seen++; + pc->times_seen++; if ($1.digits <= 2) { - PC.hour = $1.value; - PC.minutes = 0; + pc->hour = $1.value; + pc->minutes = 0; } else { - PC.hour = $1.value / 100; - PC.minutes = $1.value % 100; + pc->hour = $1.value / 100; + pc->minutes = $1.value % 100; } - PC.seconds.tv_sec = 0; - PC.seconds.tv_nsec = 0; - PC.meridian = MER24; + pc->seconds.tv_sec = 0; + pc->seconds.tv_nsec = 0; + pc->meridian = MER24; } } } @@ -510,7 +504,7 @@ { "A.M.", tMERIDIAN, MERam }, { "PM", tMERIDIAN, MERpm }, { "P.M.", tMERIDIAN, MERpm }, - { 0, 0, 0 } + { NULL, 0, 0 } }; static table const dst_table[] = @@ -544,7 +538,7 @@ { "THURS", tDAY, 4 }, { "FRIDAY", tDAY, 5 }, { "SATURDAY", tDAY, 6 }, - { 0, 0, 0 } + { NULL, 0, 0 } }; static table const time_units_table[] = @@ -559,7 +553,7 @@ { "MIN", tMINUTE_UNIT, 1 }, { "SECOND", tSEC_UNIT, 1 }, { "SEC", tSEC_UNIT, 1 }, - { 0, 0, 0 } + { NULL, 0, 0 } }; /* Assorted relative-time words. */ @@ -585,7 +579,7 @@ { "ELEVENTH", tUNUMBER, 11 }, { "TWELFTH", tUNUMBER, 12 }, { "AGO", tAGO, 1 }, - { 0, 0, 0 } + { NULL, 0, 0 } }; /* The time zone table. This table is necessarily incomplete, as time @@ -645,7 +639,7 @@ { "GST", tZONE, HOUR (10) }, /* Guam Standard */ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */ - { 0, 0, 0 } + { NULL, 0, 0 } }; /* Military time zone table. */ @@ -676,7 +670,7 @@ { "X", tZONE, HOUR (11) }, { "Y", tZONE, HOUR (12) }, { "Z", tZONE, HOUR ( 0) }, - { 0, 0, 0 } + { NULL, 0, 0 } }; @@ -686,16 +680,14 @@ { switch (meridian) { + default: /* Pacify GCC. */ case MER24: return 0 <= hours && hours < 24 ? hours : -1; case MERam: return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1; case MERpm: return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1; - default: - abort (); } - /* NOTREACHED */ } static long int @@ -728,7 +720,7 @@ if (strcmp (name, tp->name) == 0) return tp; - return 0; + return NULL; } #if ! HAVE_TM_GMTOFF @@ -827,7 +819,7 @@ if (period_found && (tp = lookup_zone (pc, word))) return tp; - return 0; + return NULL; } static int @@ -993,7 +985,7 @@ /* Do nothing if the parser reports an error. */ static int -yyerror (char *s ATTRIBUTE_UNUSED) +yyerror (parser_control *pc ATTRIBUTE_UNUSED, char *s ATTRIBUTE_UNUSED) { return 0; } @@ -1059,7 +1051,7 @@ pc.local_time_zone_table[0].name = tmp->tm_zone; pc.local_time_zone_table[0].type = tLOCAL_ZONE; pc.local_time_zone_table[0].value = tmp->tm_isdst; - pc.local_time_zone_table[1].name = 0; + pc.local_time_zone_table[1].name = NULL; /* Probe the names used in the next three calendar quarters, looking for a tm_isdst different from the one we already have. */ @@ -1076,7 +1068,7 @@ pc.local_time_zone_table[1].name = probe_tm->tm_zone; pc.local_time_zone_table[1].type = tLOCAL_ZONE; pc.local_time_zone_table[1].value = probe_tm->tm_isdst; - pc.local_time_zone_table[2].name = 0; + pc.local_time_zone_table[2].name = NULL; } break; } @@ -1095,10 +1087,10 @@ pc.local_time_zone_table[i].type = tLOCAL_ZONE; pc.local_time_zone_table[i].value = i; } - pc.local_time_zone_table[i].name = 0; + pc.local_time_zone_table[i].name = NULL; } #else - pc.local_time_zone_table[0].name = 0; + pc.local_time_zone_table[0].name = NULL; #endif #endif @@ -1110,7 +1102,7 @@ daylight times. So if we see that abbreviation, we don't know whether it's daylight time. */ pc.local_time_zone_table[0].value = -1; - pc.local_time_zone_table[1].name = 0; + pc.local_time_zone_table[1].name = NULL; } if (yyparse (&pc) != 0) @@ -1264,7 +1256,7 @@ printf ("Enter date, or blank line to exit.\n\t> "); fflush (stdout); - buff[BUFSIZ - 1] = 0; + buff[BUFSIZ - 1] = '\0'; while (fgets (buff, BUFSIZ - 1, stdin) && buff[0]) { struct timespec d; @@ -1288,4 +1280,4 @@ } return 0; } -#endif /* defined TEST */ +#endif /* TEST */