Blame src/parsdate.c

Packit f574b8
/* original parser id follows */
Packit f574b8
/* yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93" */
Packit f574b8
/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
Packit f574b8
Packit f574b8
#define YYBYACC 1
Packit f574b8
#define YYMAJOR 1
Packit f574b8
#define YYMINOR 9
Packit f574b8
#define YYPATCH 20170709
Packit f574b8
Packit f574b8
#define YYEMPTY        (-1)
Packit f574b8
#define yyclearin      (yychar = YYEMPTY)
Packit f574b8
#define yyerrok        (yyerrflag = 0)
Packit f574b8
#define YYRECOVERING() (yyerrflag != 0)
Packit f574b8
#define YYENOMEM       (-2)
Packit f574b8
#define YYEOF          0
Packit f574b8
#define YYPREFIX "yy"
Packit f574b8
Packit f574b8
#define YYPURE 0
Packit f574b8
Packit f574b8
#line 2 "./parsdate.y"
Packit f574b8
Packit f574b8
#include <LYLeaks.h>
Packit f574b8
Packit f574b8
/*
Packit f574b8
 *  $LynxId: parsdate.c,v 1.18 2018/04/01 22:22:06 tom Exp $
Packit f574b8
 *
Packit f574b8
 *  This module is adapted and extended from tin, to use for LYmktime().
Packit f574b8
 *
Packit f574b8
 *  Project   : tin - a Usenet reader
Packit f574b8
 *  Module    : parsedate.y
Packit f574b8
 *  Author    : S. Bellovin, R. $alz, J. Berets, P. Eggert
Packit f574b8
 *  Created   : 1990-08-01
Packit f574b8
 *  Updated   : 2008-06-30 (by Thomas Dickey, for Lynx)
Packit f574b8
 *  Notes     : This grammar has 8 shift/reduce conflicts.
Packit f574b8
 *
Packit f574b8
 *              Originally written by Steven M. Bellovin <smb@research.att.com>
Packit f574b8
 *              while at the University of North Carolina at Chapel Hill.
Packit f574b8
 *              Later tweaked by a couple of people on Usenet.  Completely
Packit f574b8
 *              overhauled by Rich $alz <rsalz@osf.org> and Jim Berets
Packit f574b8
 *              <jberets@bbn.com> in August, 1990.
Packit f574b8
 *
Packit f574b8
 *              Further revised (removed obsolete constructs and cleaned up
Packit f574b8
 *              timezone names) in August, 1991, by Rich.
Packit f574b8
 *              Paul Eggert <eggert@twinsun.com> helped in September 1992.
Packit f574b8
 *              Roland Rosenfeld added MET DST code in April 1994.
Packit f574b8
 *
Packit f574b8
 *  Revision  : 1.13
Packit f574b8
 *  Copyright : This code is in the public domain and has no copyright.
Packit f574b8
 */
Packit f574b8
Packit f574b8
/* SUPPRESS 530 */ /* Empty body for statement */
Packit f574b8
/* SUPPRESS 593 on yyerrlab */ /* Label was not used */
Packit f574b8
/* SUPPRESS 593 on yynewstate */ /* Label was not used */
Packit f574b8
/* SUPPRESS 595 on yypvt */ /* Automatic variable may be used before set */
Packit f574b8
Packit f574b8
#undef alloca			/* conflicting def may be set by yacc */
Packit f574b8
#include <parsdate.h>
Packit f574b8
Packit f574b8
/*
Packit f574b8
**  Get the number of elements in a fixed-size array, or a pointer just
Packit f574b8
**  past the end of it.
Packit f574b8
*/
Packit f574b8
#define ENDOF(array)	(&array[ARRAY_SIZE(array)])
Packit f574b8
Packit f574b8
#ifdef EBCDIC
Packit f574b8
#define TO_ASCII(c)	TOASCII(c)
Packit f574b8
#define TO_LOCAL(c)	FROMASCII(c)
Packit f574b8
#else
Packit f574b8
#define TO_ASCII(c)	(c)
Packit f574b8
#define TO_LOCAL(c)	(c)
Packit f574b8
#endif
Packit f574b8
Packit f574b8
#define IS7BIT(x)		((unsigned) TO_ASCII(x) < 128)
Packit f574b8
#define CTYPE(isXXXXX, c)	(IS7BIT(c) && isXXXXX(((unsigned char)c)))
Packit f574b8
Packit f574b8
typedef char *PD_STRING;
Packit f574b8
Packit f574b8
extern int date_parse(void);
Packit f574b8
Packit f574b8
#define yyparse		date_parse
Packit f574b8
#define yylex		date_lex
Packit f574b8
#define yyerror		date_error
Packit f574b8
Packit f574b8
    /* See the LeapYears table in Convert. */
Packit f574b8
#define EPOCH		1970
Packit f574b8
#define END_OF_TIME	2038
Packit f574b8
Packit f574b8
    /* Constants for general time calculations. */
Packit f574b8
#define DST_OFFSET	1
Packit f574b8
#define SECSPERDAY	(24L * 60L * 60L)
Packit f574b8
    /* Readability for TABLE stuff. */
Packit f574b8
#define HOUR(x)		(x * 60)
Packit f574b8
Packit f574b8
#define LPAREN		'('
Packit f574b8
#define RPAREN		')'
Packit f574b8
Packit f574b8
/*
Packit f574b8
**  Daylight-savings mode:  on, off, or not yet known.
Packit f574b8
*/
Packit f574b8
typedef enum _DSTMODE {
Packit f574b8
    DSTon, DSToff, DSTmaybe
Packit f574b8
} DSTMODE;
Packit f574b8
Packit f574b8
/*
Packit f574b8
**  Meridian:  am, pm, or 24-hour style.
Packit f574b8
*/
Packit f574b8
typedef enum _MERIDIAN {
Packit f574b8
    MERam, MERpm, MER24
Packit f574b8
} MERIDIAN;
Packit f574b8
Packit f574b8
/*
Packit f574b8
**  Global variables.  We could get rid of most of them by using a yacc
Packit f574b8
**  union, but this is more efficient.  (This routine predates the
Packit f574b8
**  yacc %union construct.)
Packit f574b8
*/
Packit f574b8
static char *yyInput;
Packit f574b8
static DSTMODE yyDSTmode;
Packit f574b8
static int yyHaveDate;
Packit f574b8
static int yyHaveRel;
Packit f574b8
static int yyHaveTime;
Packit f574b8
static time_t yyTimezone;
Packit f574b8
static time_t yyDay;
Packit f574b8
static time_t yyHour;
Packit f574b8
static time_t yyMinutes;
Packit f574b8
static time_t yyMonth;
Packit f574b8
static time_t yySeconds;
Packit f574b8
static time_t yyYear;
Packit f574b8
static MERIDIAN yyMeridian;
Packit f574b8
static time_t yyRelMonth;
Packit f574b8
static time_t yyRelSeconds;
Packit f574b8
Packit f574b8
static time_t ToSeconds(time_t, time_t, time_t, MERIDIAN);
Packit f574b8
static time_t Convert(time_t, time_t, time_t, time_t, time_t, time_t,
Packit f574b8
		      MERIDIAN, DSTMODE);
Packit f574b8
static time_t DSTcorrect(time_t, time_t);
Packit f574b8
static time_t RelativeMonth(time_t, time_t);
Packit f574b8
static int LookupWord(char *, int);
Packit f574b8
static int date_lex(void);
Packit f574b8
static int GetTimeInfo(TIMEINFO * Now);
Packit f574b8
Packit f574b8
/*
Packit f574b8
 * The 'date_error()' function is declared here to work around a defect in
Packit f574b8
 * bison 1.22, which redefines 'const' further down in this file, making it
Packit f574b8
 * impossible to put a prototype here, and the function later.  We're using
Packit f574b8
 * 'const' on the parameter to quiet gcc's -Wwrite-strings warning.
Packit f574b8
 */
Packit f574b8
/*ARGSUSED*/
Packit f574b8
static void date_error(const char GCC_UNUSED *s)
Packit f574b8
{
Packit f574b8
    /*NOTREACHED */
Packit f574b8
}
Packit f574b8
Packit f574b8
#ifdef YYSTYPE
Packit f574b8
#undef  YYSTYPE_IS_DECLARED
Packit f574b8
#define YYSTYPE_IS_DECLARED 1
Packit f574b8
#endif
Packit f574b8
#ifndef YYSTYPE_IS_DECLARED
Packit f574b8
#define YYSTYPE_IS_DECLARED 1
Packit f574b8
#line 136 "./parsdate.y"
Packit f574b8
typedef union {
Packit f574b8
    time_t		Number;
Packit f574b8
    enum _MERIDIAN	Meridian;
Packit f574b8
} YYSTYPE;
Packit f574b8
#endif /* !YYSTYPE_IS_DECLARED */
Packit f574b8
#line 166 "y.tab.c"
Packit f574b8
Packit f574b8
/* compatibility with bison */
Packit f574b8
#ifdef YYPARSE_PARAM
Packit f574b8
/* compatibility with FreeBSD */
Packit f574b8
# ifdef YYPARSE_PARAM_TYPE
Packit f574b8
#  define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
Packit f574b8
# else
Packit f574b8
#  define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
Packit f574b8
# endif
Packit f574b8
#else
Packit f574b8
# define YYPARSE_DECL() yyparse(void)
Packit f574b8
#endif
Packit f574b8
Packit f574b8
/* Parameters sent to lex. */
Packit f574b8
#ifdef YYLEX_PARAM
Packit f574b8
# define YYLEX_DECL() yylex(void *YYLEX_PARAM)
Packit f574b8
# define YYLEX yylex(YYLEX_PARAM)
Packit f574b8
#else
Packit f574b8
# define YYLEX_DECL() yylex(void)
Packit f574b8
# define YYLEX yylex()
Packit f574b8
#endif
Packit f574b8
Packit f574b8
/* Parameters sent to yyerror. */
Packit f574b8
#ifndef YYERROR_DECL
Packit f574b8
#define YYERROR_DECL() yyerror(const char *s)
Packit f574b8
#endif
Packit f574b8
#ifndef YYERROR_CALL
Packit f574b8
#define YYERROR_CALL(msg) yyerror(msg)
Packit f574b8
#endif
Packit f574b8
Packit f574b8
extern int YYPARSE_DECL();
Packit f574b8
Packit f574b8
#define tDAY 257
Packit f574b8
#define tDAYZONE 258
Packit f574b8
#define tMERIDIAN 259
Packit f574b8
#define tMONTH 260
Packit f574b8
#define tMONTH_UNIT 261
Packit f574b8
#define tSEC_UNIT 262
Packit f574b8
#define tSNUMBER 263
Packit f574b8
#define tUNUMBER 264
Packit f574b8
#define tZONE 265
Packit f574b8
#define tDST 266
Packit f574b8
#define YYERRCODE 256
Packit f574b8
typedef short YYINT;
Packit f574b8
static const YYINT yylhs[] = {                           -1,
Packit f574b8
    0,    0,    4,    4,    4,    4,    4,    4,    5,    5,
Packit f574b8
    5,    5,    5,    2,    2,    2,    2,    2,    1,    6,
Packit f574b8
    6,    6,    6,    6,    6,    6,    6,    6,    7,    8,
Packit f574b8
    8,    8,    8,    3,    3,
Packit f574b8
};
Packit f574b8
static const YYINT yylen[] = {                            2,
Packit f574b8
    0,    2,    1,    2,    1,    1,    2,    1,    2,    4,
Packit f574b8
    4,    6,    6,    1,    1,    2,    2,    1,    1,    3,
Packit f574b8
    5,    2,    4,    2,    3,    5,    6,    3,    9,    2,
Packit f574b8
    2,    2,    2,    0,    1,
Packit f574b8
};
Packit f574b8
static const YYINT yydefred[] = {                         1,
Packit f574b8
    0,    0,    0,    0,    0,    2,    0,    5,    0,    8,
Packit f574b8
    0,    0,    0,   32,   30,   35,    0,   33,   31,    0,
Packit f574b8
    0,    0,    9,    0,   19,    0,   18,    4,    7,    0,
Packit f574b8
    0,    0,   25,   28,    0,    0,   16,   17,    0,    0,
Packit f574b8
    0,   23,    0,   11,   10,    0,    0,   26,    0,    0,
Packit f574b8
   21,    0,   27,   13,   12,    0,    0,   29,
Packit f574b8
};
Packit f574b8
static const YYINT yydgoto[] = {                          1,
Packit f574b8
   27,   28,   23,    6,    7,    8,    9,   10,
Packit f574b8
};
Packit f574b8
static const YYINT yysindex[] = {                         0,
Packit f574b8
 -240,  -41, -256, -227,  -45,    0, -251,    0, -251,    0,
Packit f574b8
 -254, -249,  -22,    0,    0,    0, -237,    0,    0, -235,
Packit f574b8
 -228, -226,    0, -236,    0, -224,    0,    0,    0, -223,
Packit f574b8
  -39, -222,    0,    0,  -58,   -7,    0,    0,  -15, -220,
Packit f574b8
 -215,    0, -218,    0,    0, -217, -216,    0, -214, -234,
Packit f574b8
    0,   -8,    0,    0,    0, -213, -212,    0,
Packit f574b8
};
Packit f574b8
static const YYINT yyrindex[] = {                         0,
Packit f574b8
    0,    0,    0,    0,    5,    0,   26,    0,   31,    0,
Packit f574b8
    0,    0,   11,    0,    0,    0,   37,    0,    0,    0,
Packit f574b8
    0,    0,    0,   16,    0,   32,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    1,   21,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
};
Packit f574b8
static const YYINT yygindex[] = {                         0,
Packit f574b8
  -17,   44,  -31,    0,    0,    0,    0,    0,
Packit f574b8
};
Packit f574b8
#define YYTABLESIZE 300
Packit f574b8
static const YYINT yytable[] = {                         43,
Packit f574b8
   34,   22,   12,   45,   34,   41,   24,   13,   38,   30,
Packit f574b8
   22,   25,   21,   26,   31,   15,    2,   44,   55,    3,
Packit f574b8
   20,   32,    4,    5,   16,    3,   33,   34,   25,   37,
Packit f574b8
    6,   14,   54,   14,   15,   35,   24,   36,   25,   46,
Packit f574b8
   39,   42,   47,   48,   49,   50,   51,   52,   53,   56,
Packit f574b8
   57,   58,   29,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
   16,    0,    0,    0,   25,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,   16,   17,   18,   19,   20,   11,    0,
Packit f574b8
   40,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
Packit f574b8
    0,    0,    0,    0,    0,    0,    0,   34,   34,    0,
Packit f574b8
   34,   34,   34,    0,   34,   34,    0,   22,   34,   34,
Packit f574b8
   22,    0,   15,   22,   22,   15,    0,   20,   15,   15,
Packit f574b8
   20,    0,    3,   20,   20,    3,    0,    6,   14,    3,
Packit f574b8
    6,   14,    0,   24,    6,   14,   24,    0,    0,   24,
Packit f574b8
};
Packit f574b8
static const YYINT yycheck[] = {                         58,
Packit f574b8
    0,   47,   44,   35,    0,   45,  258,  264,   26,  264,
Packit f574b8
    0,  263,   58,  265,  264,    0,  257,   35,   50,  260,
Packit f574b8
    0,   44,  263,  264,  259,    0,  264,  263,  263,  266,
Packit f574b8
    0,    0,   50,  261,  262,  264,    0,  264,  263,   47,
Packit f574b8
  264,  264,   58,  264,  260,  264,  264,  264,  263,   58,
Packit f574b8
  264,  264,    9,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
  259,   -1,   -1,   -1,  263,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,  259,  260,  261,  262,  263,  260,   -1,
Packit f574b8
  260,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
Packit f574b8
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,   -1,
Packit f574b8
  260,  257,  258,   -1,  264,  265,   -1,  257,  264,  265,
Packit f574b8
  260,   -1,  257,  263,  264,  260,   -1,  257,  263,  264,
Packit f574b8
  260,   -1,  257,  263,  264,  260,   -1,  257,  257,  264,
Packit f574b8
  260,  260,   -1,  257,  264,  264,  260,   -1,   -1,  263,
Packit f574b8
};
Packit f574b8
#define YYFINAL 1
Packit f574b8
#ifndef YYDEBUG
Packit f574b8
#define YYDEBUG 0
Packit f574b8
#endif
Packit f574b8
#define YYMAXTOKEN 266
Packit f574b8
#define YYUNDFTOKEN 277
Packit f574b8
#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
Packit f574b8
#if YYDEBUG
Packit f574b8
static const char *const yyname[] = {
Packit f574b8
Packit f574b8
"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Packit f574b8
0,0,0,0,0,0,0,0,0,0,"','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0,0,0,
Packit f574b8
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Packit f574b8
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Packit f574b8
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Packit f574b8
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Packit f574b8
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"tDAY","tDAYZONE",
Packit f574b8
"tMERIDIAN","tMONTH","tMONTH_UNIT","tSEC_UNIT","tSNUMBER","tUNUMBER","tZONE",
Packit f574b8
"tDST",0,0,0,0,0,0,0,0,0,0,"illegal-symbol",
Packit f574b8
};
Packit f574b8
static const char *const yyrule[] = {
Packit f574b8
"$accept : spec",
Packit f574b8
"spec :",
Packit f574b8
"spec : spec item",
Packit f574b8
"item : time",
Packit f574b8
"item : time zone",
Packit f574b8
"item : date",
Packit f574b8
"item : both",
Packit f574b8
"item : both zone",
Packit f574b8
"item : rel",
Packit f574b8
"time : tUNUMBER o_merid",
Packit f574b8
"time : tUNUMBER ':' tUNUMBER o_merid",
Packit f574b8
"time : tUNUMBER ':' tUNUMBER numzone",
Packit f574b8
"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid",
Packit f574b8
"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER numzone",
Packit f574b8
"zone : tZONE",
Packit f574b8
"zone : tDAYZONE",
Packit f574b8
"zone : tDAYZONE tDST",
Packit f574b8
"zone : tZONE numzone",
Packit f574b8
"zone : numzone",
Packit f574b8
"numzone : tSNUMBER",
Packit f574b8
"date : tUNUMBER '/' tUNUMBER",
Packit f574b8
"date : tUNUMBER '/' tUNUMBER '/' tUNUMBER",
Packit f574b8
"date : tMONTH tUNUMBER",
Packit f574b8
"date : tMONTH tUNUMBER ',' tUNUMBER",
Packit f574b8
"date : tUNUMBER tMONTH",
Packit f574b8
"date : tUNUMBER tMONTH tUNUMBER",
Packit f574b8
"date : tDAY ',' tUNUMBER tMONTH tUNUMBER",
Packit f574b8
"date : tDAY ',' tUNUMBER '-' tMONTH tSNUMBER",
Packit f574b8
"date : tUNUMBER tSNUMBER tSNUMBER",
Packit f574b8
"both : tDAY tMONTH tUNUMBER tUNUMBER ':' tUNUMBER ':' tUNUMBER tUNUMBER",
Packit f574b8
"rel : tSNUMBER tSEC_UNIT",
Packit f574b8
"rel : tUNUMBER tSEC_UNIT",
Packit f574b8
"rel : tSNUMBER tMONTH_UNIT",
Packit f574b8
"rel : tUNUMBER tMONTH_UNIT",
Packit f574b8
"o_merid :",
Packit f574b8
"o_merid : tMERIDIAN",
Packit f574b8
Packit f574b8
};
Packit f574b8
#endif
Packit f574b8
Packit f574b8
int      yydebug;
Packit f574b8
int      yynerrs;
Packit f574b8
Packit f574b8
int      yyerrflag;
Packit f574b8
int      yychar;
Packit f574b8
YYSTYPE  yyval;
Packit f574b8
YYSTYPE  yylval;
Packit f574b8
Packit f574b8
/* define the initial stack-sizes */
Packit f574b8
#ifdef YYSTACKSIZE
Packit f574b8
#undef YYMAXDEPTH
Packit f574b8
#define YYMAXDEPTH  YYSTACKSIZE
Packit f574b8
#else
Packit f574b8
#ifdef YYMAXDEPTH
Packit f574b8
#define YYSTACKSIZE YYMAXDEPTH
Packit f574b8
#else
Packit f574b8
#define YYSTACKSIZE 10000
Packit f574b8
#define YYMAXDEPTH  10000
Packit f574b8
#endif
Packit f574b8
#endif
Packit f574b8
Packit f574b8
#define YYINITSTACKSIZE 200
Packit f574b8
Packit f574b8
typedef struct {
Packit f574b8
    unsigned stacksize;
Packit f574b8
    YYINT    *s_base;
Packit f574b8
    YYINT    *s_mark;
Packit f574b8
    YYINT    *s_last;
Packit f574b8
    YYSTYPE  *l_base;
Packit f574b8
    YYSTYPE  *l_mark;
Packit f574b8
} YYSTACKDATA;
Packit f574b8
/* variables for the parser stack */
Packit f574b8
static YYSTACKDATA yystack;
Packit f574b8
#line 358 "./parsdate.y"
Packit f574b8
Packit f574b8
Packit f574b8
/*
Packit f574b8
**  An entry in the lexical lookup table.
Packit f574b8
*/
Packit f574b8
/* *INDENT-OFF* */
Packit f574b8
typedef struct _TABLE {
Packit f574b8
    const char *name;
Packit f574b8
    int		type;
Packit f574b8
    time_t	value;
Packit f574b8
} TABLE;
Packit f574b8
Packit f574b8
/* Month and day table. */
Packit f574b8
static const TABLE MonthDayTable[] = {
Packit f574b8
    { "january",	tMONTH,  1 },
Packit f574b8
    { "february",	tMONTH,  2 },
Packit f574b8
    { "march",		tMONTH,  3 },
Packit f574b8
    { "april",		tMONTH,  4 },
Packit f574b8
    { "may",		tMONTH,  5 },
Packit f574b8
    { "june",		tMONTH,  6 },
Packit f574b8
    { "july",		tMONTH,  7 },
Packit f574b8
    { "august",		tMONTH,  8 },
Packit f574b8
    { "september",	tMONTH,  9 },
Packit f574b8
    { "october",	tMONTH, 10 },
Packit f574b8
    { "november",	tMONTH, 11 },
Packit f574b8
    { "december",	tMONTH, 12 },
Packit f574b8
	/* The value of the day isn't used... */
Packit f574b8
    { "sunday",		tDAY, 0 },
Packit f574b8
    { "monday",		tDAY, 0 },
Packit f574b8
    { "tuesday",	tDAY, 0 },
Packit f574b8
    { "wednesday",	tDAY, 0 },
Packit f574b8
    { "thursday",	tDAY, 0 },
Packit f574b8
    { "friday",		tDAY, 0 },
Packit f574b8
    { "saturday",	tDAY, 0 },
Packit f574b8
};
Packit f574b8
Packit f574b8
/* Time units table. */
Packit f574b8
static const TABLE	UnitsTable[] = {
Packit f574b8
    { "year",		tMONTH_UNIT,	12 },
Packit f574b8
    { "month",		tMONTH_UNIT,	1 },
Packit f574b8
    { "week",		tSEC_UNIT,	7 * 24 * 60 * 60 },
Packit f574b8
    { "day",		tSEC_UNIT,	1 * 24 * 60 * 60 },
Packit f574b8
    { "hour",		tSEC_UNIT,	60 * 60 },
Packit f574b8
    { "minute",		tSEC_UNIT,	60 },
Packit f574b8
    { "min",		tSEC_UNIT,	60 },
Packit f574b8
    { "second",		tSEC_UNIT,	1 },
Packit f574b8
    { "sec",		tSEC_UNIT,	1 },
Packit f574b8
};
Packit f574b8
Packit f574b8
/* Timezone table. */
Packit f574b8
static const TABLE	TimezoneTable[] = {
Packit f574b8
    { "gmt",	tZONE,     HOUR( 0) },	/* Greenwich Mean */
Packit f574b8
    { "ut",	tZONE,     HOUR( 0) },	/* Universal */
Packit f574b8
    { "utc",	tZONE,     HOUR( 0) },	/* Universal Coordinated */
Packit f574b8
    { "cut",	tZONE,     HOUR( 0) },	/* Coordinated Universal */
Packit f574b8
    { "z",	tZONE,     HOUR( 0) },	/* Greenwich Mean */
Packit f574b8
    { "wet",	tZONE,     HOUR( 0) },	/* Western European */
Packit f574b8
    { "bst",	tDAYZONE,  HOUR( 0) },	/* British Summer */
Packit f574b8
    { "nst",	tZONE,     HOUR(3)+30 }, /* Newfoundland Standard */
Packit f574b8
    { "ndt",	tDAYZONE,  HOUR(3)+30 }, /* Newfoundland Daylight */
Packit f574b8
    { "ast",	tZONE,     HOUR( 4) },	/* Atlantic Standard */
Packit f574b8
    { "adt",	tDAYZONE,  HOUR( 4) },	/* Atlantic Daylight */
Packit f574b8
    { "est",	tZONE,     HOUR( 5) },	/* Eastern Standard */
Packit f574b8
    { "edt",	tDAYZONE,  HOUR( 5) },	/* Eastern Daylight */
Packit f574b8
    { "cst",	tZONE,     HOUR( 6) },	/* Central Standard */
Packit f574b8
    { "cdt",	tDAYZONE,  HOUR( 6) },	/* Central Daylight */
Packit f574b8
    { "mst",	tZONE,     HOUR( 7) },	/* Mountain Standard */
Packit f574b8
    { "mdt",	tDAYZONE,  HOUR( 7) },	/* Mountain Daylight */
Packit f574b8
    { "pst",	tZONE,     HOUR( 8) },	/* Pacific Standard */
Packit f574b8
    { "pdt",	tDAYZONE,  HOUR( 8) },	/* Pacific Daylight */
Packit f574b8
    { "yst",	tZONE,     HOUR( 9) },	/* Yukon Standard */
Packit f574b8
    { "ydt",	tDAYZONE,  HOUR( 9) },	/* Yukon Daylight */
Packit f574b8
    { "akst",	tZONE,     HOUR( 9) },	/* Alaska Standard */
Packit f574b8
    { "akdt",	tDAYZONE,  HOUR( 9) },	/* Alaska Daylight */
Packit f574b8
    { "hst",	tZONE,     HOUR(10) },	/* Hawaii Standard */
Packit f574b8
    { "hast",	tZONE,     HOUR(10) },	/* Hawaii-Aleutian Standard */
Packit f574b8
    { "hadt",	tDAYZONE,  HOUR(10) },	/* Hawaii-Aleutian Daylight */
Packit f574b8
    { "ces",	tDAYZONE,  -HOUR(1) },	/* Central European Summer */
Packit f574b8
    { "cest",	tDAYZONE,  -HOUR(1) },	/* Central European Summer */
Packit f574b8
    { "mez",	tZONE,     -HOUR(1) },	/* Middle European */
Packit f574b8
    { "mezt",	tDAYZONE,  -HOUR(1) },	/* Middle European Summer */
Packit f574b8
    { "cet",	tZONE,     -HOUR(1) },	/* Central European */
Packit f574b8
    { "met",	tZONE,     -HOUR(1) },	/* Middle European */
Packit f574b8
/* Additional aliases for MET / MET DST *************************************/
Packit f574b8
    { "mez",    tZONE,     -HOUR(1) },  /* Middle European */
Packit f574b8
    { "mewt",   tZONE,     -HOUR(1) },  /* Middle European Winter */
Packit f574b8
    { "mest",   tDAYZONE,  -HOUR(1) },  /* Middle European Summer */
Packit f574b8
    { "mes",    tDAYZONE,  -HOUR(1) },  /* Middle European Summer */
Packit f574b8
    { "mesz",   tDAYZONE,  -HOUR(1) },  /* Middle European Summer */
Packit f574b8
    { "msz",    tDAYZONE,  -HOUR(1) },  /* Middle European Summer */
Packit f574b8
    { "metdst", tDAYZONE,  -HOUR(1) },  /* Middle European Summer */
Packit f574b8
/****************************************************************************/
Packit f574b8
    { "eet",	tZONE,     -HOUR(2) },	/* Eastern Europe */
Packit f574b8
    { "msk",	tZONE,     -HOUR(3) },	/* Moscow Winter */
Packit f574b8
    { "msd",	tDAYZONE,  -HOUR(3) },	/* Moscow Summer */
Packit f574b8
    { "wast",	tZONE,     -HOUR(8) },	/* West Australian Standard */
Packit f574b8
    { "wadt",	tDAYZONE,  -HOUR(8) },	/* West Australian Daylight */
Packit f574b8
    { "hkt",	tZONE,     -HOUR(8) },	/* Hong Kong */
Packit f574b8
    { "cct",	tZONE,     -HOUR(8) },	/* China Coast */
Packit f574b8
    { "jst",	tZONE,     -HOUR(9) },	/* Japan Standard */
Packit f574b8
    { "kst",	tZONE,     -HOUR(9) },	/* Korean Standard */
Packit f574b8
    { "kdt",	tZONE,     -HOUR(9) },	/* Korean Daylight */
Packit f574b8
    { "cast",	tZONE,     -(HOUR(9)+30) }, /* Central Australian Standard */
Packit f574b8
    { "cadt",	tDAYZONE,  -(HOUR(9)+30) }, /* Central Australian Daylight */
Packit f574b8
    { "east",	tZONE,     -HOUR(10) },	/* Eastern Australian Standard */
Packit f574b8
    { "eadt",	tDAYZONE,  -HOUR(10) },	/* Eastern Australian Daylight */
Packit f574b8
    { "nzst",	tZONE,     -HOUR(12) },	/* New Zealand Standard */
Packit f574b8
    { "nzdt",	tDAYZONE,  -HOUR(12) },	/* New Zealand Daylight */
Packit f574b8
Packit f574b8
    /* For completeness we include the following entries. */
Packit f574b8
#if	0
Packit f574b8
Packit f574b8
    /* Duplicate names.  Either they conflict with a zone listed above
Packit f574b8
     * (which is either more likely to be seen or just been in circulation
Packit f574b8
     * longer), or they conflict with another zone in this section and
Packit f574b8
     * we could not reasonably choose one over the other. */
Packit f574b8
    { "fst",	tZONE,     HOUR( 2) },	/* Fernando De Noronha Standard */
Packit f574b8
    { "fdt",	tDAYZONE,  HOUR( 2) },	/* Fernando De Noronha Daylight */
Packit f574b8
    { "bst",	tZONE,     HOUR( 3) },	/* Brazil Standard */
Packit f574b8
    { "est",	tZONE,     HOUR( 3) },	/* Eastern Standard (Brazil) */
Packit f574b8
    { "edt",	tDAYZONE,  HOUR( 3) },	/* Eastern Daylight (Brazil) */
Packit f574b8
    { "wst",	tZONE,     HOUR( 4) },	/* Western Standard (Brazil) */
Packit f574b8
    { "wdt",	tDAYZONE,  HOUR( 4) },	/* Western Daylight (Brazil) */
Packit f574b8
    { "cst",	tZONE,     HOUR( 5) },	/* Chile Standard */
Packit f574b8
    { "cdt",	tDAYZONE,  HOUR( 5) },	/* Chile Daylight */
Packit f574b8
    { "ast",	tZONE,     HOUR( 5) },	/* Acre Standard */
Packit f574b8
    { "adt",	tDAYZONE,  HOUR( 5) },	/* Acre Daylight */
Packit f574b8
    { "cst",	tZONE,     HOUR( 5) },	/* Cuba Standard */
Packit f574b8
    { "cdt",	tDAYZONE,  HOUR( 5) },	/* Cuba Daylight */
Packit f574b8
    { "est",	tZONE,     HOUR( 6) },	/* Easter Island Standard */
Packit f574b8
    { "edt",	tDAYZONE,  HOUR( 6) },	/* Easter Island Daylight */
Packit f574b8
    { "sst",	tZONE,     HOUR(11) },	/* Samoa Standard */
Packit f574b8
    { "ist",	tZONE,     -HOUR(2) },	/* Israel Standard */
Packit f574b8
    { "idt",	tDAYZONE,  -HOUR(2) },	/* Israel Daylight */
Packit f574b8
    { "idt",	tDAYZONE,  -(HOUR(3)+30) }, /* Iran Daylight */
Packit f574b8
    { "ist",	tZONE,     -(HOUR(3)+30) }, /* Iran Standard */
Packit f574b8
    { "cst",	 tZONE,     -HOUR(8) },	/* China Standard */
Packit f574b8
    { "cdt",	 tDAYZONE,  -HOUR(8) },	/* China Daylight */
Packit f574b8
    { "sst",	 tZONE,     -HOUR(8) },	/* Singapore Standard */
Packit f574b8
Packit f574b8
    /* Dubious (e.g., not in Olson's TIMEZONE package) or obsolete. */
Packit f574b8
    { "gst",	tZONE,     HOUR( 3) },	/* Greenland Standard */
Packit f574b8
    { "wat",	tZONE,     -HOUR(1) },	/* West Africa */
Packit f574b8
    { "at",	tZONE,     HOUR( 2) },	/* Azores */
Packit f574b8
    { "gst",	tZONE,     -HOUR(10) },	/* Guam Standard */
Packit f574b8
    { "nft",	tZONE,     HOUR(3)+30 }, /* Newfoundland */
Packit f574b8
    { "idlw",	tZONE,     HOUR(12) },	/* International Date Line West */
Packit f574b8
    { "mewt",	tZONE,     -HOUR(1) },	/* Middle European Winter */
Packit f574b8
    { "mest",	tDAYZONE,  -HOUR(1) },	/* Middle European Summer */
Packit f574b8
    { "swt",	tZONE,     -HOUR(1) },	/* Swedish Winter */
Packit f574b8
    { "sst",	tDAYZONE,  -HOUR(1) },	/* Swedish Summer */
Packit f574b8
    { "fwt",	tZONE,     -HOUR(1) },	/* French Winter */
Packit f574b8
    { "fst",	tDAYZONE,  -HOUR(1) },	/* French Summer */
Packit f574b8
    { "bt",	tZONE,     -HOUR(3) },	/* Baghdad */
Packit f574b8
    { "it",	tZONE,     -(HOUR(3)+30) }, /* Iran */
Packit f574b8
    { "zp4",	tZONE,     -HOUR(4) },	/* USSR Zone 3 */
Packit f574b8
    { "zp5",	tZONE,     -HOUR(5) },	/* USSR Zone 4 */
Packit f574b8
    { "ist",	tZONE,     -(HOUR(5)+30) }, /* Indian Standard */
Packit f574b8
    { "zp6",	tZONE,     -HOUR(6) },	/* USSR Zone 5 */
Packit f574b8
    { "nst",	tZONE,     -HOUR(7) },	/* North Sumatra */
Packit f574b8
    { "sst",	tZONE,     -HOUR(7) },	/* South Sumatra */
Packit f574b8
    { "jt",	tZONE,     -(HOUR(7)+30) }, /* Java (3pm in Cronusland!) */
Packit f574b8
    { "nzt",	tZONE,     -HOUR(12) },	/* New Zealand */
Packit f574b8
    { "idle",	tZONE,     -HOUR(12) },	/* International Date Line East */
Packit f574b8
    { "cat",	tZONE,     HOUR(10) },	/* -- expired 1967 */
Packit f574b8
    { "nt",	tZONE,     HOUR(11) },	/* -- expired 1967 */
Packit f574b8
    { "ahst",	tZONE,     HOUR(10) },	/* -- expired 1983 */
Packit f574b8
    { "hdt",	tDAYZONE,  HOUR(10) },	/* -- expired 1986 */
Packit f574b8
#endif	/* 0 */
Packit f574b8
};
Packit f574b8
/* *INDENT-ON* */
Packit f574b8
Packit f574b8
static time_t ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian)
Packit f574b8
{
Packit f574b8
    if ((long) Minutes < 0 || Minutes > 59 || (long) Seconds < 0 || Seconds > 61)
Packit f574b8
	return -1;
Packit f574b8
    if (Meridian == MER24) {
Packit f574b8
	if ((long) Hours < 0 || Hours > 23)
Packit f574b8
	    return -1;
Packit f574b8
    } else {
Packit f574b8
	if (Hours < 1 || Hours > 12)
Packit f574b8
	    return -1;
Packit f574b8
	if (Hours == 12)
Packit f574b8
	    Hours = 0;
Packit f574b8
	if (Meridian == MERpm)
Packit f574b8
	    Hours += 12;
Packit f574b8
    }
Packit f574b8
    return (Hours * 60L + Minutes) * 60L + Seconds;
Packit f574b8
}
Packit f574b8
Packit f574b8
static time_t Convert(time_t Month, time_t Day, time_t Year, time_t Hours,
Packit f574b8
		      time_t Minutes, time_t Seconds, MERIDIAN Meridian,
Packit f574b8
		      DSTMODE dst)
Packit f574b8
{
Packit f574b8
    static const int DaysNormal[13] =
Packit f574b8
    {
Packit f574b8
	0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
Packit f574b8
    };
Packit f574b8
    static const int DaysLeap[13] =
Packit f574b8
    {
Packit f574b8
	0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
Packit f574b8
    };
Packit f574b8
    static const int LeapYears[] =
Packit f574b8
    {
Packit f574b8
	1972, 1976, 1980, 1984, 1988, 1992, 1996,
Packit f574b8
	2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036
Packit f574b8
    };
Packit f574b8
    const int *yp;
Packit f574b8
    const int *mp;
Packit f574b8
    int i;
Packit f574b8
    time_t Julian;
Packit f574b8
    time_t tod;
Packit f574b8
Packit f574b8
    if ((long) Year < 0)
Packit f574b8
	Year = -Year;
Packit f574b8
    if (Year < 70)
Packit f574b8
	Year += 2000;
Packit f574b8
    if (Year < 100)
Packit f574b8
	Year += 1900;
Packit f574b8
    if (Year < EPOCH)
Packit f574b8
	Year += 100;
Packit f574b8
    for (mp = DaysNormal, yp = LeapYears; yp < ENDOF(LeapYears); yp++)
Packit f574b8
	if (Year == *yp) {
Packit f574b8
	    mp = DaysLeap;
Packit f574b8
	    break;
Packit f574b8
	}
Packit f574b8
    if (Year < EPOCH || Year > END_OF_TIME
Packit f574b8
	|| Month < 1 || Month > 12
Packit f574b8
    /* NOSTRICT */
Packit f574b8
    /* conversion from long may lose accuracy */
Packit f574b8
	|| Day < 1 || Day > mp[(int) Month]) {
Packit f574b8
	return -1;
Packit f574b8
    }
Packit f574b8
Packit f574b8
    Julian = Day - 1 + (Year - EPOCH) * 365;
Packit f574b8
    for (yp = LeapYears; yp < ENDOF(LeapYears); yp++, Julian++) {
Packit f574b8
	if (Year <= *yp)
Packit f574b8
	    break;
Packit f574b8
    }
Packit f574b8
    for (i = 1; i < Month; i++)
Packit f574b8
	Julian += *++mp;
Packit f574b8
    Julian *= SECSPERDAY;
Packit f574b8
    Julian += yyTimezone * 60L;
Packit f574b8
    if ((long) (tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0) {
Packit f574b8
	return -1;
Packit f574b8
    }
Packit f574b8
    Julian += tod;
Packit f574b8
    tod = Julian;
Packit f574b8
    if (dst == DSTon || (dst == DSTmaybe && localtime(&tod)->tm_isdst))
Packit f574b8
	Julian -= DST_OFFSET * 60 * 60;
Packit f574b8
    return Julian;
Packit f574b8
}
Packit f574b8
Packit f574b8
static time_t DSTcorrect(time_t Start, time_t Future)
Packit f574b8
{
Packit f574b8
    time_t StartDay;
Packit f574b8
    time_t FutureDay;
Packit f574b8
Packit f574b8
    StartDay = (localtime(&Start)->tm_hour + 1) % 24;
Packit f574b8
    FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
Packit f574b8
    return (Future - Start) + (StartDay - FutureDay) * DST_OFFSET * 60 * 60;
Packit f574b8
}
Packit f574b8
Packit f574b8
static time_t RelativeMonth(time_t Start, time_t RelMonth)
Packit f574b8
{
Packit f574b8
    struct tm *tm;
Packit f574b8
    time_t Month;
Packit f574b8
    time_t Year;
Packit f574b8
Packit f574b8
    tm = localtime(&Start;;
Packit f574b8
    Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
Packit f574b8
    Year = Month / 12 + 1900;
Packit f574b8
    Month = Month % 12 + 1;
Packit f574b8
    return DSTcorrect(Start,
Packit f574b8
		      Convert(Month, (time_t) tm->tm_mday, Year,
Packit f574b8
			      (time_t) tm->tm_hour, (time_t) tm->tm_min,
Packit f574b8
			      (time_t) tm->tm_sec,
Packit f574b8
			      MER24, DSTmaybe));
Packit f574b8
}
Packit f574b8
Packit f574b8
static int LookupWord(char *buff,
Packit f574b8
		      int length)
Packit f574b8
{
Packit f574b8
    char *p;
Packit f574b8
    const char *q;
Packit f574b8
    const TABLE *tp;
Packit f574b8
    int c;
Packit f574b8
Packit f574b8
    p = buff;
Packit f574b8
    c = p[0];
Packit f574b8
Packit f574b8
    /* See if we have an abbreviation for a month. */
Packit f574b8
    if (length == 3 || (length == 4 && p[3] == '.')) {
Packit f574b8
	for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {
Packit f574b8
	    q = tp->name;
Packit f574b8
	    if (c == q[0] && p[1] == q[1] && p[2] == q[2]) {
Packit f574b8
		yylval.Number = tp->value;
Packit f574b8
		return tp->type;
Packit f574b8
	    }
Packit f574b8
	}
Packit f574b8
    } else {
Packit f574b8
	for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {
Packit f574b8
	    if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
Packit f574b8
		yylval.Number = tp->value;
Packit f574b8
		return tp->type;
Packit f574b8
	    }
Packit f574b8
	}
Packit f574b8
    }
Packit f574b8
Packit f574b8
    /* Try for a timezone. */
Packit f574b8
    for (tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) {
Packit f574b8
	if (c == tp->name[0] && p[1] == tp->name[1]
Packit f574b8
	    && strcmp(p, tp->name) == 0) {
Packit f574b8
	    yylval.Number = tp->value;
Packit f574b8
	    return tp->type;
Packit f574b8
	}
Packit f574b8
    }
Packit f574b8
Packit f574b8
    if (strcmp(buff, "dst") == 0)
Packit f574b8
	return tDST;
Packit f574b8
Packit f574b8
    /* Try the units table. */
Packit f574b8
    for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) {
Packit f574b8
	if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
Packit f574b8
	    yylval.Number = tp->value;
Packit f574b8
	    return tp->type;
Packit f574b8
	}
Packit f574b8
    }
Packit f574b8
Packit f574b8
    /* Strip off any plural and try the units table again. */
Packit f574b8
    if (--length > 0 && p[length] == 's') {
Packit f574b8
	p[length] = '\0';
Packit f574b8
	for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) {
Packit f574b8
	    if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
Packit f574b8
		p[length] = 's';
Packit f574b8
		yylval.Number = tp->value;
Packit f574b8
		return tp->type;
Packit f574b8
	    }
Packit f574b8
	}
Packit f574b8
	p[length] = 's';
Packit f574b8
    }
Packit f574b8
    length++;
Packit f574b8
Packit f574b8
    /* Drop out any periods. */
Packit f574b8
    for (p = buff, q = (PD_STRING) buff; *q; q++) {
Packit f574b8
	if (*q != '.')
Packit f574b8
	    *p++ = *q;
Packit f574b8
    }
Packit f574b8
    *p = '\0';
Packit f574b8
Packit f574b8
    /* Try the meridians. */
Packit f574b8
    if (buff[1] == 'm' && buff[2] == '\0') {
Packit f574b8
	if (buff[0] == 'a') {
Packit f574b8
	    yylval.Meridian = MERam;
Packit f574b8
	    return tMERIDIAN;
Packit f574b8
	}
Packit f574b8
	if (buff[0] == 'p') {
Packit f574b8
	    yylval.Meridian = MERpm;
Packit f574b8
	    return tMERIDIAN;
Packit f574b8
	}
Packit f574b8
    }
Packit f574b8
Packit f574b8
    /* If we saw any periods, try the timezones again. */
Packit f574b8
    if (p - buff != length) {
Packit f574b8
	c = buff[0];
Packit f574b8
	for (p = buff, tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) {
Packit f574b8
	    if (c == tp->name[0] && p[1] == tp->name[1]
Packit f574b8
		&& strcmp(p, tp->name) == 0) {
Packit f574b8
		yylval.Number = tp->value;
Packit f574b8
		return tp->type;
Packit f574b8
	    }
Packit f574b8
	}
Packit f574b8
    }
Packit f574b8
Packit f574b8
    /* Unknown word -- assume GMT timezone. */
Packit f574b8
    yylval.Number = 0;
Packit f574b8
    return tZONE;
Packit f574b8
}
Packit f574b8
Packit f574b8
/*
Packit f574b8
 * This returns characters as-is (the ones that are not part of some token),
Packit f574b8
 * and codes greater than 256 (the token values).
Packit f574b8
 *
Packit f574b8
 * yacc generates tables that may use the character value.  In particular,
Packit f574b8
 * byacc's yycheck[] table contains integer values for the expected codes from
Packit f574b8
 * this function, which (unless byacc is run locally) are ASCII codes.
Packit f574b8
 *
Packit f574b8
 * The TO_LOCAL() function assumes its input is in ASCII, and the output is
Packit f574b8
 * whatever native encoding is used on the machine, e.g., EBCDIC.
Packit f574b8
 *
Packit f574b8
 * The TO_ASCII() function is the inverse of TO_LOCAL().
Packit f574b8
 */
Packit f574b8
static int date_lex(void)
Packit f574b8
{
Packit f574b8
    int c;
Packit f574b8
    char *p;
Packit f574b8
    char buff[20];
Packit f574b8
    int sign;
Packit f574b8
    int i;
Packit f574b8
    int nesting;
Packit f574b8
Packit f574b8
    /* Get first character after the whitespace. */
Packit f574b8
    for (;;) {
Packit f574b8
	while (CTYPE(isspace, *yyInput))
Packit f574b8
	    yyInput++;
Packit f574b8
	c = *yyInput;
Packit f574b8
Packit f574b8
	/* Ignore RFC 822 comments, typically time zone names. */
Packit f574b8
	if (c != LPAREN)
Packit f574b8
	    break;
Packit f574b8
	for (nesting = 1;
Packit f574b8
	     (c = *++yyInput) != RPAREN || --nesting;
Packit f574b8
	    ) {
Packit f574b8
	    if (c == LPAREN) {
Packit f574b8
		nesting++;
Packit f574b8
	    } else if (!IS7BIT(c) || c == '\0' || c == '\r'
Packit f574b8
		       || (c == '\\'
Packit f574b8
			   && ((c = *++yyInput) == '\0'
Packit f574b8
			       || !IS7BIT(c)))) {
Packit f574b8
		/* Lexical error: bad comment. */
Packit f574b8
		return '?';
Packit f574b8
	    }
Packit f574b8
	}
Packit f574b8
	yyInput++;
Packit f574b8
    }
Packit f574b8
Packit f574b8
    /* A number? */
Packit f574b8
    if (CTYPE(isdigit, c) || c == '-' || c == '+') {
Packit f574b8
	if (c == '-' || c == '+') {
Packit f574b8
	    sign = c == '-' ? -1 : 1;
Packit f574b8
	    yyInput++;
Packit f574b8
	    if (!CTYPE(isdigit, *yyInput)) {
Packit f574b8
		/* Return the isolated plus or minus sign. */
Packit f574b8
		--yyInput;
Packit f574b8
		return *yyInput++;
Packit f574b8
	    }
Packit f574b8
	} else {
Packit f574b8
	    sign = 0;
Packit f574b8
	}
Packit f574b8
	for (p = buff;
Packit f574b8
	     (c = *yyInput++) != '\0' && CTYPE(isdigit, c);
Packit f574b8
	    ) {
Packit f574b8
	    if (p < &buff[sizeof buff - 1])
Packit f574b8
		*p++ = (char) c;
Packit f574b8
	}
Packit f574b8
	*p = '\0';
Packit f574b8
	i = atoi(buff);
Packit f574b8
Packit f574b8
	yyInput--;
Packit f574b8
	yylval.Number = sign < 0 ? -i : i;
Packit f574b8
	return sign ? tSNUMBER : tUNUMBER;
Packit f574b8
    }
Packit f574b8
Packit f574b8
    /* A word? */
Packit f574b8
    if (CTYPE(isalpha, c)) {
Packit f574b8
	for (p = buff;
Packit f574b8
	     (c = *yyInput++) == '.' || CTYPE(isalpha, c);
Packit f574b8
	    ) {
Packit f574b8
	    if (p < &buff[sizeof buff - 1])
Packit f574b8
		*p++ = (char) (CTYPE(isupper, c) ? tolower(c) : c);
Packit f574b8
	}
Packit f574b8
	*p = '\0';
Packit f574b8
	yyInput--;
Packit f574b8
	return LookupWord(buff, (int) (p - buff));
Packit f574b8
    }
Packit f574b8
Packit f574b8
    return *yyInput++;
Packit f574b8
}
Packit f574b8
Packit f574b8
static int GetTimeInfo(TIMEINFO * Now)
Packit f574b8
{
Packit f574b8
    static time_t LastTime;
Packit f574b8
    static long LastTzone;
Packit f574b8
    struct tm *tm;
Packit f574b8
Packit f574b8
#if	defined(HAVE_GETTIMEOFDAY)
Packit f574b8
    struct timeval tv;
Packit f574b8
#endif /* defined(HAVE_GETTIMEOFDAY) */
Packit f574b8
#if	defined(DONT_HAVE_TM_GMTOFF)
Packit f574b8
    struct tm local;
Packit f574b8
    struct tm gmt;
Packit f574b8
#endif /* !defined(DONT_HAVE_TM_GMTOFF) */
Packit f574b8
Packit f574b8
    /* Get the basic time. */
Packit f574b8
#if defined(HAVE_GETTIMEOFDAY)
Packit f574b8
    if (gettimeofday(&tv, (struct timezone *) NULL) == -1)
Packit f574b8
	return -1;
Packit f574b8
    Now->time = tv.tv_sec;
Packit f574b8
    Now->usec = tv.tv_usec;
Packit f574b8
#else
Packit f574b8
    /* Can't check for -1 since that might be a time, I guess. */
Packit f574b8
    (void) time(&Now->time);
Packit f574b8
    Now->usec = 0;
Packit f574b8
#endif /* defined(HAVE_GETTIMEOFDAY) */
Packit f574b8
Packit f574b8
    /* Now get the timezone if it's been an hour since the last time. */
Packit f574b8
    if (Now->time - LastTime > 60 * 60) {
Packit f574b8
	LastTime = Now->time;
Packit f574b8
	if ((tm = localtime(&Now->time)) == NULL)
Packit f574b8
	    return -1;
Packit f574b8
#if	defined(DONT_HAVE_TM_GMTOFF)
Packit f574b8
	/* To get the timezone, compare localtime with GMT. */
Packit f574b8
	local = *tm;
Packit f574b8
	if ((tm = gmtime(&Now->time)) == NULL)
Packit f574b8
	    return -1;
Packit f574b8
	gmt = *tm;
Packit f574b8
Packit f574b8
	/* Assume we are never more than 24 hours away. */
Packit f574b8
	LastTzone = gmt.tm_yday - local.tm_yday;
Packit f574b8
	if (LastTzone > 1)
Packit f574b8
	    LastTzone = -24;
Packit f574b8
	else if (LastTzone < -1)
Packit f574b8
	    LastTzone = 24;
Packit f574b8
	else
Packit f574b8
	    LastTzone *= 24;
Packit f574b8
Packit f574b8
	/* Scale in the hours and minutes; ignore seconds. */
Packit f574b8
	LastTzone += gmt.tm_hour - local.tm_hour;
Packit f574b8
	LastTzone *= 60;
Packit f574b8
	LastTzone += gmt.tm_min - local.tm_min;
Packit f574b8
#else
Packit f574b8
	LastTzone = (0 - tm->tm_gmtoff) / 60;
Packit f574b8
#endif /* defined(DONT_HAVE_TM_GMTOFF) */
Packit f574b8
    }
Packit f574b8
    Now->tzone = LastTzone;
Packit f574b8
    return 0;
Packit f574b8
}
Packit f574b8
Packit f574b8
#if defined(YYBYACC) && defined(YYPURE) && defined(LY_FIND_LEAKS)
Packit f574b8
#undef YYPURE
Packit f574b8
#define YYPURE 1
Packit f574b8
static void yyfreestack(YYSTACKDATA *);
Packit f574b8
static void parsedate_leaks(void)
Packit f574b8
{
Packit f574b8
    yyfreestack(&yystack);
Packit f574b8
}
Packit f574b8
#endif
Packit f574b8
Packit f574b8
time_t parsedate(char *p,
Packit f574b8
		 TIMEINFO * now)
Packit f574b8
{
Packit f574b8
    struct tm *tm;
Packit f574b8
    TIMEINFO ti;
Packit f574b8
    time_t Start;
Packit f574b8
Packit f574b8
#if defined(YYBYACC) && defined(YYPURE) && defined(LY_FIND_LEAKS)
Packit f574b8
    static int initialized;
Packit f574b8
Packit f574b8
    if (!initialized) {
Packit f574b8
	initialized = 1;
Packit f574b8
	atexit(parsedate_leaks);
Packit f574b8
    }
Packit f574b8
#endif
Packit f574b8
Packit f574b8
    yyInput = p;
Packit f574b8
    if (now == NULL) {
Packit f574b8
	now = &ti;
Packit f574b8
	(void) GetTimeInfo(&ti);
Packit f574b8
    }
Packit f574b8
Packit f574b8
    tm = localtime(&now->time);
Packit f574b8
    yyYear = tm->tm_year + 1900;
Packit f574b8
    yyMonth = tm->tm_mon + 1;
Packit f574b8
    yyDay = tm->tm_mday;
Packit f574b8
    yyTimezone = now->tzone;
Packit f574b8
    if (tm->tm_isdst)		/* Correct timezone offset for DST */
Packit f574b8
	yyTimezone += DST_OFFSET * 60;
Packit f574b8
    yyDSTmode = DSTmaybe;
Packit f574b8
    yyHour = 0;
Packit f574b8
    yyMinutes = 0;
Packit f574b8
    yySeconds = 0;
Packit f574b8
    yyMeridian = MER24;
Packit f574b8
    yyRelSeconds = 0;
Packit f574b8
    yyRelMonth = 0;
Packit f574b8
    yyHaveDate = 0;
Packit f574b8
    yyHaveRel = 0;
Packit f574b8
    yyHaveTime = 0;
Packit f574b8
Packit f574b8
    if (date_parse() || yyHaveTime > 1 || yyHaveDate > 1)
Packit f574b8
	return -1;
Packit f574b8
Packit f574b8
    if (yyHaveDate || yyHaveTime) {
Packit f574b8
	Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
Packit f574b8
			yyMeridian, yyDSTmode);
Packit f574b8
	if ((long) Start < 0)
Packit f574b8
	    return -1;
Packit f574b8
    } else {
Packit f574b8
	Start = now->time;
Packit f574b8
	if (!yyHaveRel)
Packit f574b8
	    Start -= (tm->tm_hour * 60L + tm->tm_min) * 60L + tm->tm_sec;
Packit f574b8
    }
Packit f574b8
Packit f574b8
    Start += yyRelSeconds;
Packit f574b8
    if (yyRelMonth)
Packit f574b8
	Start += RelativeMonth(Start, yyRelMonth);
Packit f574b8
Packit f574b8
    /* Have to do *something* with a legitimate -1 so it's distinguishable
Packit f574b8
     * from the error return value.  (Alternately could set errno on error.) */
Packit f574b8
    return (Start == (time_t) -1) ? 0 : Start;
Packit f574b8
}
Packit f574b8
#line 1013 "y.tab.c"
Packit f574b8
Packit f574b8
#if YYDEBUG
Packit f574b8
#include <stdio.h>	/* needed for printf */
Packit f574b8
#endif
Packit f574b8
Packit f574b8
#include <stdlib.h>	/* needed for malloc, etc */
Packit f574b8
#include <string.h>	/* needed for memset */
Packit f574b8
Packit f574b8
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
Packit f574b8
static int yygrowstack(YYSTACKDATA *data)
Packit f574b8
{
Packit f574b8
    int i;
Packit f574b8
    unsigned newsize;
Packit f574b8
    YYINT *newss;
Packit f574b8
    YYSTYPE *newvs;
Packit f574b8
Packit f574b8
    if ((newsize = data->stacksize) == 0)
Packit f574b8
        newsize = YYINITSTACKSIZE;
Packit f574b8
    else if (newsize >= YYMAXDEPTH)
Packit f574b8
        return YYENOMEM;
Packit f574b8
    else if ((newsize *= 2) > YYMAXDEPTH)
Packit f574b8
        newsize = YYMAXDEPTH;
Packit f574b8
Packit f574b8
    i = (int) (data->s_mark - data->s_base);
Packit f574b8
    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
Packit f574b8
    if (newss == 0)
Packit f574b8
        return YYENOMEM;
Packit f574b8
Packit f574b8
    data->s_base = newss;
Packit f574b8
    data->s_mark = newss + i;
Packit f574b8
Packit f574b8
    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
Packit f574b8
    if (newvs == 0)
Packit f574b8
        return YYENOMEM;
Packit f574b8
Packit f574b8
    data->l_base = newvs;
Packit f574b8
    data->l_mark = newvs + i;
Packit f574b8
Packit f574b8
    data->stacksize = newsize;
Packit f574b8
    data->s_last = data->s_base + newsize - 1;
Packit f574b8
    return 0;
Packit f574b8
}
Packit f574b8
Packit f574b8
#if YYPURE || defined(YY_NO_LEAKS)
Packit f574b8
static void yyfreestack(YYSTACKDATA *data)
Packit f574b8
{
Packit f574b8
    free(data->s_base);
Packit f574b8
    free(data->l_base);
Packit f574b8
    memset(data, 0, sizeof(*data));
Packit f574b8
}
Packit f574b8
#else
Packit f574b8
#define yyfreestack(data) /* nothing */
Packit f574b8
#endif
Packit f574b8
Packit f574b8
#define YYABORT  goto yyabort
Packit f574b8
#define YYREJECT goto yyabort
Packit f574b8
#define YYACCEPT goto yyaccept
Packit f574b8
#define YYERROR  goto yyerrlab
Packit f574b8
Packit f574b8
int
Packit f574b8
YYPARSE_DECL()
Packit f574b8
{
Packit f574b8
    int yym, yyn, yystate;
Packit f574b8
#if YYDEBUG
Packit f574b8
    const char *yys;
Packit f574b8
Packit f574b8
    if ((yys = getenv("YYDEBUG")) != 0)
Packit f574b8
    {
Packit f574b8
        yyn = *yys;
Packit f574b8
        if (yyn >= '0' && yyn <= '9')
Packit f574b8
            yydebug = yyn - '0';
Packit f574b8
    }
Packit f574b8
#endif
Packit f574b8
Packit f574b8
    yym = 0;
Packit f574b8
    yyn = 0;
Packit f574b8
    yynerrs = 0;
Packit f574b8
    yyerrflag = 0;
Packit f574b8
    yychar = YYEMPTY;
Packit f574b8
    yystate = 0;
Packit f574b8
Packit f574b8
#if YYPURE
Packit f574b8
    memset(&yystack, 0, sizeof(yystack));
Packit f574b8
#endif
Packit f574b8
Packit f574b8
    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
Packit f574b8
    yystack.s_mark = yystack.s_base;
Packit f574b8
    yystack.l_mark = yystack.l_base;
Packit f574b8
    yystate = 0;
Packit f574b8
    *yystack.s_mark = 0;
Packit f574b8
Packit f574b8
yyloop:
Packit f574b8
    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
Packit f574b8
    if (yychar < 0)
Packit f574b8
    {
Packit f574b8
        yychar = YYLEX;
Packit f574b8
        if (yychar < 0) yychar = YYEOF;
Packit f574b8
#if YYDEBUG
Packit f574b8
        if (yydebug)
Packit f574b8
        {
Packit f574b8
            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
Packit f574b8
            printf("%sdebug: state %d, reading %d (%s)\n",
Packit f574b8
                    YYPREFIX, yystate, yychar, yys);
Packit f574b8
        }
Packit f574b8
#endif
Packit f574b8
    }
Packit f574b8
    if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
Packit f574b8
            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
Packit f574b8
    {
Packit f574b8
#if YYDEBUG
Packit f574b8
        if (yydebug)
Packit f574b8
            printf("%sdebug: state %d, shifting to state %d\n",
Packit f574b8
                    YYPREFIX, yystate, yytable[yyn]);
Packit f574b8
#endif
Packit f574b8
        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
Packit f574b8
        yystate = yytable[yyn];
Packit f574b8
        *++yystack.s_mark = yytable[yyn];
Packit f574b8
        *++yystack.l_mark = yylval;
Packit f574b8
        yychar = YYEMPTY;
Packit f574b8
        if (yyerrflag > 0)  --yyerrflag;
Packit f574b8
        goto yyloop;
Packit f574b8
    }
Packit f574b8
    if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
Packit f574b8
            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
Packit f574b8
    {
Packit f574b8
        yyn = yytable[yyn];
Packit f574b8
        goto yyreduce;
Packit f574b8
    }
Packit f574b8
    if (yyerrflag != 0) goto yyinrecovery;
Packit f574b8
Packit f574b8
    YYERROR_CALL("syntax error");
Packit f574b8
Packit f574b8
    goto yyerrlab; /* redundant goto avoids 'unused label' warning */
Packit f574b8
yyerrlab:
Packit f574b8
    ++yynerrs;
Packit f574b8
Packit f574b8
yyinrecovery:
Packit f574b8
    if (yyerrflag < 3)
Packit f574b8
    {
Packit f574b8
        yyerrflag = 3;
Packit f574b8
        for (;;)
Packit f574b8
        {
Packit f574b8
            if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
Packit f574b8
                    yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
Packit f574b8
            {
Packit f574b8
#if YYDEBUG
Packit f574b8
                if (yydebug)
Packit f574b8
                    printf("%sdebug: state %d, error recovery shifting\
Packit f574b8
 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
Packit f574b8
#endif
Packit f574b8
                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
Packit f574b8
                yystate = yytable[yyn];
Packit f574b8
                *++yystack.s_mark = yytable[yyn];
Packit f574b8
                *++yystack.l_mark = yylval;
Packit f574b8
                goto yyloop;
Packit f574b8
            }
Packit f574b8
            else
Packit f574b8
            {
Packit f574b8
#if YYDEBUG
Packit f574b8
                if (yydebug)
Packit f574b8
                    printf("%sdebug: error recovery discarding state %d\n",
Packit f574b8
                            YYPREFIX, *yystack.s_mark);
Packit f574b8
#endif
Packit f574b8
                if (yystack.s_mark <= yystack.s_base) goto yyabort;
Packit f574b8
                --yystack.s_mark;
Packit f574b8
                --yystack.l_mark;
Packit f574b8
            }
Packit f574b8
        }
Packit f574b8
    }
Packit f574b8
    else
Packit f574b8
    {
Packit f574b8
        if (yychar == YYEOF) goto yyabort;
Packit f574b8
#if YYDEBUG
Packit f574b8
        if (yydebug)
Packit f574b8
        {
Packit f574b8
            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
Packit f574b8
            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
Packit f574b8
                    YYPREFIX, yystate, yychar, yys);
Packit f574b8
        }
Packit f574b8
#endif
Packit f574b8
        yychar = YYEMPTY;
Packit f574b8
        goto yyloop;
Packit f574b8
    }
Packit f574b8
Packit f574b8
yyreduce:
Packit f574b8
#if YYDEBUG
Packit f574b8
    if (yydebug)
Packit f574b8
        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
Packit f574b8
                YYPREFIX, yystate, yyn, yyrule[yyn]);
Packit f574b8
#endif
Packit f574b8
    yym = yylen[yyn];
Packit f574b8
    if (yym > 0)
Packit f574b8
        yyval = yystack.l_mark[1-yym];
Packit f574b8
    else
Packit f574b8
        memset(&yyval, 0, sizeof yyval);
Packit f574b8
Packit f574b8
    switch (yyn)
Packit f574b8
    {
Packit f574b8
case 3:
Packit f574b8
#line 154 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHaveTime++;
Packit f574b8
#if	defined(lint)
Packit f574b8
	    /* I am compulsive about lint natterings... */
Packit f574b8
	    if (yyHaveTime == -1) {
Packit f574b8
		YYERROR;
Packit f574b8
	    }
Packit f574b8
#endif	/* defined(lint) */
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 4:
Packit f574b8
#line 163 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHaveTime++;
Packit f574b8
	    yyTimezone = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 5:
Packit f574b8
#line 167 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHaveDate++;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 6:
Packit f574b8
#line 170 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHaveDate++;
Packit f574b8
	    yyHaveTime++;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 7:
Packit f574b8
#line 174 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHaveDate++;
Packit f574b8
	    yyHaveTime++;
Packit f574b8
	    yyTimezone = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 8:
Packit f574b8
#line 179 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHaveRel = 1;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 9:
Packit f574b8
#line 184 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    if (yystack.l_mark[-1].Number < 100) {
Packit f574b8
		yyHour = yystack.l_mark[-1].Number;
Packit f574b8
		yyMinutes = 0;
Packit f574b8
	    }
Packit f574b8
	    else {
Packit f574b8
		yyHour = yystack.l_mark[-1].Number / 100;
Packit f574b8
		yyMinutes = yystack.l_mark[-1].Number % 100;
Packit f574b8
	    }
Packit f574b8
	    yySeconds = 0;
Packit f574b8
	    yyMeridian = yystack.l_mark[0].Meridian;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 10:
Packit f574b8
#line 196 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHour = yystack.l_mark[-3].Number;
Packit f574b8
	    yyMinutes = yystack.l_mark[-1].Number;
Packit f574b8
	    yySeconds = 0;
Packit f574b8
	    yyMeridian = yystack.l_mark[0].Meridian;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 11:
Packit f574b8
#line 202 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHour = yystack.l_mark[-3].Number;
Packit f574b8
	    yyMinutes = yystack.l_mark[-1].Number;
Packit f574b8
	    yyTimezone = yystack.l_mark[0].Number;
Packit f574b8
	    yyMeridian = MER24;
Packit f574b8
	    yyDSTmode = DSToff;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 12:
Packit f574b8
#line 209 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHour = yystack.l_mark[-5].Number;
Packit f574b8
	    yyMinutes = yystack.l_mark[-3].Number;
Packit f574b8
	    yySeconds = yystack.l_mark[-1].Number;
Packit f574b8
	    yyMeridian = yystack.l_mark[0].Meridian;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 13:
Packit f574b8
#line 215 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyHour = yystack.l_mark[-5].Number;
Packit f574b8
	    yyMinutes = yystack.l_mark[-3].Number;
Packit f574b8
	    yySeconds = yystack.l_mark[-1].Number;
Packit f574b8
	    yyTimezone = yystack.l_mark[0].Number;
Packit f574b8
	    yyMeridian = MER24;
Packit f574b8
	    yyDSTmode = DSToff;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 14:
Packit f574b8
#line 225 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyval.Number = yystack.l_mark[0].Number;
Packit f574b8
	    yyDSTmode = DSToff;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 15:
Packit f574b8
#line 229 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyval.Number = yystack.l_mark[0].Number;
Packit f574b8
	    yyDSTmode = DSTon;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 16:
Packit f574b8
#line 233 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyTimezone = yystack.l_mark[-1].Number;
Packit f574b8
	    yyDSTmode = DSTon;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 17:
Packit f574b8
#line 237 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    /* Only allow "GMT+300" and "GMT-0800" */
Packit f574b8
	    if (yystack.l_mark[-1].Number != 0) {
Packit f574b8
		YYABORT;
Packit f574b8
	    }
Packit f574b8
	    yyval.Number = yystack.l_mark[0].Number;
Packit f574b8
	    yyDSTmode = DSToff;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 18:
Packit f574b8
#line 245 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyval.Number = yystack.l_mark[0].Number;
Packit f574b8
	    yyDSTmode = DSToff;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 19:
Packit f574b8
#line 251 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    int	i;
Packit f574b8
Packit f574b8
	    /* Unix and GMT and numeric timezones -- a little confusing. */
Packit f574b8
	    if ((int)yystack.l_mark[0].Number < 0) {
Packit f574b8
		/* Don't work with negative modulus. */
Packit f574b8
		yystack.l_mark[0].Number = -(int)yystack.l_mark[0].Number;
Packit f574b8
		if (yystack.l_mark[0].Number > 9999 || (i = (int) (yystack.l_mark[0].Number % 100)) >= 60) {
Packit f574b8
			YYABORT;
Packit f574b8
		}
Packit f574b8
		yyval.Number = (yystack.l_mark[0].Number / 100) * 60 + i;
Packit f574b8
	    }
Packit f574b8
	    else {
Packit f574b8
		if (yystack.l_mark[0].Number > 9999 || (i = (int) (yystack.l_mark[0].Number % 100)) >= 60) {
Packit f574b8
			YYABORT;
Packit f574b8
		}
Packit f574b8
		yyval.Number = -((yystack.l_mark[0].Number / 100) * 60 + i);
Packit f574b8
	    }
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 20:
Packit f574b8
#line 272 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyMonth = yystack.l_mark[-2].Number;
Packit f574b8
	    yyDay = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 21:
Packit f574b8
#line 276 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    if (yystack.l_mark[-4].Number > 100) {
Packit f574b8
		yyYear = yystack.l_mark[-4].Number;
Packit f574b8
		yyMonth = yystack.l_mark[-2].Number;
Packit f574b8
		yyDay = yystack.l_mark[0].Number;
Packit f574b8
	    }
Packit f574b8
	    else {
Packit f574b8
		yyMonth = yystack.l_mark[-4].Number;
Packit f574b8
		yyDay = yystack.l_mark[-2].Number;
Packit f574b8
		yyYear = yystack.l_mark[0].Number;
Packit f574b8
	    }
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 22:
Packit f574b8
#line 288 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyMonth = yystack.l_mark[-1].Number;
Packit f574b8
	    yyDay = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 23:
Packit f574b8
#line 292 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyMonth = yystack.l_mark[-3].Number;
Packit f574b8
	    yyDay = yystack.l_mark[-2].Number;
Packit f574b8
	    yyYear = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 24:
Packit f574b8
#line 297 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyDay = yystack.l_mark[-1].Number;
Packit f574b8
	    yyMonth = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 25:
Packit f574b8
#line 301 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyDay = yystack.l_mark[-2].Number;
Packit f574b8
	    yyMonth = yystack.l_mark[-1].Number;
Packit f574b8
	    yyYear = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 26:
Packit f574b8
#line 306 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyDay = yystack.l_mark[-2].Number;
Packit f574b8
	    yyMonth = yystack.l_mark[-1].Number;
Packit f574b8
	    yyYear = yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 27:
Packit f574b8
#line 311 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyDay = yystack.l_mark[-3].Number;
Packit f574b8
	    yyMonth = yystack.l_mark[-1].Number;
Packit f574b8
	    yyYear = -yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 28:
Packit f574b8
#line 316 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyDay = yystack.l_mark[-2].Number;
Packit f574b8
	    yyMonth = -yystack.l_mark[-1].Number;
Packit f574b8
	    yyYear = -yystack.l_mark[0].Number;
Packit f574b8
	    yyDSTmode = DSToff;	/* assume midnight if no time given */
Packit f574b8
	    yyTimezone = 0;	/* Lynx assumes GMT for this format */
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 29:
Packit f574b8
#line 325 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyMonth = yystack.l_mark[-7].Number;
Packit f574b8
	    yyDay = yystack.l_mark[-6].Number;
Packit f574b8
	    yyYear = yystack.l_mark[0].Number;
Packit f574b8
	    yyHour = yystack.l_mark[-5].Number;
Packit f574b8
	    yyMinutes = yystack.l_mark[-3].Number;
Packit f574b8
	    yySeconds = yystack.l_mark[-1].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 30:
Packit f574b8
#line 335 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyRelSeconds += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 31:
Packit f574b8
#line 338 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyRelSeconds += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 32:
Packit f574b8
#line 341 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyRelMonth += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 33:
Packit f574b8
#line 344 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyRelMonth += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 34:
Packit f574b8
#line 349 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyval.Meridian = MER24;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
case 35:
Packit f574b8
#line 352 "./parsdate.y"
Packit f574b8
	{
Packit f574b8
	    yyval.Meridian = yystack.l_mark[0].Meridian;
Packit f574b8
	}
Packit f574b8
break;
Packit f574b8
#line 1498 "y.tab.c"
Packit f574b8
    }
Packit f574b8
    yystack.s_mark -= yym;
Packit f574b8
    yystate = *yystack.s_mark;
Packit f574b8
    yystack.l_mark -= yym;
Packit f574b8
    yym = yylhs[yyn];
Packit f574b8
    if (yystate == 0 && yym == 0)
Packit f574b8
    {
Packit f574b8
#if YYDEBUG
Packit f574b8
        if (yydebug)
Packit f574b8
            printf("%sdebug: after reduction, shifting from state 0 to\
Packit f574b8
 state %d\n", YYPREFIX, YYFINAL);
Packit f574b8
#endif
Packit f574b8
        yystate = YYFINAL;
Packit f574b8
        *++yystack.s_mark = YYFINAL;
Packit f574b8
        *++yystack.l_mark = yyval;
Packit f574b8
        if (yychar < 0)
Packit f574b8
        {
Packit f574b8
            yychar = YYLEX;
Packit f574b8
            if (yychar < 0) yychar = YYEOF;
Packit f574b8
#if YYDEBUG
Packit f574b8
            if (yydebug)
Packit f574b8
            {
Packit f574b8
                if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
Packit f574b8
                printf("%sdebug: state %d, reading %d (%s)\n",
Packit f574b8
                        YYPREFIX, YYFINAL, yychar, yys);
Packit f574b8
            }
Packit f574b8
#endif
Packit f574b8
        }
Packit f574b8
        if (yychar == YYEOF) goto yyaccept;
Packit f574b8
        goto yyloop;
Packit f574b8
    }
Packit f574b8
    if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
Packit f574b8
            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
Packit f574b8
        yystate = yytable[yyn];
Packit f574b8
    else
Packit f574b8
        yystate = yydgoto[yym];
Packit f574b8
#if YYDEBUG
Packit f574b8
    if (yydebug)
Packit f574b8
        printf("%sdebug: after reduction, shifting from state %d \
Packit f574b8
to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
Packit f574b8
#endif
Packit f574b8
    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
Packit f574b8
    *++yystack.s_mark = (YYINT) yystate;
Packit f574b8
    *++yystack.l_mark = yyval;
Packit f574b8
    goto yyloop;
Packit f574b8
Packit f574b8
yyoverflow:
Packit f574b8
    YYERROR_CALL("yacc stack overflow");
Packit f574b8
Packit f574b8
yyabort:
Packit f574b8
    yyfreestack(&yystack);
Packit f574b8
    return (1);
Packit f574b8
Packit f574b8
yyaccept:
Packit f574b8
    yyfreestack(&yystack);
Packit f574b8
    return (0);
Packit f574b8
}