|
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 |
}
|