First step in making parsedate.y thread safe - use a pure parser

This commit is contained in:
Zeev Suraski 1999-12-06 19:04:01 +00:00
parent 291066c459
commit 40eb2bb5b0

View file

@ -18,6 +18,7 @@
/* SUPPRESS 593 on yynewstate *//* Label was not used */ /* SUPPRESS 593 on yynewstate *//* Label was not used */
/* SUPPRESS 595 on yypvt *//* Automatic variable may be used before set */ /* SUPPRESS 595 on yypvt *//* Automatic variable may be used before set */
#ifdef WIN32 #ifdef WIN32
# include "config.w32.h" # include "config.w32.h"
#else #else
@ -60,6 +61,9 @@ extern time_t timezone;
# endif # endif
#endif #endif
#define yylhs date_yylhs #define yylhs date_yylhs
#define yylen date_yylen #define yylen date_yylen
#define yydefred date_yydefred #define yydefred date_yydefred
@ -74,7 +78,6 @@ extern time_t timezone;
#define yylex date_lex #define yylex date_lex
#define yyerror date_error #define yyerror date_error
static int date_lex(void);
/* See the LeapYears table in Convert. */ /* See the LeapYears table in Convert. */
#define EPOCH 1970 #define EPOCH 1970
@ -156,9 +159,14 @@ static time_t yyRelSeconds;
extern struct tm *localtime(const time_t *timep); extern struct tm *localtime(const time_t *timep);
/* YYSTYPE is not yet defined at this point */
static int date_lex(void *yylval);
static void date_error(char *s); static void date_error(char *s);
%} %}
%pure_parser
%expect 6 %expect 6
%union { %union {
@ -703,7 +711,7 @@ RelativeMonth(time_t Start, time_t RelMonth)
} }
static int LookupWord(char *buff, int length) static int LookupWord(char *buff, int length, YYSTYPE *yylval)
{ {
char *p; char *p;
STRING q; STRING q;
@ -718,14 +726,14 @@ static int LookupWord(char *buff, int length)
for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) { for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {
q = tp->name; q = tp->name;
if (c == q[0] && p[1] == q[1] && p[2] == q[2]) { if (c == q[0] && p[1] == q[1] && p[2] == q[2]) {
yylval.Number = tp->value; yylval->Number = tp->value;
return tp->type; return tp->type;
} }
} }
else else
for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++)
if (c == tp->name[0] && strcmp(p, tp->name) == 0) { if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
yylval.Number = tp->value; yylval->Number = tp->value;
return tp->type; return tp->type;
} }
@ -733,14 +741,14 @@ static int LookupWord(char *buff, int length)
for (tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) for (tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++)
if (c == tp->name[0] && p[1] == tp->name[1] if (c == tp->name[0] && p[1] == tp->name[1]
&& strcmp(p, tp->name) == 0) { && strcmp(p, tp->name) == 0) {
yylval.Number = tp->value; yylval->Number = tp->value;
return tp->type; return tp->type;
} }
/* Try the units table. */ /* Try the units table. */
for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++)
if (c == tp->name[0] && strcmp(p, tp->name) == 0) { if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
yylval.Number = tp->value; yylval->Number = tp->value;
return tp->type; return tp->type;
} }
@ -750,7 +758,7 @@ static int LookupWord(char *buff, int length)
for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++)
if (c == tp->name[0] && strcmp(p, tp->name) == 0) { if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
p[length] = 's'; p[length] = 's';
yylval.Number = tp->value; yylval->Number = tp->value;
return tp->type; return tp->type;
} }
p[length] = 's'; p[length] = 's';
@ -766,11 +774,11 @@ static int LookupWord(char *buff, int length)
/* Try the meridians. */ /* Try the meridians. */
if (buff[1] == 'm' && buff[2] == '\0') { if (buff[1] == 'm' && buff[2] == '\0') {
if (buff[0] == 'a') { if (buff[0] == 'a') {
yylval.Meridian = MERam; yylval->Meridian = MERam;
return tMERIDIAN; return tMERIDIAN;
} }
if (buff[0] == 'p') { if (buff[0] == 'p') {
yylval.Meridian = MERpm; yylval->Meridian = MERpm;
return tMERIDIAN; return tMERIDIAN;
} }
} }
@ -781,18 +789,18 @@ static int LookupWord(char *buff, int length)
for (p = buff, tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) for (p = buff, tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++)
if (c == tp->name[0] && p[1] == tp->name[1] if (c == tp->name[0] && p[1] == tp->name[1]
&& strcmp(p, tp->name) == 0) { && strcmp(p, tp->name) == 0) {
yylval.Number = tp->value; yylval->Number = tp->value;
return tp->type; return tp->type;
} }
} }
/* Unknown word -- assume GMT timezone. */ /* Unknown word -- assume GMT timezone. */
yylval.Number = 0; yylval->Number = 0;
return tZONE; return tZONE;
} }
static int date_lex(void) static int date_lex(YYSTYPE *yylval)
{ {
char c; char c;
char *p; char *p;
@ -835,7 +843,7 @@ static int date_lex(void)
for (i = 0; (c = *yyInput++) != '\0' && CTYPE(isdigit, (int)c); ) for (i = 0; (c = *yyInput++) != '\0' && CTYPE(isdigit, (int)c); )
i = 10 * i + c - '0'; i = 10 * i + c - '0';
yyInput--; yyInput--;
yylval.Number = sign < 0 ? -i : i; yylval->Number = sign < 0 ? -i : i;
return sign ? tSNUMBER : tUNUMBER; return sign ? tSNUMBER : tUNUMBER;
} }
@ -846,7 +854,7 @@ static int date_lex(void)
*p++ = CTYPE(isupper, (int)c) ? tolower(c) : c; *p++ = CTYPE(isupper, (int)c) ? tolower(c) : c;
*p = '\0'; *p = '\0';
yyInput--; yyInput--;
return LookupWord(buff, p - buff); return LookupWord(buff, p - buff, yylval);
} }
return *yyInput++; return *yyInput++;