18
18
/* SUPPRESS 593 on yynewstate */ /* Label was not used */
19
19
/* SUPPRESS 595 on yypvt */ /* Automatic variable may be used before set */
20
20
21
+
21
22
#ifdef WIN32
22
23
# include " config.w32.h"
23
24
#else
@@ -60,6 +61,9 @@ extern time_t timezone;
60
61
# endif
61
62
#endif
62
63
64
+
65
+
66
+
63
67
#define yylhs date_yylhs
64
68
#define yylen date_yylen
65
69
#define yydefred date_yydefred
@@ -74,7 +78,6 @@ extern time_t timezone;
74
78
#define yylex date_lex
75
79
#define yyerror date_error
76
80
77
- static int date_lex (void );
78
81
79
82
/* See the LeapYears table in Convert. */
80
83
#define EPOCH 1970
@@ -156,13 +159,18 @@ static time_t yyRelSeconds;
156
159
157
160
extern struct tm *localtime (const time_t *timep);
158
161
162
+ /* YYSTYPE is not yet defined at this point */
163
+ static int date_lex (void *yylval);
164
+
159
165
static void date_error (char *s);
166
+
160
167
%}
161
168
169
+ %pure_parser
162
170
%expect 6
163
171
164
172
%union {
165
- time_t Number;
173
+ time_t Number;
166
174
enum _MERIDIAN Meridian;
167
175
}
168
176
@@ -703,7 +711,7 @@ RelativeMonth(time_t Start, time_t RelMonth)
703
711
}
704
712
705
713
706
- static int LookupWord (char *buff, int length)
714
+ static int LookupWord (char *buff, int length, YYSTYPE *yylval )
707
715
{
708
716
char *p;
709
717
STRING q;
@@ -718,29 +726,29 @@ static int LookupWord(char *buff, int length)
718
726
for (tp = MonthDayTable; tp < ENDOF (MonthDayTable); tp++) {
719
727
q = tp->name ;
720
728
if (c == q[0 ] && p[1 ] == q[1 ] && p[2 ] == q[2 ]) {
721
- yylval. Number = tp->value ;
729
+ yylval-> Number = tp->value ;
722
730
return tp->type ;
723
731
}
724
732
}
725
733
else
726
734
for (tp = MonthDayTable; tp < ENDOF (MonthDayTable); tp++)
727
735
if (c == tp->name [0 ] && strcmp (p, tp->name ) == 0 ) {
728
- yylval. Number = tp->value ;
736
+ yylval-> Number = tp->value ;
729
737
return tp->type ;
730
738
}
731
739
732
740
/* Try for a timezone. */
733
741
for (tp = TimezoneTable; tp < ENDOF (TimezoneTable); tp++)
734
742
if (c == tp->name [0 ] && p[1 ] == tp->name [1 ]
735
743
&& strcmp (p, tp->name ) == 0 ) {
736
- yylval. Number = tp->value ;
744
+ yylval-> Number = tp->value ;
737
745
return tp->type ;
738
746
}
739
747
740
748
/* Try the units table. */
741
749
for (tp = UnitsTable; tp < ENDOF (UnitsTable); tp++)
742
750
if (c == tp->name [0 ] && strcmp (p, tp->name ) == 0 ) {
743
- yylval. Number = tp->value ;
751
+ yylval-> Number = tp->value ;
744
752
return tp->type ;
745
753
}
746
754
@@ -750,7 +758,7 @@ static int LookupWord(char *buff, int length)
750
758
for (tp = UnitsTable; tp < ENDOF (UnitsTable); tp++)
751
759
if (c == tp->name [0 ] && strcmp (p, tp->name ) == 0 ) {
752
760
p[length] = ' s' ;
753
- yylval. Number = tp->value ;
761
+ yylval-> Number = tp->value ;
754
762
return tp->type ;
755
763
}
756
764
p[length] = ' s' ;
@@ -766,11 +774,11 @@ static int LookupWord(char *buff, int length)
766
774
/* Try the meridians. */
767
775
if (buff[1 ] == ' m' && buff[2 ] == ' \0 ' ) {
768
776
if (buff[0 ] == ' a' ) {
769
- yylval. Meridian = MERam;
777
+ yylval-> Meridian = MERam;
770
778
return tMERIDIAN;
771
779
}
772
780
if (buff[0 ] == ' p' ) {
773
- yylval. Meridian = MERpm;
781
+ yylval-> Meridian = MERpm;
774
782
return tMERIDIAN;
775
783
}
776
784
}
@@ -781,18 +789,18 @@ static int LookupWord(char *buff, int length)
781
789
for (p = buff, tp = TimezoneTable; tp < ENDOF (TimezoneTable); tp++)
782
790
if (c == tp->name [0 ] && p[1 ] == tp->name [1 ]
783
791
&& strcmp (p, tp->name ) == 0 ) {
784
- yylval. Number = tp->value ;
792
+ yylval-> Number = tp->value ;
785
793
return tp->type ;
786
794
}
787
795
}
788
796
789
797
/* Unknown word -- assume GMT timezone. */
790
- yylval. Number = 0 ;
798
+ yylval-> Number = 0 ;
791
799
return tZONE;
792
800
}
793
801
794
802
795
- static int date_lex (void )
803
+ static int date_lex (YYSTYPE *yylval )
796
804
{
797
805
char c;
798
806
char *p;
@@ -835,7 +843,7 @@ static int date_lex(void)
835
843
for (i = 0 ; (c = *yyInput++) != ' \0 ' && CTYPE (isdigit, (int )c); )
836
844
i = 10 * i + c - ' 0' ;
837
845
yyInput--;
838
- yylval. Number = sign < 0 ? -i : i;
846
+ yylval-> Number = sign < 0 ? -i : i;
839
847
return sign ? tSNUMBER : tUNUMBER;
840
848
}
841
849
@@ -846,7 +854,7 @@ static int date_lex(void)
846
854
*p++ = CTYPE (isupper, (int )c) ? tolower (c) : c;
847
855
*p = ' \0 ' ;
848
856
yyInput--;
849
- return LookupWord (buff, p - buff);
857
+ return LookupWord (buff, p - buff, yylval );
850
858
}
851
859
852
860
return *yyInput++;
0 commit comments