Skip to content
getdate.c.cvs 55.9 KiB
Newer Older
Daniel Stenberg's avatar
Daniel Stenberg committed
    break;}
case 12:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 274 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyHour = yyvsp[-5].Number;
	    context->yyMinutes = yyvsp[-3].Number;
	    context->yySeconds = yyvsp[-1].Number;
	    context->yyMeridian = yyvsp[0].Meridian;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 13:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 280 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyHour = yyvsp[-5].Number;
	    context->yyMinutes = yyvsp[-3].Number;
	    context->yySeconds = yyvsp[-1].Number;
	    context->yyMeridian = MER24;
	    context->yyHaveZone++;
	    context->yyTimezone = (yyvsp[0].Number < 0
				   ? -yyvsp[0].Number % 100 + (-yyvsp[0].Number / 100) * 60
				   : - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60));
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 14:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 292 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyTimezone = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 15:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 295 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyTimezone = yyvsp[0].Number - 60;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 16:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 299 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyTimezone = yyvsp[-1].Number - 60;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 17:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 304 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyDayOrdinal = 1;
	    context->yyDayNumber = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 18:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 308 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyDayOrdinal = 1;
	    context->yyDayNumber = yyvsp[-1].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 19:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 312 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyDayOrdinal = yyvsp[-1].Number;
	    context->yyDayNumber = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 20:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 318 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyMonth = yyvsp[-2].Number;
	    context->yyDay = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 21:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 322 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
	  /* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
	     The goal in recognizing YYYY/MM/DD is solely to support legacy
	     machine-generated dates like those in an RCS log listing.  If
	     you want portability, use the ISO 8601 format.  */
	  if (yyvsp[-4].Number >= 1000)
	    {
Daniel Stenberg's avatar
Daniel Stenberg committed
	      context->yyYear = yyvsp[-4].Number;
	      context->yyMonth = yyvsp[-2].Number;
	      context->yyDay = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	      context->yyMonth = yyvsp[-4].Number;
	      context->yyDay = yyvsp[-2].Number;
	      context->yyYear = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	    }
	;
    break;}
case 22:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 340 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
	    /* ISO 8601 format.  yyyy-mm-dd.  */
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyYear = yyvsp[-2].Number;
	    context->yyMonth = -yyvsp[-1].Number;
	    context->yyDay = -yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 23:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 346 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
	    /* e.g. 17-JUN-1992.  */
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyDay = yyvsp[-2].Number;
	    context->yyMonth = yyvsp[-1].Number;
	    context->yyYear = -yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 24:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 352 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyMonth = yyvsp[-1].Number;
	    context->yyDay = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 25:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 356 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyMonth = yyvsp[-3].Number;
	    context->yyDay = yyvsp[-2].Number;
	    context->yyYear = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 26:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 361 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyMonth = yyvsp[0].Number;
	    context->yyDay = yyvsp[-1].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 27:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 365 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyMonth = yyvsp[-1].Number;
	    context->yyDay = yyvsp[-2].Number;
	    context->yyYear = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 28:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 372 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelSeconds = -context->yyRelSeconds;
	    context->yyRelMinutes = -context->yyRelMinutes;
	    context->yyRelHour = -context->yyRelHour;
	    context->yyRelDay = -context->yyRelDay;
	    context->yyRelMonth = -context->yyRelMonth;
	    context->yyRelYear = -context->yyRelYear;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 30:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 383 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 31:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 386 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 32:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 389 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelYear += yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 33:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 392 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 34:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 395 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 35:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 398 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelMonth += yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 36:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 401 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 37:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 404 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 38:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 407 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelDay += yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 39:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 410 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 40:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 413 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 41:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 416 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelHour += yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 42:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 419 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 43:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 422 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 44:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 425 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelMinutes += yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 45:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 428 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 46:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 431 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 47:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 434 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    context->yyRelSeconds += yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	;
    break;}
case 48:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 440 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
Daniel Stenberg's avatar
Daniel Stenberg committed
	    if (context->yyHaveTime && context->yyHaveDate &&
		!context->yyHaveRel)
	      context->yyYear = yyvsp[0].Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	    else
	      {
		if (yyvsp[0].Number>10000)
		  {
Daniel Stenberg's avatar
Daniel Stenberg committed
		    context->yyHaveDate++;
		    context->yyDay= (yyvsp[0].Number)%100;
		    context->yyMonth= (yyvsp[0].Number/100)%100;
		    context->yyYear = yyvsp[0].Number/10000;
Daniel Stenberg's avatar
Daniel Stenberg committed
		    context->yyHaveTime++;
Daniel Stenberg's avatar
Daniel Stenberg committed
		    if (yyvsp[0].Number < 100)
		      {
Daniel Stenberg's avatar
Daniel Stenberg committed
			context->yyHour = yyvsp[0].Number;
			context->yyMinutes = 0;
Daniel Stenberg's avatar
Daniel Stenberg committed
		    	context->yyHour = yyvsp[0].Number / 100;
		    	context->yyMinutes = yyvsp[0].Number % 100;
Daniel Stenberg's avatar
Daniel Stenberg committed
		      }
Daniel Stenberg's avatar
Daniel Stenberg committed
		    context->yySeconds = 0;
		    context->yyMeridian = MER24;
Daniel Stenberg's avatar
Daniel Stenberg committed
		  }
	      }
	  ;
    break;}
case 49:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 474 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
	    yyval.Meridian = MER24;
	  ;
    break;}
case 50:
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 478 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed
{
	    yyval.Meridian = yyvsp[0].Meridian;
	  ;
    break;}
}
   /* the action file gets copied in in place of this dollarsign */
#line 543 "/usr/lib/bison.simple"
Daniel Stenberg's avatar
Daniel Stenberg committed

  yyvsp -= yylen;
  yyssp -= yylen;
#ifdef YYLSP_NEEDED
  yylsp -= yylen;
#endif

#if YYDEBUG != 0
  if (yydebug)
    {
      short *ssp1 = yyss - 1;
      fprintf (stderr, "state stack now");
      while (ssp1 != yyssp)
	fprintf (stderr, " %d", *++ssp1);
      fprintf (stderr, "\n");
    }
#endif

  *++yyvsp = yyval;

#ifdef YYLSP_NEEDED
  yylsp++;
  if (yylen == 0)
    {
      yylsp->first_line = yylloc.first_line;
      yylsp->first_column = yylloc.first_column;
      yylsp->last_line = (yylsp-1)->last_line;
      yylsp->last_column = (yylsp-1)->last_column;
      yylsp->text = 0;
    }
  else
    {
      yylsp->last_line = (yylsp+yylen-1)->last_line;
      yylsp->last_column = (yylsp+yylen-1)->last_column;
    }
#endif

  /* Now "shift" the result of the reduction.
     Determine what state that goes to,
     based on the state we popped back to
     and the rule number reduced by.  */

  yyn = yyr1[yyn];

  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
    yystate = yytable[yystate];
  else
    yystate = yydefgoto[yyn - YYNTBASE];

  goto yynewstate;

yyerrlab:   /* here on detecting error */

  if (! yyerrstatus)
    /* If not already recovering from an error, report this error.  */
    {
      ++yynerrs;

#ifdef YYERROR_VERBOSE
      yyn = yypact[yystate];

      if (yyn > YYFLAG && yyn < YYLAST)
	{
	  int size = 0;
	  char *msg;
	  int x, count;

	  count = 0;
	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
	  for (x = (yyn < 0 ? -yyn : 0);
	       x < (sizeof(yytname) / sizeof(char *)); x++)
	    if (yycheck[x + yyn] == x)
	      size += strlen(yytname[x]) + 15, count++;
	  msg = (char *) malloc(size + 15);
	  if (msg != 0)
	    {
	      strcpy(msg, "parse error");

	      if (count < 5)
		{
		  count = 0;
		  for (x = (yyn < 0 ? -yyn : 0);
		       x < (sizeof(yytname) / sizeof(char *)); x++)
		    if (yycheck[x + yyn] == x)
		      {
			strcat(msg, count == 0 ? ", expecting `" : " or `");
			strcat(msg, yytname[x]);
			strcat(msg, "'");
			count++;
		      }
		}
	      yyerror(msg);
	      free(msg);
	    }
	  else
	    yyerror ("parse error; also virtual memory exceeded");
	}
      else
#endif /* YYERROR_VERBOSE */
	yyerror("parse error");
    }

  goto yyerrlab1;
yyerrlab1:   /* here on error raised explicitly by an action */

  if (yyerrstatus == 3)
    {
      /* if just tried and failed to reuse lookahead token after an error, discard it.  */

      /* return failure if at end of input */
      if (yychar == YYEOF)
	YYABORT;

#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
#endif

      yychar = YYEMPTY;
    }

  /* Else will try to reuse lookahead token
     after shifting the error token.  */

  yyerrstatus = 3;		/* Each real token shifted decrements this */

  goto yyerrhandle;

yyerrdefault:  /* current state does not do anything special for the error token. */

#if 0
  /* This is wrong; only states that explicitly want error tokens
     should shift them.  */
  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  if (yyn) goto yydefault;
#endif

yyerrpop:   /* pop the current state because it cannot handle the error token */

  if (yyssp == yyss) YYABORT;
  yyvsp--;
  yystate = *--yyssp;
#ifdef YYLSP_NEEDED
  yylsp--;
#endif

#if YYDEBUG != 0
  if (yydebug)
    {
      short *ssp1 = yyss - 1;
      fprintf (stderr, "Error: state stack now");
      while (ssp1 != yyssp)
	fprintf (stderr, " %d", *++ssp1);
      fprintf (stderr, "\n");
    }
#endif

yyerrhandle:

  yyn = yypact[yystate];
  if (yyn == YYFLAG)
    goto yyerrdefault;

  yyn += YYTERROR;
  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
    goto yyerrdefault;

  yyn = yytable[yyn];
  if (yyn < 0)
    {
      if (yyn == YYFLAG)
	goto yyerrpop;
      yyn = -yyn;
      goto yyreduce;
    }
  else if (yyn == 0)
    goto yyerrpop;

  if (yyn == YYFINAL)
    YYACCEPT;

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Shifting error token, ");
#endif

  *++yyvsp = yylval;
#ifdef YYLSP_NEEDED
  *++yylsp = yylloc;
#endif

  yystate = yyn;
  goto yynewstate;

 yyacceptlab:
  /* YYACCEPT comes here.  */
  if (yyfree_stacks)
    {
      free (yyss);
      free (yyvs);
#ifdef YYLSP_NEEDED
      free (yyls);
#endif
    }
  return 0;

 yyabortlab:
  /* YYABORT comes here.  */
  if (yyfree_stacks)
    {
      free (yyss);
      free (yyvs);
#ifdef YYLSP_NEEDED
      free (yyls);
#endif
    }
  return 1;
Daniel Stenberg's avatar
Daniel Stenberg committed
}
Daniel Stenberg's avatar
Daniel Stenberg committed
#line 483 "getdate.y"
Daniel Stenberg's avatar
Daniel Stenberg committed


/* Include this file down here because bison inserts code above which
   may define-away `const'.  We want the prototype for get_date to have
   the same signature as the function definition does. */
#include "getdate.h"

#ifndef WIN32 /* the windows dudes don't need these, does anyone really? */
Daniel Stenberg's avatar
Daniel Stenberg committed
extern struct tm	*gmtime ();
extern struct tm	*localtime ();
extern time_t		mktime ();
Daniel Stenberg's avatar
Daniel Stenberg committed

/* Month and day table. */
static TABLE const MonthDayTable[] = {
    { "january",	tMONTH,  1 },
    { "february",	tMONTH,  2 },
    { "march",		tMONTH,  3 },
    { "april",		tMONTH,  4 },
    { "may",		tMONTH,  5 },
    { "june",		tMONTH,  6 },
    { "july",		tMONTH,  7 },
    { "august",		tMONTH,  8 },
    { "september",	tMONTH,  9 },
    { "sept",		tMONTH,  9 },
    { "october",	tMONTH, 10 },
    { "november",	tMONTH, 11 },
    { "december",	tMONTH, 12 },
    { "sunday",		tDAY, 0 },
    { "monday",		tDAY, 1 },
    { "tuesday",	tDAY, 2 },
    { "tues",		tDAY, 2 },
    { "wednesday",	tDAY, 3 },
    { "wednes",		tDAY, 3 },
    { "thursday",	tDAY, 4 },
    { "thur",		tDAY, 4 },
    { "thurs",		tDAY, 4 },
    { "friday",		tDAY, 5 },
    { "saturday",	tDAY, 6 },
    { NULL, 0, 0 }
};

/* Time units table. */
static TABLE const UnitsTable[] = {
    { "year",		tYEAR_UNIT,	1 },
    { "month",		tMONTH_UNIT,	1 },
    { "fortnight",	tDAY_UNIT,	14 },
    { "week",		tDAY_UNIT,	7 },
    { "day",		tDAY_UNIT,	1 },
    { "hour",		tHOUR_UNIT,	1 },
    { "minute",		tMINUTE_UNIT,	1 },
    { "min",		tMINUTE_UNIT,	1 },
    { "second",		tSEC_UNIT,	1 },
    { "sec",		tSEC_UNIT,	1 },
    { NULL, 0, 0 }
};

/* Assorted relative-time words. */
static TABLE const OtherTable[] = {
    { "tomorrow",	tMINUTE_UNIT,	1 * 24 * 60 },
    { "yesterday",	tMINUTE_UNIT,	-1 * 24 * 60 },
    { "today",		tMINUTE_UNIT,	0 },
    { "now",		tMINUTE_UNIT,	0 },
    { "last",		tUNUMBER,	-1 },
    { "this",		tMINUTE_UNIT,	0 },
    { "next",		tUNUMBER,	1 },
    { "first",		tUNUMBER,	1 },
/*  { "second",		tUNUMBER,	2 }, */
    { "third",		tUNUMBER,	3 },
    { "fourth",		tUNUMBER,	4 },
    { "fifth",		tUNUMBER,	5 },
    { "sixth",		tUNUMBER,	6 },
    { "seventh",	tUNUMBER,	7 },
    { "eighth",		tUNUMBER,	8 },
    { "ninth",		tUNUMBER,	9 },
    { "tenth",		tUNUMBER,	10 },
    { "eleventh",	tUNUMBER,	11 },
    { "twelfth",	tUNUMBER,	12 },
    { "ago",		tAGO,	1 },
    { NULL, 0, 0 }
};

/* The timezone table. */
static TABLE const TimezoneTable[] = {
    { "gmt",	tZONE,     HOUR ( 0) },	/* Greenwich Mean */
    { "ut",	tZONE,     HOUR ( 0) },	/* Universal (Coordinated) */
    { "utc",	tZONE,     HOUR ( 0) },
    { "wet",	tZONE,     HOUR ( 0) },	/* Western European */
    { "bst",	tDAYZONE,  HOUR ( 0) },	/* British Summer */
    { "wat",	tZONE,     HOUR ( 1) },	/* West Africa */
    { "at",	tZONE,     HOUR ( 2) },	/* Azores */
#if	0
    /* For completeness.  BST is also British Summer, and GST is
     * also Guam Standard. */
    { "bst",	tZONE,     HOUR ( 3) },	/* Brazil Standard */
    { "gst",	tZONE,     HOUR ( 3) },	/* Greenland Standard */
#endif
#if 0
    { "nft",	tZONE,     HOUR (3.5) },	/* Newfoundland */
    { "nst",	tZONE,     HOUR (3.5) },	/* Newfoundland Standard */
    { "ndt",	tDAYZONE,  HOUR (3.5) },	/* Newfoundland Daylight */
#endif
    { "ast",	tZONE,     HOUR ( 4) },	/* Atlantic Standard */
    { "adt",	tDAYZONE,  HOUR ( 4) },	/* Atlantic Daylight */
    { "est",	tZONE,     HOUR ( 5) },	/* Eastern Standard */
    { "edt",	tDAYZONE,  HOUR ( 5) },	/* Eastern Daylight */
    { "cst",	tZONE,     HOUR ( 6) },	/* Central Standard */
    { "cdt",	tDAYZONE,  HOUR ( 6) },	/* Central Daylight */
    { "mst",	tZONE,     HOUR ( 7) },	/* Mountain Standard */
    { "mdt",	tDAYZONE,  HOUR ( 7) },	/* Mountain Daylight */
    { "pst",	tZONE,     HOUR ( 8) },	/* Pacific Standard */
    { "pdt",	tDAYZONE,  HOUR ( 8) },	/* Pacific Daylight */
    { "yst",	tZONE,     HOUR ( 9) },	/* Yukon Standard */
    { "ydt",	tDAYZONE,  HOUR ( 9) },	/* Yukon Daylight */
    { "hst",	tZONE,     HOUR (10) },	/* Hawaii Standard */
    { "hdt",	tDAYZONE,  HOUR (10) },	/* Hawaii Daylight */
    { "cat",	tZONE,     HOUR (10) },	/* Central Alaska */
    { "ahst",	tZONE,     HOUR (10) },	/* Alaska-Hawaii Standard */
    { "nt",	tZONE,     HOUR (11) },	/* Nome */
    { "idlw",	tZONE,     HOUR (12) },	/* International Date Line West */
    { "cet",	tZONE,     -HOUR (1) },	/* Central European */
    { "met",	tZONE,     -HOUR (1) },	/* Middle European */
    { "mewt",	tZONE,     -HOUR (1) },	/* Middle European Winter */
    { "mest",	tDAYZONE,  -HOUR (1) },	/* Middle European Summer */
    { "mesz",	tDAYZONE,  -HOUR (1) },	/* Middle European Summer */
    { "swt",	tZONE,     -HOUR (1) },	/* Swedish Winter */
    { "sst",	tDAYZONE,  -HOUR (1) },	/* Swedish Summer */
    { "fwt",	tZONE,     -HOUR (1) },	/* French Winter */
    { "fst",	tDAYZONE,  -HOUR (1) },	/* French Summer */
    { "eet",	tZONE,     -HOUR (2) },	/* Eastern Europe, USSR Zone 1 */
    { "bt",	tZONE,     -HOUR (3) },	/* Baghdad, USSR Zone 2 */
#if 0
    { "it",	tZONE,     -HOUR (3.5) },/* Iran */
#endif
    { "zp4",	tZONE,     -HOUR (4) },	/* USSR Zone 3 */
    { "zp5",	tZONE,     -HOUR (5) },	/* USSR Zone 4 */
#if 0
    { "ist",	tZONE,     -HOUR (5.5) },/* Indian Standard */
#endif
    { "zp6",	tZONE,     -HOUR (6) },	/* USSR Zone 5 */
#if	0
    /* For completeness.  NST is also Newfoundland Standard, and SST is
     * also Swedish Summer. */
    { "nst",	tZONE,     -HOUR (6.5) },/* North Sumatra */
    { "sst",	tZONE,     -HOUR (7) },	/* South Sumatra, USSR Zone 6 */
#endif	/* 0 */
    { "wast",	tZONE,     -HOUR (7) },	/* West Australian Standard */
    { "wadt",	tDAYZONE,  -HOUR (7) },	/* West Australian Daylight */
#if 0
    { "jt",	tZONE,     -HOUR (7.5) },/* Java (3pm in Cronusland!) */
#endif
    { "cct",	tZONE,     -HOUR (8) },	/* China Coast, USSR Zone 7 */
    { "jst",	tZONE,     -HOUR (9) },	/* Japan Standard, USSR Zone 8 */
#if 0
    { "cast",	tZONE,     -HOUR (9.5) },/* Central Australian Standard */
    { "cadt",	tDAYZONE,  -HOUR (9.5) },/* Central Australian Daylight */
#endif
    { "east",	tZONE,     -HOUR (10) },	/* Eastern Australian Standard */
    { "eadt",	tDAYZONE,  -HOUR (10) },	/* Eastern Australian Daylight */
    { "gst",	tZONE,     -HOUR (10) },	/* Guam Standard, USSR Zone 9 */
    { "nzt",	tZONE,     -HOUR (12) },	/* New Zealand */
    { "nzst",	tZONE,     -HOUR (12) },	/* New Zealand Standard */
    { "nzdt",	tDAYZONE,  -HOUR (12) },	/* New Zealand Daylight */
    { "idle",	tZONE,     -HOUR (12) },	/* International Date Line East */
    {  NULL, 0, 0  }
};

/* Military timezone table. */
static TABLE const MilitaryTable[] = {
    { "a",	tZONE,	HOUR (  1) },
    { "b",	tZONE,	HOUR (  2) },
    { "c",	tZONE,	HOUR (  3) },
    { "d",	tZONE,	HOUR (  4) },
    { "e",	tZONE,	HOUR (  5) },
    { "f",	tZONE,	HOUR (  6) },
    { "g",	tZONE,	HOUR (  7) },
    { "h",	tZONE,	HOUR (  8) },
    { "i",	tZONE,	HOUR (  9) },
    { "k",	tZONE,	HOUR ( 10) },
    { "l",	tZONE,	HOUR ( 11) },
    { "m",	tZONE,	HOUR ( 12) },
    { "n",	tZONE,	HOUR (- 1) },
    { "o",	tZONE,	HOUR (- 2) },
    { "p",	tZONE,	HOUR (- 3) },
    { "q",	tZONE,	HOUR (- 4) },
    { "r",	tZONE,	HOUR (- 5) },
    { "s",	tZONE,	HOUR (- 6) },
    { "t",	tZONE,	HOUR (- 7) },
    { "u",	tZONE,	HOUR (- 8) },
    { "v",	tZONE,	HOUR (- 9) },
    { "w",	tZONE,	HOUR (-10) },
    { "x",	tZONE,	HOUR (-11) },
    { "y",	tZONE,	HOUR (-12) },
    { "z",	tZONE,	HOUR (  0) },
    { NULL, 0, 0 }
};




/* ARGSUSED */
static int
yyerror (s)
     char *s ATTRIBUTE_UNUSED;
{
  return 0;
}

static int
ToHour (Hours, Meridian)
     int Hours;
     MERIDIAN Meridian;
{
  switch (Meridian)
    {
    case MER24:
      if (Hours < 0 || Hours > 23)
	return -1;
      return Hours;
    case MERam:
      if (Hours < 1 || Hours > 12)
	return -1;
      if (Hours == 12)
	Hours = 0;
      return Hours;
    case MERpm:
      if (Hours < 1 || Hours > 12)
	return -1;
      if (Hours == 12)
	Hours = 0;
      return Hours + 12;
    default:
      abort ();
    }
  /* NOTREACHED */
}

static int
ToYear (Year)
     int Year;
{
  if (Year < 0)
    Year = -Year;

  /* XPG4 suggests that years 00-68 map to 2000-2068, and
     years 69-99 map to 1969-1999.  */
  if (Year < 69)
    Year += 2000;
  else if (Year < 100)
    Year += 1900;

  return Year;
}

static int
Daniel Stenberg's avatar
Daniel Stenberg committed
LookupWord (yylval, buff)
     YYSTYPE *yylval;
Daniel Stenberg's avatar
Daniel Stenberg committed
     char *buff;
{
  register char *p;
  register char *q;
  register const TABLE *tp;
  int i;
  int abbrev;

  /* Make it lowercase. */
  for (p = buff; *p; p++)
    if (ISUPPER ((unsigned char) *p))
      *p = tolower (*p);

  if (strcmp (buff, "am") == 0 || strcmp (buff, "a.m.") == 0)
    {
Daniel Stenberg's avatar
Daniel Stenberg committed
      yylval->Meridian = MERam;
Daniel Stenberg's avatar
Daniel Stenberg committed
      return tMERIDIAN;
    }
  if (strcmp (buff, "pm") == 0 || strcmp (buff, "p.m.") == 0)
    {
Daniel Stenberg's avatar
Daniel Stenberg committed
      yylval->Meridian = MERpm;
Daniel Stenberg's avatar
Daniel Stenberg committed
      return tMERIDIAN;
    }

  /* See if we have an abbreviation for a month. */
  if (strlen (buff) == 3)
    abbrev = 1;
  else if (strlen (buff) == 4 && buff[3] == '.')
    {
      abbrev = 1;
      buff[3] = '\0';
    }
  else
    abbrev = 0;

  for (tp = MonthDayTable; tp->name; tp++)
    {
      if (abbrev)
	{
	  if (strncmp (buff, tp->name, 3) == 0)
	    {
Daniel Stenberg's avatar
Daniel Stenberg committed
	      yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	      return tp->type;
	    }
	}
      else if (strcmp (buff, tp->name) == 0)
	{
Daniel Stenberg's avatar
Daniel Stenberg committed
	  yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	  return tp->type;
	}
    }

  for (tp = TimezoneTable; tp->name; tp++)
    if (strcmp (buff, tp->name) == 0)
      {
Daniel Stenberg's avatar
Daniel Stenberg committed
	yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	return tp->type;
      }

  if (strcmp (buff, "dst") == 0)
    return tDST;

  for (tp = UnitsTable; tp->name; tp++)
    if (strcmp (buff, tp->name) == 0)
      {
Daniel Stenberg's avatar
Daniel Stenberg committed
	yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	return tp->type;
      }

  /* Strip off any plural and try the units table again. */
  i = strlen (buff) - 1;
  if (buff[i] == 's')
    {
      buff[i] = '\0';
      for (tp = UnitsTable; tp->name; tp++)
	if (strcmp (buff, tp->name) == 0)
	  {
Daniel Stenberg's avatar
Daniel Stenberg committed
	    yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	    return tp->type;
	  }
      buff[i] = 's';		/* Put back for "this" in OtherTable. */
    }

  for (tp = OtherTable; tp->name; tp++)
    if (strcmp (buff, tp->name) == 0)
      {
Daniel Stenberg's avatar
Daniel Stenberg committed
	yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	return tp->type;
      }

  /* Military timezones. */
  if (buff[1] == '\0' && ISALPHA ((unsigned char) *buff))
    {
      for (tp = MilitaryTable; tp->name; tp++)
	if (strcmp (buff, tp->name) == 0)
	  {
Daniel Stenberg's avatar
Daniel Stenberg committed
	    yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	    return tp->type;
	  }
    }

  /* Drop out any periods and try the timezone table again. */
  for (i = 0, p = q = buff; *q; q++)
    if (*q != '.')
      *p++ = *q;
    else
      i++;
  *p = '\0';
  if (i)
    for (tp = TimezoneTable; tp->name; tp++)
      if (strcmp (buff, tp->name) == 0)
	{
Daniel Stenberg's avatar
Daniel Stenberg committed
	  yylval->Number = tp->value;
Daniel Stenberg's avatar
Daniel Stenberg committed
	  return tp->type;
	}

  return tID;
}

static int
Daniel Stenberg's avatar
Daniel Stenberg committed
yylex (yylval, cookie)
     YYSTYPE *yylval;
     void *cookie;
Daniel Stenberg's avatar
Daniel Stenberg committed
{
  register unsigned char c;
  register char *p;
  char buff[20];
  int Count;
  int sign;

  for (;;)
    {
Daniel Stenberg's avatar
Daniel Stenberg committed
      while (ISSPACE ((unsigned char) *context->yyInput))
	context->yyInput++;
Daniel Stenberg's avatar
Daniel Stenberg committed

Daniel Stenberg's avatar
Daniel Stenberg committed
      if (ISDIGIT (c = *context->yyInput) || c == '-' || c == '+')
Daniel Stenberg's avatar
Daniel Stenberg committed
	{
	  if (c == '-' || c == '+')
	    {
	      sign = c == '-' ? -1 : 1;
Daniel Stenberg's avatar
Daniel Stenberg committed
	      if (!ISDIGIT (*++context->yyInput))
Daniel Stenberg's avatar
Daniel Stenberg committed
		/* skip the '-' sign */
		continue;
	    }
	  else
	    sign = 0;
Daniel Stenberg's avatar
Daniel Stenberg committed
	  for (yylval->Number = 0; ISDIGIT (c = *context->yyInput++);)
	    yylval->Number = 10 * yylval->Number + c - '0';
	  context->yyInput--;
Daniel Stenberg's avatar
Daniel Stenberg committed
	  if (sign < 0)
Daniel Stenberg's avatar
Daniel Stenberg committed
	    yylval->Number = -yylval->Number;
Daniel Stenberg's avatar
Daniel Stenberg committed
	  return sign ? tSNUMBER : tUNUMBER;
	}
      if (ISALPHA (c))
	{
Daniel Stenberg's avatar
Daniel Stenberg committed
	  for (p = buff; (c = *context->yyInput++, ISALPHA (c)) || c == '.';)
Daniel Stenberg's avatar
Daniel Stenberg committed
	    if (p < &buff[sizeof buff - 1])
	      *p++ = c;
	  *p = '\0';
Daniel Stenberg's avatar
Daniel Stenberg committed
	  context->yyInput--;
	  return LookupWord (yylval, buff);
Daniel Stenberg's avatar
Daniel Stenberg committed
	}
      if (c != '(')
Daniel Stenberg's avatar
Daniel Stenberg committed
	return *context->yyInput++;
Daniel Stenberg's avatar
Daniel Stenberg committed
      Count = 0;
      do
	{
Daniel Stenberg's avatar
Daniel Stenberg committed
	  c = *context->yyInput++;
Daniel Stenberg's avatar
Daniel Stenberg committed
	  if (c == '\0')
	    return c;
	  if (c == '(')
	    Count++;
	  else if (c == ')')
	    Count--;
	}
      while (Count > 0);
    }
}

#define TM_YEAR_ORIGIN 1900

/* Yield A - B, measured in seconds.  */
static long
difftm (struct tm *a, struct tm *b)
{
  int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
  int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
  long days = (
  /* difference in day of year */
		a->tm_yday - b->tm_yday
  /* + intervening leap days */
		+ ((ay >> 2) - (by >> 2))
		- (ay / 100 - by / 100)
		+ ((ay / 100 >> 2) - (by / 100 >> 2))
  /* + difference in years * 365 */
		+ (long) (ay - by) * 365
  );
  return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
		+ (a->tm_min - b->tm_min))
	  + (a->tm_sec - b->tm_sec));
}

time_t
curl_getdate (const char *p, const time_t *now)
Daniel Stenberg's avatar
Daniel Stenberg committed
{
  struct tm tm, tm0, *tmp;
  time_t Start;
  CURL_CONTEXT cookie;
#ifdef HAVE_LOCALTIME_R
  struct tm keeptime;
#endif
Daniel Stenberg's avatar
Daniel Stenberg committed
  cookie.yyInput = p;
Daniel Stenberg's avatar
Daniel Stenberg committed
  Start = now ? *now : time ((time_t *) NULL);
  tmp = (struct tm *)localtime_r(&Start, &keeptime);
Daniel Stenberg's avatar
Daniel Stenberg committed
  tmp = localtime (&Start);