⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclgetdate.y

📁 linux系统下的音频通信
💻 Y
📖 第 1 页 / 共 2 页
字号:
/*  * tclGetDate.y -- * *	Contains yacc grammar for parsing date and time strings. *	The output of this file should be the file tclDate.c which *	is used directly in the Tcl sources. * * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans. * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tclGetDate.y 1.34 97/02/03 14:53:54 */%{/*  * tclDate.c -- * *	This file is generated from a yacc grammar defined in *	the file tclGetDate.y.  It should not be edited directly. * * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans. * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCSID */#include "tclInt.h"#include "tclPort.h"#ifdef MAC_TCL#   define EPOCH           1904#   define START_OF_TIME   1904#   define END_OF_TIME     2039#else#   define EPOCH           1970#   define START_OF_TIME   1902#   define END_OF_TIME     2037#endif/* * The offset of tm_year of struct tm returned by localtime, gmtime, etc. * I don't know how universal this is; K&R II, the NetBSD manpages, and * ../compat/strftime.c all agree that tm_year is the year-1900.  However, * some systems may have a different value.  This #define should be the * same as in ../compat/strftime.c. */#define TM_YEAR_BASE 1900#define HOUR(x)         ((int) (60 * x))#define SECSPERDAY      (24L * 60L * 60L)/* *  An entry in the lexical lookup table. */typedef struct _TABLE {    char        *name;    int         type;    time_t      value;} TABLE;/* *  Daylight-savings mode:  on, off, or not yet known. */typedef enum _DSTMODE {    DSTon, DSToff, DSTmaybe} DSTMODE;/* *  Meridian:  am, pm, or 24-hour style. */typedef enum _MERIDIAN {    MERam, MERpm, MER24} MERIDIAN;/* *  Global variables.  We could get rid of most of these by using a good *  union as the yacc stack.  (This routine was originally written before *  yacc had the %union construct.)  Maybe someday; right now we only use *  the %union very rarely. */static char     *yyInput;static DSTMODE  yyDSTmode;static time_t   yyDayOrdinal;static time_t   yyDayNumber;static int      yyHaveDate;static int      yyHaveDay;static int      yyHaveRel;static int      yyHaveTime;static int      yyHaveZone;static time_t   yyTimezone;static time_t   yyDay;static time_t   yyHour;static time_t   yyMinutes;static time_t   yyMonth;static time_t   yySeconds;static time_t   yyYear;static MERIDIAN yyMeridian;static time_t   yyRelMonth;static time_t   yyRelSeconds;/* * Prototypes of internal functions. */static void	yyerror _ANSI_ARGS_((char *s));static time_t	ToSeconds _ANSI_ARGS_((time_t Hours, time_t Minutes,		    time_t Seconds, MERIDIAN Meridian));static int	Convert _ANSI_ARGS_((time_t Month, time_t Day, time_t Year,		    time_t Hours, time_t Minutes, time_t Seconds,		    MERIDIAN Meridia, DSTMODE DSTmode, time_t *TimePtr));static time_t	DSTcorrect _ANSI_ARGS_((time_t Start, time_t Future));static time_t	RelativeDate _ANSI_ARGS_((time_t Start, time_t DayOrdinal,		    time_t DayNumber));static int	RelativeMonth _ANSI_ARGS_((time_t Start, time_t RelMonth,		    time_t *TimePtr));static int	LookupWord _ANSI_ARGS_((char *buff));static int	yylex _ANSI_ARGS_((void));intyyparse _ANSI_ARGS_((void));%}%union {    time_t              Number;    enum _MERIDIAN      Meridian;}%token  tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT%token  tSEC_UNIT tSNUMBER tUNUMBER tZONE tEPOCH tDST%type   <Number>        tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT tDST%type   <Number>        tSEC_UNIT tSNUMBER tUNUMBER tZONE%type   <Meridian>      tMERIDIAN o_merid%%spec    : /* NULL */        | spec item        ;item    : time {            yyHaveTime++;        }        | zone {            yyHaveZone++;        }        | date {            yyHaveDate++;        }        | day {            yyHaveDay++;        }        | rel {            yyHaveRel++;        }        | number        ;time    : tUNUMBER tMERIDIAN {            yyHour = $1;            yyMinutes = 0;            yySeconds = 0;            yyMeridian = $2;        }        | tUNUMBER ':' tUNUMBER o_merid {            yyHour = $1;            yyMinutes = $3;            yySeconds = 0;            yyMeridian = $4;        }        | tUNUMBER ':' tUNUMBER tSNUMBER {            yyHour = $1;            yyMinutes = $3;            yyMeridian = MER24;            yyDSTmode = DSToff;            yyTimezone = - ($4 % 100 + ($4 / 100) * 60);        }        | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {            yyHour = $1;            yyMinutes = $3;            yySeconds = $5;            yyMeridian = $6;        }        | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER {            yyHour = $1;            yyMinutes = $3;            yySeconds = $5;            yyMeridian = MER24;            yyDSTmode = DSToff;            yyTimezone = - ($6 % 100 + ($6 / 100) * 60);        }        ;zone    : tZONE tDST {            yyTimezone = $1;            yyDSTmode = DSTon;        }        | tZONE {            yyTimezone = $1;            yyDSTmode = DSToff;        }        | tDAYZONE {            yyTimezone = $1;            yyDSTmode = DSTon;        }        ;day     : tDAY {            yyDayOrdinal = 1;            yyDayNumber = $1;        }        | tDAY ',' {            yyDayOrdinal = 1;            yyDayNumber = $1;        }        | tUNUMBER tDAY {            yyDayOrdinal = $1;            yyDayNumber = $2;        }        ;date    : tUNUMBER '/' tUNUMBER {            yyMonth = $1;            yyDay = $3;        }        | tUNUMBER '/' tUNUMBER '/' tUNUMBER {            yyMonth = $1;            yyDay = $3;            yyYear = $5;        }        | tMONTH tUNUMBER {            yyMonth = $1;            yyDay = $2;        }        | tMONTH tUNUMBER ',' tUNUMBER {            yyMonth = $1;            yyDay = $2;            yyYear = $4;        }        | tUNUMBER tMONTH {            yyMonth = $2;            yyDay = $1;        }		  | tEPOCH {				yyMonth = 1;				yyDay = 1;				yyYear = EPOCH;		  }        | tUNUMBER tMONTH tUNUMBER {            yyMonth = $2;            yyDay = $1;            yyYear = $3;        }        ;rel     : relunit tAGO {            yyRelSeconds = -yyRelSeconds;            yyRelMonth = -yyRelMonth;        }        | relunit        ;relunit : tUNUMBER tMINUTE_UNIT {            yyRelSeconds += $1 * $2 * 60L;        }        | tSNUMBER tMINUTE_UNIT {            yyRelSeconds += $1 * $2 * 60L;        }        | tMINUTE_UNIT {            yyRelSeconds += $1 * 60L;        }        | tSNUMBER tSEC_UNIT {            yyRelSeconds += $1;        }        | tUNUMBER tSEC_UNIT {            yyRelSeconds += $1;        }        | tSEC_UNIT {            yyRelSeconds++;        }        | tSNUMBER tMONTH_UNIT {            yyRelMonth += $1 * $2;        }        | tUNUMBER tMONTH_UNIT {            yyRelMonth += $1 * $2;        }        | tMONTH_UNIT {            yyRelMonth += $1;        }        ;number  : tUNUMBER    {	if (yyHaveTime && yyHaveDate && !yyHaveRel) {	    yyYear = $1;	} else {	    yyHaveTime++;	    if ($1 < 100) {		yyHour = 0;		yyMinutes = $1;	    } else {		yyHour = $1 / 100;		yyMinutes = $1 % 100;	    }	    yySeconds = 0;	    yyMeridian = MER24;	}    };o_merid : /* NULL */ {            $$ = MER24;        }        | tMERIDIAN {            $$ = $1;        }        ;%%/* * Month and day table. */static TABLE    MonthDayTable[] = {    { "january",        tMONTH,  1 },    { "february",       tMONTH,  2 },    { "march",          tMONTH,  3 },    { "april",          tMONTH,  4 },    { "may",            tMONTH,  5 },    { "june",           tMONTH,  6 },    { "july",           tMONTH,  7 },    { "august",         tMONTH,  8 },    { "september",      tMONTH,  9 },    { "sept",           tMONTH,  9 },    { "october",        tMONTH, 10 },    { "november",       tMONTH, 11 },    { "december",       tMONTH, 12 },    { "sunday",         tDAY, 0 },    { "monday",         tDAY, 1 },    { "tuesday",        tDAY, 2 },    { "tues",           tDAY, 2 },    { "wednesday",      tDAY, 3 },    { "wednes",         tDAY, 3 },    { "thursday",       tDAY, 4 },    { "thur",           tDAY, 4 },    { "thurs",          tDAY, 4 },    { "friday",         tDAY, 5 },    { "saturday",       tDAY, 6 },    { NULL }};/* * Time units table. */static TABLE    UnitsTable[] = {    { "year",           tMONTH_UNIT,    12 },    { "month",          tMONTH_UNIT,    1 },    { "fortnight",      tMINUTE_UNIT,   14 * 24 * 60 },    { "week",           tMINUTE_UNIT,   7 * 24 * 60 },    { "day",            tMINUTE_UNIT,   1 * 24 * 60 },    { "hour",           tMINUTE_UNIT,   60 },    { "minute",         tMINUTE_UNIT,   1 },    { "min",            tMINUTE_UNIT,   1 },    { "second",         tSEC_UNIT,      1 },    { "sec",            tSEC_UNIT,      1 },    { NULL }};/* * Assorted relative-time words. */static TABLE    OtherTable[] = {    { "tomorrow",       tMINUTE_UNIT,   1 * 24 * 60 },    { "yesterday",      tMINUTE_UNIT,   -1 * 24 * 60 },    { "today",          tMINUTE_UNIT,   0 },    { "now",            tMINUTE_UNIT,   0 },    { "last",           tUNUMBER,       -1 },    { "this",           tMINUTE_UNIT,   0 },    { "next",           tUNUMBER,       2 },#if 0    { "first",          tUNUMBER,       1 },/*  { "second",         tUNUMBER,       2 }, */    { "third",          tUNUMBER,       3 },    { "fourth",         tUNUMBER,       4 },    { "fifth",          tUNUMBER,       5 },    { "sixth",          tUNUMBER,       6 },    { "seventh",        tUNUMBER,       7 },    { "eighth",         tUNUMBER,       8 },    { "ninth",          tUNUMBER,       9 },    { "tenth",          tUNUMBER,       10 },    { "eleventh",       tUNUMBER,       11 },    { "twelfth",        tUNUMBER,       12 },#endif    { "ago",            tAGO,   1 },    { "epoch",          tEPOCH,   0 },    { NULL }};/* * The timezone table.  (Note: This table was modified to not use any floating * point constants to work around an SGI compiler bug). */static TABLE    TimezoneTable[] = {    { "gmt",    tZONE,     HOUR( 0) },      /* Greenwich Mean */    { "ut",     tZONE,     HOUR( 0) },      /* Universal (Coordinated) */    { "utc",    tZONE,     HOUR( 0) },    { "wet",    tZONE,     HOUR( 0) } ,     /* Western European */    { "bst",    tDAYZONE,  HOUR( 0) },      /* British Summer */    { "wat",    tZONE,     HOUR( 1) },      /* West Africa */    { "at",     tZONE,     HOUR( 2) },      /* Azores */#if     0    /* For completeness.  BST is also British Summer, and GST is     * also Guam Standard. */    { "bst",    tZONE,     HOUR( 3) },      /* Brazil Standard */    { "gst",    tZONE,     HOUR( 3) },      /* Greenland Standard */#endif    { "nft",    tZONE,     HOUR( 7/2) },    /* Newfoundland */    { "nst",    tZONE,     HOUR( 7/2) },    /* Newfoundland Standard */    { "ndt",    tDAYZONE,  HOUR( 7/2) },    /* Newfoundland Daylight */    { "ast",    tZONE,     HOUR( 4) },      /* Atlantic Standard */    { "adt",    tDAYZONE,  HOUR( 4) },      /* Atlantic Daylight */    { "est",    tZONE,     HOUR( 5) },      /* Eastern Standard */    { "edt",    tDAYZONE,  HOUR( 5) },      /* Eastern Daylight */    { "cst",    tZONE,     HOUR( 6) },      /* Central Standard */    { "cdt",    tDAYZONE,  HOUR( 6) },      /* Central Daylight */    { "mst",    tZONE,     HOUR( 7) },      /* Mountain Standard */    { "mdt",    tDAYZONE,  HOUR( 7) },      /* Mountain Daylight */    { "pst",    tZONE,     HOUR( 8) },      /* Pacific Standard */    { "pdt",    tDAYZONE,  HOUR( 8) },      /* Pacific Daylight */    { "yst",    tZONE,     HOUR( 9) },      /* Yukon Standard */    { "ydt",    tDAYZONE,  HOUR( 9) },      /* Yukon Daylight */    { "hst",    tZONE,     HOUR(10) },      /* Hawaii Standard */    { "hdt",    tDAYZONE,  HOUR(10) },      /* Hawaii Daylight */    { "cat",    tZONE,     HOUR(10) },      /* Central Alaska */    { "ahst",   tZONE,     HOUR(10) },      /* Alaska-Hawaii Standard */    { "nt",     tZONE,     HOUR(11) },      /* Nome */    { "idlw",   tZONE,     HOUR(12) },      /* International Date Line West */    { "cet",    tZONE,    -HOUR( 1) },      /* Central European */    { "met",    tZONE,    -HOUR( 1) },      /* Middle European */    { "mewt",   tZONE,    -HOUR( 1) },      /* Middle European Winter */    { "mest",   tDAYZONE, -HOUR( 1) },      /* Middle European Summer */    { "swt",    tZONE,    -HOUR( 1) },      /* Swedish Winter */    { "sst",    tDAYZONE, -HOUR( 1) },      /* Swedish Summer */    { "fwt",    tZONE,    -HOUR( 1) },      /* French Winter */    { "fst",    tDAYZONE, -HOUR( 1) },      /* French Summer */    { "eet",    tZONE,    -HOUR( 2) },      /* Eastern Europe, USSR Zone 1 */    { "bt",     tZONE,    -HOUR( 3) },      /* Baghdad, USSR Zone 2 */    { "it",     tZONE,    -HOUR( 7/2) },    /* Iran */    { "zp4",    tZONE,    -HOUR( 4) },      /* USSR Zone 3 */    { "zp5",    tZONE,    -HOUR( 5) },      /* USSR Zone 4 */    { "ist",    tZONE,    -HOUR(11/2) },    /* Indian Standard */    { "zp6",    tZONE,    -HOUR( 6) },      /* USSR Zone 5 */#if     0    /* For completeness.  NST is also Newfoundland Stanard, nad SST is     * also Swedish Summer. */    { "nst",    tZONE,    -HOUR(13/2) },    /* North Sumatra */    { "sst",    tZONE,    -HOUR( 7) },      /* South Sumatra, USSR Zone 6 */#endif  /* 0 */    { "wast",   tZONE,    -HOUR( 7) },      /* West Australian Standard */    { "wadt",   tDAYZONE, -HOUR( 7) },      /* West Australian Daylight */    { "jt",     tZONE,    -HOUR(15/2) },    /* Java (3pm in Cronusland!) */    { "cct",    tZONE,    -HOUR( 8) },      /* China Coast, USSR Zone 7 */    { "jst",    tZONE,    -HOUR( 9) },      /* Japan Standard, USSR Zone 8 */    { "cast",   tZONE,    -HOUR(19/2) },    /* Central Australian Standard */    { "cadt",   tDAYZONE, -HOUR(19/2) },    /* Central Australian Daylight */    { "east",   tZONE,    -HOUR(10) },      /* Eastern Australian Standard */    { "eadt",   tDAYZONE, -HOUR(10) },      /* Eastern Australian Daylight */    { "gst",    tZONE,    -HOUR(10) },      /* Guam Standard, USSR Zone 9 */    { "nzt",    tZONE,    -HOUR(12) },      /* New Zealand */    { "nzst",   tZONE,    -HOUR(12) },      /* New Zealand Standard */    { "nzdt",   tDAYZONE, -HOUR(12) },      /* New Zealand Daylight */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -