17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * Openvision retains the copyright to derivative works of
57c478bd9Sstevel@tonic-gate * this source code. Do *NOT* create a derivative of this
67c478bd9Sstevel@tonic-gate * source code before consulting with your legal department.
77c478bd9Sstevel@tonic-gate * Do *NOT* integrate *ANY* of this source code into another
87c478bd9Sstevel@tonic-gate * product before consulting with your legal department.
97c478bd9Sstevel@tonic-gate *
107c478bd9Sstevel@tonic-gate * For further information, read the top-level Openvision
117c478bd9Sstevel@tonic-gate * copyright which is contained in the top-level MIT Kerberos
127c478bd9Sstevel@tonic-gate * copyright.
137c478bd9Sstevel@tonic-gate *
147c478bd9Sstevel@tonic-gate * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
157c478bd9Sstevel@tonic-gate *
167c478bd9Sstevel@tonic-gate */
177c478bd9Sstevel@tonic-gate
187c478bd9Sstevel@tonic-gate
197c478bd9Sstevel@tonic-gate %{
207c478bd9Sstevel@tonic-gate /*
21*56a424ccSmp153739 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
227c478bd9Sstevel@tonic-gate * Use is subject to license terms.
237c478bd9Sstevel@tonic-gate */
247c478bd9Sstevel@tonic-gate
257c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI"
267c478bd9Sstevel@tonic-gate
277c478bd9Sstevel@tonic-gate /*
28*56a424ccSmp153739 ** Originally written by Steven M. Bellovin <smb@research.att.com> while
29*56a424ccSmp153739 ** at the University of North Carolina at Chapel Hill. Later tweaked by
30*56a424ccSmp153739 ** a couple of people on Usenet. Completely overhauled by Rich $alz
31*56a424ccSmp153739 ** <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
32*56a424ccSmp153739 ** send any email to Rich.
33*56a424ccSmp153739 **
34*56a424ccSmp153739 ** This grammar has nine shift/reduce conflicts.
35*56a424ccSmp153739 **
36*56a424ccSmp153739 ** This code is in the public domain and has no copyright.
377c478bd9Sstevel@tonic-gate */
387c478bd9Sstevel@tonic-gate /* SUPPRESS 287 on yaccpar_sccsid *//* Unusd static variable */
397c478bd9Sstevel@tonic-gate /* SUPPRESS 288 on yyerrlab *//* Label unused */
407c478bd9Sstevel@tonic-gate
417c478bd9Sstevel@tonic-gate #ifdef HAVE_CONFIG_H
427c478bd9Sstevel@tonic-gate #if defined (emacs) || defined (CONFIG_BROKETS)
437c478bd9Sstevel@tonic-gate #include <config.h>
447c478bd9Sstevel@tonic-gate #else
457c478bd9Sstevel@tonic-gate #include "config.h"
467c478bd9Sstevel@tonic-gate #endif
477c478bd9Sstevel@tonic-gate #endif
487c478bd9Sstevel@tonic-gate #include <string.h>
497c478bd9Sstevel@tonic-gate
50*56a424ccSmp153739 /* Since the code of getdate.y is not included in the Emacs executable
51*56a424ccSmp153739 itself, there is no need to #define static in this file. Even if
52*56a424ccSmp153739 the code were included in the Emacs executable, it probably
53*56a424ccSmp153739 wouldn't do any harm to #undef it here; this will only cause
54*56a424ccSmp153739 problems if we try to write to a static variable, which I don't
55*56a424ccSmp153739 think this code needs to do. */
567c478bd9Sstevel@tonic-gate #ifdef emacs
577c478bd9Sstevel@tonic-gate #undef static
587c478bd9Sstevel@tonic-gate #endif
597c478bd9Sstevel@tonic-gate
60*56a424ccSmp153739 /* The following block of alloca-related preprocessor directives is here
61*56a424ccSmp153739 solely to allow compilation by non GNU-C compilers of the C parser
62*56a424ccSmp153739 produced from this file by old versions of bison. Newer versions of
63*56a424ccSmp153739 bison include a block similar to this one in bison.simple. */
647c478bd9Sstevel@tonic-gate
657c478bd9Sstevel@tonic-gate #ifdef __GNUC__
667c478bd9Sstevel@tonic-gate #undef alloca
677c478bd9Sstevel@tonic-gate #define alloca __builtin_alloca
687c478bd9Sstevel@tonic-gate #else
697c478bd9Sstevel@tonic-gate #ifdef HAVE_ALLOCA_H
707c478bd9Sstevel@tonic-gate #include <alloca.h>
717c478bd9Sstevel@tonic-gate #else
727c478bd9Sstevel@tonic-gate #ifdef _AIX /* for Bison */
737c478bd9Sstevel@tonic-gate #pragma alloca
747c478bd9Sstevel@tonic-gate #else
757c478bd9Sstevel@tonic-gate void *alloca ();
767c478bd9Sstevel@tonic-gate #endif
777c478bd9Sstevel@tonic-gate #endif
787c478bd9Sstevel@tonic-gate #endif
797c478bd9Sstevel@tonic-gate
807c478bd9Sstevel@tonic-gate #include <stdio.h>
817c478bd9Sstevel@tonic-gate #include <ctype.h>
827c478bd9Sstevel@tonic-gate
83*56a424ccSmp153739 #if defined(HAVE_STDLIB_H)
84*56a424ccSmp153739 #include <stdlib.h>
85*56a424ccSmp153739 #endif
86*56a424ccSmp153739
87*56a424ccSmp153739 /* The code at the top of get_date which figures out the offset of the
88*56a424ccSmp153739 current time zone checks various CPP symbols to see if special
89*56a424ccSmp153739 tricks are need, but defaults to using the gettimeofday system call.
90*56a424ccSmp153739 Include <sys/time.h> if that will be used. */
917c478bd9Sstevel@tonic-gate
927c478bd9Sstevel@tonic-gate #if defined(vms)
937c478bd9Sstevel@tonic-gate
947c478bd9Sstevel@tonic-gate #include <types.h>
957c478bd9Sstevel@tonic-gate #include <time.h>
967c478bd9Sstevel@tonic-gate
977c478bd9Sstevel@tonic-gate #else
987c478bd9Sstevel@tonic-gate
997c478bd9Sstevel@tonic-gate #include <sys/types.h>
1007c478bd9Sstevel@tonic-gate
1017c478bd9Sstevel@tonic-gate #ifdef TIME_WITH_SYS_TIME
1027c478bd9Sstevel@tonic-gate #include <sys/time.h>
1037c478bd9Sstevel@tonic-gate #include <time.h>
1047c478bd9Sstevel@tonic-gate #else
1057c478bd9Sstevel@tonic-gate #ifdef HAVE_SYS_TIME_H
1067c478bd9Sstevel@tonic-gate #include <sys/time.h>
1077c478bd9Sstevel@tonic-gate #else
1087c478bd9Sstevel@tonic-gate #include <time.h>
1097c478bd9Sstevel@tonic-gate #endif
1107c478bd9Sstevel@tonic-gate #endif
1117c478bd9Sstevel@tonic-gate
1127c478bd9Sstevel@tonic-gate #ifdef timezone
1137c478bd9Sstevel@tonic-gate #undef timezone /* needed for sgi */
1147c478bd9Sstevel@tonic-gate #endif
1157c478bd9Sstevel@tonic-gate
1167c478bd9Sstevel@tonic-gate /*
117*56a424ccSmp153739 ** We use the obsolete `struct my_timeb' as part of our interface!
118*56a424ccSmp153739 ** Since the system doesn't have it, we define it here;
119*56a424ccSmp153739 ** our callers must do likewise.
1207c478bd9Sstevel@tonic-gate */
1217c478bd9Sstevel@tonic-gate struct my_timeb {
1227c478bd9Sstevel@tonic-gate time_t time; /* Seconds since the epoch */
1237c478bd9Sstevel@tonic-gate unsigned short millitm; /* Field not used */
1247c478bd9Sstevel@tonic-gate short timezone; /* Minutes west of GMT */
1257c478bd9Sstevel@tonic-gate short dstflag; /* Field not used */
1267c478bd9Sstevel@tonic-gate };
1277c478bd9Sstevel@tonic-gate #endif /* defined(vms) */
1287c478bd9Sstevel@tonic-gate
1297c478bd9Sstevel@tonic-gate #if defined (STDC_HEADERS) || defined (USG)
1307c478bd9Sstevel@tonic-gate #include <string.h>
1317c478bd9Sstevel@tonic-gate #endif
1327c478bd9Sstevel@tonic-gate
133*56a424ccSmp153739 /* Some old versions of bison generate parsers that use bcopy.
134*56a424ccSmp153739 That loses on systems that don't provide the function, so we have
135*56a424ccSmp153739 to redefine it here. */
136*56a424ccSmp153739 #ifndef bcopy
1377c478bd9Sstevel@tonic-gate #define bcopy(from, to, len) memcpy ((to), (from), (len))
1387c478bd9Sstevel@tonic-gate #endif
1397c478bd9Sstevel@tonic-gate
1407c478bd9Sstevel@tonic-gate /*
1417c478bd9Sstevel@tonic-gate * The following is a hack so that it is easy to internationalize
1427c478bd9Sstevel@tonic-gate * statically declared strings. We define a wrapper function here that
1437c478bd9Sstevel@tonic-gate * will be a replacement for gettext. We the make gettext a macro that
1447c478bd9Sstevel@tonic-gate * just returns its argument, which now can be used with statically defined
1457c478bd9Sstevel@tonic-gate * strings. The conquence of this is that GETTEXT must be used to translate
1467c478bd9Sstevel@tonic-gate * a string at runtime and gettext must be used around string literals so
1477c478bd9Sstevel@tonic-gate * that xgettext command can extract them to a portable object database file.
1487c478bd9Sstevel@tonic-gate *
1497c478bd9Sstevel@tonic-gate * Thus to translate a string literal that is an argument to a function foo
1507c478bd9Sstevel@tonic-gate * the following will have to be performed:
1517c478bd9Sstevel@tonic-gate *
1527c478bd9Sstevel@tonic-gate * foo(GETTEXT(gettext("This is a test")));
1537c478bd9Sstevel@tonic-gate *
1547c478bd9Sstevel@tonic-gate * The inner gettext call is for xgettext command to extract the string.
1557c478bd9Sstevel@tonic-gate * The C preprossesor will reduce the above to:
1567c478bd9Sstevel@tonic-gate *
1577c478bd9Sstevel@tonic-gate * foo(GETTEXT(("This ia a test"));
1587c478bd9Sstevel@tonic-gate */
1597c478bd9Sstevel@tonic-gate
1607c478bd9Sstevel@tonic-gate #include <libintl.h>
1617c478bd9Sstevel@tonic-gate
1627c478bd9Sstevel@tonic-gate static char *
GETTEXT(const char * msgid)1637c478bd9Sstevel@tonic-gate GETTEXT(const char *msgid)
1647c478bd9Sstevel@tonic-gate {
1657c478bd9Sstevel@tonic-gate return (gettext(msgid));
1667c478bd9Sstevel@tonic-gate }
1677c478bd9Sstevel@tonic-gate
1687c478bd9Sstevel@tonic-gate #define gettext(s) (s)
1697c478bd9Sstevel@tonic-gate
1707c478bd9Sstevel@tonic-gate
1717c478bd9Sstevel@tonic-gate extern struct tm *gmtime();
1727c478bd9Sstevel@tonic-gate extern struct tm *localtime();
1737c478bd9Sstevel@tonic-gate
1747c478bd9Sstevel@tonic-gate #define yyparse getdate_yyparse
1757c478bd9Sstevel@tonic-gate #define yylex getdate_yylex
1767c478bd9Sstevel@tonic-gate #define yyerror getdate_yyerror
1777c478bd9Sstevel@tonic-gate
178*56a424ccSmp153739 static int getdate_yylex (void);
179*56a424ccSmp153739 static int getdate_yyerror (char *);
1807c478bd9Sstevel@tonic-gate
1817c478bd9Sstevel@tonic-gate
1827c478bd9Sstevel@tonic-gate #define EPOCH 1970
1837c478bd9Sstevel@tonic-gate #define EPOCH_END 2099 /* Solaris 64 bit can support this at this point */
1847c478bd9Sstevel@tonic-gate #define HOUR(x) ((time_t)(x) * 60)
1857c478bd9Sstevel@tonic-gate #define SECSPERDAY (24L * 60L * 60L)
1867c478bd9Sstevel@tonic-gate
1877c478bd9Sstevel@tonic-gate
1887c478bd9Sstevel@tonic-gate /*
189*56a424ccSmp153739 ** An entry in the lexical lookup table.
1907c478bd9Sstevel@tonic-gate */
1917c478bd9Sstevel@tonic-gate typedef struct _TABLE {
1927c478bd9Sstevel@tonic-gate char *name;
1937c478bd9Sstevel@tonic-gate int type;
1947c478bd9Sstevel@tonic-gate time_t value;
1957c478bd9Sstevel@tonic-gate } TABLE;
1967c478bd9Sstevel@tonic-gate
1977c478bd9Sstevel@tonic-gate
1987c478bd9Sstevel@tonic-gate /*
199*56a424ccSmp153739 ** Daylight-savings mode: on, off, or not yet known.
2007c478bd9Sstevel@tonic-gate */
2017c478bd9Sstevel@tonic-gate typedef enum _DSTMODE {
2027c478bd9Sstevel@tonic-gate DSTon, DSToff, DSTmaybe
2037c478bd9Sstevel@tonic-gate } DSTMODE;
2047c478bd9Sstevel@tonic-gate
2057c478bd9Sstevel@tonic-gate /*
206*56a424ccSmp153739 ** Meridian: am, pm, or 24-hour style.
2077c478bd9Sstevel@tonic-gate */
2087c478bd9Sstevel@tonic-gate typedef enum _MERIDIAN {
2097c478bd9Sstevel@tonic-gate MERam, MERpm, MER24
2107c478bd9Sstevel@tonic-gate } MERIDIAN;
2117c478bd9Sstevel@tonic-gate
2127c478bd9Sstevel@tonic-gate
2137c478bd9Sstevel@tonic-gate /*
214*56a424ccSmp153739 ** Global variables. We could get rid of most of these by using a good
215*56a424ccSmp153739 ** union as the yacc stack. (This routine was originally written before
216*56a424ccSmp153739 ** yacc had the %union construct.) Maybe someday; right now we only use
217*56a424ccSmp153739 ** the %union very rarely.
2187c478bd9Sstevel@tonic-gate */
2197c478bd9Sstevel@tonic-gate static char *yyInput;
2207c478bd9Sstevel@tonic-gate static DSTMODE yyDSTmode;
2217c478bd9Sstevel@tonic-gate static time_t yyDayOrdinal;
2227c478bd9Sstevel@tonic-gate static time_t yyDayNumber;
2237c478bd9Sstevel@tonic-gate static int yyHaveDate;
2247c478bd9Sstevel@tonic-gate static int yyHaveDay;
2257c478bd9Sstevel@tonic-gate static int yyHaveRel;
2267c478bd9Sstevel@tonic-gate static int yyHaveTime;
2277c478bd9Sstevel@tonic-gate static int yyHaveZone;
2287c478bd9Sstevel@tonic-gate static time_t yyTimezone;
2297c478bd9Sstevel@tonic-gate static time_t yyDay;
2307c478bd9Sstevel@tonic-gate static time_t yyHour;
2317c478bd9Sstevel@tonic-gate static time_t yyMinutes;
2327c478bd9Sstevel@tonic-gate static time_t yyMonth;
2337c478bd9Sstevel@tonic-gate static time_t yySeconds;
2347c478bd9Sstevel@tonic-gate static time_t yyYear;
2357c478bd9Sstevel@tonic-gate static MERIDIAN yyMeridian;
2367c478bd9Sstevel@tonic-gate static time_t yyRelMonth;
2377c478bd9Sstevel@tonic-gate static time_t yyRelSeconds;
2387c478bd9Sstevel@tonic-gate
2397c478bd9Sstevel@tonic-gate %}
2407c478bd9Sstevel@tonic-gate
2417c478bd9Sstevel@tonic-gate %union {
2427c478bd9Sstevel@tonic-gate time_t Number;
2437c478bd9Sstevel@tonic-gate enum _MERIDIAN Meridian;
2447c478bd9Sstevel@tonic-gate }
2457c478bd9Sstevel@tonic-gate
2467c478bd9Sstevel@tonic-gate %token tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
2477c478bd9Sstevel@tonic-gate %token tSEC_UNIT tSNUMBER tUNUMBER tZONE tDST tNEVER
2487c478bd9Sstevel@tonic-gate
2497c478bd9Sstevel@tonic-gate %type <Number> tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT
2507c478bd9Sstevel@tonic-gate %type <Number> tSEC_UNIT tSNUMBER tUNUMBER tZONE
2517c478bd9Sstevel@tonic-gate %type <Meridian> tMERIDIAN o_merid
2527c478bd9Sstevel@tonic-gate
2537c478bd9Sstevel@tonic-gate %%
2547c478bd9Sstevel@tonic-gate
2557c478bd9Sstevel@tonic-gate spec : /* NULL */
2567c478bd9Sstevel@tonic-gate | spec item
2577c478bd9Sstevel@tonic-gate | tNEVER {
2587c478bd9Sstevel@tonic-gate yyYear = 1970;
2597c478bd9Sstevel@tonic-gate yyMonth = 1;
2607c478bd9Sstevel@tonic-gate yyDay = 1;
2617c478bd9Sstevel@tonic-gate yyHour = yyMinutes = yySeconds = 0;
2627c478bd9Sstevel@tonic-gate yyDSTmode = DSToff;
2637c478bd9Sstevel@tonic-gate yyTimezone = 0; /* gmt */
2647c478bd9Sstevel@tonic-gate yyHaveDate++;
2657c478bd9Sstevel@tonic-gate }
2667c478bd9Sstevel@tonic-gate ;
2677c478bd9Sstevel@tonic-gate
2687c478bd9Sstevel@tonic-gate item : time {
2697c478bd9Sstevel@tonic-gate yyHaveTime++;
2707c478bd9Sstevel@tonic-gate }
2717c478bd9Sstevel@tonic-gate | zone {
2727c478bd9Sstevel@tonic-gate yyHaveZone++;
2737c478bd9Sstevel@tonic-gate }
2747c478bd9Sstevel@tonic-gate | date {
2757c478bd9Sstevel@tonic-gate yyHaveDate++;
2767c478bd9Sstevel@tonic-gate }
2777c478bd9Sstevel@tonic-gate | day {
2787c478bd9Sstevel@tonic-gate yyHaveDay++;
2797c478bd9Sstevel@tonic-gate }
2807c478bd9Sstevel@tonic-gate | rel {
2817c478bd9Sstevel@tonic-gate yyHaveRel++;
2827c478bd9Sstevel@tonic-gate }
2837c478bd9Sstevel@tonic-gate ;
2847c478bd9Sstevel@tonic-gate
2857c478bd9Sstevel@tonic-gate time : tUNUMBER tMERIDIAN {
2867c478bd9Sstevel@tonic-gate yyHour = $1;
2877c478bd9Sstevel@tonic-gate yyMinutes = 0;
2887c478bd9Sstevel@tonic-gate yySeconds = 0;
2897c478bd9Sstevel@tonic-gate yyMeridian = $2;
2907c478bd9Sstevel@tonic-gate }
2917c478bd9Sstevel@tonic-gate | tUNUMBER ':' tUNUMBER o_merid {
2927c478bd9Sstevel@tonic-gate yyHour = $1;
2937c478bd9Sstevel@tonic-gate yyMinutes = $3;
2947c478bd9Sstevel@tonic-gate yySeconds = 0;
2957c478bd9Sstevel@tonic-gate yyMeridian = $4;
2967c478bd9Sstevel@tonic-gate }
2977c478bd9Sstevel@tonic-gate | tUNUMBER ':' tUNUMBER tSNUMBER {
2987c478bd9Sstevel@tonic-gate yyHour = $1;
2997c478bd9Sstevel@tonic-gate yyMinutes = $3;
3007c478bd9Sstevel@tonic-gate yyMeridian = MER24;
3017c478bd9Sstevel@tonic-gate yyDSTmode = DSToff;
3027c478bd9Sstevel@tonic-gate yyTimezone = - ($4 % 100 + ($4 / 100) * 60);
3037c478bd9Sstevel@tonic-gate }
3047c478bd9Sstevel@tonic-gate | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {
3057c478bd9Sstevel@tonic-gate yyHour = $1;
3067c478bd9Sstevel@tonic-gate yyMinutes = $3;
3077c478bd9Sstevel@tonic-gate yySeconds = $5;
3087c478bd9Sstevel@tonic-gate yyMeridian = $6;
3097c478bd9Sstevel@tonic-gate }
3107c478bd9Sstevel@tonic-gate | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER {
3117c478bd9Sstevel@tonic-gate yyHour = $1;
3127c478bd9Sstevel@tonic-gate yyMinutes = $3;
3137c478bd9Sstevel@tonic-gate yySeconds = $5;
3147c478bd9Sstevel@tonic-gate yyMeridian = MER24;
3157c478bd9Sstevel@tonic-gate yyDSTmode = DSToff;
3167c478bd9Sstevel@tonic-gate yyTimezone = - ($6 % 100 + ($6 / 100) * 60);
3177c478bd9Sstevel@tonic-gate }
3187c478bd9Sstevel@tonic-gate ;
3197c478bd9Sstevel@tonic-gate
3207c478bd9Sstevel@tonic-gate zone : tZONE {
3217c478bd9Sstevel@tonic-gate yyTimezone = $1;
3227c478bd9Sstevel@tonic-gate yyDSTmode = DSToff;
3237c478bd9Sstevel@tonic-gate }
3247c478bd9Sstevel@tonic-gate | tDAYZONE {
3257c478bd9Sstevel@tonic-gate yyTimezone = $1;
3267c478bd9Sstevel@tonic-gate yyDSTmode = DSTon;
3277c478bd9Sstevel@tonic-gate }
3287c478bd9Sstevel@tonic-gate |
3297c478bd9Sstevel@tonic-gate tZONE tDST {
3307c478bd9Sstevel@tonic-gate yyTimezone = $1;
3317c478bd9Sstevel@tonic-gate yyDSTmode = DSTon;
3327c478bd9Sstevel@tonic-gate }
3337c478bd9Sstevel@tonic-gate ;
3347c478bd9Sstevel@tonic-gate
3357c478bd9Sstevel@tonic-gate day : tDAY {
3367c478bd9Sstevel@tonic-gate yyDayOrdinal = 1;
3377c478bd9Sstevel@tonic-gate yyDayNumber = $1;
3387c478bd9Sstevel@tonic-gate }
3397c478bd9Sstevel@tonic-gate | tDAY ',' {
3407c478bd9Sstevel@tonic-gate yyDayOrdinal = 1;
3417c478bd9Sstevel@tonic-gate yyDayNumber = $1;
3427c478bd9Sstevel@tonic-gate }
3437c478bd9Sstevel@tonic-gate | tUNUMBER tDAY {
3447c478bd9Sstevel@tonic-gate yyDayOrdinal = $1;
3457c478bd9Sstevel@tonic-gate yyDayNumber = $2;
3467c478bd9Sstevel@tonic-gate }
3477c478bd9Sstevel@tonic-gate ;
3487c478bd9Sstevel@tonic-gate
3497c478bd9Sstevel@tonic-gate date : tUNUMBER '/' tUNUMBER {
3507c478bd9Sstevel@tonic-gate yyMonth = $1;
3517c478bd9Sstevel@tonic-gate yyDay = $3;
3527c478bd9Sstevel@tonic-gate }
3537c478bd9Sstevel@tonic-gate | tUNUMBER '/' tUNUMBER '/' tUNUMBER {
3547c478bd9Sstevel@tonic-gate yyMonth = $1;
3557c478bd9Sstevel@tonic-gate yyDay = $3;
3567c478bd9Sstevel@tonic-gate yyYear = $5;
3577c478bd9Sstevel@tonic-gate }
3587c478bd9Sstevel@tonic-gate | tUNUMBER tSNUMBER tSNUMBER {
3597c478bd9Sstevel@tonic-gate /* ISO 8601 format. yyyy-mm-dd. */
3607c478bd9Sstevel@tonic-gate yyYear = $1;
3617c478bd9Sstevel@tonic-gate yyMonth = -$2;
3627c478bd9Sstevel@tonic-gate yyDay = -$3;
3637c478bd9Sstevel@tonic-gate }
3647c478bd9Sstevel@tonic-gate | tUNUMBER tMONTH tSNUMBER {
3657c478bd9Sstevel@tonic-gate /* e.g. 17-JUN-1992. */
3667c478bd9Sstevel@tonic-gate yyDay = $1;
3677c478bd9Sstevel@tonic-gate yyMonth = $2;
3687c478bd9Sstevel@tonic-gate yyYear = -$3;
3697c478bd9Sstevel@tonic-gate }
3707c478bd9Sstevel@tonic-gate | tMONTH tUNUMBER {
3717c478bd9Sstevel@tonic-gate yyMonth = $1;
3727c478bd9Sstevel@tonic-gate yyDay = $2;
3737c478bd9Sstevel@tonic-gate }
3747c478bd9Sstevel@tonic-gate | tMONTH tUNUMBER ',' tUNUMBER {
3757c478bd9Sstevel@tonic-gate yyMonth = $1;
3767c478bd9Sstevel@tonic-gate yyDay = $2;
3777c478bd9Sstevel@tonic-gate yyYear = $4;
3787c478bd9Sstevel@tonic-gate }
3797c478bd9Sstevel@tonic-gate | tUNUMBER tMONTH {
3807c478bd9Sstevel@tonic-gate yyMonth = $2;
3817c478bd9Sstevel@tonic-gate yyDay = $1;
3827c478bd9Sstevel@tonic-gate }
3837c478bd9Sstevel@tonic-gate | tUNUMBER tMONTH tUNUMBER {
3847c478bd9Sstevel@tonic-gate yyMonth = $2;
3857c478bd9Sstevel@tonic-gate yyDay = $1;
3867c478bd9Sstevel@tonic-gate yyYear = $3;
3877c478bd9Sstevel@tonic-gate }
3887c478bd9Sstevel@tonic-gate ;
3897c478bd9Sstevel@tonic-gate
3907c478bd9Sstevel@tonic-gate rel : relunit tAGO {
3917c478bd9Sstevel@tonic-gate yyRelSeconds = -yyRelSeconds;
3927c478bd9Sstevel@tonic-gate yyRelMonth = -yyRelMonth;
3937c478bd9Sstevel@tonic-gate }
3947c478bd9Sstevel@tonic-gate | relunit
3957c478bd9Sstevel@tonic-gate ;
3967c478bd9Sstevel@tonic-gate
3977c478bd9Sstevel@tonic-gate relunit : tUNUMBER tMINUTE_UNIT {
3987c478bd9Sstevel@tonic-gate yyRelSeconds += $1 * $2 * 60L;
3997c478bd9Sstevel@tonic-gate }
4007c478bd9Sstevel@tonic-gate | tSNUMBER tMINUTE_UNIT {
4017c478bd9Sstevel@tonic-gate yyRelSeconds += $1 * $2 * 60L;
4027c478bd9Sstevel@tonic-gate }
4037c478bd9Sstevel@tonic-gate | tMINUTE_UNIT {
4047c478bd9Sstevel@tonic-gate yyRelSeconds += $1 * 60L;
4057c478bd9Sstevel@tonic-gate }
4067c478bd9Sstevel@tonic-gate | tSNUMBER tSEC_UNIT {
4077c478bd9Sstevel@tonic-gate yyRelSeconds += $1;
4087c478bd9Sstevel@tonic-gate }
4097c478bd9Sstevel@tonic-gate | tUNUMBER tSEC_UNIT {
4107c478bd9Sstevel@tonic-gate yyRelSeconds += $1;
4117c478bd9Sstevel@tonic-gate }
4127c478bd9Sstevel@tonic-gate | tSEC_UNIT {
4137c478bd9Sstevel@tonic-gate yyRelSeconds++;
4147c478bd9Sstevel@tonic-gate }
4157c478bd9Sstevel@tonic-gate | tSNUMBER tMONTH_UNIT {
4167c478bd9Sstevel@tonic-gate yyRelMonth += $1 * $2;
4177c478bd9Sstevel@tonic-gate }
4187c478bd9Sstevel@tonic-gate | tUNUMBER tMONTH_UNIT {
4197c478bd9Sstevel@tonic-gate yyRelMonth += $1 * $2;
4207c478bd9Sstevel@tonic-gate }
4217c478bd9Sstevel@tonic-gate | tMONTH_UNIT {
4227c478bd9Sstevel@tonic-gate yyRelMonth += $1;
4237c478bd9Sstevel@tonic-gate }
4247c478bd9Sstevel@tonic-gate ;
4257c478bd9Sstevel@tonic-gate
4267c478bd9Sstevel@tonic-gate o_merid : /* NULL */ {
4277c478bd9Sstevel@tonic-gate $$ = MER24;
4287c478bd9Sstevel@tonic-gate }
4297c478bd9Sstevel@tonic-gate | tMERIDIAN {
4307c478bd9Sstevel@tonic-gate $$ = $1;
4317c478bd9Sstevel@tonic-gate }
4327c478bd9Sstevel@tonic-gate ;
4337c478bd9Sstevel@tonic-gate
4347c478bd9Sstevel@tonic-gate %%
4357c478bd9Sstevel@tonic-gate
4367c478bd9Sstevel@tonic-gate /* Month and day table. */
4377c478bd9Sstevel@tonic-gate static TABLE const MonthDayTable[] = {
4387c478bd9Sstevel@tonic-gate { gettext("january"), tMONTH, 1 },
4397c478bd9Sstevel@tonic-gate { gettext("february"), tMONTH, 2 },
4407c478bd9Sstevel@tonic-gate { gettext("march"), tMONTH, 3 },
4417c478bd9Sstevel@tonic-gate { gettext("april"), tMONTH, 4 },
4427c478bd9Sstevel@tonic-gate { gettext("may"), tMONTH, 5 },
4437c478bd9Sstevel@tonic-gate { gettext("june"), tMONTH, 6 },
4447c478bd9Sstevel@tonic-gate { gettext("july"), tMONTH, 7 },
4457c478bd9Sstevel@tonic-gate { gettext("august"), tMONTH, 8 },
4467c478bd9Sstevel@tonic-gate { gettext("september"), tMONTH, 9 },
4477c478bd9Sstevel@tonic-gate { gettext("sept"), tMONTH, 9 },
4487c478bd9Sstevel@tonic-gate { gettext("october"), tMONTH, 10 },
4497c478bd9Sstevel@tonic-gate { gettext("november"), tMONTH, 11 },
4507c478bd9Sstevel@tonic-gate { gettext("december"), tMONTH, 12 },
4517c478bd9Sstevel@tonic-gate { gettext("sunday"), tDAY, 0 },
4527c478bd9Sstevel@tonic-gate { gettext("monday"), tDAY, 1 },
4537c478bd9Sstevel@tonic-gate { gettext("tuesday"), tDAY, 2 },
4547c478bd9Sstevel@tonic-gate { gettext("tues"), tDAY, 2 },
4557c478bd9Sstevel@tonic-gate { gettext("wednesday"), tDAY, 3 },
4567c478bd9Sstevel@tonic-gate { gettext("wednes"), tDAY, 3 },
4577c478bd9Sstevel@tonic-gate { gettext("thursday"), tDAY, 4 },
4587c478bd9Sstevel@tonic-gate { gettext("thur"), tDAY, 4 },
4597c478bd9Sstevel@tonic-gate { gettext("thurs"), tDAY, 4 },
4607c478bd9Sstevel@tonic-gate { gettext("friday"), tDAY, 5 },
4617c478bd9Sstevel@tonic-gate { gettext("saturday"), tDAY, 6 },
4627c478bd9Sstevel@tonic-gate { NULL }
4637c478bd9Sstevel@tonic-gate };
4647c478bd9Sstevel@tonic-gate
4657c478bd9Sstevel@tonic-gate /* Time units table. */
4667c478bd9Sstevel@tonic-gate static TABLE const UnitsTable[] = {
4677c478bd9Sstevel@tonic-gate { gettext("year"), tMONTH_UNIT, 12 },
4687c478bd9Sstevel@tonic-gate { gettext("month"), tMONTH_UNIT, 1 },
4697c478bd9Sstevel@tonic-gate { gettext("fortnight"), tMINUTE_UNIT, 14 * 24 * 60 },
4707c478bd9Sstevel@tonic-gate { gettext("week"), tMINUTE_UNIT, 7 * 24 * 60 },
4717c478bd9Sstevel@tonic-gate { gettext("day"), tMINUTE_UNIT, 1 * 24 * 60 },
4727c478bd9Sstevel@tonic-gate { gettext("hour"), tMINUTE_UNIT, 60 },
4737c478bd9Sstevel@tonic-gate { gettext("minute"), tMINUTE_UNIT, 1 },
4747c478bd9Sstevel@tonic-gate { gettext("min"), tMINUTE_UNIT, 1 },
4757c478bd9Sstevel@tonic-gate { gettext("second"), tSEC_UNIT, 1 },
4767c478bd9Sstevel@tonic-gate { gettext("sec"), tSEC_UNIT, 1 },
4777c478bd9Sstevel@tonic-gate { NULL }
4787c478bd9Sstevel@tonic-gate };
4797c478bd9Sstevel@tonic-gate
4807c478bd9Sstevel@tonic-gate /* Assorted relative-time words. */
4817c478bd9Sstevel@tonic-gate static TABLE const OtherTable[] = {
4827c478bd9Sstevel@tonic-gate { gettext("tomorrow"), tMINUTE_UNIT, 1 * 24 * 60 },
4837c478bd9Sstevel@tonic-gate { gettext("yesterday"), tMINUTE_UNIT, -1 * 24 * 60 },
4847c478bd9Sstevel@tonic-gate { gettext("today"), tMINUTE_UNIT, 0 },
4857c478bd9Sstevel@tonic-gate { gettext("now"), tMINUTE_UNIT, 0 },
4867c478bd9Sstevel@tonic-gate { gettext("last"), tUNUMBER, -1 },
4877c478bd9Sstevel@tonic-gate { gettext("this"), tMINUTE_UNIT, 0 },
4887c478bd9Sstevel@tonic-gate { gettext("next"), tUNUMBER, 2 },
4897c478bd9Sstevel@tonic-gate { gettext("first"), tUNUMBER, 1 },
4907c478bd9Sstevel@tonic-gate /* { gettext("second"), tUNUMBER, 2 }, */
4917c478bd9Sstevel@tonic-gate { gettext("third"), tUNUMBER, 3 },
4927c478bd9Sstevel@tonic-gate { gettext("fourth"), tUNUMBER, 4 },
4937c478bd9Sstevel@tonic-gate { gettext("fifth"), tUNUMBER, 5 },
4947c478bd9Sstevel@tonic-gate { gettext("sixth"), tUNUMBER, 6 },
4957c478bd9Sstevel@tonic-gate { gettext("seventh"), tUNUMBER, 7 },
4967c478bd9Sstevel@tonic-gate { gettext("eighth"), tUNUMBER, 8 },
4977c478bd9Sstevel@tonic-gate { gettext("ninth"), tUNUMBER, 9 },
4987c478bd9Sstevel@tonic-gate { gettext("tenth"), tUNUMBER, 10 },
4997c478bd9Sstevel@tonic-gate { gettext("eleventh"), tUNUMBER, 11 },
5007c478bd9Sstevel@tonic-gate { gettext("twelfth"), tUNUMBER, 12 },
5017c478bd9Sstevel@tonic-gate { gettext("ago"), tAGO, 1 },
5027c478bd9Sstevel@tonic-gate { gettext("never"), tNEVER, 0 },
5037c478bd9Sstevel@tonic-gate { NULL }
5047c478bd9Sstevel@tonic-gate };
5057c478bd9Sstevel@tonic-gate
5067c478bd9Sstevel@tonic-gate /* The timezone table. */
5077c478bd9Sstevel@tonic-gate /* Some of these are commented out because a time_t can't store a float. */
5087c478bd9Sstevel@tonic-gate static TABLE const TimezoneTable[] = {
5097c478bd9Sstevel@tonic-gate { gettext("gmt"), tZONE, HOUR( 0) }, /* Greenwich Mean */
5107c478bd9Sstevel@tonic-gate { gettext("ut"), tZONE, HOUR( 0) }, /* Universal (Coordinated) */
5117c478bd9Sstevel@tonic-gate { gettext("utc"), tZONE, HOUR( 0) },
5127c478bd9Sstevel@tonic-gate { gettext("wet"), tZONE, HOUR( 0) }, /* Western European */
5137c478bd9Sstevel@tonic-gate { gettext("bst"), tDAYZONE, HOUR( 0) }, /* British Summer */
5147c478bd9Sstevel@tonic-gate { gettext("wat"), tZONE, HOUR( 1) }, /* West Africa */
5157c478bd9Sstevel@tonic-gate { gettext("at"), tZONE, HOUR( 2) }, /* Azores */
5167c478bd9Sstevel@tonic-gate #if 0
517*56a424ccSmp153739 /* For completeness. BST is also British Summer, and GST is
518*56a424ccSmp153739 * also Guam Standard. */
5197c478bd9Sstevel@tonic-gate { gettext("bst"), tZONE, HOUR( 3) }, /* Brazil Standard */
5207c478bd9Sstevel@tonic-gate { gettext("gst"), tZONE, HOUR( 3) }, /* Greenland Standard */
5217c478bd9Sstevel@tonic-gate #endif
5227c478bd9Sstevel@tonic-gate #if 0
5237c478bd9Sstevel@tonic-gate { gettext("nft"), tZONE, HOUR(3.5) }, /* Newfoundland */
5247c478bd9Sstevel@tonic-gate { gettext("nst"), tZONE, HOUR(3.5) }, /* Newfoundland Standard */
5257c478bd9Sstevel@tonic-gate { gettext("ndt"), tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */
5267c478bd9Sstevel@tonic-gate #endif
5277c478bd9Sstevel@tonic-gate { gettext("ast"), tZONE, HOUR( 4) }, /* Atlantic Standard */
5287c478bd9Sstevel@tonic-gate { gettext("adt"), tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
5297c478bd9Sstevel@tonic-gate { gettext("est"), tZONE, HOUR( 5) }, /* Eastern Standard */
5307c478bd9Sstevel@tonic-gate { gettext("edt"), tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
5317c478bd9Sstevel@tonic-gate { gettext("cst"), tZONE, HOUR( 6) }, /* Central Standard */
5327c478bd9Sstevel@tonic-gate { gettext("cdt"), tDAYZONE, HOUR( 6) }, /* Central Daylight */
5337c478bd9Sstevel@tonic-gate { gettext("mst"), tZONE, HOUR( 7) }, /* Mountain Standard */
5347c478bd9Sstevel@tonic-gate { gettext("mdt"), tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
5357c478bd9Sstevel@tonic-gate { gettext("pst"), tZONE, HOUR( 8) }, /* Pacific Standard */
5367c478bd9Sstevel@tonic-gate { gettext("pdt"), tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
5377c478bd9Sstevel@tonic-gate { gettext("yst"), tZONE, HOUR( 9) }, /* Yukon Standard */
5387c478bd9Sstevel@tonic-gate { gettext("ydt"), tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
5397c478bd9Sstevel@tonic-gate { gettext("hst"), tZONE, HOUR(10) }, /* Hawaii Standard */
5407c478bd9Sstevel@tonic-gate { gettext("hdt"), tDAYZONE, HOUR(10) }, /* Hawaii Daylight */
5417c478bd9Sstevel@tonic-gate { gettext("cat"), tZONE, HOUR(10) }, /* Central Alaska */
5427c478bd9Sstevel@tonic-gate { gettext("ahst"), tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */
5437c478bd9Sstevel@tonic-gate { gettext("nt"), tZONE, HOUR(11) }, /* Nome */
5447c478bd9Sstevel@tonic-gate { gettext("idlw"), tZONE, HOUR(12) }, /* International Date Line West */
5457c478bd9Sstevel@tonic-gate { gettext("cet"), tZONE, -HOUR(1) }, /* Central European */
5467c478bd9Sstevel@tonic-gate { gettext("met"), tZONE, -HOUR(1) }, /* Middle European */
5477c478bd9Sstevel@tonic-gate { gettext("mewt"), tZONE, -HOUR(1) }, /* Middle European Winter */
5487c478bd9Sstevel@tonic-gate { gettext("mest"), tDAYZONE, -HOUR(1) }, /* Middle European Summer */
5497c478bd9Sstevel@tonic-gate { gettext("swt"), tZONE, -HOUR(1) }, /* Swedish Winter */
5507c478bd9Sstevel@tonic-gate { gettext("sst"), tDAYZONE, -HOUR(1) }, /* Swedish Summer */
5517c478bd9Sstevel@tonic-gate { gettext("fwt"), tZONE, -HOUR(1) }, /* French Winter */
5527c478bd9Sstevel@tonic-gate { gettext("fst"), tDAYZONE, -HOUR(1) }, /* French Summer */
5537c478bd9Sstevel@tonic-gate { gettext("eet"), tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */
5547c478bd9Sstevel@tonic-gate { gettext("bt"), tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */
5557c478bd9Sstevel@tonic-gate #if 0
5567c478bd9Sstevel@tonic-gate { gettext("it"), tZONE, -HOUR(3.5) },/* Iran */
5577c478bd9Sstevel@tonic-gate #endif
5587c478bd9Sstevel@tonic-gate { gettext("zp4"), tZONE, -HOUR(4) }, /* USSR Zone 3 */
5597c478bd9Sstevel@tonic-gate { gettext("zp5"), tZONE, -HOUR(5) }, /* USSR Zone 4 */
5607c478bd9Sstevel@tonic-gate #if 0
5617c478bd9Sstevel@tonic-gate { gettext("ist"), tZONE, -HOUR(5.5) },/* Indian Standard */
5627c478bd9Sstevel@tonic-gate #endif
5637c478bd9Sstevel@tonic-gate { gettext("zp6"), tZONE, -HOUR(6) }, /* USSR Zone 5 */
5647c478bd9Sstevel@tonic-gate #if 0
565*56a424ccSmp153739 /* For completeness. NST is also Newfoundland Stanard, and SST is
566*56a424ccSmp153739 * also Swedish Summer. */
5677c478bd9Sstevel@tonic-gate { gettext("nst"), tZONE, -HOUR(6.5) },/* North Sumatra */
5687c478bd9Sstevel@tonic-gate { gettext("sst"), tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */
5697c478bd9Sstevel@tonic-gate #endif /* 0 */
5707c478bd9Sstevel@tonic-gate { gettext("wast"), tZONE, -HOUR(7) }, /* West Australian Standard */
5717c478bd9Sstevel@tonic-gate { gettext("wadt"), tDAYZONE, -HOUR(7) }, /* West Australian Daylight */
5727c478bd9Sstevel@tonic-gate #if 0
5737c478bd9Sstevel@tonic-gate { gettext("jt"), tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */
5747c478bd9Sstevel@tonic-gate #endif
5757c478bd9Sstevel@tonic-gate { gettext("cct"), tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */
5767c478bd9Sstevel@tonic-gate { gettext("jst"), tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */
5777c478bd9Sstevel@tonic-gate { gettext("kst"), tZONE, -HOUR(9) }, /* Korean Standard */
5787c478bd9Sstevel@tonic-gate #if 0
5797c478bd9Sstevel@tonic-gate { gettext("cast"), tZONE, -HOUR(9.5) },/* Central Australian Standard */
5807c478bd9Sstevel@tonic-gate { gettext("cadt"), tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */
5817c478bd9Sstevel@tonic-gate #endif
5827c478bd9Sstevel@tonic-gate { gettext("east"), tZONE, -HOUR(10) }, /* Eastern Australian Standard */
5837c478bd9Sstevel@tonic-gate { gettext("eadt"), tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */
5847c478bd9Sstevel@tonic-gate { gettext("gst"), tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */
5857c478bd9Sstevel@tonic-gate { gettext("kdt"), tZONE, -HOUR(10) }, /* Korean Daylight */
5867c478bd9Sstevel@tonic-gate { gettext("nzt"), tZONE, -HOUR(12) }, /* New Zealand */
5877c478bd9Sstevel@tonic-gate { gettext("nzst"), tZONE, -HOUR(12) }, /* New Zealand Standard */
5887c478bd9Sstevel@tonic-gate { gettext("nzdt"), tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
5897c478bd9Sstevel@tonic-gate { gettext("idle"), tZONE, -HOUR(12) }, /* International Date Line East */
5907c478bd9Sstevel@tonic-gate { NULL }
5917c478bd9Sstevel@tonic-gate };
5927c478bd9Sstevel@tonic-gate
5937c478bd9Sstevel@tonic-gate /* ARGSUSED */
5947c478bd9Sstevel@tonic-gate static int
yyerror(s)5957c478bd9Sstevel@tonic-gate yyerror(s)
5967c478bd9Sstevel@tonic-gate char *s;
5977c478bd9Sstevel@tonic-gate {
598*56a424ccSmp153739 return 0;
5997c478bd9Sstevel@tonic-gate }
6007c478bd9Sstevel@tonic-gate
6017c478bd9Sstevel@tonic-gate
6027c478bd9Sstevel@tonic-gate static time_t
ToSeconds(Hours,Minutes,Seconds,Meridian)603*56a424ccSmp153739 ToSeconds(Hours, Minutes, Seconds, Meridian)
604*56a424ccSmp153739 time_t Hours;
605*56a424ccSmp153739 time_t Minutes;
606*56a424ccSmp153739 time_t Seconds;
607*56a424ccSmp153739 MERIDIAN Meridian;
6087c478bd9Sstevel@tonic-gate {
6097c478bd9Sstevel@tonic-gate if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
610*56a424ccSmp153739 return -1;
6117c478bd9Sstevel@tonic-gate switch (Meridian) {
6127c478bd9Sstevel@tonic-gate case MER24:
6137c478bd9Sstevel@tonic-gate if (Hours < 0 || Hours > 23)
614*56a424ccSmp153739 return -1;
6157c478bd9Sstevel@tonic-gate return (Hours * 60L + Minutes) * 60L + Seconds;
6167c478bd9Sstevel@tonic-gate case MERam:
6177c478bd9Sstevel@tonic-gate if (Hours < 1 || Hours > 12)
618*56a424ccSmp153739 return -1;
6197c478bd9Sstevel@tonic-gate return (Hours * 60L + Minutes) * 60L + Seconds;
6207c478bd9Sstevel@tonic-gate case MERpm:
6217c478bd9Sstevel@tonic-gate if (Hours < 1 || Hours > 12)
622*56a424ccSmp153739 return -1;
6237c478bd9Sstevel@tonic-gate return ((Hours + 12) * 60L + Minutes) * 60L + Seconds;
6247c478bd9Sstevel@tonic-gate default:
6257c478bd9Sstevel@tonic-gate abort ();
6267c478bd9Sstevel@tonic-gate }
6277c478bd9Sstevel@tonic-gate /* NOTREACHED */
6287c478bd9Sstevel@tonic-gate }
6297c478bd9Sstevel@tonic-gate
6307c478bd9Sstevel@tonic-gate /*
6317c478bd9Sstevel@tonic-gate * From hh:mm:ss [am|pm] mm/dd/yy [tz], compute and return the number
6327c478bd9Sstevel@tonic-gate * of seconds since 00:00:00 1/1/70 GMT.
6337c478bd9Sstevel@tonic-gate */
6347c478bd9Sstevel@tonic-gate static time_t
Convert(Month,Day,Year,Hours,Minutes,Seconds,Meridian,DSTmode)635*56a424ccSmp153739 Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
636*56a424ccSmp153739 time_t Month;
637*56a424ccSmp153739 time_t Day;
638*56a424ccSmp153739 time_t Year;
639*56a424ccSmp153739 time_t Hours;
640*56a424ccSmp153739 time_t Minutes;
641*56a424ccSmp153739 time_t Seconds;
642*56a424ccSmp153739 MERIDIAN Meridian;
643*56a424ccSmp153739 DSTMODE DSTmode;
6447c478bd9Sstevel@tonic-gate {
6457c478bd9Sstevel@tonic-gate static int DaysInMonth[12] = {
6467c478bd9Sstevel@tonic-gate 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
6477c478bd9Sstevel@tonic-gate };
6487c478bd9Sstevel@tonic-gate time_t tod;
6497c478bd9Sstevel@tonic-gate time_t Julian;
6507c478bd9Sstevel@tonic-gate int i;
6517c478bd9Sstevel@tonic-gate
6527c478bd9Sstevel@tonic-gate if (Year < 0)
6537c478bd9Sstevel@tonic-gate Year = -Year;
6547c478bd9Sstevel@tonic-gate if (Year < 1900)
6557c478bd9Sstevel@tonic-gate Year += 1900;
6567c478bd9Sstevel@tonic-gate DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
6577c478bd9Sstevel@tonic-gate ? 29 : 28;
658*56a424ccSmp153739 if (Year < EPOCH
659*56a424ccSmp153739 || Year > EPOCH_END
660*56a424ccSmp153739 || Month < 1 || Month > 12
6617c478bd9Sstevel@tonic-gate /* Lint fluff: "conversion from long may lose accuracy" */
6627c478bd9Sstevel@tonic-gate || Day < 1 || Day > DaysInMonth[(int)--Month])
663*56a424ccSmp153739 return -1;
6647c478bd9Sstevel@tonic-gate
6657c478bd9Sstevel@tonic-gate for (Julian = Day - 1, i = 0; i < Month; i++)
6667c478bd9Sstevel@tonic-gate Julian += DaysInMonth[i];
6677c478bd9Sstevel@tonic-gate for (i = EPOCH; i < Year; i++)
6687c478bd9Sstevel@tonic-gate Julian += 365 + ((i % 4 == 0) && ((Year % 100 != 0) ||
6697c478bd9Sstevel@tonic-gate (Year % 400 == 0)));
6707c478bd9Sstevel@tonic-gate Julian *= SECSPERDAY;
6717c478bd9Sstevel@tonic-gate Julian += yyTimezone * 60L;
6727c478bd9Sstevel@tonic-gate if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)
673*56a424ccSmp153739 return -1;
6747c478bd9Sstevel@tonic-gate Julian += tod;
6757c478bd9Sstevel@tonic-gate if (DSTmode == DSTon
6767c478bd9Sstevel@tonic-gate || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst))
6777c478bd9Sstevel@tonic-gate Julian -= 60 * 60;
678*56a424ccSmp153739 return Julian;
6797c478bd9Sstevel@tonic-gate }
6807c478bd9Sstevel@tonic-gate
6817c478bd9Sstevel@tonic-gate
6827c478bd9Sstevel@tonic-gate static time_t
DSTcorrect(Start,Future)6837c478bd9Sstevel@tonic-gate DSTcorrect(Start, Future)
6847c478bd9Sstevel@tonic-gate time_t Start;
6857c478bd9Sstevel@tonic-gate time_t Future;
6867c478bd9Sstevel@tonic-gate {
6877c478bd9Sstevel@tonic-gate time_t StartDay;
6887c478bd9Sstevel@tonic-gate time_t FutureDay;
6897c478bd9Sstevel@tonic-gate
6907c478bd9Sstevel@tonic-gate StartDay = (localtime(&Start)->tm_hour + 1) % 24;
6917c478bd9Sstevel@tonic-gate FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
6927c478bd9Sstevel@tonic-gate return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
6937c478bd9Sstevel@tonic-gate }
6947c478bd9Sstevel@tonic-gate
6957c478bd9Sstevel@tonic-gate
6967c478bd9Sstevel@tonic-gate static time_t
RelativeDate(Start,DayOrdinal,DayNumber)6977c478bd9Sstevel@tonic-gate RelativeDate(Start, DayOrdinal, DayNumber)
6987c478bd9Sstevel@tonic-gate time_t Start;
6997c478bd9Sstevel@tonic-gate time_t DayOrdinal;
7007c478bd9Sstevel@tonic-gate time_t DayNumber;
7017c478bd9Sstevel@tonic-gate {
7027c478bd9Sstevel@tonic-gate struct tm *tm;
7037c478bd9Sstevel@tonic-gate time_t now;
7047c478bd9Sstevel@tonic-gate
7057c478bd9Sstevel@tonic-gate now = Start;
7067c478bd9Sstevel@tonic-gate tm = localtime(&now);
7077c478bd9Sstevel@tonic-gate now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
7087c478bd9Sstevel@tonic-gate now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
709*56a424ccSmp153739 return DSTcorrect(Start, now);
7107c478bd9Sstevel@tonic-gate }
7117c478bd9Sstevel@tonic-gate
7127c478bd9Sstevel@tonic-gate
7137c478bd9Sstevel@tonic-gate static time_t
RelativeMonth(Start,RelMonth)714*56a424ccSmp153739 RelativeMonth(Start, RelMonth)
715*56a424ccSmp153739 time_t Start;
716*56a424ccSmp153739 time_t RelMonth;
7177c478bd9Sstevel@tonic-gate {
7187c478bd9Sstevel@tonic-gate struct tm *tm;
7197c478bd9Sstevel@tonic-gate time_t Month;
7207c478bd9Sstevel@tonic-gate time_t Year;
7217c478bd9Sstevel@tonic-gate time_t ret;
7227c478bd9Sstevel@tonic-gate
7237c478bd9Sstevel@tonic-gate if (RelMonth == 0)
724*56a424ccSmp153739 return 0;
7257c478bd9Sstevel@tonic-gate tm = localtime(&Start);
7267c478bd9Sstevel@tonic-gate Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
7277c478bd9Sstevel@tonic-gate Year = Month / 12;
7287c478bd9Sstevel@tonic-gate Month = Month % 12 + 1;
7297c478bd9Sstevel@tonic-gate ret = Convert(Month, (time_t)tm->tm_mday, Year,
7307c478bd9Sstevel@tonic-gate (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
7317c478bd9Sstevel@tonic-gate MER24, DSTmaybe);
7327c478bd9Sstevel@tonic-gate if (ret == -1)
7337c478bd9Sstevel@tonic-gate return ret;
7347c478bd9Sstevel@tonic-gate return DSTcorrect(Start, ret);
7357c478bd9Sstevel@tonic-gate }
7367c478bd9Sstevel@tonic-gate
7377c478bd9Sstevel@tonic-gate
7387c478bd9Sstevel@tonic-gate static int
LookupWord(buff)739*56a424ccSmp153739 LookupWord(buff)
740*56a424ccSmp153739 char *buff;
7417c478bd9Sstevel@tonic-gate {
7427c478bd9Sstevel@tonic-gate register char *p;
7437c478bd9Sstevel@tonic-gate register char *q;
7447c478bd9Sstevel@tonic-gate register const TABLE *tp;
7457c478bd9Sstevel@tonic-gate int i;
7467c478bd9Sstevel@tonic-gate int abbrev;
7477c478bd9Sstevel@tonic-gate
7487c478bd9Sstevel@tonic-gate /* Make it lowercase. */
7497c478bd9Sstevel@tonic-gate for (p = buff; *p; p++)
750*56a424ccSmp153739 if (isupper((int) *p))
751*56a424ccSmp153739 *p = tolower((int) *p);
7527c478bd9Sstevel@tonic-gate
753*56a424ccSmp153739 if (strcmp(buff, gettext("am")) == 0 || strcmp(buff, gettext("a.m.")) == 0) {
7547c478bd9Sstevel@tonic-gate yylval.Meridian = MERam;
755*56a424ccSmp153739 return tMERIDIAN;
7567c478bd9Sstevel@tonic-gate }
7577c478bd9Sstevel@tonic-gate if (strcmp(buff, gettext("pm")) == 0 ||
7587c478bd9Sstevel@tonic-gate strcmp(buff, gettext("p.m.")) == 0) {
7597c478bd9Sstevel@tonic-gate yylval.Meridian = MERpm;
760*56a424ccSmp153739 return tMERIDIAN;
7617c478bd9Sstevel@tonic-gate }
7627c478bd9Sstevel@tonic-gate
7637c478bd9Sstevel@tonic-gate /* See if we have an abbreviation for a month. */
7647c478bd9Sstevel@tonic-gate if (strlen(buff) == 3)
7657c478bd9Sstevel@tonic-gate abbrev = 1;
7667c478bd9Sstevel@tonic-gate else if (strlen(buff) == 4 && buff[3] == '.') {
7677c478bd9Sstevel@tonic-gate abbrev = 1;
7687c478bd9Sstevel@tonic-gate buff[3] = '\0';
7697c478bd9Sstevel@tonic-gate }
7707c478bd9Sstevel@tonic-gate else
7717c478bd9Sstevel@tonic-gate abbrev = 0;
7727c478bd9Sstevel@tonic-gate
7737c478bd9Sstevel@tonic-gate for (tp = MonthDayTable; tp->name; tp++) {
7747c478bd9Sstevel@tonic-gate if (abbrev) {
7757c478bd9Sstevel@tonic-gate if (strncmp(buff, GETTEXT(tp->name), 3) == 0) {
7767c478bd9Sstevel@tonic-gate yylval.Number = tp->value;
777*56a424ccSmp153739 return tp->type;
7787c478bd9Sstevel@tonic-gate }
7797c478bd9Sstevel@tonic-gate }
7807c478bd9Sstevel@tonic-gate else if (strcmp(buff, GETTEXT(tp->name)) == 0) {
7817c478bd9Sstevel@tonic-gate yylval.Number = tp->value;
782*56a424ccSmp153739 return tp->type;
7837c478bd9Sstevel@tonic-gate }
7847c478bd9Sstevel@tonic-gate }
7857c478bd9Sstevel@tonic-gate
7867c478bd9Sstevel@tonic-gate for (tp = TimezoneTable; tp->name; tp++)
7877c478bd9Sstevel@tonic-gate if (strcmp(buff, GETTEXT(tp->name)) == 0) {
7887c478bd9Sstevel@tonic-gate yylval.Number = tp->value;
789*56a424ccSmp153739 return tp->type;
7907c478bd9Sstevel@tonic-gate }
7917c478bd9Sstevel@tonic-gate
7927c478bd9Sstevel@tonic-gate if (strcmp(buff, gettext("dst")) == 0)
793*56a424ccSmp153739 return tDST;
7947c478bd9Sstevel@tonic-gate
7957c478bd9Sstevel@tonic-gate for (tp = UnitsTable; tp->name; tp++)
7967c478bd9Sstevel@tonic-gate if (strcmp(buff, GETTEXT(tp->name)) == 0) {
7977c478bd9Sstevel@tonic-gate yylval.Number = tp->value;
798*56a424ccSmp153739 return tp->type;
7997c478bd9Sstevel@tonic-gate }
8007c478bd9Sstevel@tonic-gate
8017c478bd9Sstevel@tonic-gate /* Strip off any plural and try the units table again. */
8027c478bd9Sstevel@tonic-gate i = strlen(buff) - 1;
8037c478bd9Sstevel@tonic-gate if (buff[i] == 's') {
8047c478bd9Sstevel@tonic-gate buff[i] = '\0';
8057c478bd9Sstevel@tonic-gate for (tp = UnitsTable; tp->name; tp++)
8067c478bd9Sstevel@tonic-gate if (strcmp(buff, GETTEXT(tp->name)) == 0) {
8077c478bd9Sstevel@tonic-gate yylval.Number = tp->value;
808*56a424ccSmp153739 return tp->type;
8097c478bd9Sstevel@tonic-gate }
8107c478bd9Sstevel@tonic-gate buff[i] = 's'; /* Put back for "this" in OtherTable. */
8117c478bd9Sstevel@tonic-gate }
8127c478bd9Sstevel@tonic-gate
8137c478bd9Sstevel@tonic-gate for (tp = OtherTable; tp->name; tp++)
8147c478bd9Sstevel@tonic-gate if (strcmp(buff, GETTEXT(tp->name)) == 0) {
8157c478bd9Sstevel@tonic-gate yylval.Number = tp->value;
816*56a424ccSmp153739 return tp->type;
8177c478bd9Sstevel@tonic-gate }
8187c478bd9Sstevel@tonic-gate
8197c478bd9Sstevel@tonic-gate /* Drop out any periods and try the timezone table again. */
8207c478bd9Sstevel@tonic-gate for (i = 0, p = q = buff; *q; q++)
8217c478bd9Sstevel@tonic-gate if (*q != '.')
8227c478bd9Sstevel@tonic-gate *p++ = *q;
8237c478bd9Sstevel@tonic-gate else
8247c478bd9Sstevel@tonic-gate i++;
8257c478bd9Sstevel@tonic-gate *p = '\0';
8267c478bd9Sstevel@tonic-gate if (i)
8277c478bd9Sstevel@tonic-gate for (tp = TimezoneTable; tp->name; tp++)
8287c478bd9Sstevel@tonic-gate if (strcmp(buff, GETTEXT(tp->name)) == 0) {
8297c478bd9Sstevel@tonic-gate yylval.Number = tp->value;
830*56a424ccSmp153739 return tp->type;
8317c478bd9Sstevel@tonic-gate }
8327c478bd9Sstevel@tonic-gate
833*56a424ccSmp153739 return tID;
8347c478bd9Sstevel@tonic-gate }
8357c478bd9Sstevel@tonic-gate
8367c478bd9Sstevel@tonic-gate
8377c478bd9Sstevel@tonic-gate static int
yylex()8387c478bd9Sstevel@tonic-gate yylex()
8397c478bd9Sstevel@tonic-gate {
8407c478bd9Sstevel@tonic-gate register char c;
8417c478bd9Sstevel@tonic-gate register char *p;
8427c478bd9Sstevel@tonic-gate char buff[20];
8437c478bd9Sstevel@tonic-gate int Count;
8447c478bd9Sstevel@tonic-gate int sign;
8457c478bd9Sstevel@tonic-gate
8467c478bd9Sstevel@tonic-gate for ( ; ; ) {
847*56a424ccSmp153739 while (isspace((int) *yyInput))
8487c478bd9Sstevel@tonic-gate yyInput++;
8497c478bd9Sstevel@tonic-gate
850*56a424ccSmp153739 c = *yyInput;
851*56a424ccSmp153739 if (isdigit((int) c) || c == '-' || c == '+') {
8527c478bd9Sstevel@tonic-gate if (c == '-' || c == '+') {
8537c478bd9Sstevel@tonic-gate sign = c == '-' ? -1 : 1;
854*56a424ccSmp153739 if (!isdigit((int) (*++yyInput)))
8557c478bd9Sstevel@tonic-gate /* skip the '-' sign */
8567c478bd9Sstevel@tonic-gate continue;
8577c478bd9Sstevel@tonic-gate }
8587c478bd9Sstevel@tonic-gate else
8597c478bd9Sstevel@tonic-gate sign = 0;
860*56a424ccSmp153739 for (yylval.Number = 0; isdigit((int) (c = *yyInput++)); )
8617c478bd9Sstevel@tonic-gate yylval.Number = 10 * yylval.Number + c - '0';
8627c478bd9Sstevel@tonic-gate yyInput--;
8637c478bd9Sstevel@tonic-gate if (sign < 0)
8647c478bd9Sstevel@tonic-gate yylval.Number = -yylval.Number;
865*56a424ccSmp153739 return sign ? tSNUMBER : tUNUMBER;
8667c478bd9Sstevel@tonic-gate }
867*56a424ccSmp153739 if (isalpha((int) c)) {
868*56a424ccSmp153739 for (p = buff; isalpha((int) (c = *yyInput++)) || c == '.'; )
8697c478bd9Sstevel@tonic-gate if (p < &buff[sizeof buff - 1])
8707c478bd9Sstevel@tonic-gate *p++ = c;
8717c478bd9Sstevel@tonic-gate *p = '\0';
8727c478bd9Sstevel@tonic-gate yyInput--;
873*56a424ccSmp153739 return LookupWord(buff);
8747c478bd9Sstevel@tonic-gate }
8757c478bd9Sstevel@tonic-gate if (c != '(')
876*56a424ccSmp153739 return *yyInput++;
8777c478bd9Sstevel@tonic-gate Count = 0;
8787c478bd9Sstevel@tonic-gate do {
8797c478bd9Sstevel@tonic-gate c = *yyInput++;
8807c478bd9Sstevel@tonic-gate if (c == '\0')
881*56a424ccSmp153739 return c;
8827c478bd9Sstevel@tonic-gate if (c == '(')
8837c478bd9Sstevel@tonic-gate Count++;
8847c478bd9Sstevel@tonic-gate else if (c == ')')
8857c478bd9Sstevel@tonic-gate Count--;
8867c478bd9Sstevel@tonic-gate } while (Count > 0);
8877c478bd9Sstevel@tonic-gate }
8887c478bd9Sstevel@tonic-gate }
8897c478bd9Sstevel@tonic-gate
8907c478bd9Sstevel@tonic-gate
8917c478bd9Sstevel@tonic-gate #define TM_YEAR_ORIGIN 1900
8927c478bd9Sstevel@tonic-gate
8937c478bd9Sstevel@tonic-gate /* Yield A - B, measured in seconds. */
8947c478bd9Sstevel@tonic-gate static time_t
difftm(a,b)895*56a424ccSmp153739 difftm(a, b)
896*56a424ccSmp153739 struct tm *a, *b;
8977c478bd9Sstevel@tonic-gate {
8987c478bd9Sstevel@tonic-gate int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
8997c478bd9Sstevel@tonic-gate int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
900*56a424ccSmp153739 return
901*56a424ccSmp153739 (
902*56a424ccSmp153739 (
903*56a424ccSmp153739 (
9047c478bd9Sstevel@tonic-gate /* difference in day of year */
9057c478bd9Sstevel@tonic-gate a->tm_yday - b->tm_yday
9067c478bd9Sstevel@tonic-gate /* + intervening leap days */
9077c478bd9Sstevel@tonic-gate + ((ay >> 2) - (by >> 2))
9087c478bd9Sstevel@tonic-gate - (ay/100 - by/100)
9097c478bd9Sstevel@tonic-gate + ((ay/100 >> 2) - (by/100 >> 2))
9107c478bd9Sstevel@tonic-gate /* + difference in years * 365 */
9117c478bd9Sstevel@tonic-gate + (time_t)(ay-by) * 365
9127c478bd9Sstevel@tonic-gate )*24 + (a->tm_hour - b->tm_hour)
9137c478bd9Sstevel@tonic-gate )*60 + (a->tm_min - b->tm_min)
914*56a424ccSmp153739 )*60 + (a->tm_sec - b->tm_sec);
9157c478bd9Sstevel@tonic-gate }
9167c478bd9Sstevel@tonic-gate
917*56a424ccSmp153739 /* For get_date extern declaration compatibility check... yuck. */
918*56a424ccSmp153739 #include <krb5.h>
919*56a424ccSmp153739 #include "kadmin.h"
920*56a424ccSmp153739
9217c478bd9Sstevel@tonic-gate time_t
get_date(p)922*56a424ccSmp153739 get_date(p)
923*56a424ccSmp153739 char *p;
9247c478bd9Sstevel@tonic-gate {
925*56a424ccSmp153739 struct my_timeb *now = NULL;
9267c478bd9Sstevel@tonic-gate struct tm *tm, gmt;
9277c478bd9Sstevel@tonic-gate struct my_timeb ftz;
9287c478bd9Sstevel@tonic-gate time_t Start;
9297c478bd9Sstevel@tonic-gate time_t tod;
9307c478bd9Sstevel@tonic-gate time_t delta;
9317c478bd9Sstevel@tonic-gate
9327c478bd9Sstevel@tonic-gate yyInput = p;
9337c478bd9Sstevel@tonic-gate if (now == NULL) {
9347c478bd9Sstevel@tonic-gate now = &ftz;
9357c478bd9Sstevel@tonic-gate
9367c478bd9Sstevel@tonic-gate ftz.time = time((time_t *) 0);
9377c478bd9Sstevel@tonic-gate
9387c478bd9Sstevel@tonic-gate if (! (tm = gmtime (&ftz.time)))
939*56a424ccSmp153739 return -1;
9407c478bd9Sstevel@tonic-gate gmt = *tm; /* Make a copy, in case localtime modifies *tm. */
9417c478bd9Sstevel@tonic-gate ftz.timezone = difftm (&gmt, localtime (&ftz.time)) / 60;
9427c478bd9Sstevel@tonic-gate }
9437c478bd9Sstevel@tonic-gate
9447c478bd9Sstevel@tonic-gate tm = localtime(&now->time);
9457c478bd9Sstevel@tonic-gate yyYear = tm->tm_year;
9467c478bd9Sstevel@tonic-gate yyMonth = tm->tm_mon + 1;
9477c478bd9Sstevel@tonic-gate yyDay = tm->tm_mday;
9487c478bd9Sstevel@tonic-gate yyTimezone = now->timezone;
9497c478bd9Sstevel@tonic-gate yyDSTmode = DSTmaybe;
9507c478bd9Sstevel@tonic-gate yyHour = 0;
9517c478bd9Sstevel@tonic-gate yyMinutes = 0;
9527c478bd9Sstevel@tonic-gate yySeconds = 0;
9537c478bd9Sstevel@tonic-gate yyMeridian = MER24;
9547c478bd9Sstevel@tonic-gate yyRelSeconds = 0;
9557c478bd9Sstevel@tonic-gate yyRelMonth = 0;
9567c478bd9Sstevel@tonic-gate yyHaveDate = 0;
9577c478bd9Sstevel@tonic-gate yyHaveDay = 0;
9587c478bd9Sstevel@tonic-gate yyHaveRel = 0;
9597c478bd9Sstevel@tonic-gate yyHaveTime = 0;
9607c478bd9Sstevel@tonic-gate yyHaveZone = 0;
9617c478bd9Sstevel@tonic-gate
9627c478bd9Sstevel@tonic-gate /*
9637c478bd9Sstevel@tonic-gate * When yyparse returns, zero or more of yyHave{Time,Zone,Date,Day,Rel}
9647c478bd9Sstevel@tonic-gate * will have been incremented. The value is number of items of
9657c478bd9Sstevel@tonic-gate * that type that were found; for all but Rel, more than one is
9667c478bd9Sstevel@tonic-gate * illegal.
9677c478bd9Sstevel@tonic-gate *
9687c478bd9Sstevel@tonic-gate * For each yyHave indicator, the following values are set:
9697c478bd9Sstevel@tonic-gate *
9707c478bd9Sstevel@tonic-gate * yyHaveTime:
9717c478bd9Sstevel@tonic-gate * yyHour, yyMinutes, yySeconds: hh:mm:ss specified, initialized
9727c478bd9Sstevel@tonic-gate * to zeros above
9737c478bd9Sstevel@tonic-gate * yyMeridian: MERam, MERpm, or MER24
9747c478bd9Sstevel@tonic-gate * yyTimeZone: time zone specified in minutes
9757c478bd9Sstevel@tonic-gate * yyDSTmode: DSToff if yyTimeZone is set, otherwise unchanged
9767c478bd9Sstevel@tonic-gate * (initialized above to DSTmaybe)
9777c478bd9Sstevel@tonic-gate *
9787c478bd9Sstevel@tonic-gate * yyHaveZone:
9797c478bd9Sstevel@tonic-gate * yyTimezone: as above
9807c478bd9Sstevel@tonic-gate * yyDSTmode: DSToff if a non-DST zone is specified, otherwise DSTon
9817c478bd9Sstevel@tonic-gate * XXX don't understand interaction with yyHaveTime zone info
9827c478bd9Sstevel@tonic-gate *
9837c478bd9Sstevel@tonic-gate * yyHaveDay:
9847c478bd9Sstevel@tonic-gate * yyDayNumber: 0-6 for Sunday-Saturday
9857c478bd9Sstevel@tonic-gate * yyDayOrdinal: val specified with day ("second monday",
9867c478bd9Sstevel@tonic-gate * Ordinal=2), otherwise 1
9877c478bd9Sstevel@tonic-gate *
9887c478bd9Sstevel@tonic-gate * yyHaveDate:
9897c478bd9Sstevel@tonic-gate * yyMonth, yyDay, yyYear: mm/dd/yy specified, initialized to
9907c478bd9Sstevel@tonic-gate * today above
9917c478bd9Sstevel@tonic-gate *
9927c478bd9Sstevel@tonic-gate * yyHaveRel:
9937c478bd9Sstevel@tonic-gate * yyRelSeconds: seconds specified with MINUTE_UNITs ("3 hours") or
9947c478bd9Sstevel@tonic-gate * SEC_UNITs ("30 seconds")
9957c478bd9Sstevel@tonic-gate * yyRelMonth: months specified with MONTH_UNITs ("3 months", "1
9967c478bd9Sstevel@tonic-gate * year")
9977c478bd9Sstevel@tonic-gate *
9987c478bd9Sstevel@tonic-gate * The code following yyparse turns these values into a single
9997c478bd9Sstevel@tonic-gate * date stamp.
10007c478bd9Sstevel@tonic-gate */
1001*56a424ccSmp153739 if (yyparse()
1002*56a424ccSmp153739 || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
1003*56a424ccSmp153739 return -1;
10047c478bd9Sstevel@tonic-gate
10057c478bd9Sstevel@tonic-gate /*
10067c478bd9Sstevel@tonic-gate * If an absolute time specified, set Start to the equivalent Unix
10077c478bd9Sstevel@tonic-gate * timestamp. Otherwise, set Start to now, and if we do not have
10087c478bd9Sstevel@tonic-gate * a relatime time (ie: only yyHaveZone), decrement Start to the
10097c478bd9Sstevel@tonic-gate * beginning of today.
10107c478bd9Sstevel@tonic-gate *
10117c478bd9Sstevel@tonic-gate * By having yyHaveDay in the "absolute" list, "next Monday" means
10127c478bd9Sstevel@tonic-gate * midnight next Monday. Otherwise, "next Monday" would mean the
10137c478bd9Sstevel@tonic-gate * time right now, next Monday. It's not clear to me why the
10147c478bd9Sstevel@tonic-gate * current behavior is preferred.
10157c478bd9Sstevel@tonic-gate */
10167c478bd9Sstevel@tonic-gate if (yyHaveDate || yyHaveTime || yyHaveDay) {
1017*56a424ccSmp153739 Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
10187c478bd9Sstevel@tonic-gate yyMeridian, yyDSTmode);
10197c478bd9Sstevel@tonic-gate if (Start < 0)
1020*56a424ccSmp153739 return -1;
10217c478bd9Sstevel@tonic-gate }
10227c478bd9Sstevel@tonic-gate else {
10237c478bd9Sstevel@tonic-gate Start = now->time;
10247c478bd9Sstevel@tonic-gate if (!yyHaveRel)
1025*56a424ccSmp153739 Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec;
10267c478bd9Sstevel@tonic-gate }
10277c478bd9Sstevel@tonic-gate
10287c478bd9Sstevel@tonic-gate /*
10297c478bd9Sstevel@tonic-gate * Add in the relative time specified. RelativeMonth adds in the
10307c478bd9Sstevel@tonic-gate * months, accounting for the fact that the actual length of "3
10317c478bd9Sstevel@tonic-gate * months" depends on where you start counting.
10327c478bd9Sstevel@tonic-gate *
10337c478bd9Sstevel@tonic-gate * XXX By having this separate from the previous block, we are
10347c478bd9Sstevel@tonic-gate * allowing dates like "10:00am 3 months", which means 3 months
10357c478bd9Sstevel@tonic-gate * from 10:00am today, or even "1/1/99 two days" which means two
10367c478bd9Sstevel@tonic-gate * days after 1/1/99.
10377c478bd9Sstevel@tonic-gate *
10387c478bd9Sstevel@tonic-gate * XXX Shouldn't this only be done if yyHaveRel, just for
10397c478bd9Sstevel@tonic-gate * thoroughness?
10407c478bd9Sstevel@tonic-gate */
10417c478bd9Sstevel@tonic-gate Start += yyRelSeconds;
10427c478bd9Sstevel@tonic-gate delta = RelativeMonth(Start, yyRelMonth);
10437c478bd9Sstevel@tonic-gate if (delta == (time_t) -1)
10447c478bd9Sstevel@tonic-gate return -1;
10457c478bd9Sstevel@tonic-gate Start += delta;
10467c478bd9Sstevel@tonic-gate
10477c478bd9Sstevel@tonic-gate /*
10487c478bd9Sstevel@tonic-gate * Now, if you specified a day of week and counter, add it in. By
10497c478bd9Sstevel@tonic-gate * disallowing Date but allowing Time, you can say "5pm next
10507c478bd9Sstevel@tonic-gate * monday".
10517c478bd9Sstevel@tonic-gate *
10527c478bd9Sstevel@tonic-gate * XXX The yyHaveDay && !yyHaveDate restriction should be enforced
10537c478bd9Sstevel@tonic-gate * above and be able to cause failure.
10547c478bd9Sstevel@tonic-gate */
10557c478bd9Sstevel@tonic-gate if (yyHaveDay && !yyHaveDate) {
10567c478bd9Sstevel@tonic-gate tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber);
10577c478bd9Sstevel@tonic-gate Start += tod;
10587c478bd9Sstevel@tonic-gate }
10597c478bd9Sstevel@tonic-gate
10607c478bd9Sstevel@tonic-gate /* Have to do *something* with a legitimate -1 so it's distinguishable
10617c478bd9Sstevel@tonic-gate * from the error return value. (Alternately could set errno on error.) */
1062*56a424ccSmp153739 return Start == -1 ? 0 : Start;
10637c478bd9Sstevel@tonic-gate }
10647c478bd9Sstevel@tonic-gate
10657c478bd9Sstevel@tonic-gate
10667c478bd9Sstevel@tonic-gate #if defined(TEST)
10677c478bd9Sstevel@tonic-gate
10687c478bd9Sstevel@tonic-gate /* ARGSUSED */
main(ac,av)1069*56a424ccSmp153739 main(ac, av)
1070*56a424ccSmp153739 int ac;
1071*56a424ccSmp153739 char *av[];
10727c478bd9Sstevel@tonic-gate {
10737c478bd9Sstevel@tonic-gate char buff[128];
10747c478bd9Sstevel@tonic-gate time_t d;
10757c478bd9Sstevel@tonic-gate
10767c478bd9Sstevel@tonic-gate (void)printf(gettext("Enter date, or blank line to exit.\n\t> "));
10777c478bd9Sstevel@tonic-gate (void)fflush(stdout);
10787c478bd9Sstevel@tonic-gate while (gets(buff) && buff[0]) {
10797c478bd9Sstevel@tonic-gate d = get_date(buff, (struct my_timeb *)NULL);
10807c478bd9Sstevel@tonic-gate if (d == -1)
10817c478bd9Sstevel@tonic-gate (void)printf(
10827c478bd9Sstevel@tonic-gate gettext("Bad format - couldn't convert.\n"));
10837c478bd9Sstevel@tonic-gate else
10847c478bd9Sstevel@tonic-gate (void)printf("%s", ctime(&d));
10857c478bd9Sstevel@tonic-gate (void)printf("\t> ");
10867c478bd9Sstevel@tonic-gate (void)fflush(stdout);
10877c478bd9Sstevel@tonic-gate }
10887c478bd9Sstevel@tonic-gate exit(0);
10897c478bd9Sstevel@tonic-gate /* NOTREACHED */
10907c478bd9Sstevel@tonic-gate }
10917c478bd9Sstevel@tonic-gate #endif /* defined(TEST) */
1092