📄 getdate.c
字号:
}
*yy_ps = yy_state;
*++yy_pv = yyval;
/*
** we have a new state - find out what to do
*/
yy_newstate:
if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
goto yydefault; /* simple state */
#if YYDEBUG
/*
** if debugging, need to mark whether new token grabbed
*/
yytmp = yychar < 0;
#endif
if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
yychar = 0; /* reached EOF */
#if YYDEBUG
if ( yydebug && yytmp )
{
register int yy_i;
printf( "Received token " );
if ( yychar == 0 )
printf( "end-of-file\n" );
else if ( yychar < 0 )
printf( "-none-\n" );
else
{
for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val == yychar )
break;
}
printf( "%s\n", yytoks[yy_i].t_name );
}
}
#endif /* YYDEBUG */
if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
goto yydefault;
if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/
{
yychar = -1;
yyval = yylval;
yy_state = yy_n;
if ( yyerrflag > 0 )
yyerrflag--;
goto yy_stack;
}
yydefault:
if ( ( yy_n = yydef[ yy_state ] ) == -2 )
{
#if YYDEBUG
yytmp = yychar < 0;
#endif
if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
yychar = 0; /* reached EOF */
#if YYDEBUG
if ( yydebug && yytmp )
{
register int yy_i;
printf( "Received token " );
if ( yychar == 0 )
printf( "end-of-file\n" );
else if ( yychar < 0 )
printf( "-none-\n" );
else
{
for ( yy_i = 0;
yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val
== yychar )
{
break;
}
}
printf( "%s\n", yytoks[yy_i].t_name );
}
}
#endif /* YYDEBUG */
/*
** look through exception table
*/
{
register int *yyxi = yyexca;
while ( ( *yyxi != -1 ) ||
( yyxi[1] != yy_state ) )
{
yyxi += 2;
}
while ( ( *(yyxi += 2) >= 0 ) &&
( *yyxi != yychar ) )
;
if ( ( yy_n = yyxi[1] ) < 0 )
YYACCEPT;
}
}
/*
** check for syntax error
*/
if ( yy_n == 0 ) /* have an error */
{
/* no worry about speed here! */
switch ( yyerrflag )
{
case 0: /* new error */
yyerror( "syntax error" );
goto skip_init;
yyerrlab:
/*
** get globals into registers.
** we have a user generated syntax type error
*/
yy_pv = yypv;
yy_ps = yyps;
yy_state = yystate;
yynerrs++;
skip_init:
case 1:
case 2: /* incompletely recovered error */
/* try again... */
yyerrflag = 3;
/*
** find state where "error" is a legal
** shift action
*/
while ( yy_ps >= yys )
{
yy_n = yypact[ *yy_ps ] + YYERRCODE;
if ( yy_n >= 0 && yy_n < YYLAST &&
yychk[yyact[yy_n]] == YYERRCODE) {
/*
** simulate shift of "error"
*/
yy_state = yyact[ yy_n ];
goto yy_stack;
}
/*
** current state has no shift on
** "error", pop stack
*/
#if YYDEBUG
# define _POP_ "Error recovery pops state %d, uncovers state %d\n"
if ( yydebug )
printf( _POP_, *yy_ps,
yy_ps[-1] );
# undef _POP_
#endif
yy_ps--;
yy_pv--;
}
/*
** there is no state on stack with "error" as
** a valid shift. give up.
*/
YYABORT;
case 3: /* no shift yet; eat a token */
#if YYDEBUG
/*
** if debugging, look up token in list of
** pairs. 0 and negative shouldn't occur,
** but since timing doesn't matter when
** debugging, it doesn't hurt to leave the
** tests here.
*/
if ( yydebug )
{
register int yy_i;
printf( "Error recovery discards " );
if ( yychar == 0 )
printf( "token end-of-file\n" );
else if ( yychar < 0 )
printf( "token -none-\n" );
else
{
for ( yy_i = 0;
yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val
== yychar )
{
break;
}
}
printf( "token %s\n",
yytoks[yy_i].t_name );
}
}
#endif /* YYDEBUG */
if ( yychar == 0 ) /* reached EOF. quit */
YYABORT;
yychar = -1;
goto yy_newstate;
}
}/* end if ( yy_n == 0 ) */
/*
** reduction by production yy_n
** put stack tops, etc. so things right after switch
*/
#if YYDEBUG
/*
** if debugging, print the string that is the user's
** specification of the reduction which is just about
** to be done.
*/
if ( yydebug )
printf( "Reduce by (%d) \"%s\"\n",
yy_n, yyreds[ yy_n ] );
#endif
yytmp = yy_n; /* value to switch over */
yypvt = yy_pv; /* $vars top of value stack */
/*
** Look in goto table for next state
** Sorry about using yy_state here as temporary
** register variable, but why not, if it works...
** If yyr2[ yy_n ] doesn't have the low order bit
** set, then there is no action to be done for
** this reduction. So, no saving & unsaving of
** registers done. The only difference between the
** code just after the if and the body of the if is
** the goto yy_stack in the body. This way the test
** can be made before the choice of what to do is needed.
*/
{
/* length of production doubled with extra bit */
register int yy_len = yyr2[ yy_n ];
if ( !( yy_len & 01 ) )
{
yy_len >>= 1;
yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
*( yy_ps -= yy_len ) + 1;
if ( yy_state >= YYLAST ||
yychk[ yy_state =
yyact[ yy_state ] ] != -yy_n )
{
yy_state = yyact[ yypgo[ yy_n ] ];
}
goto yy_stack;
}
yy_len >>= 1;
yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
*( yy_ps -= yy_len ) + 1;
if ( yy_state >= YYLAST ||
yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
{
yy_state = yyact[ yypgo[ yy_n ] ];
}
}
/* save until reenter driver code */
yystate = yy_state;
yyps = yy_ps;
yypv = yy_pv;
}
/*
** code supplied by user is placed in this switch
*/
switch( yytmp )
{
case 3:
# line 153 "getdate.y"
{
yyHaveTime++;
} break;
case 4:
# line 156 "getdate.y"
{
yyHaveZone++;
} break;
case 5:
# line 159 "getdate.y"
{
yyHaveDate++;
} break;
case 6:
# line 162 "getdate.y"
{
yyHaveDay++;
} break;
case 7:
# line 165 "getdate.y"
{
yyHaveRel++;
} break;
case 9:
# line 171 "getdate.y"
{
yyHour = yypvt[-1].Number;
yyMinutes = 0;
yySeconds = 0;
yyMeridian = yypvt[-0].Meridian;
} break;
case 10:
# line 177 "getdate.y"
{
yyHour = yypvt[-3].Number;
yyMinutes = yypvt[-1].Number;
yySeconds = 0;
yyMeridian = yypvt[-0].Meridian;
} break;
case 11:
# line 183 "getdate.y"
{
yyHour = yypvt[-3].Number;
yyMinutes = yypvt[-1].Number;
yyMeridian = MER24;
yyDSTmode = DSToff;
yyTimezone = - (yypvt[-0].Number % 100 + (yypvt[-0].Number / 100) * 60);
} break;
case 12:
# line 190 "getdate.y"
{
yyHour = yypvt[-5].Number;
yyMinutes = yypvt[-3].Number;
yySeconds = yypvt[-1].Number;
yyMeridian = yypvt[-0].Meridian;
} break;
case 13:
# line 196 "getdate.y"
{
yyHour = yypvt[-5].Number;
yyMinutes = yypvt[-3].Number;
yySeconds = yypvt[-1].Number;
yyMeridian = MER24;
yyDSTmode = DSToff;
yyTimezone = - (yypvt[-0].Number % 100 + (yypvt[-0].Number / 100) * 60);
} break;
case 14:
# line 206 "getdate.y"
{
yyTimezone = yypvt[-0].Number;
yyDSTmode = DSToff;
} break;
case 15:
# line 210 "getdate.y"
{
yyTimezone = yypvt[-0].Number;
yyDSTmode = DSTon;
} break;
case 16:
# line 216 "getdate.y"
{
yyDayOrdinal = 1;
yyDayNumber = yypvt[-0].Number;
} break;
case 17:
# line 220 "getdate.y"
{
yyDayOrdinal = 1;
yyDayNumber = yypvt[-1].Number;
} break;
case 18:
# line 224 "getdate.y"
{
yyDayOrdinal = yypvt[-1].Number;
yyDayNumber = yypvt[-0].Number;
} break;
case 19:
# line 230 "getdate.y"
{
yyMonth = yypvt[-2].Number;
yyDay = yypvt[-0].Number;
} break;
case 20:
# line 234 "getdate.y"
{
yyMonth = yypvt[-4].Number;
yyDay = yypvt[-2].Number;
yyYear = yypvt[-0].Number;
} break;
case 21:
# line 239 "getdate.y"
{
yyMonth = yypvt[-1].Number;
yyDay = yypvt[-0].Number;
} break;
case 22:
# line 243 "getdate.y"
{
yyMonth = yypvt[-3].Number;
yyDay = yypvt[-2].Number;
yyYear = yypvt[-0].Number;
} break;
case 23:
# line 248 "getdate.y"
{
yyMonth = yypvt[-0].Number;
yyDay = yypvt[-1].Number;
} break;
case 24:
# line 252 "getdate.y"
{
yyMonth = yypvt[-1].Number;
yyDay = yypvt[-2].Number;
yyYear = yypvt[-0].Number;
} break;
case 25:
# line 259 "getdate.y"
{
yyRelSeconds = -yyRelSeconds;
yyRelMonth = -yyRelMonth;
} break;
case 27:
# line 266 "getdate.y"
{
yyRelSeconds += yypvt[-1].Number * yypvt[-0].Number * 60L;
} break;
case 28:
# line 269 "getdate.y"
{
yyRelSeconds += yypvt[-1].Number * yypvt[-0].Number * 60L;
} break;
case 29:
# line 272 "getdate.y"
{
yyRelSeconds += yypvt[-0].Number * 60L;
} break;
case 30:
# line 275 "getdate.y"
{
yyRelSeconds += yypvt[-1].Number;
} break;
case 31:
# line 278 "getdate.y"
{
yyRelSeconds += yypvt[-1].Number;
} break;
case 32:
# line 281 "getdate.y"
{
yyRelSeconds++;
} break;
case 33:
# line 284 "getdate.y"
{
yyRelMonth += yypvt[-1].Number * yypvt[-0].Number;
} break;
case 34:
# line 287 "getdate.y"
{
yyRelMonth += yypvt[-1].Number * yypvt[-0].Number;
} break;
case 35:
# line 290 "getdate.y"
{
yyRelMonth += yypvt[-0].Number;
} break;
case 36:
# line 295 "getdate.y"
{
if (yyHaveTime && yyHaveDate && !yyHaveRel)
yyYear = yypvt[-0].Number;
else {
if(yypvt[-0].Number>10000) {
time_t date_part;
date_part= yypvt[-0].Number/10000;
yyHaveDate++;
yyDay= (date_part)%100;
yyMonth= (date_part/100)%100;
yyYear = date_part/10000;
}
yyHaveTime++;
if (yypvt[-0].Number < 100) {
yyHour = yypvt[-0].Number;
yyMinutes = 0;
}
else {
yyHour = yypvt[-0].Number / 100;
yyMinutes = yypvt[-0].Number % 100;
}
yySeconds = 0;
yyMeridian = MER24;
}
} break;
case 37:
# line 323 "getdate.y"
{
yyval.Meridian = MER24;
} break;
case 38:
# line 326 "getdate.y"
{
yyval.Meridian = yypvt[-0].Meridian;
} break;
}
goto yystack; /* reset registers in driver code */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -