Annotation of embedaddon/sudo/plugins/sudoers/getdate.c, revision 1.1

1.1     ! misho       1: #include <config.h>
        !             2: #include <stdlib.h>
        !             3: #include <string.h>
        !             4: #define YYBYACC 1
        !             5: #define YYMAJOR 1
        !             6: #define YYMINOR 9
        !             7: #define YYLEX yylex()
        !             8: #define YYEMPTY -1
        !             9: #define yyclearin (yychar=(YYEMPTY))
        !            10: #define yyerrok (yyerrflag=0)
        !            11: #define YYRECOVERING() (yyerrflag!=0)
        !            12: #define YYPREFIX "yy"
        !            13: #line 2 "getdate.y"
        !            14: /*
        !            15: **  Originally written by Steven M. Bellovin <smb@research.att.com> while
        !            16: **  at the University of North Carolina at Chapel Hill.  Later tweaked by
        !            17: **  a couple of people on Usenet.  Completely overhauled by Rich $alz
        !            18: **  <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
        !            19: **
        !            20: **  This grammar has 10 shift/reduce conflicts.
        !            21: **
        !            22: **  This code is in the public domain and has no copyright.
        !            23: */
        !            24: /* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
        !            25: /* SUPPRESS 288 on yyerrlab *//* Label unused */
        !            26: 
        !            27: #include <config.h>
        !            28: 
        !            29: #include <sys/types.h>
        !            30: #include <sys/time.h>
        !            31: #include <stdio.h>
        !            32: #ifdef STDC_HEADERS
        !            33: # include <stdlib.h>
        !            34: # include <stddef.h>
        !            35: #else
        !            36: # ifdef HAVE_STDLIB_H
        !            37: #  include <stdlib.h>
        !            38: # endif
        !            39: #endif /* STDC_HEADERS */
        !            40: #ifdef HAVE_STRING_H
        !            41: # if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
        !            42: #  include <memory.h>
        !            43: # endif
        !            44: # include <string.h>
        !            45: #endif /* HAVE_STRING_H */
        !            46: #ifdef HAVE_STRINGS_H
        !            47: # include <strings.h>
        !            48: #endif /* HAVE_STRINGS_H */
        !            49: #if TIME_WITH_SYS_TIME
        !            50: # include <time.h>
        !            51: #endif
        !            52: #include <ctype.h>
        !            53: 
        !            54: #include "missing.h"
        !            55: 
        !            56: 
        !            57: #define EPOCH          1970
        !            58: #define HOUR(x)                ((time_t)(x) * 60)
        !            59: #define SECSPERDAY     (24L * 60L * 60L)
        !            60: 
        !            61: 
        !            62: /*
        !            63: **  An entry in the lexical lookup table.
        !            64: */
        !            65: typedef struct _TABLE {
        !            66:     char       *name;
        !            67:     int                type;
        !            68:     time_t     value;
        !            69: } TABLE;
        !            70: 
        !            71: 
        !            72: /*
        !            73: **  Daylight-savings mode:  on, off, or not yet known.
        !            74: */
        !            75: typedef enum _DSTMODE {
        !            76:     DSTon, DSToff, DSTmaybe
        !            77: } DSTMODE;
        !            78: 
        !            79: /*
        !            80: **  Meridian:  am, pm, or 24-hour style.
        !            81: */
        !            82: typedef enum _MERIDIAN {
        !            83:     MERam, MERpm, MER24
        !            84: } MERIDIAN;
        !            85: 
        !            86: 
        !            87: /*
        !            88: **  Global variables.  We could get rid of most of these by using a good
        !            89: **  union as the yacc stack.  (This routine was originally written before
        !            90: **  yacc had the %union construct.)  Maybe someday; right now we only use
        !            91: **  the %union very rarely.
        !            92: */
        !            93: static char    *yyInput;
        !            94: static DSTMODE yyDSTmode;
        !            95: static time_t  yyDayOrdinal;
        !            96: static time_t  yyDayNumber;
        !            97: static int     yyHaveDate;
        !            98: static int     yyHaveDay;
        !            99: static int     yyHaveRel;
        !           100: static int     yyHaveTime;
        !           101: static int     yyHaveZone;
        !           102: static time_t  yyTimezone;
        !           103: static time_t  yyDay;
        !           104: static time_t  yyHour;
        !           105: static time_t  yyMinutes;
        !           106: static time_t  yyMonth;
        !           107: static time_t  yySeconds;
        !           108: static time_t  yyYear;
        !           109: static MERIDIAN        yyMeridian;
        !           110: static time_t  yyRelMonth;
        !           111: static time_t  yyRelSeconds;
        !           112: 
        !           113: static int     yyerror(char *s);
        !           114: static int     yylex(void);
        !           115:        int     yyparse(void);
        !           116: 
        !           117: #line 107 "getdate.y"
        !           118: #ifndef YYSTYPE_DEFINED
        !           119: #define YYSTYPE_DEFINED
        !           120: typedef union {
        !           121:     time_t             Number;
        !           122:     enum _MERIDIAN     Meridian;
        !           123: } YYSTYPE;
        !           124: #endif /* YYSTYPE_DEFINED */
        !           125: #line 125 "y.tab.c"
        !           126: #define tAGO 257
        !           127: #define tDAY 258
        !           128: #define tDAYZONE 259
        !           129: #define tID 260
        !           130: #define tMERIDIAN 261
        !           131: #define tMINUTE_UNIT 262
        !           132: #define tMONTH 263
        !           133: #define tMONTH_UNIT 264
        !           134: #define tSEC_UNIT 265
        !           135: #define tSNUMBER 266
        !           136: #define tUNUMBER 267
        !           137: #define tZONE 268
        !           138: #define tDST 269
        !           139: #define YYERRCODE 256
        !           140: #if defined(__cplusplus) || defined(__STDC__)
        !           141: const short yylhs[] =
        !           142: #else
        !           143: short yylhs[] =
        !           144: #endif
        !           145:        {                                        -1,
        !           146:     0,    0,    2,    2,    2,    2,    2,    2,    3,    3,
        !           147:     3,    3,    3,    4,    4,    4,    6,    6,    6,    5,
        !           148:     5,    5,    5,    5,    5,    5,    5,    7,    7,    9,
        !           149:     9,    9,    9,    9,    9,    9,    9,    9,    8,    1,
        !           150:     1,
        !           151: };
        !           152: #if defined(__cplusplus) || defined(__STDC__)
        !           153: const short yylen[] =
        !           154: #else
        !           155: short yylen[] =
        !           156: #endif
        !           157:        {                                         2,
        !           158:     0,    2,    1,    1,    1,    1,    1,    1,    2,    4,
        !           159:     4,    6,    6,    1,    1,    2,    1,    2,    2,    3,
        !           160:     5,    3,    3,    2,    4,    2,    3,    2,    1,    2,
        !           161:     2,    1,    2,    2,    1,    2,    2,    1,    1,    0,
        !           162:     1,
        !           163: };
        !           164: #if defined(__cplusplus) || defined(__STDC__)
        !           165: const short yydefred[] =
        !           166: #else
        !           167: short yydefred[] =
        !           168: #endif
        !           169:        {                                      1,
        !           170:     0,    0,   15,   32,    0,   38,   35,    0,    0,    0,
        !           171:     2,    3,    4,    5,    6,    7,    8,    0,   18,    0,
        !           172:    31,   36,   33,   19,    9,   30,    0,   37,   34,    0,
        !           173:     0,    0,   16,   28,    0,   23,   27,   22,    0,    0,
        !           174:    25,   41,   11,    0,   10,    0,    0,   21,   13,   12,
        !           175: };
        !           176: #if defined(__cplusplus) || defined(__STDC__)
        !           177: const short yydgoto[] =
        !           178: #else
        !           179: short yydgoto[] =
        !           180: #endif
        !           181:        {                                       1,
        !           182:    45,   11,   12,   13,   14,   15,   16,   17,   18,
        !           183: };
        !           184: #if defined(__cplusplus) || defined(__STDC__)
        !           185: const short yysindex[] =
        !           186: #else
        !           187: short yysindex[] =
        !           188: #endif
        !           189:        {                                      0,
        !           190:  -249,  -38,    0,    0, -260,    0,    0, -240,  -47, -248,
        !           191:     0,    0,    0,    0,    0,    0,    0, -237,    0,  -18,
        !           192:     0,    0,    0,    0,    0,    0, -262,    0,    0, -239,
        !           193:  -238, -236,    0,    0, -235,    0,    0,    0,  -56,  -19,
        !           194:     0,    0,    0, -234,    0, -232, -258,    0,    0,    0,};
        !           195: #if defined(__cplusplus) || defined(__STDC__)
        !           196: const short yyrindex[] =
        !           197: #else
        !           198: short yyrindex[] =
        !           199: #endif
        !           200:        {                                      0,
        !           201:     0,    1,    0,    0,    0,    0,    0,    0,   69,   12,
        !           202:     0,    0,    0,    0,    0,    0,    0,   23,    0,   34,
        !           203:     0,    0,    0,    0,    0,    0,   67,    0,    0,    0,
        !           204:     0,    0,    0,    0,    0,    0,    0,    0,   56,   45,
        !           205:     0,    0,    0,    0,    0,    0,   56,    0,    0,    0,};
        !           206: #if defined(__cplusplus) || defined(__STDC__)
        !           207: const short yygindex[] =
        !           208: #else
        !           209: short yygindex[] =
        !           210: #endif
        !           211:        {                                      0,
        !           212:   -17,    0,    0,    0,    0,    0,    0,    0,    0,
        !           213: };
        !           214: #define YYTABLESIZE 337
        !           215: #if defined(__cplusplus) || defined(__STDC__)
        !           216: const short yytable[] =
        !           217: #else
        !           218: short yytable[] =
        !           219: #endif
        !           220:        {                                      32,
        !           221:    17,   44,   42,   36,   37,   19,   20,   49,    2,    3,
        !           222:    31,   14,    4,    5,    6,    7,    8,    9,   10,   34,
        !           223:    33,   21,   29,   22,   23,   35,   38,   46,   39,   50,
        !           224:    40,   41,   47,   24,   48,    0,    0,    0,    0,    0,
        !           225:     0,    0,    0,    0,   20,    0,    0,    0,    0,    0,
        !           226:     0,    0,    0,    0,    0,   40,    0,    0,    0,    0,
        !           227:     0,    0,    0,    0,    0,    0,   26,    0,   39,    0,
        !           228:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           229:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           230:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           231:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           232:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           233:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           234:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           235:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           236:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           237:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           238:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           239:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           240:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           241:     0,    0,    0,    0,   42,    0,    0,    0,    0,   43,
        !           242:    24,    0,    0,   25,   26,   27,   28,   29,   30,    0,
        !           243:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           244:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           245:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           246:     0,    0,    0,    0,    0,    0,    0,    0,   17,   17,
        !           247:     0,    0,   17,   17,   17,   17,   17,   17,   17,   14,
        !           248:    14,    0,    0,   14,   14,   14,   14,   14,   14,   14,
        !           249:    29,   29,    0,    0,   29,   29,   29,   29,   29,   29,
        !           250:    29,   24,   24,    0,    0,   24,   24,   24,   24,   24,
        !           251:    24,   24,   20,   20,    0,    0,   20,   20,   20,   20,
        !           252:    20,   20,   20,   40,   40,    0,    0,   40,   40,   40,
        !           253:    40,    0,   40,   40,   26,   26,    0,   39,   26,   26,
        !           254:    26,   26,    0,    0,   26,   39,   39,
        !           255: };
        !           256: #if defined(__cplusplus) || defined(__STDC__)
        !           257: const short yycheck[] =
        !           258: #else
        !           259: short yycheck[] =
        !           260: #endif
        !           261:        {                                      47,
        !           262:     0,   58,  261,  266,  267,   44,  267,  266,  258,  259,
        !           263:    58,    0,  262,  263,  264,  265,  266,  267,  268,  257,
        !           264:   269,  262,    0,  264,  265,   44,  266,   47,  267,   47,
        !           265:   267,  267,  267,    0,  267,   -1,   -1,   -1,   -1,   -1,
        !           266:    -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,   -1,   -1,
        !           267:    -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,   -1,
        !           268:    -1,   -1,   -1,   -1,   -1,   -1,    0,   -1,    0,   -1,
        !           269:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           270:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           271:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           272:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           273:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           274:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           275:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           276:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           277:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           278:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           279:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           280:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           281:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           282:    -1,   -1,   -1,   -1,  261,   -1,   -1,   -1,   -1,  266,
        !           283:   258,   -1,   -1,  261,  262,  263,  264,  265,  266,   -1,
        !           284:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           285:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           286:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           287:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  258,  259,
        !           288:    -1,   -1,  262,  263,  264,  265,  266,  267,  268,  258,
        !           289:   259,   -1,   -1,  262,  263,  264,  265,  266,  267,  268,
        !           290:   258,  259,   -1,   -1,  262,  263,  264,  265,  266,  267,
        !           291:   268,  258,  259,   -1,   -1,  262,  263,  264,  265,  266,
        !           292:   267,  268,  258,  259,   -1,   -1,  262,  263,  264,  265,
        !           293:   266,  267,  268,  258,  259,   -1,   -1,  262,  263,  264,
        !           294:   265,   -1,  267,  268,  258,  259,   -1,  259,  262,  263,
        !           295:   264,  265,   -1,   -1,  268,  267,  268,
        !           296: };
        !           297: #define YYFINAL 1
        !           298: #ifndef YYDEBUG
        !           299: #define YYDEBUG 0
        !           300: #endif
        !           301: #define YYMAXTOKEN 269
        !           302: #if YYDEBUG
        !           303: #if defined(__cplusplus) || defined(__STDC__)
        !           304: const char * const yyname[] =
        !           305: #else
        !           306: char *yyname[] =
        !           307: #endif
        !           308:        {
        !           309: "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,
        !           310: 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,
        !           311: 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,
        !           312: 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,
        !           313: 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,
        !           314: 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,
        !           315: 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,"tAGO","tDAY",
        !           316: "tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT",
        !           317: "tSNUMBER","tUNUMBER","tZONE","tDST",
        !           318: };
        !           319: #if defined(__cplusplus) || defined(__STDC__)
        !           320: const char * const yyrule[] =
        !           321: #else
        !           322: char *yyrule[] =
        !           323: #endif
        !           324:        {"$accept : spec",
        !           325: "spec :",
        !           326: "spec : spec item",
        !           327: "item : time",
        !           328: "item : zone",
        !           329: "item : date",
        !           330: "item : day",
        !           331: "item : rel",
        !           332: "item : number",
        !           333: "time : tUNUMBER tMERIDIAN",
        !           334: "time : tUNUMBER ':' tUNUMBER o_merid",
        !           335: "time : tUNUMBER ':' tUNUMBER tSNUMBER",
        !           336: "time : tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid",
        !           337: "time : tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER",
        !           338: "zone : tZONE",
        !           339: "zone : tDAYZONE",
        !           340: "zone : tZONE tDST",
        !           341: "day : tDAY",
        !           342: "day : tDAY ','",
        !           343: "day : tUNUMBER tDAY",
        !           344: "date : tUNUMBER '/' tUNUMBER",
        !           345: "date : tUNUMBER '/' tUNUMBER '/' tUNUMBER",
        !           346: "date : tUNUMBER tSNUMBER tSNUMBER",
        !           347: "date : tUNUMBER tMONTH tSNUMBER",
        !           348: "date : tMONTH tUNUMBER",
        !           349: "date : tMONTH tUNUMBER ',' tUNUMBER",
        !           350: "date : tUNUMBER tMONTH",
        !           351: "date : tUNUMBER tMONTH tUNUMBER",
        !           352: "rel : relunit tAGO",
        !           353: "rel : relunit",
        !           354: "relunit : tUNUMBER tMINUTE_UNIT",
        !           355: "relunit : tSNUMBER tMINUTE_UNIT",
        !           356: "relunit : tMINUTE_UNIT",
        !           357: "relunit : tSNUMBER tSEC_UNIT",
        !           358: "relunit : tUNUMBER tSEC_UNIT",
        !           359: "relunit : tSEC_UNIT",
        !           360: "relunit : tSNUMBER tMONTH_UNIT",
        !           361: "relunit : tUNUMBER tMONTH_UNIT",
        !           362: "relunit : tMONTH_UNIT",
        !           363: "number : tUNUMBER",
        !           364: "o_merid :",
        !           365: "o_merid : tMERIDIAN",
        !           366: };
        !           367: #endif
        !           368: #ifdef YYSTACKSIZE
        !           369: #undef YYMAXDEPTH
        !           370: #define YYMAXDEPTH YYSTACKSIZE
        !           371: #else
        !           372: #ifdef YYMAXDEPTH
        !           373: #define YYSTACKSIZE YYMAXDEPTH
        !           374: #else
        !           375: #define YYSTACKSIZE 10000
        !           376: #define YYMAXDEPTH 10000
        !           377: #endif
        !           378: #endif
        !           379: #define YYINITSTACKSIZE 200
        !           380: /* LINTUSED */
        !           381: int yydebug;
        !           382: int yynerrs;
        !           383: int yyerrflag;
        !           384: int yychar;
        !           385: short *yyssp;
        !           386: YYSTYPE *yyvsp;
        !           387: YYSTYPE yyval;
        !           388: YYSTYPE yylval;
        !           389: short *yyss;
        !           390: short *yysslim;
        !           391: YYSTYPE *yyvs;
        !           392: int yystacksize;
        !           393: #line 326 "getdate.y"
        !           394: 
        !           395: /* Month and day table. */
        !           396: static TABLE const MonthDayTable[] = {
        !           397:     { "january",       tMONTH,  1 },
        !           398:     { "february",      tMONTH,  2 },
        !           399:     { "march",         tMONTH,  3 },
        !           400:     { "april",         tMONTH,  4 },
        !           401:     { "may",           tMONTH,  5 },
        !           402:     { "june",          tMONTH,  6 },
        !           403:     { "july",          tMONTH,  7 },
        !           404:     { "august",                tMONTH,  8 },
        !           405:     { "september",     tMONTH,  9 },
        !           406:     { "sept",          tMONTH,  9 },
        !           407:     { "october",       tMONTH, 10 },
        !           408:     { "november",      tMONTH, 11 },
        !           409:     { "december",      tMONTH, 12 },
        !           410:     { "sunday",                tDAY, 0 },
        !           411:     { "monday",                tDAY, 1 },
        !           412:     { "tuesday",       tDAY, 2 },
        !           413:     { "tues",          tDAY, 2 },
        !           414:     { "wednesday",     tDAY, 3 },
        !           415:     { "wednes",                tDAY, 3 },
        !           416:     { "thursday",      tDAY, 4 },
        !           417:     { "thur",          tDAY, 4 },
        !           418:     { "thurs",         tDAY, 4 },
        !           419:     { "friday",                tDAY, 5 },
        !           420:     { "saturday",      tDAY, 6 },
        !           421:     { NULL }
        !           422: };
        !           423: 
        !           424: /* Time units table. */
        !           425: static TABLE const UnitsTable[] = {
        !           426:     { "year",          tMONTH_UNIT,    12 },
        !           427:     { "month",         tMONTH_UNIT,    1 },
        !           428:     { "fortnight",     tMINUTE_UNIT,   14 * 24 * 60 },
        !           429:     { "week",          tMINUTE_UNIT,   7 * 24 * 60 },
        !           430:     { "day",           tMINUTE_UNIT,   1 * 24 * 60 },
        !           431:     { "hour",          tMINUTE_UNIT,   60 },
        !           432:     { "minute",                tMINUTE_UNIT,   1 },
        !           433:     { "min",           tMINUTE_UNIT,   1 },
        !           434:     { "second",                tSEC_UNIT,      1 },
        !           435:     { "sec",           tSEC_UNIT,      1 },
        !           436:     { NULL }
        !           437: };
        !           438: 
        !           439: /* Assorted relative-time words. */
        !           440: static TABLE const OtherTable[] = {
        !           441:     { "tomorrow",      tMINUTE_UNIT,   1 * 24 * 60 },
        !           442:     { "yesterday",     tMINUTE_UNIT,   -1 * 24 * 60 },
        !           443:     { "today",         tMINUTE_UNIT,   0 },
        !           444:     { "now",           tMINUTE_UNIT,   0 },
        !           445:     { "last",          tUNUMBER,       -1 },
        !           446:     { "this",          tMINUTE_UNIT,   0 },
        !           447:     { "next",          tUNUMBER,       2 },
        !           448:     { "first",         tUNUMBER,       1 },
        !           449: /*  { "second",                tUNUMBER,       2 }, */
        !           450:     { "third",         tUNUMBER,       3 },
        !           451:     { "fourth",                tUNUMBER,       4 },
        !           452:     { "fifth",         tUNUMBER,       5 },
        !           453:     { "sixth",         tUNUMBER,       6 },
        !           454:     { "seventh",       tUNUMBER,       7 },
        !           455:     { "eighth",                tUNUMBER,       8 },
        !           456:     { "ninth",         tUNUMBER,       9 },
        !           457:     { "tenth",         tUNUMBER,       10 },
        !           458:     { "eleventh",      tUNUMBER,       11 },
        !           459:     { "twelfth",       tUNUMBER,       12 },
        !           460:     { "ago",           tAGO,   1 },
        !           461:     { NULL }
        !           462: };
        !           463: 
        !           464: /* The timezone table. */
        !           465: /* Some of these are commented out because a time_t can't store a float. */
        !           466: static TABLE const TimezoneTable[] = {
        !           467:     { "gmt",   tZONE,     HOUR( 0) },  /* Greenwich Mean */
        !           468:     { "ut",    tZONE,     HOUR( 0) },  /* Universal (Coordinated) */
        !           469:     { "utc",   tZONE,     HOUR( 0) },
        !           470:     { "wet",   tZONE,     HOUR( 0) },  /* Western European */
        !           471:     { "bst",   tDAYZONE,  HOUR( 0) },  /* British Summer */
        !           472:     { "wat",   tZONE,     HOUR( 1) },  /* West Africa */
        !           473:     { "at",    tZONE,     HOUR( 2) },  /* Azores */
        !           474: #if    0
        !           475:     /* For completeness.  BST is also British Summer, and GST is
        !           476:      * also Guam Standard. */
        !           477:     { "bst",   tZONE,     HOUR( 3) },  /* Brazil Standard */
        !           478:     { "gst",   tZONE,     HOUR( 3) },  /* Greenland Standard */
        !           479: #endif
        !           480: #if 0
        !           481:     { "nft",   tZONE,     HOUR(3.5) }, /* Newfoundland */
        !           482:     { "nst",   tZONE,     HOUR(3.5) }, /* Newfoundland Standard */
        !           483:     { "ndt",   tDAYZONE,  HOUR(3.5) }, /* Newfoundland Daylight */
        !           484: #endif
        !           485:     { "ast",   tZONE,     HOUR( 4) },  /* Atlantic Standard */
        !           486:     { "adt",   tDAYZONE,  HOUR( 4) },  /* Atlantic Daylight */
        !           487:     { "est",   tZONE,     HOUR( 5) },  /* Eastern Standard */
        !           488:     { "edt",   tDAYZONE,  HOUR( 5) },  /* Eastern Daylight */
        !           489:     { "cst",   tZONE,     HOUR( 6) },  /* Central Standard */
        !           490:     { "cdt",   tDAYZONE,  HOUR( 6) },  /* Central Daylight */
        !           491:     { "mst",   tZONE,     HOUR( 7) },  /* Mountain Standard */
        !           492:     { "mdt",   tDAYZONE,  HOUR( 7) },  /* Mountain Daylight */
        !           493:     { "pst",   tZONE,     HOUR( 8) },  /* Pacific Standard */
        !           494:     { "pdt",   tDAYZONE,  HOUR( 8) },  /* Pacific Daylight */
        !           495:     { "yst",   tZONE,     HOUR( 9) },  /* Yukon Standard */
        !           496:     { "ydt",   tDAYZONE,  HOUR( 9) },  /* Yukon Daylight */
        !           497:     { "hst",   tZONE,     HOUR(10) },  /* Hawaii Standard */
        !           498:     { "hdt",   tDAYZONE,  HOUR(10) },  /* Hawaii Daylight */
        !           499:     { "cat",   tZONE,     HOUR(10) },  /* Central Alaska */
        !           500:     { "ahst",  tZONE,     HOUR(10) },  /* Alaska-Hawaii Standard */
        !           501:     { "nt",    tZONE,     HOUR(11) },  /* Nome */
        !           502:     { "idlw",  tZONE,     HOUR(12) },  /* International Date Line West */
        !           503:     { "cet",   tZONE,     -HOUR(1) },  /* Central European */
        !           504:     { "met",   tZONE,     -HOUR(1) },  /* Middle European */
        !           505:     { "mewt",  tZONE,     -HOUR(1) },  /* Middle European Winter */
        !           506:     { "mest",  tDAYZONE,  -HOUR(1) },  /* Middle European Summer */
        !           507:     { "swt",   tZONE,     -HOUR(1) },  /* Swedish Winter */
        !           508:     { "sst",   tDAYZONE,  -HOUR(1) },  /* Swedish Summer */
        !           509:     { "fwt",   tZONE,     -HOUR(1) },  /* French Winter */
        !           510:     { "fst",   tDAYZONE,  -HOUR(1) },  /* French Summer */
        !           511:     { "eet",   tZONE,     -HOUR(2) },  /* Eastern Europe, USSR Zone 1 */
        !           512:     { "bt",    tZONE,     -HOUR(3) },  /* Baghdad, USSR Zone 2 */
        !           513: #if 0
        !           514:     { "it",    tZONE,     -HOUR(3.5) },/* Iran */
        !           515: #endif
        !           516:     { "zp4",   tZONE,     -HOUR(4) },  /* USSR Zone 3 */
        !           517:     { "zp5",   tZONE,     -HOUR(5) },  /* USSR Zone 4 */
        !           518: #if 0
        !           519:     { "ist",   tZONE,     -HOUR(5.5) },/* Indian Standard */
        !           520: #endif
        !           521:     { "zp6",   tZONE,     -HOUR(6) },  /* USSR Zone 5 */
        !           522: #if    0
        !           523:     /* For completeness.  NST is also Newfoundland Stanard, and SST is
        !           524:      * also Swedish Summer. */
        !           525:     { "nst",   tZONE,     -HOUR(6.5) },/* North Sumatra */
        !           526:     { "sst",   tZONE,     -HOUR(7) },  /* South Sumatra, USSR Zone 6 */
        !           527: #endif /* 0 */
        !           528:     { "wast",  tZONE,     -HOUR(7) },  /* West Australian Standard */
        !           529:     { "wadt",  tDAYZONE,  -HOUR(7) },  /* West Australian Daylight */
        !           530: #if 0
        !           531:     { "jt",    tZONE,     -HOUR(7.5) },/* Java (3pm in Cronusland!) */
        !           532: #endif
        !           533:     { "cct",   tZONE,     -HOUR(8) },  /* China Coast, USSR Zone 7 */
        !           534:     { "jst",   tZONE,     -HOUR(9) },  /* Japan Standard, USSR Zone 8 */
        !           535: #if 0
        !           536:     { "cast",  tZONE,     -HOUR(9.5) },/* Central Australian Standard */
        !           537:     { "cadt",  tDAYZONE,  -HOUR(9.5) },/* Central Australian Daylight */
        !           538: #endif
        !           539:     { "east",  tZONE,     -HOUR(10) }, /* Eastern Australian Standard */
        !           540:     { "eadt",  tDAYZONE,  -HOUR(10) }, /* Eastern Australian Daylight */
        !           541:     { "gst",   tZONE,     -HOUR(10) }, /* Guam Standard, USSR Zone 9 */
        !           542:     { "nzt",   tZONE,     -HOUR(12) }, /* New Zealand */
        !           543:     { "nzst",  tZONE,     -HOUR(12) }, /* New Zealand Standard */
        !           544:     { "nzdt",  tDAYZONE,  -HOUR(12) }, /* New Zealand Daylight */
        !           545:     { "idle",  tZONE,     -HOUR(12) }, /* International Date Line East */
        !           546:     {  NULL  }
        !           547: };
        !           548: 
        !           549: /* Military timezone table. */
        !           550: static TABLE const MilitaryTable[] = {
        !           551:     { "a",     tZONE,  HOUR(  1) },
        !           552:     { "b",     tZONE,  HOUR(  2) },
        !           553:     { "c",     tZONE,  HOUR(  3) },
        !           554:     { "d",     tZONE,  HOUR(  4) },
        !           555:     { "e",     tZONE,  HOUR(  5) },
        !           556:     { "f",     tZONE,  HOUR(  6) },
        !           557:     { "g",     tZONE,  HOUR(  7) },
        !           558:     { "h",     tZONE,  HOUR(  8) },
        !           559:     { "i",     tZONE,  HOUR(  9) },
        !           560:     { "k",     tZONE,  HOUR( 10) },
        !           561:     { "l",     tZONE,  HOUR( 11) },
        !           562:     { "m",     tZONE,  HOUR( 12) },
        !           563:     { "n",     tZONE,  HOUR(- 1) },
        !           564:     { "o",     tZONE,  HOUR(- 2) },
        !           565:     { "p",     tZONE,  HOUR(- 3) },
        !           566:     { "q",     tZONE,  HOUR(- 4) },
        !           567:     { "r",     tZONE,  HOUR(- 5) },
        !           568:     { "s",     tZONE,  HOUR(- 6) },
        !           569:     { "t",     tZONE,  HOUR(- 7) },
        !           570:     { "u",     tZONE,  HOUR(- 8) },
        !           571:     { "v",     tZONE,  HOUR(- 9) },
        !           572:     { "w",     tZONE,  HOUR(-10) },
        !           573:     { "x",     tZONE,  HOUR(-11) },
        !           574:     { "y",     tZONE,  HOUR(-12) },
        !           575:     { "z",     tZONE,  HOUR(  0) },
        !           576:     { NULL }
        !           577: };
        !           578: 
        !           579: 
        !           580: 
        !           581: 
        !           582: /* ARGSUSED */
        !           583: static int
        !           584: yyerror(s)
        !           585:     char       *s;
        !           586: {
        !           587:   return 0;
        !           588: }
        !           589: 
        !           590: 
        !           591: static time_t
        !           592: ToSeconds(Hours, Minutes, Seconds, Meridian)
        !           593:     time_t     Hours;
        !           594:     time_t     Minutes;
        !           595:     time_t     Seconds;
        !           596:     MERIDIAN   Meridian;
        !           597: {
        !           598:     if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
        !           599:        return -1;
        !           600:     switch (Meridian) {
        !           601:     case MER24:
        !           602:        if (Hours < 0 || Hours > 23)
        !           603:            return -1;
        !           604:        return (Hours * 60L + Minutes) * 60L + Seconds;
        !           605:     case MERam:
        !           606:        if (Hours < 1 || Hours > 12)
        !           607:            return -1;
        !           608:        if (Hours == 12)
        !           609:            Hours = 0;
        !           610:        return (Hours * 60L + Minutes) * 60L + Seconds;
        !           611:     case MERpm:
        !           612:        if (Hours < 1 || Hours > 12)
        !           613:            return -1;
        !           614:        if (Hours == 12)
        !           615:            Hours = 0;
        !           616:        return ((Hours + 12) * 60L + Minutes) * 60L + Seconds;
        !           617:     default:
        !           618:        abort ();
        !           619:     }
        !           620:     /* NOTREACHED */
        !           621: }
        !           622: 
        !           623: 
        !           624: /* Year is either
        !           625:    * A negative number, which means to use its absolute value (why?)
        !           626:    * A number from 0 to 99, which means a year from 1900 to 1999, or
        !           627:    * The actual year (>=100).  */
        !           628: static time_t
        !           629: Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
        !           630:     time_t     Month;
        !           631:     time_t     Day;
        !           632:     time_t     Year;
        !           633:     time_t     Hours;
        !           634:     time_t     Minutes;
        !           635:     time_t     Seconds;
        !           636:     MERIDIAN   Meridian;
        !           637:     DSTMODE    DSTmode;
        !           638: {
        !           639:     static int DaysInMonth[12] = {
        !           640:        31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
        !           641:     };
        !           642:     time_t     tod;
        !           643:     time_t     Julian;
        !           644:     int                i;
        !           645: 
        !           646:     if (Year < 0)
        !           647:        Year = -Year;
        !           648:     if (Year < 69)
        !           649:        Year += 2000;
        !           650:     else if (Year < 100) {
        !           651:        Year += 1900;
        !           652:        if (Year < EPOCH)
        !           653:                Year += 100;
        !           654:     }
        !           655:     DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
        !           656:                    ? 29 : 28;
        !           657:     /* Checking for 2038 bogusly assumes that time_t is 32 bits.  But
        !           658:        I'm too lazy to try to check for time_t overflow in another way.  */
        !           659:     if (Year < EPOCH || Year > 2038
        !           660:      || Month < 1 || Month > 12
        !           661:      /* Lint fluff:  "conversion from long may lose accuracy" */
        !           662:      || Day < 1 || Day > DaysInMonth[(int)--Month])
        !           663:        return -1;
        !           664: 
        !           665:     for (Julian = Day - 1, i = 0; i < Month; i++)
        !           666:        Julian += DaysInMonth[i];
        !           667:     for (i = EPOCH; i < Year; i++)
        !           668:        Julian += 365 + (i % 4 == 0);
        !           669:     Julian *= SECSPERDAY;
        !           670:     Julian += yyTimezone * 60L;
        !           671:     if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)
        !           672:        return -1;
        !           673:     Julian += tod;
        !           674:     if (DSTmode == DSTon
        !           675:      || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst))
        !           676:        Julian -= 60 * 60;
        !           677:     return Julian;
        !           678: }
        !           679: 
        !           680: 
        !           681: static time_t
        !           682: DSTcorrect(Start, Future)
        !           683:     time_t     Start;
        !           684:     time_t     Future;
        !           685: {
        !           686:     time_t     StartDay;
        !           687:     time_t     FutureDay;
        !           688: 
        !           689:     StartDay = (localtime(&Start)->tm_hour + 1) % 24;
        !           690:     FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
        !           691:     return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
        !           692: }
        !           693: 
        !           694: 
        !           695: static time_t
        !           696: RelativeDate(Start, DayOrdinal, DayNumber)
        !           697:     time_t     Start;
        !           698:     time_t     DayOrdinal;
        !           699:     time_t     DayNumber;
        !           700: {
        !           701:     struct tm  *tm;
        !           702:     time_t     now;
        !           703: 
        !           704:     now = Start;
        !           705:     tm = localtime(&now);
        !           706:     now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
        !           707:     now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
        !           708:     return DSTcorrect(Start, now);
        !           709: }
        !           710: 
        !           711: 
        !           712: static time_t
        !           713: RelativeMonth(Start, RelMonth)
        !           714:     time_t     Start;
        !           715:     time_t     RelMonth;
        !           716: {
        !           717:     struct tm  *tm;
        !           718:     time_t     Month;
        !           719:     time_t     Year;
        !           720: 
        !           721:     if (RelMonth == 0)
        !           722:        return 0;
        !           723:     tm = localtime(&Start);
        !           724:     Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth;
        !           725:     Year = Month / 12;
        !           726:     Month = Month % 12 + 1;
        !           727:     return DSTcorrect(Start,
        !           728:            Convert(Month, (time_t)tm->tm_mday, Year,
        !           729:                (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
        !           730:                MER24, DSTmaybe));
        !           731: }
        !           732: 
        !           733: 
        !           734: static int
        !           735: LookupWord(buff)
        !           736:     char               *buff;
        !           737: {
        !           738:     char               *p;
        !           739:     char               *q;
        !           740:     const TABLE                *tp;
        !           741:     int                        i;
        !           742:     int                        abbrev;
        !           743: 
        !           744:     /* Make it lowercase. */
        !           745:     for (p = buff; *p; p++)
        !           746:        if (isupper((unsigned char)*p))
        !           747:            *p = tolower((unsigned char)*p);
        !           748: 
        !           749:     if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) {
        !           750:        yylval.Meridian = MERam;
        !           751:        return tMERIDIAN;
        !           752:     }
        !           753:     if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) {
        !           754:        yylval.Meridian = MERpm;
        !           755:        return tMERIDIAN;
        !           756:     }
        !           757: 
        !           758:     /* See if we have an abbreviation for a month. */
        !           759:     if (strlen(buff) == 3)
        !           760:        abbrev = 1;
        !           761:     else if (strlen(buff) == 4 && buff[3] == '.') {
        !           762:        abbrev = 1;
        !           763:        buff[3] = '\0';
        !           764:     }
        !           765:     else
        !           766:        abbrev = 0;
        !           767: 
        !           768:     for (tp = MonthDayTable; tp->name; tp++) {
        !           769:        if (abbrev) {
        !           770:            if (strncmp(buff, tp->name, 3) == 0) {
        !           771:                yylval.Number = tp->value;
        !           772:                return tp->type;
        !           773:            }
        !           774:        }
        !           775:        else if (strcmp(buff, tp->name) == 0) {
        !           776:            yylval.Number = tp->value;
        !           777:            return tp->type;
        !           778:        }
        !           779:     }
        !           780: 
        !           781:     for (tp = TimezoneTable; tp->name; tp++)
        !           782:        if (strcmp(buff, tp->name) == 0) {
        !           783:            yylval.Number = tp->value;
        !           784:            return tp->type;
        !           785:        }
        !           786: 
        !           787:     if (strcmp(buff, "dst") == 0) 
        !           788:        return tDST;
        !           789: 
        !           790:     for (tp = UnitsTable; tp->name; tp++)
        !           791:        if (strcmp(buff, tp->name) == 0) {
        !           792:            yylval.Number = tp->value;
        !           793:            return tp->type;
        !           794:        }
        !           795: 
        !           796:     /* Strip off any plural and try the units table again. */
        !           797:     i = strlen(buff) - 1;
        !           798:     if (buff[i] == 's') {
        !           799:        buff[i] = '\0';
        !           800:        for (tp = UnitsTable; tp->name; tp++)
        !           801:            if (strcmp(buff, tp->name) == 0) {
        !           802:                yylval.Number = tp->value;
        !           803:                return tp->type;
        !           804:            }
        !           805:        buff[i] = 's';          /* Put back for "this" in OtherTable. */
        !           806:     }
        !           807: 
        !           808:     for (tp = OtherTable; tp->name; tp++)
        !           809:        if (strcmp(buff, tp->name) == 0) {
        !           810:            yylval.Number = tp->value;
        !           811:            return tp->type;
        !           812:        }
        !           813: 
        !           814:     /* Military timezones. */
        !           815:     if (buff[1] == '\0' && isalpha((unsigned char)*buff)) {
        !           816:        for (tp = MilitaryTable; tp->name; tp++)
        !           817:            if (strcmp(buff, tp->name) == 0) {
        !           818:                yylval.Number = tp->value;
        !           819:                return tp->type;
        !           820:            }
        !           821:     }
        !           822: 
        !           823:     /* Drop out any periods and try the timezone table again. */
        !           824:     for (i = 0, p = q = buff; *q; q++)
        !           825:        if (*q != '.')
        !           826:            *p++ = *q;
        !           827:        else
        !           828:            i++;
        !           829:     *p = '\0';
        !           830:     if (i)
        !           831:        for (tp = TimezoneTable; tp->name; tp++)
        !           832:            if (strcmp(buff, tp->name) == 0) {
        !           833:                yylval.Number = tp->value;
        !           834:                return tp->type;
        !           835:            }
        !           836: 
        !           837:     return tID;
        !           838: }
        !           839: 
        !           840: 
        !           841: static int
        !           842: yylex()
        !           843: {
        !           844:     char               c;
        !           845:     char               *p;
        !           846:     char               buff[20];
        !           847:     int                        Count;
        !           848:     int                        sign;
        !           849: 
        !           850:     for ( ; ; ) {
        !           851:        while (isspace((unsigned char)*yyInput))
        !           852:            yyInput++;
        !           853: 
        !           854:        if (isdigit((unsigned char)(c = *yyInput)) || c == '-' || c == '+') {
        !           855:            if (c == '-' || c == '+') {
        !           856:                sign = c == '-' ? -1 : 1;
        !           857:                if (!isdigit((unsigned char)*++yyInput))
        !           858:                    /* skip the '-' sign */
        !           859:                    continue;
        !           860:            }
        !           861:            else
        !           862:                sign = 0;
        !           863:            for (yylval.Number = 0; isdigit((unsigned char)(c = *yyInput++)); )
        !           864:                yylval.Number = 10 * yylval.Number + c - '0';
        !           865:            yyInput--;
        !           866:            if (sign < 0)
        !           867:                yylval.Number = -yylval.Number;
        !           868:            return sign ? tSNUMBER : tUNUMBER;
        !           869:        }
        !           870:        if (isalpha((unsigned char)c)) {
        !           871:            for (p = buff; isalpha((unsigned char)(c = *yyInput++)) || c == '.'; )
        !           872:                if (p < &buff[sizeof buff - 1])
        !           873:                    *p++ = c;
        !           874:            *p = '\0';
        !           875:            yyInput--;
        !           876:            return LookupWord(buff);
        !           877:        }
        !           878:        if (c != '(')
        !           879:            return *yyInput++;
        !           880:        Count = 0;
        !           881:        do {
        !           882:            c = *yyInput++;
        !           883:            if (c == '\0')
        !           884:                return c;
        !           885:            if (c == '(')
        !           886:                Count++;
        !           887:            else if (c == ')')
        !           888:                Count--;
        !           889:        } while (Count > 0);
        !           890:     }
        !           891: }
        !           892: 
        !           893: #define TM_YEAR_ORIGIN 1900
        !           894: 
        !           895: /* Yield A - B, measured in seconds.  */
        !           896: static long
        !           897: difftm (a, b)
        !           898:      struct tm *a, *b;
        !           899: {
        !           900:   int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
        !           901:   int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
        !           902:   int days = (
        !           903:              /* difference in day of year */
        !           904:              a->tm_yday - b->tm_yday
        !           905:              /* + intervening leap days */
        !           906:              +  ((ay >> 2) - (by >> 2))
        !           907:              -  (ay/100 - by/100)
        !           908:              +  ((ay/100 >> 2) - (by/100 >> 2))
        !           909:              /* + difference in years * 365 */
        !           910:              +  (long)(ay-by) * 365
        !           911:              );
        !           912:   return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
        !           913:              + (a->tm_min - b->tm_min))
        !           914:          + (a->tm_sec - b->tm_sec));
        !           915: }
        !           916: 
        !           917: time_t
        !           918: get_date(p)
        !           919:     char               *p;
        !           920: {
        !           921:     struct tm          *tm, *gmt, gmtbuf;
        !           922:     time_t             Start;
        !           923:     time_t             tod;
        !           924:     time_t             now;
        !           925:     time_t             timezone;
        !           926: 
        !           927:     yyInput = p;
        !           928:     (void)time (&now);
        !           929: 
        !           930:     gmt = gmtime (&now);
        !           931:     if (gmt != NULL)
        !           932:     {
        !           933:        /* Make a copy, in case localtime modifies *tm (I think
        !           934:           that comment now applies to *gmt, but I am too
        !           935:           lazy to dig into how gmtime and locatime allocate the
        !           936:           structures they return pointers to).  */
        !           937:        gmtbuf = *gmt;
        !           938:        gmt = &gmtbuf;
        !           939:     }
        !           940: 
        !           941:     if (! (tm = localtime (&now)))
        !           942:        return -1;
        !           943: 
        !           944:     if (gmt != NULL)
        !           945:        timezone = difftm (gmt, tm) / 60;
        !           946:     else
        !           947:        /* We are on a system like VMS, where the system clock is
        !           948:           in local time and the system has no concept of timezones.
        !           949:           Hopefully we can fake this out (for the case in which the
        !           950:           user specifies no timezone) by just saying the timezone
        !           951:           is zero.  */
        !           952:        timezone = 0;
        !           953: 
        !           954:     if(tm->tm_isdst)
        !           955:        timezone += 60;
        !           956: 
        !           957:     tm = localtime(&now);
        !           958:     yyYear = tm->tm_year + 1900;
        !           959:     yyMonth = tm->tm_mon + 1;
        !           960:     yyDay = tm->tm_mday;
        !           961:     yyTimezone = timezone;
        !           962:     yyDSTmode = DSTmaybe;
        !           963:     yyHour = 0;
        !           964:     yyMinutes = 0;
        !           965:     yySeconds = 0;
        !           966:     yyMeridian = MER24;
        !           967:     yyRelSeconds = 0;
        !           968:     yyRelMonth = 0;
        !           969:     yyHaveDate = 0;
        !           970:     yyHaveDay = 0;
        !           971:     yyHaveRel = 0;
        !           972:     yyHaveTime = 0;
        !           973:     yyHaveZone = 0;
        !           974: 
        !           975:     if (yyparse()
        !           976:      || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
        !           977:        return -1;
        !           978: 
        !           979:     if (yyHaveDate || yyHaveTime || yyHaveDay) {
        !           980:        Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
        !           981:                    yyMeridian, yyDSTmode);
        !           982:        if (Start < 0)
        !           983:            return -1;
        !           984:     }
        !           985:     else {
        !           986:        Start = now;
        !           987:        if (!yyHaveRel)
        !           988:            Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec;
        !           989:     }
        !           990: 
        !           991:     Start += yyRelSeconds;
        !           992:     Start += RelativeMonth(Start, yyRelMonth);
        !           993: 
        !           994:     if (yyHaveDay && !yyHaveDate) {
        !           995:        tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber);
        !           996:        Start += tod;
        !           997:     }
        !           998: 
        !           999:     /* Have to do *something* with a legitimate -1 so it's distinguishable
        !          1000:      * from the error return value.  (Alternately could set errno on error.) */
        !          1001:     return Start == -1 ? 0 : Start;
        !          1002: }
        !          1003: 
        !          1004: 
        !          1005: #if    defined(TEST)
        !          1006: 
        !          1007: /* ARGSUSED */
        !          1008: int
        !          1009: main(ac, av)
        !          1010:     int                ac;
        !          1011:     char       *av[];
        !          1012: {
        !          1013:     char       buff[128];
        !          1014:     time_t     d;
        !          1015: 
        !          1016:     (void)printf("Enter date, or blank line to exit.\n\t> ");
        !          1017:     (void)fflush(stdout);
        !          1018:     while (gets(buff) && buff[0]) {
        !          1019:        d = get_date(buff);
        !          1020:        if (d == -1)
        !          1021:            (void)printf("Bad format - couldn't convert.\n");
        !          1022:        else
        !          1023:            (void)printf("%s", ctime(&d));
        !          1024:        (void)printf("\t> ");
        !          1025:        (void)fflush(stdout);
        !          1026:     }
        !          1027:     exit(0);
        !          1028:     /* NOTREACHED */
        !          1029: }
        !          1030: #endif /* defined(TEST) */
        !          1031: #line 979 "y.tab.c"
        !          1032: /* allocate initial stack or double stack size, up to YYMAXDEPTH */
        !          1033: #if defined(__cplusplus) || defined(__STDC__)
        !          1034: static int yygrowstack(void)
        !          1035: #else
        !          1036: static int yygrowstack()
        !          1037: #endif
        !          1038: {
        !          1039:     int newsize, i;
        !          1040:     short *newss;
        !          1041:     YYSTYPE *newvs;
        !          1042: 
        !          1043:     if ((newsize = yystacksize) == 0)
        !          1044:         newsize = YYINITSTACKSIZE;
        !          1045:     else if (newsize >= YYMAXDEPTH)
        !          1046:         return -1;
        !          1047:     else if ((newsize *= 2) > YYMAXDEPTH)
        !          1048:         newsize = YYMAXDEPTH;
        !          1049:     i = yyssp - yyss;
        !          1050: #ifdef SIZE_MAX
        !          1051: #define YY_SIZE_MAX SIZE_MAX
        !          1052: #else
        !          1053: #define YY_SIZE_MAX 0x7fffffff
        !          1054: #endif
        !          1055:     if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)
        !          1056:         goto bail;
        !          1057:     newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
        !          1058:       (short *)malloc(newsize * sizeof *newss); /* overflow check above */
        !          1059:     if (newss == NULL)
        !          1060:         goto bail;
        !          1061:     yyss = newss;
        !          1062:     yyssp = newss + i;
        !          1063:     if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)
        !          1064:         goto bail;
        !          1065:     newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
        !          1066:       (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */
        !          1067:     if (newvs == NULL)
        !          1068:         goto bail;
        !          1069:     yyvs = newvs;
        !          1070:     yyvsp = newvs + i;
        !          1071:     yystacksize = newsize;
        !          1072:     yysslim = yyss + newsize - 1;
        !          1073:     return 0;
        !          1074: bail:
        !          1075:     if (yyss)
        !          1076:             free(yyss);
        !          1077:     if (yyvs)
        !          1078:             free(yyvs);
        !          1079:     yyss = yyssp = NULL;
        !          1080:     yyvs = yyvsp = NULL;
        !          1081:     yystacksize = 0;
        !          1082:     return -1;
        !          1083: }
        !          1084: 
        !          1085: #define YYABORT goto yyabort
        !          1086: #define YYREJECT goto yyabort
        !          1087: #define YYACCEPT goto yyaccept
        !          1088: #define YYERROR goto yyerrlab
        !          1089: int
        !          1090: #if defined(__cplusplus) || defined(__STDC__)
        !          1091: yyparse(void)
        !          1092: #else
        !          1093: yyparse()
        !          1094: #endif
        !          1095: {
        !          1096:     int yym, yyn, yystate;
        !          1097: #if YYDEBUG
        !          1098: #if defined(__cplusplus) || defined(__STDC__)
        !          1099:     const char *yys;
        !          1100: #else /* !(defined(__cplusplus) || defined(__STDC__)) */
        !          1101:     char *yys;
        !          1102: #endif /* !(defined(__cplusplus) || defined(__STDC__)) */
        !          1103: 
        !          1104:     if ((yys = getenv("YYDEBUG")))
        !          1105:     {
        !          1106:         yyn = *yys;
        !          1107:         if (yyn >= '0' && yyn <= '9')
        !          1108:             yydebug = yyn - '0';
        !          1109:     }
        !          1110: #endif /* YYDEBUG */
        !          1111: 
        !          1112:     yynerrs = 0;
        !          1113:     yyerrflag = 0;
        !          1114:     yychar = (-1);
        !          1115: 
        !          1116:     if (yyss == NULL && yygrowstack()) goto yyoverflow;
        !          1117:     yyssp = yyss;
        !          1118:     yyvsp = yyvs;
        !          1119:     *yyssp = yystate = 0;
        !          1120: 
        !          1121: yyloop:
        !          1122:     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
        !          1123:     if (yychar < 0)
        !          1124:     {
        !          1125:         if ((yychar = yylex()) < 0) yychar = 0;
        !          1126: #if YYDEBUG
        !          1127:         if (yydebug)
        !          1128:         {
        !          1129:             yys = 0;
        !          1130:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
        !          1131:             if (!yys) yys = "illegal-symbol";
        !          1132:             printf("%sdebug: state %d, reading %d (%s)\n",
        !          1133:                     YYPREFIX, yystate, yychar, yys);
        !          1134:         }
        !          1135: #endif
        !          1136:     }
        !          1137:     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
        !          1138:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
        !          1139:     {
        !          1140: #if YYDEBUG
        !          1141:         if (yydebug)
        !          1142:             printf("%sdebug: state %d, shifting to state %d\n",
        !          1143:                     YYPREFIX, yystate, yytable[yyn]);
        !          1144: #endif
        !          1145:         if (yyssp >= yysslim && yygrowstack())
        !          1146:         {
        !          1147:             goto yyoverflow;
        !          1148:         }
        !          1149:         *++yyssp = yystate = yytable[yyn];
        !          1150:         *++yyvsp = yylval;
        !          1151:         yychar = (-1);
        !          1152:         if (yyerrflag > 0)  --yyerrflag;
        !          1153:         goto yyloop;
        !          1154:     }
        !          1155:     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
        !          1156:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
        !          1157:     {
        !          1158:         yyn = yytable[yyn];
        !          1159:         goto yyreduce;
        !          1160:     }
        !          1161:     if (yyerrflag) goto yyinrecovery;
        !          1162: #if defined(lint) || defined(__GNUC__)
        !          1163:     goto yynewerror;
        !          1164: #endif
        !          1165: yynewerror:
        !          1166:     yyerror("syntax error");
        !          1167: #if defined(lint) || defined(__GNUC__)
        !          1168:     goto yyerrlab;
        !          1169: #endif
        !          1170: yyerrlab:
        !          1171:     ++yynerrs;
        !          1172: yyinrecovery:
        !          1173:     if (yyerrflag < 3)
        !          1174:     {
        !          1175:         yyerrflag = 3;
        !          1176:         for (;;)
        !          1177:         {
        !          1178:             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
        !          1179:                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
        !          1180:             {
        !          1181: #if YYDEBUG
        !          1182:                 if (yydebug)
        !          1183:                     printf("%sdebug: state %d, error recovery shifting\
        !          1184:  to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
        !          1185: #endif
        !          1186:                 if (yyssp >= yysslim && yygrowstack())
        !          1187:                 {
        !          1188:                     goto yyoverflow;
        !          1189:                 }
        !          1190:                 *++yyssp = yystate = yytable[yyn];
        !          1191:                 *++yyvsp = yylval;
        !          1192:                 goto yyloop;
        !          1193:             }
        !          1194:             else
        !          1195:             {
        !          1196: #if YYDEBUG
        !          1197:                 if (yydebug)
        !          1198:                     printf("%sdebug: error recovery discarding state %d\n",
        !          1199:                             YYPREFIX, *yyssp);
        !          1200: #endif
        !          1201:                 if (yyssp <= yyss) goto yyabort;
        !          1202:                 --yyssp;
        !          1203:                 --yyvsp;
        !          1204:             }
        !          1205:         }
        !          1206:     }
        !          1207:     else
        !          1208:     {
        !          1209:         if (yychar == 0) goto yyabort;
        !          1210: #if YYDEBUG
        !          1211:         if (yydebug)
        !          1212:         {
        !          1213:             yys = 0;
        !          1214:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
        !          1215:             if (!yys) yys = "illegal-symbol";
        !          1216:             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
        !          1217:                     YYPREFIX, yystate, yychar, yys);
        !          1218:         }
        !          1219: #endif
        !          1220:         yychar = (-1);
        !          1221:         goto yyloop;
        !          1222:     }
        !          1223: yyreduce:
        !          1224: #if YYDEBUG
        !          1225:     if (yydebug)
        !          1226:         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
        !          1227:                 YYPREFIX, yystate, yyn, yyrule[yyn]);
        !          1228: #endif
        !          1229:     yym = yylen[yyn];
        !          1230:     if (yym)
        !          1231:         yyval = yyvsp[1-yym];
        !          1232:     else
        !          1233:         memset(&yyval, 0, sizeof yyval);
        !          1234:     switch (yyn)
        !          1235:     {
        !          1236: case 3:
        !          1237: #line 125 "getdate.y"
        !          1238: {
        !          1239:            yyHaveTime++;
        !          1240:        }
        !          1241: break;
        !          1242: case 4:
        !          1243: #line 128 "getdate.y"
        !          1244: {
        !          1245:            yyHaveZone++;
        !          1246:        }
        !          1247: break;
        !          1248: case 5:
        !          1249: #line 131 "getdate.y"
        !          1250: {
        !          1251:            yyHaveDate++;
        !          1252:        }
        !          1253: break;
        !          1254: case 6:
        !          1255: #line 134 "getdate.y"
        !          1256: {
        !          1257:            yyHaveDay++;
        !          1258:        }
        !          1259: break;
        !          1260: case 7:
        !          1261: #line 137 "getdate.y"
        !          1262: {
        !          1263:            yyHaveRel++;
        !          1264:        }
        !          1265: break;
        !          1266: case 9:
        !          1267: #line 143 "getdate.y"
        !          1268: {
        !          1269:            yyHour = yyvsp[-1].Number;
        !          1270:            yyMinutes = 0;
        !          1271:            yySeconds = 0;
        !          1272:            yyMeridian = yyvsp[0].Meridian;
        !          1273:        }
        !          1274: break;
        !          1275: case 10:
        !          1276: #line 149 "getdate.y"
        !          1277: {
        !          1278:            yyHour = yyvsp[-3].Number;
        !          1279:            yyMinutes = yyvsp[-1].Number;
        !          1280:            yySeconds = 0;
        !          1281:            yyMeridian = yyvsp[0].Meridian;
        !          1282:        }
        !          1283: break;
        !          1284: case 11:
        !          1285: #line 155 "getdate.y"
        !          1286: {
        !          1287:            yyHour = yyvsp[-3].Number;
        !          1288:            yyMinutes = yyvsp[-1].Number;
        !          1289:            yyMeridian = MER24;
        !          1290:            yyDSTmode = DSToff;
        !          1291:            yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60);
        !          1292:        }
        !          1293: break;
        !          1294: case 12:
        !          1295: #line 162 "getdate.y"
        !          1296: {
        !          1297:            yyHour = yyvsp[-5].Number;
        !          1298:            yyMinutes = yyvsp[-3].Number;
        !          1299:            yySeconds = yyvsp[-1].Number;
        !          1300:            yyMeridian = yyvsp[0].Meridian;
        !          1301:        }
        !          1302: break;
        !          1303: case 13:
        !          1304: #line 168 "getdate.y"
        !          1305: {
        !          1306:            yyHour = yyvsp[-5].Number;
        !          1307:            yyMinutes = yyvsp[-3].Number;
        !          1308:            yySeconds = yyvsp[-1].Number;
        !          1309:            yyMeridian = MER24;
        !          1310:            yyDSTmode = DSToff;
        !          1311:            yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60);
        !          1312:        }
        !          1313: break;
        !          1314: case 14:
        !          1315: #line 178 "getdate.y"
        !          1316: {
        !          1317:            yyTimezone = yyvsp[0].Number;
        !          1318:            yyDSTmode = DSToff;
        !          1319:        }
        !          1320: break;
        !          1321: case 15:
        !          1322: #line 182 "getdate.y"
        !          1323: {
        !          1324:            yyTimezone = yyvsp[0].Number;
        !          1325:            yyDSTmode = DSTon;
        !          1326:        }
        !          1327: break;
        !          1328: case 16:
        !          1329: #line 187 "getdate.y"
        !          1330: {
        !          1331:            yyTimezone = yyvsp[-1].Number;
        !          1332:            yyDSTmode = DSTon;
        !          1333:        }
        !          1334: break;
        !          1335: case 17:
        !          1336: #line 193 "getdate.y"
        !          1337: {
        !          1338:            yyDayOrdinal = 1;
        !          1339:            yyDayNumber = yyvsp[0].Number;
        !          1340:        }
        !          1341: break;
        !          1342: case 18:
        !          1343: #line 197 "getdate.y"
        !          1344: {
        !          1345:            yyDayOrdinal = 1;
        !          1346:            yyDayNumber = yyvsp[-1].Number;
        !          1347:        }
        !          1348: break;
        !          1349: case 19:
        !          1350: #line 201 "getdate.y"
        !          1351: {
        !          1352:            yyDayOrdinal = yyvsp[-1].Number;
        !          1353:            yyDayNumber = yyvsp[0].Number;
        !          1354:        }
        !          1355: break;
        !          1356: case 20:
        !          1357: #line 207 "getdate.y"
        !          1358: {
        !          1359:            yyMonth = yyvsp[-2].Number;
        !          1360:            yyDay = yyvsp[0].Number;
        !          1361:        }
        !          1362: break;
        !          1363: case 21:
        !          1364: #line 211 "getdate.y"
        !          1365: {
        !          1366:            if (yyvsp[-4].Number >= 100) {
        !          1367:                yyYear = yyvsp[-4].Number;
        !          1368:                yyMonth = yyvsp[-2].Number;
        !          1369:                yyDay = yyvsp[0].Number;
        !          1370:            } else {
        !          1371:                yyMonth = yyvsp[-4].Number;
        !          1372:                yyDay = yyvsp[-2].Number;
        !          1373:                yyYear = yyvsp[0].Number;
        !          1374:            }
        !          1375:        }
        !          1376: break;
        !          1377: case 22:
        !          1378: #line 222 "getdate.y"
        !          1379: {
        !          1380:            /* ISO 8601 format.  yyyy-mm-dd.  */
        !          1381:            yyYear = yyvsp[-2].Number;
        !          1382:            yyMonth = -yyvsp[-1].Number;
        !          1383:            yyDay = -yyvsp[0].Number;
        !          1384:        }
        !          1385: break;
        !          1386: case 23:
        !          1387: #line 228 "getdate.y"
        !          1388: {
        !          1389:            /* e.g. 17-JUN-1992.  */
        !          1390:            yyDay = yyvsp[-2].Number;
        !          1391:            yyMonth = yyvsp[-1].Number;
        !          1392:            yyYear = -yyvsp[0].Number;
        !          1393:        }
        !          1394: break;
        !          1395: case 24:
        !          1396: #line 234 "getdate.y"
        !          1397: {
        !          1398:            yyMonth = yyvsp[-1].Number;
        !          1399:            yyDay = yyvsp[0].Number;
        !          1400:        }
        !          1401: break;
        !          1402: case 25:
        !          1403: #line 238 "getdate.y"
        !          1404: {
        !          1405:            yyMonth = yyvsp[-3].Number;
        !          1406:            yyDay = yyvsp[-2].Number;
        !          1407:            yyYear = yyvsp[0].Number;
        !          1408:        }
        !          1409: break;
        !          1410: case 26:
        !          1411: #line 243 "getdate.y"
        !          1412: {
        !          1413:            yyMonth = yyvsp[0].Number;
        !          1414:            yyDay = yyvsp[-1].Number;
        !          1415:        }
        !          1416: break;
        !          1417: case 27:
        !          1418: #line 247 "getdate.y"
        !          1419: {
        !          1420:            yyMonth = yyvsp[-1].Number;
        !          1421:            yyDay = yyvsp[-2].Number;
        !          1422:            yyYear = yyvsp[0].Number;
        !          1423:        }
        !          1424: break;
        !          1425: case 28:
        !          1426: #line 254 "getdate.y"
        !          1427: {
        !          1428:            yyRelSeconds = -yyRelSeconds;
        !          1429:            yyRelMonth = -yyRelMonth;
        !          1430:        }
        !          1431: break;
        !          1432: case 30:
        !          1433: #line 261 "getdate.y"
        !          1434: {
        !          1435:            yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
        !          1436:        }
        !          1437: break;
        !          1438: case 31:
        !          1439: #line 264 "getdate.y"
        !          1440: {
        !          1441:            yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
        !          1442:        }
        !          1443: break;
        !          1444: case 32:
        !          1445: #line 267 "getdate.y"
        !          1446: {
        !          1447:            yyRelSeconds += yyvsp[0].Number * 60L;
        !          1448:        }
        !          1449: break;
        !          1450: case 33:
        !          1451: #line 270 "getdate.y"
        !          1452: {
        !          1453:            yyRelSeconds += yyvsp[-1].Number;
        !          1454:        }
        !          1455: break;
        !          1456: case 34:
        !          1457: #line 273 "getdate.y"
        !          1458: {
        !          1459:            yyRelSeconds += yyvsp[-1].Number;
        !          1460:        }
        !          1461: break;
        !          1462: case 35:
        !          1463: #line 276 "getdate.y"
        !          1464: {
        !          1465:            yyRelSeconds++;
        !          1466:        }
        !          1467: break;
        !          1468: case 36:
        !          1469: #line 279 "getdate.y"
        !          1470: {
        !          1471:            yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
        !          1472:        }
        !          1473: break;
        !          1474: case 37:
        !          1475: #line 282 "getdate.y"
        !          1476: {
        !          1477:            yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
        !          1478:        }
        !          1479: break;
        !          1480: case 38:
        !          1481: #line 285 "getdate.y"
        !          1482: {
        !          1483:            yyRelMonth += yyvsp[0].Number;
        !          1484:        }
        !          1485: break;
        !          1486: case 39:
        !          1487: #line 290 "getdate.y"
        !          1488: {
        !          1489:            if (yyHaveTime && yyHaveDate && !yyHaveRel)
        !          1490:                yyYear = yyvsp[0].Number;
        !          1491:            else {
        !          1492:                if(yyvsp[0].Number>10000) {
        !          1493:                    yyHaveDate++;
        !          1494:                    yyDay= (yyvsp[0].Number)%100;
        !          1495:                    yyMonth= (yyvsp[0].Number/100)%100;
        !          1496:                    yyYear = yyvsp[0].Number/10000;
        !          1497:                }
        !          1498:                else {
        !          1499:                    yyHaveTime++;
        !          1500:                    if (yyvsp[0].Number < 100) {
        !          1501:                        yyHour = yyvsp[0].Number;
        !          1502:                        yyMinutes = 0;
        !          1503:                    }
        !          1504:                    else {
        !          1505:                        yyHour = yyvsp[0].Number / 100;
        !          1506:                        yyMinutes = yyvsp[0].Number % 100;
        !          1507:                    }
        !          1508:                    yySeconds = 0;
        !          1509:                    yyMeridian = MER24;
        !          1510:                }
        !          1511:            }
        !          1512:        }
        !          1513: break;
        !          1514: case 40:
        !          1515: #line 317 "getdate.y"
        !          1516: {
        !          1517:            yyval.Meridian = MER24;
        !          1518:        }
        !          1519: break;
        !          1520: case 41:
        !          1521: #line 320 "getdate.y"
        !          1522: {
        !          1523:            yyval.Meridian = yyvsp[0].Meridian;
        !          1524:        }
        !          1525: break;
        !          1526: #line 1474 "y.tab.c"
        !          1527:     }
        !          1528:     yyssp -= yym;
        !          1529:     yystate = *yyssp;
        !          1530:     yyvsp -= yym;
        !          1531:     yym = yylhs[yyn];
        !          1532:     if (yystate == 0 && yym == 0)
        !          1533:     {
        !          1534: #if YYDEBUG
        !          1535:         if (yydebug)
        !          1536:             printf("%sdebug: after reduction, shifting from state 0 to\
        !          1537:  state %d\n", YYPREFIX, YYFINAL);
        !          1538: #endif
        !          1539:         yystate = YYFINAL;
        !          1540:         *++yyssp = YYFINAL;
        !          1541:         *++yyvsp = yyval;
        !          1542:         if (yychar < 0)
        !          1543:         {
        !          1544:             if ((yychar = yylex()) < 0) yychar = 0;
        !          1545: #if YYDEBUG
        !          1546:             if (yydebug)
        !          1547:             {
        !          1548:                 yys = 0;
        !          1549:                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
        !          1550:                 if (!yys) yys = "illegal-symbol";
        !          1551:                 printf("%sdebug: state %d, reading %d (%s)\n",
        !          1552:                         YYPREFIX, YYFINAL, yychar, yys);
        !          1553:             }
        !          1554: #endif
        !          1555:         }
        !          1556:         if (yychar == 0) goto yyaccept;
        !          1557:         goto yyloop;
        !          1558:     }
        !          1559:     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
        !          1560:             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
        !          1561:         yystate = yytable[yyn];
        !          1562:     else
        !          1563:         yystate = yydgoto[yym];
        !          1564: #if YYDEBUG
        !          1565:     if (yydebug)
        !          1566:         printf("%sdebug: after reduction, shifting from state %d \
        !          1567: to state %d\n", YYPREFIX, *yyssp, yystate);
        !          1568: #endif
        !          1569:     if (yyssp >= yysslim && yygrowstack())
        !          1570:     {
        !          1571:         goto yyoverflow;
        !          1572:     }
        !          1573:     *++yyssp = yystate;
        !          1574:     *++yyvsp = yyval;
        !          1575:     goto yyloop;
        !          1576: yyoverflow:
        !          1577:     yyerror("yacc stack overflow");
        !          1578: yyabort:
        !          1579:     if (yyss)
        !          1580:             free(yyss);
        !          1581:     if (yyvs)
        !          1582:             free(yyvs);
        !          1583:     yyss = yyssp = NULL;
        !          1584:     yyvs = yyvsp = NULL;
        !          1585:     yystacksize = 0;
        !          1586:     return (1);
        !          1587: yyaccept:
        !          1588:     if (yyss)
        !          1589:             free(yyss);
        !          1590:     if (yyvs)
        !          1591:             free(yyvs);
        !          1592:     yyss = yyssp = NULL;
        !          1593:     yyvs = yyvsp = NULL;
        !          1594:     yystacksize = 0;
        !          1595:     return (0);
        !          1596: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>