lib/eggdrop/date.c File Reference

#include <eggdrop/eggdrop.h>

Go to the source code of this file.

Data Structures

struct  _TABLE
union  YYSTYPE
struct  date_Datetoktype

Defines

#define EPOCH   1970
#define START_OF_TIME   1902
#define END_OF_TIME   2037
#define TM_YEAR_BASE   1900
#define HOUR(x)   ((int) (60 * x))
#define SECSPERDAY   (24L * 60L * 60L)
#define IsLeapYear(x)   ((x % 4 == 0) && (x % 100 != 0 || x % 400 == 0))
#define tAGO   257
#define tDAY   258
#define tDAYZONE   259
#define tID   260
#define tMERIDIAN   261
#define tMINUTE_UNIT   262
#define tMONTH   263
#define tMONTH_UNIT   264
#define tSTARDATE   265
#define tSEC_UNIT   266
#define tSNUMBER   267
#define tUNUMBER   268
#define tZONE   269
#define tEPOCH   270
#define tDST   271
#define tISOBASE   272
#define tDAY_UNIT   273
#define tNEXT   274
#define date_Dateclearin   date_Datechar = -1
#define date_Dateerrok   date_Dateerrflag = 0
#define YYMAXDEPTH   150
#define YYERRCODE   256
#define YYNPROD   56
#define YYLAST   261
#define YYDEBUG   0
#define YYERROR   goto date_Dateerrlab
#define YYACCEPT   return(0)
#define YYABORT   return(1)
#define YYBACKUP(newtoken, newvalue)
#define YYRECOVERING()   (!!date_Dateerrflag)
#define YYNEW(type)   malloc(sizeof(type) * date_Datenewmax)
#define YYCOPY(to, from, type)   (type *) memcpy(to, (char *) from, date_Datemaxdepth * sizeof (type))
#define YYENLARGE(from, type)   (type *) realloc((char *) from, date_Datenewmax * sizeof(type))
#define YYFLAG   (-10000000)
#define YYLEX()   date_Datelex()

Typedefs

typedef struct _TABLE TABLE
typedef enum _DSTMODE DSTMODE
typedef enum _MERIDIAN MERIDIAN
typedef int date_Datetabelem

Enumerations

enum  _DSTMODE { DSTon, DSToff, DSTmaybe }
enum  _MERIDIAN { MERam, MERpm, MER24 }

Functions

static void date_Dateerror (char *s)
static time_t ToSeconds (time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian)
static int Convert (time_t Month, time_t Day, time_t Year, time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridia, DSTMODE DSTmode, time_t *TimePtr)
static time_t DSTcorrect (time_t Start, time_t Future)
static time_t NamedDay (time_t Start, time_t DayOrdinal, time_t DayNumber)
static time_t NamedMonth (time_t Start, time_t MonthOrdinal, time_t MonthNumber)
static int RelativeMonth (time_t Start, time_t RelMonth, time_t *TimePtr)
static int RelativeDay (time_t Start, time_t RelDay, time_t *TimePtr)
static int LookupWord (char *buff)
static int date_Datelex (void)
int date_Dateparse (void)
int date_timezone ()
int date_scan (char *timestr, time_t *now, int zone, time_t *timeptr)

Variables

static char * date_DateInput
static DSTMODE date_DateDSTmode
static time_t date_DateDayOrdinal
static time_t date_DateDayNumber
static time_t date_DateMonthOrdinal
static int date_DateHaveDate
static int date_DateHaveDay
static int date_DateHaveOrdinalMonth
static int date_DateHaveRel
static int date_DateHaveTime
static int date_DateHaveZone
static time_t date_DateTimezone
static time_t date_DateDay
static time_t date_DateHour
static time_t date_DateMinutes
static time_t date_DateMonth
static time_t date_DateSeconds
static time_t date_DateYear
static MERIDIAN date_DateMeridian
static time_t date_DateRelMonth
static time_t date_DateRelDay
static time_t date_DateRelSeconds
static time_t * date_DateRelPointer
int date_Datechar
int date_Dateerrflag
YYSTYPE date_Datelval
YYSTYPE date_Dateval
int date_Date_date_Dates [YYMAXDEPTH]
int * date_Dates = date_Date_date_Dates
YYSTYPE date_Date_date_Datev [YYMAXDEPTH]
YYSTYPEdate_Datev = date_Date_date_Datev
static int date_Datemaxdepth = YYMAXDEPTH
static TABLE MonthDayTable []
static TABLE UnitsTable []
static TABLE OtherTable []
static TABLE TimezoneTable []
static TABLE MilitaryTable []
static date_Datetabelem date_Dateexca []
static date_Datetabelem date_Dateact []
static date_Datetabelem date_Datepact []
static date_Datetabelem date_Datepgo []
static date_Datetabelem date_Dater1 []
static date_Datetabelem date_Dater2 []
static date_Datetabelem date_Datechk []
static date_Datetabelem date_Datedef []
int date_Datedebug
YYSTYPEdate_Datepv
int * date_Dateps
int date_Datestate
int date_Datetmp
int date_Datenerrs


Define Documentation

#define date_Dateclearin   date_Datechar = -1

Definition at line 165 of file date.c.

#define date_Dateerrok   date_Dateerrflag = 0

Definition at line 166 of file date.c.

#define END_OF_TIME   2037

Definition at line 22 of file date.c.

Referenced by Convert().

#define EPOCH   1970

Definition at line 20 of file date.c.

Referenced by Convert(), and date_Dateparse().

#define HOUR (  )     ((int) (60 * x))

Definition at line 33 of file date.c.

Referenced by date_Dateparse().

#define IsLeapYear (  )     ((x % 4 == 0) && (x % 100 != 0 || x % 400 == 0))

Definition at line 35 of file date.c.

Referenced by Convert(), and date_Dateparse().

#define SECSPERDAY   (24L * 60L * 60L)

Definition at line 34 of file date.c.

Referenced by Convert(), and NamedDay().

#define START_OF_TIME   1902

Definition at line 21 of file date.c.

#define tAGO   257

Definition at line 123 of file date.c.

#define tDAY   258

Definition at line 124 of file date.c.

#define tDAY_UNIT   273

Definition at line 139 of file date.c.

#define tDAYZONE   259

Definition at line 125 of file date.c.

#define tDST   271

Definition at line 137 of file date.c.

#define tEPOCH   270

Definition at line 136 of file date.c.

#define tID   260

Definition at line 126 of file date.c.

Referenced by LookupWord().

#define tISOBASE   272

Definition at line 138 of file date.c.

Referenced by date_Datelex().

#define TM_YEAR_BASE   1900

Definition at line 31 of file date.c.

Referenced by date_scan(), NamedMonth(), and RelativeMonth().

#define tMERIDIAN   261

Definition at line 127 of file date.c.

Referenced by LookupWord().

#define tMINUTE_UNIT   262

Definition at line 128 of file date.c.

#define tMONTH   263

Definition at line 129 of file date.c.

#define tMONTH_UNIT   264

Definition at line 130 of file date.c.

#define tNEXT   274

Definition at line 140 of file date.c.

#define tSEC_UNIT   266

Definition at line 132 of file date.c.

#define tSNUMBER   267

Definition at line 133 of file date.c.

#define tSTARDATE   265

Definition at line 131 of file date.c.

#define tUNUMBER   268

Definition at line 134 of file date.c.

Referenced by date_Datelex().

#define tZONE   269

Definition at line 135 of file date.c.

#define YYABORT   return(1)

Definition at line 1141 of file date.c.

Referenced by date_Dateparse().

#define YYACCEPT   return(0)

Definition at line 1140 of file date.c.

Referenced by date_Dateparse().

#define YYBACKUP ( newtoken,
newvalue   ) 

Value:

{\
  if ( date_Datechar >= 0 || ( date_Dater2[ date_Datetmp ] >> 1 ) != 1 )\
  {\
    date_Dateerror( "syntax error - cannot backup" );\
    goto date_Dateerrlab;\
  }\
  date_Datechar = newtoken;\
  date_Datestate = *date_Dateps;\
  date_Datelval = newvalue;\
  goto date_Datenewstate;\
}

Definition at line 1142 of file date.c.

#define YYCOPY ( to,
from,
type   )     (type *) memcpy(to, (char *) from, date_Datemaxdepth * sizeof (type))

Definition at line 1156 of file date.c.

Referenced by date_Dateparse().

#define YYDEBUG   0

Definition at line 1039 of file date.c.

#define YYENLARGE ( from,
type   )     (type *) realloc((char *) from, date_Datenewmax * sizeof(type))

Definition at line 1158 of file date.c.

Referenced by date_Dateparse().

#define YYERRCODE   256

Definition at line 183 of file date.c.

Referenced by date_Dateparse().

#define YYERROR   goto date_Dateerrlab

Definition at line 1139 of file date.c.

#define YYFLAG   (-10000000)

Definition at line 1172 of file date.c.

Referenced by date_Dateparse().

#define YYLAST   261

Definition at line 950 of file date.c.

Referenced by date_Dateparse().

 
#define YYLEX (  )     date_Datelex()

YYNMBCHARS

Definition at line 1229 of file date.c.

Referenced by date_Dateparse().

#define YYMAXDEPTH   150

Definition at line 173 of file date.c.

Referenced by date_Dateparse().

#define YYNEW ( type   )     malloc(sizeof(type) * date_Datenewmax)

Definition at line 1155 of file date.c.

Referenced by date_Dateparse().

#define YYNPROD   56

Definition at line 949 of file date.c.

 
#define YYRECOVERING (  )     (!!date_Dateerrflag)

Definition at line 1154 of file date.c.


Typedef Documentation

typedef int date_Datetabelem

Definition at line 171 of file date.c.

typedef enum _DSTMODE DSTMODE

typedef enum _MERIDIAN MERIDIAN

typedef struct _TABLE TABLE


Enumeration Type Documentation

enum _DSTMODE

Enumerator:
DSTon 
DSToff 
DSTmaybe 

Definition at line 50 of file date.c.

00050                       {
00051     DSTon, DSToff, DSTmaybe
00052 } DSTMODE;

enum _MERIDIAN

Enumerator:
MERam 
MERpm 
MER24 

Definition at line 57 of file date.c.

00057                        {
00058     MERam, MERpm, MER24
00059 } MERIDIAN;


Function Documentation

static int Convert ( time_t  Month,
time_t  Day,
time_t  Year,
time_t  Hours,
time_t  Minutes,
time_t  Seconds,
MERIDIAN  Meridia,
DSTMODE  DSTmode,
time_t *  TimePtr 
) [static]

Definition at line 446 of file date.c.

References date_DateTimezone, DSTmaybe, DSTon, END_OF_TIME, EPOCH, IsLeapYear, SECSPERDAY, and ToSeconds().

Referenced by date_scan(), NamedMonth(), and RelativeMonth().

00456 {
00457     static int  DaysInMonth[12] = {
00458         31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
00459     };
00460     time_t tod;
00461     time_t Julian;
00462     int i;
00463 
00464     /* Figure out how many days are in February for the given year.
00465      * Every year divisible by 4 is a leap year.
00466      * But, every year divisible by 100 is not a leap year.
00467      * But, every year divisible by 400 is a leap year after all.
00468      */
00469     DaysInMonth[1] = IsLeapYear(Year) ? 29 : 28;
00470 
00471     /* Check the inputs for validity */
00472     if (Month < 1 || Month > 12
00473       || Year < START_OF_TIME || Year > END_OF_TIME
00474       || Day < 1 || Day > DaysInMonth[(int)--Month])
00475         return -1;
00476 
00477     /* Start computing the value.  First determine the number of days
00478      * represented by the date, then multiply by the number of seconds/day.
00479      */
00480     for (Julian = Day - 1, i = 0; i < Month; i++)
00481         Julian += DaysInMonth[i];
00482     if (Year >= EPOCH) {
00483         for (i = EPOCH; i < Year; i++)
00484             Julian += 365 + IsLeapYear(i);
00485     } else {
00486         for (i = Year; i < EPOCH; i++)
00487             Julian -= 365 + IsLeapYear(i);
00488     }
00489     Julian *= SECSPERDAY;
00490 
00491     /* Add the timezone offset ?? */
00492     Julian += date_DateTimezone * 60L;
00493 
00494     /* Add the number of seconds represented by the time component */
00495     if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)
00496         return -1;
00497     Julian += tod;
00498 
00499     /* Perform a preliminary DST compensation ?? */
00500     if (DSTmode == DSTon
00501      || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst))
00502         Julian -= 60 * 60;
00503     *TimePtr = Julian;
00504     return 0;
00505 }

static void date_Dateerror ( char *  s  )  [static]

Definition at line 384 of file date.c.

Referenced by date_Dateparse().

00386 {
00387 }

static int date_Datelex ( void   )  [static]

Definition at line 780 of file date.c.

References date_DateInput, LookupWord(), YYSTYPE::Number, tISOBASE, and tUNUMBER.

00781 {
00782     register char       c;
00783     register char       *p;
00784     char                buff[20];
00785     int                 Count;
00786 
00787     for ( ; ; ) {
00788         while (isspace(*date_DateInput)) {
00789             date_DateInput++;
00790   }
00791 
00792         if (isdigit((c = *date_DateInput))) { /* INTL: digit */
00793       /* convert the string into a number; count the number of digits */
00794       Count = 0;
00795             for (date_Datelval.Number = 0;
00796         isdigit((c = *date_DateInput++)); ) { /* INTL: digit */
00797                 date_Datelval.Number = 10 * date_Datelval.Number + c - '0';
00798     Count++;
00799       }
00800             date_DateInput--;
00801       /* A number with 6 or more digits is considered an ISO 8601 base */
00802       if (Count >= 6) {
00803     return tISOBASE;
00804       } else {
00805     return tUNUMBER;
00806       }
00807         }
00808         if (!(c & 0x80) && isalpha(c)) {  /* INTL: ISO only. */
00809             for (p = buff; isalpha((c = *date_DateInput++)) /* INTL: ISO only. */
00810          || c == '.'; ) {
00811                 if (p < &buff[sizeof buff - 1]) {
00812                     *p++ = c;
00813     }
00814       }
00815             *p = '\0';
00816             date_DateInput--;
00817             return LookupWord(buff);
00818         }
00819         if (c != '(') {
00820             return *date_DateInput++;
00821   }
00822         Count = 0;
00823         do {
00824             c = *date_DateInput++;
00825             if (c == '\0') {
00826                 return c;
00827       } else if (c == '(') {
00828                 Count++;
00829       } else if (c == ')') {
00830                 Count--;
00831       }
00832         } while (Count > 0);
00833     }
00834 }

int date_Dateparse (  ) 

YYNMBCHARS

Definition at line 1238 of file date.c.

References date_Dateact, date_Datechar, date_Datechk, date_DateDay, date_DateDayNumber, date_DateDayOrdinal, date_Datedebug, date_Datedef, date_DateDSTmode, date_Dateerrflag, date_Dateerror(), date_Dateexca, date_DateHaveDate, date_DateHaveDay, date_DateHaveOrdinalMonth, date_DateHaveRel, date_DateHaveTime, date_DateHaveZone, date_DateHour, date_Datemaxdepth, date_DateMeridian, date_DateMinutes, date_DateMonth, date_DateMonthOrdinal, date_Datenerrs, date_Datepact, date_Datepgo, date_Dateps, date_Dater1, date_Dater2, date_DateRelDay, date_DateRelMonth, date_DateRelPointer, date_DateRelSeconds, date_Dates, date_DateSeconds, date_Datestate, date_DateTimezone, date_Datetmp, date_DateYear, DSToff, DSTon, EPOCH, HOUR, IsLeapYear, MER24, YYSTYPE::Meridian, YYSTYPE::Number, date_Datetoktype::t_val, YYABORT, YYACCEPT, YYCOPY, YYENLARGE, YYERRCODE, YYFLAG, YYLAST, YYLEX, YYMAXDEPTH, and YYNEW.

Referenced by date_scan().

01240 {
01241   register YYSTYPE *date_Datepvt = 0; /* top of value stack for $vars */
01242 
01243 #if defined(__cplusplus) || defined(lint)
01244 /*
01245   hacks to please C++ and lint - goto's inside
01246   switch should never be executed
01247 */
01248   static int __yaccpar_lint_hack__ = 0;
01249   switch (__yaccpar_lint_hack__)
01250   {
01251     case 1: goto date_Dateerrlab;
01252     case 2: goto date_Datenewstate;
01253   }
01254 #endif
01255 
01256   /*
01257   ** Initialize externals - date_Dateparse may be called more than once
01258   */
01259   date_Datepv = &date_Datev[-1];
01260   date_Dateps = &date_Dates[-1];
01261   date_Datestate = 0;
01262   date_Datetmp = 0;
01263   date_Datenerrs = 0;
01264   date_Dateerrflag = 0;
01265   date_Datechar = -1;
01266 
01267 #if YYMAXDEPTH <= 0
01268   if (date_Datemaxdepth <= 0)
01269   {
01270     if ((date_Datemaxdepth = YYEXPAND(0)) <= 0)
01271     {
01272       date_Dateerror("yacc initialization error");
01273       YYABORT;
01274     }
01275   }
01276 #endif
01277 
01278   {
01279     register YYSTYPE *date_Date_pv; /* top of value stack */
01280     register int *date_Date_ps;   /* top of state stack */
01281     register int date_Date_state;   /* current state */
01282     register int  date_Date_n;    /* internal state number info */
01283   goto date_Datestack;  /* moved from 6 lines above to here to please C++ */
01284 
01285     /*
01286     ** get globals into registers.
01287     ** branch to here only if YYBACKUP was called.
01288     */
01289     date_Date_pv = date_Datepv;
01290     date_Date_ps = date_Dateps;
01291     date_Date_state = date_Datestate;
01292     goto date_Date_newstate;
01293 
01294     /*
01295     ** get globals into registers.
01296     ** either we just started, or we just finished a reduction
01297     */
01298   date_Datestack:
01299     date_Date_pv = date_Datepv;
01300     date_Date_ps = date_Dateps;
01301     date_Date_state = date_Datestate;
01302 
01303     /*
01304     ** top of for (;;) loop while no reductions done
01305     */
01306   date_Date_stack:
01307     /*
01308     ** put a state and value onto the stacks
01309     */
01310 #if YYDEBUG
01311     /*
01312     ** if debugging, look up token value in list of value vs.
01313     ** name pairs.  0 and negative (-1) are special values.
01314     ** Note: linear search is used since time is not a real
01315     ** consideration while debugging.
01316     */
01317     if ( date_Datedebug )
01318     {
01319       register int date_Date_i;
01320 
01321       printf( "State %d, token ", date_Date_state );
01322       if ( date_Datechar == 0 )
01323         printf( "end-of-file\n" );
01324       else if ( date_Datechar < 0 )
01325         printf( "-none-\n" );
01326       else
01327       {
01328         for ( date_Date_i = 0; date_Datetoks[date_Date_i].t_val >= 0;
01329           date_Date_i++ )
01330         {
01331           if ( date_Datetoks[date_Date_i].t_val == date_Datechar )
01332             break;
01333         }
01334         printf( "%s\n", date_Datetoks[date_Date_i].t_name );
01335       }
01336     }
01337 #endif /* YYDEBUG */
01338     if ( ++date_Date_ps >= &date_Dates[ date_Datemaxdepth ] ) /* room on stack? */
01339     {
01340       /*
01341       ** reallocate and recover.  Note that pointers
01342       ** have to be reset, or bad things will happen
01343       */
01344       long date_Dateps_index = (date_Date_ps - date_Dates);
01345       long date_Datepv_index = (date_Date_pv - date_Datev);
01346       long date_Datepvt_index = (date_Datepvt - date_Datev);
01347       int date_Datenewmax;
01348 #ifdef YYEXPAND
01349       date_Datenewmax = YYEXPAND(date_Datemaxdepth);
01350 #else
01351       date_Datenewmax = 2 * date_Datemaxdepth;  /* double table size */
01352       if (date_Datemaxdepth == YYMAXDEPTH)  /* first time growth */
01353       {
01354         char *newdate_Dates = (char *)YYNEW(int);
01355         char *newdate_Datev = (char *)YYNEW(YYSTYPE);
01356         if (newdate_Dates != 0 && newdate_Datev != 0)
01357         {
01358           date_Dates = YYCOPY(newdate_Dates, date_Dates, int);
01359           date_Datev = YYCOPY(newdate_Datev, date_Datev, YYSTYPE);
01360         }
01361         else
01362           date_Datenewmax = 0;  /* failed */
01363       }
01364       else        /* not first time */
01365       {
01366         date_Dates = YYENLARGE(date_Dates, int);
01367         date_Datev = YYENLARGE(date_Datev, YYSTYPE);
01368         if (date_Dates == 0 || date_Datev == 0)
01369           date_Datenewmax = 0;  /* failed */
01370       }
01371 #endif
01372       if (date_Datenewmax <= date_Datemaxdepth) /* tables not expanded */
01373       {
01374         date_Dateerror( "yacc stack overflow" );
01375         YYABORT;
01376       }
01377       date_Datemaxdepth = date_Datenewmax;
01378 
01379       date_Date_ps = date_Dates + date_Dateps_index;
01380       date_Date_pv = date_Datev + date_Datepv_index;
01381       date_Datepvt = date_Datev + date_Datepvt_index;
01382     }
01383     *date_Date_ps = date_Date_state;
01384     *++date_Date_pv = date_Dateval;
01385 
01386     /*
01387     ** we have a new state - find out what to do
01388     */
01389   date_Date_newstate:
01390     if ( ( date_Date_n = date_Datepact[ date_Date_state ] ) <= YYFLAG )
01391       goto date_Datedefault;    /* simple state */
01392 #if YYDEBUG
01393     /*
01394     ** if debugging, need to mark whether new token grabbed
01395     */
01396     date_Datetmp = date_Datechar < 0;
01397 #endif
01398     if ( ( date_Datechar < 0 ) && ( ( date_Datechar = YYLEX() ) < 0 ) )
01399       date_Datechar = 0;    /* reached EOF */
01400 #if YYDEBUG
01401     if ( date_Datedebug && date_Datetmp )
01402     {
01403       register int date_Date_i;
01404 
01405       printf( "Received token " );
01406       if ( date_Datechar == 0 )
01407         printf( "end-of-file\n" );
01408       else if ( date_Datechar < 0 )
01409         printf( "-none-\n" );
01410       else
01411       {
01412         for ( date_Date_i = 0; date_Datetoks[date_Date_i].t_val >= 0;
01413           date_Date_i++ )
01414         {
01415           if ( date_Datetoks[date_Date_i].t_val == date_Datechar )
01416             break;
01417         }
01418         printf( "%s\n", date_Datetoks[date_Date_i].t_name );
01419       }
01420     }
01421 #endif /* YYDEBUG */
01422     if ( ( ( date_Date_n += date_Datechar ) < 0 ) || ( date_Date_n >= YYLAST ) )
01423       goto date_Datedefault;
01424     if ( date_Datechk[ date_Date_n = date_Dateact[ date_Date_n ] ] == date_Datechar ) /*valid shift*/
01425     {
01426       date_Datechar = -1;
01427       date_Dateval = date_Datelval;
01428       date_Date_state = date_Date_n;
01429       if ( date_Dateerrflag > 0 )
01430         date_Dateerrflag--;
01431       goto date_Date_stack;
01432     }
01433 
01434   date_Datedefault:
01435     if ( ( date_Date_n = date_Datedef[ date_Date_state ] ) == -2 )
01436     {
01437 #if YYDEBUG
01438       date_Datetmp = date_Datechar < 0;
01439 #endif
01440       if ( ( date_Datechar < 0 ) && ( ( date_Datechar = YYLEX() ) < 0 ) )
01441         date_Datechar = 0;    /* reached EOF */
01442 #if YYDEBUG
01443       if ( date_Datedebug && date_Datetmp )
01444       {
01445         register int date_Date_i;
01446 
01447         printf( "Received token " );
01448         if ( date_Datechar == 0 )
01449           printf( "end-of-file\n" );
01450         else if ( date_Datechar < 0 )
01451           printf( "-none-\n" );
01452         else
01453         {
01454           for ( date_Date_i = 0;
01455             date_Datetoks[date_Date_i].t_val >= 0;
01456             date_Date_i++ )
01457           {
01458             if ( date_Datetoks[date_Date_i].t_val
01459               == date_Datechar )
01460             {
01461               break;
01462             }
01463           }
01464           printf( "%s\n", date_Datetoks[date_Date_i].t_name );
01465         }
01466       }
01467 #endif /* YYDEBUG */
01468       /*
01469       ** look through exception table
01470       */
01471       {
01472         register int *date_Datexi = date_Dateexca;
01473 
01474         while ( ( *date_Datexi != -1 ) ||
01475           ( date_Datexi[1] != date_Date_state ) )
01476         {
01477           date_Datexi += 2;
01478         }
01479         while ( ( *(date_Datexi += 2) >= 0 ) &&
01480           ( *date_Datexi != date_Datechar ) )
01481           ;
01482         if ( ( date_Date_n = date_Datexi[1] ) < 0 )
01483           YYACCEPT;
01484       }
01485     }
01486 
01487     /*
01488     ** check for syntax error
01489     */
01490     if ( date_Date_n == 0 ) /* have an error */
01491     {
01492       /* no worry about speed here! */
01493       switch ( date_Dateerrflag )
01494       {
01495       case 0:   /* new error */
01496         date_Dateerror( "syntax error" );
01497         goto skip_init;
01498         /*
01499         ** get globals into registers.
01500         ** we have a user generated syntax type error
01501         */
01502         date_Date_pv = date_Datepv;
01503         date_Date_ps = date_Dateps;
01504         date_Date_state = date_Datestate;
01505       skip_init:
01506         date_Datenerrs++;
01507         /* FALLTHRU */
01508       case 1:
01509       case 2:   /* incompletely recovered error */
01510           /* try again... */
01511         date_Dateerrflag = 3;
01512         /*
01513         ** find state where "error" is a legal
01514         ** shift action
01515         */
01516         while ( date_Date_ps >= date_Dates )
01517         {
01518           date_Date_n = date_Datepact[ *date_Date_ps ] + YYERRCODE;
01519           if ( date_Date_n >= 0 && date_Date_n < YYLAST &&
01520             date_Datechk[date_Dateact[date_Date_n]] == YYERRCODE)         {
01521             /*
01522             ** simulate shift of "error"
01523             */
01524             date_Date_state = date_Dateact[ date_Date_n ];
01525             goto date_Date_stack;
01526           }
01527           /*
01528           ** current state has no shift on
01529           ** "error", pop stack
01530           */
01531 #if YYDEBUG
01532 # define _POP_ "Error recovery pops state %d, uncovers state %d\n"
01533           if ( date_Datedebug )
01534             printf( _POP_, *date_Date_ps,
01535               date_Date_ps[-1] );
01536 # undef _POP_
01537 #endif
01538           date_Date_ps--;
01539           date_Date_pv--;
01540         }
01541         /*
01542         ** there is no state on stack with "error" as
01543         ** a valid shift.  give up.
01544         */
01545         YYABORT;
01546       case 3:   /* no shift yet; eat a token */
01547 #if YYDEBUG
01548         /*
01549         ** if debugging, look up token in list of
01550         ** pairs.  0 and negative shouldn't occur,
01551         ** but since timing doesn't matter when
01552         ** debugging, it doesn't hurt to leave the
01553         ** tests here.
01554         */
01555         if ( date_Datedebug )
01556         {
01557           register int date_Date_i;
01558 
01559           printf( "Error recovery discards " );
01560           if ( date_Datechar == 0 )
01561             printf( "token end-of-file\n" );
01562           else if ( date_Datechar < 0 )
01563             printf( "token -none-\n" );
01564           else
01565           {
01566             for ( date_Date_i = 0;
01567               date_Datetoks[date_Date_i].t_val >= 0;
01568               date_Date_i++ )
01569             {
01570               if ( date_Datetoks[date_Date_i].t_val
01571                 == date_Datechar )
01572               {
01573                 break;
01574               }
01575             }
01576             printf( "token %s\n",
01577               date_Datetoks[date_Date_i].t_name );
01578           }
01579         }
01580 #endif /* YYDEBUG */
01581         if ( date_Datechar == 0 ) /* reached EOF. quit */
01582           YYABORT;
01583         date_Datechar = -1;
01584         goto date_Date_newstate;
01585       }
01586     }/* end if ( date_Date_n == 0 ) */
01587     /*
01588     ** reduction by production date_Date_n
01589     ** put stack tops, etc. so things right after switch
01590     */
01591 #if YYDEBUG
01592     /*
01593     ** if debugging, print the string that is the user's
01594     ** specification of the reduction which is just about
01595     ** to be done.
01596     */
01597     if ( date_Datedebug )
01598       printf( "Reduce by (%d) \"%s\"\n",
01599         date_Date_n, date_Datereds[ date_Date_n ] );
01600 #endif
01601     date_Datetmp = date_Date_n;     /* value to switch over */
01602     date_Datepvt = date_Date_pv;      /* $vars top of value stack */
01603     /*
01604     ** Look in goto table for next state
01605     ** Sorry about using date_Date_state here as temporary
01606     ** register variable, but why not, if it works...
01607     ** If date_Dater2[ date_Date_n ] doesn't have the low order bit
01608     ** set, then there is no action to be done for
01609     ** this reduction.  So, no saving & unsaving of
01610     ** registers done.  The only difference between the
01611     ** code just after the if and the body of the if is
01612     ** the goto date_Date_stack in the body.  This way the test
01613     ** can be made before the choice of what to do is needed.
01614     */
01615     {
01616       /* length of production doubled with extra bit */
01617       register int date_Date_len = date_Dater2[ date_Date_n ];
01618 
01619       if ( !( date_Date_len & 01 ) )
01620       {
01621         date_Date_len >>= 1;
01622         date_Dateval = ( date_Date_pv -= date_Date_len )[1];  /* $$ = $1 */
01623         date_Date_state = date_Datepgo[ date_Date_n = date_Dater1[ date_Date_n ] ] +
01624           *( date_Date_ps -= date_Date_len ) + 1;
01625         if ( date_Date_state >= YYLAST ||
01626           date_Datechk[ date_Date_state =
01627           date_Dateact[ date_Date_state ] ] != -date_Date_n )
01628         {
01629           date_Date_state = date_Dateact[ date_Datepgo[ date_Date_n ] ];
01630         }
01631         goto date_Date_stack;
01632       }
01633       date_Date_len >>= 1;
01634       date_Dateval = ( date_Date_pv -= date_Date_len )[1];  /* $$ = $1 */
01635       date_Date_state = date_Datepgo[ date_Date_n = date_Dater1[ date_Date_n ] ] +
01636         *( date_Date_ps -= date_Date_len ) + 1;
01637       if ( date_Date_state >= YYLAST ||
01638         date_Datechk[ date_Date_state = date_Dateact[ date_Date_state ] ] != -date_Date_n )
01639       {
01640         date_Date_state = date_Dateact[ date_Datepgo[ date_Date_n ] ];
01641       }
01642     }
01643           /* save until reenter driver code */
01644     date_Datestate = date_Date_state;
01645     date_Dateps = date_Date_ps;
01646     date_Datepv = date_Date_pv;
01647   }
01648   /*
01649   ** code supplied by user is placed in this switch
01650   */
01651   switch( date_Datetmp )
01652   {
01653     
01654 case 3:{
01655             date_DateHaveTime++;
01656         } break;
01657 case 4:{
01658             date_DateHaveZone++;
01659         } break;
01660 case 5:{
01661             date_DateHaveDate++;
01662         } break;
01663 case 6:{
01664             date_DateHaveOrdinalMonth++;
01665         } break;
01666 case 7:{
01667             date_DateHaveDay++;
01668         } break;
01669 case 8:{
01670             date_DateHaveRel++;
01671         } break;
01672 case 9:{
01673       date_DateHaveTime++;
01674       date_DateHaveDate++;
01675   } break;
01676 case 10:{
01677       date_DateHaveTime++;
01678       date_DateHaveDate++;
01679       date_DateHaveRel++;
01680         } break;
01681 case 12:{
01682             date_DateHour = date_Datepvt[-1].Number;
01683             date_DateMinutes = 0;
01684             date_DateSeconds = 0;
01685             date_DateMeridian = date_Datepvt[-0].Meridian;
01686         } break;
01687 case 13:{
01688             date_DateHour = date_Datepvt[-3].Number;
01689             date_DateMinutes = date_Datepvt[-1].Number;
01690             date_DateSeconds = 0;
01691             date_DateMeridian = date_Datepvt[-0].Meridian;
01692         } break;
01693 case 14:{
01694             date_DateHour = date_Datepvt[-4].Number;
01695             date_DateMinutes = date_Datepvt[-2].Number;
01696             date_DateMeridian = MER24;
01697             date_DateDSTmode = DSToff;
01698             date_DateTimezone = (date_Datepvt[-0].Number % 100 + (date_Datepvt[-0].Number / 100) * 60);
01699         } break;
01700 case 15:{
01701             date_DateHour = date_Datepvt[-5].Number;
01702             date_DateMinutes = date_Datepvt[-3].Number;
01703             date_DateSeconds = date_Datepvt[-1].Number;
01704             date_DateMeridian = date_Datepvt[-0].Meridian;
01705         } break;
01706 case 16:{
01707             date_DateHour = date_Datepvt[-6].Number;
01708             date_DateMinutes = date_Datepvt[-4].Number;
01709             date_DateSeconds = date_Datepvt[-2].Number;
01710             date_DateMeridian = MER24;
01711             date_DateDSTmode = DSToff;
01712             date_DateTimezone = (date_Datepvt[-0].Number % 100 + (date_Datepvt[-0].Number / 100) * 60);
01713         } break;
01714 case 17:{
01715             date_DateTimezone = date_Datepvt[-1].Number;
01716             date_DateDSTmode = DSTon;
01717         } break;
01718 case 18:{
01719             date_DateTimezone = date_Datepvt[-0].Number;
01720             date_DateDSTmode = DSToff;
01721         } break;
01722 case 19:{
01723             date_DateTimezone = date_Datepvt[-0].Number;
01724             date_DateDSTmode = DSTon;
01725         } break;
01726 case 20:{
01727             date_DateDayOrdinal = 1;
01728             date_DateDayNumber = date_Datepvt[-0].Number;
01729         } break;
01730 case 21:{
01731             date_DateDayOrdinal = 1;
01732             date_DateDayNumber = date_Datepvt[-1].Number;
01733         } break;
01734 case 22:{
01735             date_DateDayOrdinal = date_Datepvt[-1].Number;
01736             date_DateDayNumber = date_Datepvt[-0].Number;
01737         } break;
01738 case 23:{
01739             date_DateDayOrdinal = date_Datepvt[-2].Number * date_Datepvt[-1].Number;
01740             date_DateDayNumber = date_Datepvt[-0].Number;
01741         } break;
01742 case 24:{
01743             date_DateDayOrdinal = 2;
01744             date_DateDayNumber = date_Datepvt[-0].Number;
01745         } break;
01746 case 25:{
01747             date_DateMonth = date_Datepvt[-2].Number;
01748             date_DateDay = date_Datepvt[-0].Number;
01749         } break;
01750 case 26:{
01751             date_DateMonth = date_Datepvt[-4].Number;
01752             date_DateDay = date_Datepvt[-2].Number;
01753             date_DateYear = date_Datepvt[-0].Number;
01754         } break;
01755 case 27:{
01756       date_DateYear = date_Datepvt[-0].Number / 10000;
01757       date_DateMonth = (date_Datepvt[-0].Number % 10000)/100;
01758       date_DateDay = date_Datepvt[-0].Number % 100;
01759   } break;
01760 case 28:{
01761       date_DateDay = date_Datepvt[-4].Number;
01762       date_DateMonth = date_Datepvt[-2].Number;
01763       date_DateYear = date_Datepvt[-0].Number;
01764   } break;
01765 case 29:{
01766             date_DateMonth = date_Datepvt[-2].Number;
01767             date_DateDay = date_Datepvt[-0].Number;
01768             date_DateYear = date_Datepvt[-4].Number;
01769         } break;
01770 case 30:{
01771             date_DateMonth = date_Datepvt[-1].Number;
01772             date_DateDay = date_Datepvt[-0].Number;
01773         } break;
01774 case 31:{
01775             date_DateMonth = date_Datepvt[-3].Number;
01776             date_DateDay = date_Datepvt[-2].Number;
01777             date_DateYear = date_Datepvt[-0].Number;
01778         } break;
01779 case 32:{
01780             date_DateMonth = date_Datepvt[-0].Number;
01781             date_DateDay = date_Datepvt[-1].Number;
01782         } break;
01783 case 33:{
01784       date_DateMonth = 1;
01785       date_DateDay = 1;
01786       date_DateYear = EPOCH;
01787   } break;
01788 case 34:{
01789             date_DateMonth = date_Datepvt[-1].Number;
01790             date_DateDay = date_Datepvt[-2].Number;
01791             date_DateYear = date_Datepvt[-0].Number;
01792         } break;
01793 case 35:{
01794       date_DateMonthOrdinal = 1;
01795       date_DateMonth = date_Datepvt[-0].Number;
01796   } break;
01797 case 36:{
01798       date_DateMonthOrdinal = date_Datepvt[-1].Number;
01799       date_DateMonth = date_Datepvt[-0].Number;
01800   } break;
01801 case 37:{
01802             if (date_Datepvt[-1].Number != HOUR(- 7)) YYABORT;
01803       date_DateYear = date_Datepvt[-2].Number / 10000;
01804       date_DateMonth = (date_Datepvt[-2].Number % 10000)/100;
01805       date_DateDay = date_Datepvt[-2].Number % 100;
01806       date_DateHour = date_Datepvt[-0].Number / 10000;
01807       date_DateMinutes = (date_Datepvt[-0].Number % 10000)/100;
01808       date_DateSeconds = date_Datepvt[-0].Number % 100;
01809         } break;
01810 case 38:{
01811             if (date_Datepvt[-5].Number != HOUR(- 7)) YYABORT;
01812       date_DateYear = date_Datepvt[-6].Number / 10000;
01813       date_DateMonth = (date_Datepvt[-6].Number % 10000)/100;
01814       date_DateDay = date_Datepvt[-6].Number % 100;
01815       date_DateHour = date_Datepvt[-4].Number;
01816       date_DateMinutes = date_Datepvt[-2].Number;
01817       date_DateSeconds = date_Datepvt[-0].Number;
01818         } break;
01819 case 39:{
01820       date_DateYear = date_Datepvt[-1].Number / 10000;
01821       date_DateMonth = (date_Datepvt[-1].Number % 10000)/100;
01822       date_DateDay = date_Datepvt[-1].Number % 100;
01823       date_DateHour = date_Datepvt[-0].Number / 10000;
01824       date_DateMinutes = (date_Datepvt[-0].Number % 10000)/100;
01825       date_DateSeconds = date_Datepvt[-0].Number % 100;
01826         } break;
01827 case 40:{
01828             /*
01829        * Offset computed year by -377 so that the returned years will
01830        * be in a range accessible with a 32 bit clock seconds value
01831        */
01832             date_DateYear = date_Datepvt[-2].Number/1000 + 2323 - 377;
01833             date_DateDay  = 1;
01834       date_DateMonth = 1;
01835       date_DateRelDay += ((date_Datepvt[-2].Number%1000)*(365 + IsLeapYear(date_DateYear)))/1000;
01836       date_DateRelSeconds += date_Datepvt[-0].Number * 144 * 60;
01837         } break;
01838 case 41:{
01839       date_DateRelSeconds *= -1;
01840       date_DateRelMonth *= -1;
01841       date_DateRelDay *= -1;
01842   } break;
01843 case 43:{ *date_DateRelPointer += date_Datepvt[-2].Number * date_Datepvt[-1].Number * date_Datepvt[-0].Number; } break;
01844 case 44:{ *date_DateRelPointer += date_Datepvt[-1].Number * date_Datepvt[-0].Number; } break;
01845 case 45:{ *date_DateRelPointer += date_Datepvt[-0].Number; } break;
01846 case 46:{ *date_DateRelPointer += date_Datepvt[-1].Number * date_Datepvt[-0].Number; } break;
01847 case 47:{ *date_DateRelPointer += date_Datepvt[-0].Number; } break;
01848 case 48:{ date_Dateval.Number = -1; } break;
01849 case 49:{ date_Dateval.Number =  1; } break;
01850 case 50:{ date_Dateval.Number = date_Datepvt[-0].Number; date_DateRelPointer = &date_DateRelSeconds; } break;
01851 case 51:{ date_Dateval.Number = date_Datepvt[-0].Number; date_DateRelPointer = &date_DateRelDay; } break;
01852 case 52:{ date_Dateval.Number = date_Datepvt[-0].Number; date_DateRelPointer = &date_DateRelMonth; } break;
01853 case 53:{
01854   if (date_DateHaveTime && date_DateHaveDate && !date_DateHaveRel) {
01855       date_DateYear = date_Datepvt[-0].Number;
01856   } else {
01857       date_DateHaveTime++;
01858       if (date_Datepvt[-0].Number < 100) {
01859     date_DateHour = date_Datepvt[-0].Number;
01860     date_DateMinutes = 0;
01861       } else {
01862     date_DateHour = date_Datepvt[-0].Number / 100;
01863     date_DateMinutes = date_Datepvt[-0].Number % 100;
01864       }
01865       date_DateSeconds = 0;
01866       date_DateMeridian = MER24;
01867   }
01868     } break;
01869 case 54:{
01870             date_Dateval.Meridian = MER24;
01871         } break;
01872 case 55:{
01873             date_Dateval.Meridian = date_Datepvt[-0].Meridian;
01874         } break;
01875   }
01876   goto date_Datestack;    /* reset registers in driver code */
01877 }

int date_scan ( char *  timestr,
time_t *  now,
int  zone,
time_t *  timeptr 
)

Definition at line 840 of file date.c.

References Convert(), date_DateDay, date_DateDayNumber, date_DateDayOrdinal, date_DateDSTmode, date_DateHaveDate, date_DateHaveDay, date_DateHaveOrdinalMonth, date_DateHaveRel, date_DateHaveTime, date_DateHaveZone, date_DateHour, date_DateInput, date_DateMeridian, date_DateMinutes, date_DateMonth, date_DateMonthOrdinal, date_Dateparse(), date_DateRelDay, date_DateRelMonth, date_DateRelPointer, date_DateRelSeconds, date_DateSeconds, date_DateTimezone, date_DateYear, date_timezone(), DSTmaybe, DSToff, EGG_TIMEZONE_LOOKUP, MER24, NamedDay(), NamedMonth(), NULL, RelativeDay(), RelativeMonth(), and TM_YEAR_BASE.

00841 {
00842     struct tm *tm;
00843     time_t Start;
00844     time_t Time;
00845     time_t tod;
00846     int thisyear;
00847 
00848     /* Look up timezone if required. */
00849     if (zone == EGG_TIMEZONE_LOOKUP) zone = date_timezone();
00850 
00851     date_DateInput = timestr;
00852     /* now has to be cast to a time_t for 64bit compliance */
00853     Start = *now;
00854     tm = localtime(&Start);
00855     thisyear = tm->tm_year + TM_YEAR_BASE;
00856     date_DateYear = thisyear;
00857     date_DateMonth = tm->tm_mon + 1;
00858     date_DateDay = tm->tm_mday;
00859     date_DateTimezone = zone;
00860     if (zone == -50000) {
00861         date_DateDSTmode = DSToff;  /* assume GMT */
00862         date_DateTimezone = 0;
00863     } else {
00864         date_DateDSTmode = DSTmaybe;
00865     }
00866     date_DateHour = 0;
00867     date_DateMinutes = 0;
00868     date_DateSeconds = 0;
00869     date_DateMeridian = MER24;
00870     date_DateRelSeconds = 0;
00871     date_DateRelMonth = 0;
00872     date_DateRelDay = 0;
00873     date_DateRelPointer = NULL;
00874 
00875     date_DateHaveDate = 0;
00876     date_DateHaveDay = 0;
00877     date_DateHaveOrdinalMonth = 0;
00878     date_DateHaveRel = 0;
00879     date_DateHaveTime = 0;
00880     date_DateHaveZone = 0;
00881 
00882     if (date_Dateparse() || date_DateHaveTime > 1 || date_DateHaveZone > 1 || date_DateHaveDate > 1 ||
00883       date_DateHaveDay > 1 || date_DateHaveOrdinalMonth > 1) {
00884         return -1;
00885     }
00886     
00887     if (date_DateHaveDate || date_DateHaveTime || date_DateHaveDay) {
00888   if (date_DateYear < 0) {
00889       date_DateYear = -date_DateYear;
00890   }
00891   /*
00892    * The following line handles years that are specified using
00893    * only two digits.  The line of code below implements a policy
00894    * defined by the X/Open workgroup on the millinium rollover.
00895    * Note: some of those dates may not actually be valid on some
00896    * platforms.  The POSIX standard startes that the dates 70-99
00897    * shall refer to 1970-1999 and 00-38 shall refer to 2000-2038.
00898    * This later definition should work on all platforms.
00899    */
00900 
00901   if (date_DateYear < 100) {
00902       if (date_DateYear >= 69) {
00903     date_DateYear += 1900;
00904       } else {
00905     date_DateYear += 2000;
00906       }
00907   }
00908   if (Convert(date_DateMonth, date_DateDay, date_DateYear, date_DateHour, date_DateMinutes, date_DateSeconds,
00909     date_DateMeridian, date_DateDSTmode, &Start) < 0) {
00910             return -1;
00911   }
00912     } else {
00913         Start = *now;
00914         if (!date_DateHaveRel) {
00915             Start -= ((tm->tm_hour * 60L * 60L) +
00916         tm->tm_min * 60L) + tm->tm_sec;
00917   }
00918     }
00919 
00920     Start += date_DateRelSeconds;
00921     if (RelativeMonth(Start, date_DateRelMonth, &Time) < 0) {
00922         return -1;
00923     }
00924     Start += Time;
00925 
00926     if (RelativeDay(Start, date_DateRelDay, &Time) < 0) {
00927   return -1;
00928     }
00929     Start += Time;
00930     
00931     if (date_DateHaveDay && !date_DateHaveDate) {
00932         tod = NamedDay(Start, date_DateDayOrdinal, date_DateDayNumber);
00933         Start += tod;
00934     }
00935 
00936     if (date_DateHaveOrdinalMonth) {
00937   tod = NamedMonth(Start, date_DateMonthOrdinal, date_DateMonth);
00938   Start += tod;
00939     }
00940     
00941     *timeptr = Start;
00942     return 0;
00943 }

int date_timezone (  ) 

Definition at line 389 of file date.c.

References now.

Referenced by date_scan(), and RelativeMonth().

00390 {
00391   struct tm gmt, local;
00392   time_t now;
00393   int zone;
00394 
00395   time(&now);
00396   gmt = *(gmtime(&now));
00397   local = *(localtime(&now));
00398   local.tm_isdst = gmt.tm_isdst = 0;
00399   zone = (int)(mktime(&local) - mktime(&gmt));
00400   return(zone/60);
00401 }

static time_t DSTcorrect ( time_t  Start,
time_t  Future 
) [static]

Definition at line 509 of file date.c.

Referenced by NamedDay(), NamedMonth(), RelativeDay(), and RelativeMonth().

00512 {
00513     time_t      StartDay;
00514     time_t      FutureDay;
00515     StartDay = (localtime(&Start)->tm_hour + 1) % 24;
00516     FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
00517     return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
00518 }

static int LookupWord ( char *  buff  )  [static]

Definition at line 660 of file date.c.

References MERam, YYSTYPE::Meridian, MERpm, _TABLE::name, YYSTYPE::Number, str_tolower(), tID, tMERIDIAN, _TABLE::type, and _TABLE::value.

Referenced by date_Datelex().

00662 {
00663     register char *p;
00664     register char *q;
00665     register TABLE *tp;
00666     int i;
00667     int abbrev;
00668 
00669     /*
00670      * Make it lowercase.
00671      */
00672 
00673     str_tolower(buff);
00674 
00675     if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) {
00676         date_Datelval.Meridian = MERam;
00677         return tMERIDIAN;
00678     }
00679     if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) {
00680         date_Datelval.Meridian = MERpm;
00681         return tMERIDIAN;
00682     }
00683 
00684     /*
00685      * See if we have an abbreviation for a month.
00686      */
00687     if (strlen(buff) == 3) {
00688         abbrev = 1;
00689     } else if (strlen(buff) == 4 && buff[3] == '.') {
00690         abbrev = 1;
00691         buff[3] = '\0';
00692     } else {
00693         abbrev = 0;
00694     }
00695 
00696     for (tp = MonthDayTable; tp->name; tp++) {
00697         if (abbrev) {
00698             if (strncmp(buff, tp->name, 3) == 0) {
00699                 date_Datelval.Number = tp->value;
00700                 return tp->type;
00701             }
00702         } else if (strcmp(buff, tp->name) == 0) {
00703             date_Datelval.Number = tp->value;
00704             return tp->type;
00705         }
00706     }
00707 
00708     for (tp = TimezoneTable; tp->name; tp++) {
00709         if (strcmp(buff, tp->name) == 0) {
00710             date_Datelval.Number = tp->value;
00711             return tp->type;
00712         }
00713     }
00714 
00715     for (tp = UnitsTable; tp->name; tp++) {
00716         if (strcmp(buff, tp->name) == 0) {
00717             date_Datelval.Number = tp->value;
00718             return tp->type;
00719         }
00720     }
00721 
00722     /*
00723      * Strip off any plural and try the units table again.
00724      */
00725     i = strlen(buff) - 1;
00726     if (buff[i] == 's') {
00727         buff[i] = '\0';
00728         for (tp = UnitsTable; tp->name; tp++) {
00729             if (strcmp(buff, tp->name) == 0) {
00730                 date_Datelval.Number = tp->value;
00731                 return tp->type;
00732             }
00733   }
00734     }
00735 
00736     for (tp = OtherTable; tp->name; tp++) {
00737         if (strcmp(buff, tp->name) == 0) {
00738             date_Datelval.Number = tp->value;
00739             return tp->type;
00740         }
00741     }
00742 
00743     /*
00744      * Military timezones.
00745      */
00746     if (buff[1] == '\0' && !(*buff & 0x80)
00747       && isalpha(*buff)) {  /* INTL: ISO only */
00748         for (tp = MilitaryTable; tp->name; tp++) {
00749             if (strcmp(buff, tp->name) == 0) {
00750                 date_Datelval.Number = tp->value;
00751                 return tp->type;
00752             }
00753   }
00754     }
00755 
00756     /*
00757      * Drop out any periods and try the timezone table again.
00758      */
00759     for (i = 0, p = q = buff; *q; q++)
00760         if (*q != '.') {
00761             *p++ = *q;
00762         } else {
00763             i++;
00764   }
00765     *p = '\0';
00766     if (i) {
00767         for (tp = TimezoneTable; tp->name; tp++) {
00768             if (strcmp(buff, tp->name) == 0) {
00769                 date_Datelval.Number = tp->value;
00770                 return tp->type;
00771             }
00772   }
00773     }
00774     
00775     return tID;
00776 }

static time_t NamedDay ( time_t  Start,
time_t  DayOrdinal,
time_t  DayNumber 
) [static]

Definition at line 522 of file date.c.

References DSTcorrect(), now, and SECSPERDAY.

Referenced by date_scan().

00526 {
00527     struct tm   *tm;
00528     time_t      now;
00529 
00530     now = Start;
00531     tm = localtime(&now);
00532     now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
00533     now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
00534     return DSTcorrect(Start, now);
00535 }

static time_t NamedMonth ( time_t  Start,
time_t  MonthOrdinal,
time_t  MonthNumber 
) [static]

Definition at line 538 of file date.c.

References Convert(), DSTcorrect(), DSTmaybe, MER24, now, and TM_YEAR_BASE.

Referenced by date_scan().

00542 {
00543     struct tm *tm;
00544     time_t now;
00545     int result;
00546     
00547     now = Start;
00548     tm = localtime(&now);
00549     /* To compute the next n'th month, we use this alg:
00550      * add n to year value
00551      * if currentMonth < requestedMonth decrement year value by 1 (so that
00552      *  doing next february from january gives us february of the current year)
00553      * set day to 1, time to 0
00554      */
00555     tm->tm_year += MonthOrdinal;
00556     if (tm->tm_mon < MonthNumber - 1) {
00557   tm->tm_year--;
00558     }
00559     result = Convert(MonthNumber, (time_t) 1, tm->tm_year + TM_YEAR_BASE,
00560       (time_t) 0, (time_t) 0, (time_t) 0, MER24, DSTmaybe, &now);
00561     if (result < 0) {
00562   return 0;
00563     }
00564     return DSTcorrect(Start, now);
00565 }

static int RelativeDay ( time_t  Start,
time_t  RelDay,
time_t *  TimePtr 
) [static]

Definition at line 647 of file date.c.

References DSTcorrect().

Referenced by date_scan().

00651 {
00652     time_t new;
00653 
00654     new = Start + (RelDay * 60 * 60 * 24);
00655     *TimePtr = DSTcorrect(Start, new);
00656     return 1;
00657 }

static int RelativeMonth ( time_t  Start,
time_t  RelMonth,
time_t *  TimePtr 
) [static]

Definition at line 568 of file date.c.

References Convert(), date_DateTimezone, date_timezone(), DSTcorrect(), DSTmaybe, MER24, and TM_YEAR_BASE.

Referenced by date_scan().

00572 {
00573     struct tm *tm;
00574     time_t Month;
00575     time_t Year;
00576     time_t Julian;
00577     int result;
00578 
00579     if (RelMonth == 0) {
00580         *TimePtr = 0;
00581         return 0;
00582     }
00583     tm = localtime(&Start);
00584     Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;
00585     Year = Month / 12;
00586     Month = Month % 12 + 1;
00587     result = Convert(Month, (time_t) tm->tm_mday, Year,
00588       (time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
00589       MER24, DSTmaybe, &Julian);
00590 
00591     /*
00592      * The Julian time returned above is behind by one day, if "month" 
00593      * or "year" is used to specify relative time and the GMT flag is true.
00594      * This problem occurs only when the current time is closer to
00595      * midnight, the difference being not more than its time difference
00596      * with GMT. For example, in US/Pacific time zone, the problem occurs
00597      * whenever the current time is between midnight to 8:00am or 7:00amDST.
00598      * See Bug# 413397 for more details and sample script.
00599      * To resolve this bug, we simply add the number of seconds corresponding
00600      * to timezone difference with GMT to Julian time, if GMT flag is true.
00601      */
00602 
00603     if (date_DateTimezone == 0) {
00604         Julian += date_timezone() * 60L;
00605     }
00606 
00607     /*
00608      * The following iteration takes into account the case were we jump
00609      * into a "short month".  Far example, "one month from Jan 31" will
00610      * fail because there is no Feb 31.  The code below will reduce the
00611      * day and try converting the date until we succed or the date equals
00612      * 28 (which always works unless the date is bad in another way).
00613      */
00614 
00615     while ((result != 0) && (tm->tm_mday > 28)) {
00616   tm->tm_mday--;
00617   result = Convert(Month, (time_t) tm->tm_mday, Year,
00618     (time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
00619     MER24, DSTmaybe, &Julian);
00620     }
00621     if (result != 0) {
00622   return -1;
00623     }
00624     *TimePtr = DSTcorrect(Start, Julian);
00625     return 0;
00626 }

static time_t ToSeconds ( time_t  Hours,
time_t  Minutes,
time_t  Seconds,
MERIDIAN  Meridian 
) [static]

Definition at line 404 of file date.c.

References MER24, MERam, and MERpm.

Referenced by Convert().

00409 {
00410     if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
00411         return -1;
00412     switch (Meridian) {
00413     case MER24:
00414         if (Hours < 0 || Hours > 23)
00415             return -1;
00416         return (Hours * 60L + Minutes) * 60L + Seconds;
00417     case MERam:
00418         if (Hours < 1 || Hours > 12)
00419             return -1;
00420         return ((Hours % 12) * 60L + Minutes) * 60L + Seconds;
00421     case MERpm:
00422         if (Hours < 1 || Hours > 12)
00423             return -1;
00424         return (((Hours % 12) + 12) * 60L + Minutes) * 60L + Seconds;
00425     }
00426     return -1;  /* Should never be reached */
00427 }


Variable Documentation

int date_Date_date_Dates[YYMAXDEPTH]

Definition at line 176 of file date.c.

Definition at line 177 of file date.c.

Initial value:

{

    24,    40,    23,    36,    54,    81,    41,    28,    53,    26,
    37,    42,    58,    38,    56,    28,    27,    26,    28,    33,
    26,    32,    61,    50,    27,    80,    76,    27,    51,    75,
    74,    73,    30,    72,    71,    70,    69,    52,    49,    48,
    47,    45,    39,    62,    78,    46,    79,    68,    25,    65,
    60,    67,    66,    55,    44,    21,    63,    11,    10,     9,
     8,    35,     7,     6,     5,     4,     3,    43,     2,     1,
    20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    57,     0,     0,    59,    77,     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,     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,     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,    19,    14,     0,     0,     0,
    16,    28,    22,    26,     0,    12,    13,    17,     0,    15,
    27,    18,    31,     0,     0,    29,     0,    34,    28,     0,
    26,     0,     0,     0,     0,     0,     0,    27,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    64,
    64 }

Definition at line 951 of file date.c.

Referenced by date_Dateparse().

Definition at line 1185 of file date.c.

Referenced by date_Dateparse().

Initial value:

{

-10000000,    -4,    -5,    -6,    -7,    -8,    -9,   -10,   -11,   -12,
   -13,   -14,   268,   269,   259,   272,   263,   270,   274,   258,
    -2,   -15,   265,    45,    43,    -1,   266,   273,   264,   261,
    58,   258,    47,    45,   263,    -1,   271,   269,   272,   268,
   258,   263,   268,    -1,    44,   268,   257,   268,   268,   268,
   263,   268,   268,   272,   268,    44,   263,    -1,   258,    -1,
    46,    -3,    45,    58,   261,    47,    45,    45,    58,   268,
   268,   268,   268,   268,   268,   268,   268,    -3,    45,    58,
   268,   268 }

Definition at line 1011 of file date.c.

Referenced by date_Dateparse().

time_t date_DateDay [static]

Definition at line 80 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateDayNumber [static]

Definition at line 71 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateDayOrdinal [static]

Definition at line 70 of file date.c.

Referenced by date_Dateparse(), and date_scan().

Definition at line 1167 of file date.c.

Referenced by date_Dateparse().

Initial value:

{

     1,    -2,     2,     3,     4,     5,     6,     7,     8,     9,
    10,    11,    53,    18,    19,    27,     0,    33,     0,    20,
     0,    42,     0,    48,    49,    47,    50,    51,    52,    12,
     0,    22,     0,     0,    32,    44,    17,     0,    39,    30,
    24,    35,     0,    45,    21,     0,    41,     0,    54,    25,
     0,     0,    34,    37,     0,     0,    36,    46,    23,    43,
     0,    13,     0,     0,    55,     0,     0,     0,     0,    31,
    40,    14,    54,    26,    28,    29,     0,    15,     0,     0,
    16,    38 }

Definition at line 1022 of file date.c.

Referenced by date_Dateparse().

Definition at line 69 of file date.c.

Referenced by date_Dateparse(), and date_scan().

Definition at line 1184 of file date.c.

Referenced by date_Dateparse().

Initial value:

{
-1, 1,
  0, -1,
  -2, 0,
  }

Definition at line 944 of file date.c.

Referenced by date_Dateparse().

int date_DateHaveDate [static]

Definition at line 73 of file date.c.

Referenced by date_Dateparse(), and date_scan().

int date_DateHaveDay [static]

Definition at line 74 of file date.c.

Referenced by date_Dateparse(), and date_scan().

Definition at line 75 of file date.c.

Referenced by date_Dateparse(), and date_scan().

int date_DateHaveRel [static]

Definition at line 76 of file date.c.

Referenced by date_Dateparse(), and date_scan().

int date_DateHaveTime [static]

Definition at line 77 of file date.c.

Referenced by date_Dateparse(), and date_scan().

int date_DateHaveZone [static]

Definition at line 78 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateHour [static]

Definition at line 81 of file date.c.

Referenced by date_Dateparse(), and date_scan().

char* date_DateInput [static]

Definition at line 68 of file date.c.

Referenced by date_Datelex(), and date_scan().

Definition at line 169 of file date.c.

int date_Datemaxdepth = YYMAXDEPTH [static]

Definition at line 182 of file date.c.

Referenced by date_Dateparse().

Definition at line 86 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateMinutes [static]

Definition at line 82 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateMonth [static]

Definition at line 83 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateMonthOrdinal [static]

Definition at line 72 of file date.c.

Referenced by date_Dateparse(), and date_scan().

Definition at line 1183 of file date.c.

Referenced by date_Dateparse().

Initial value:

{

-10000000,   -43,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
-10000000,-10000000,   -26,  -268,-10000000,  -259,  -226,-10000000,  -257,    10,
  -227,  -212,  -228,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
  -229,-10000000,  -230,  -240,  -231,-10000000,-10000000,  -264,-10000000,     9,
-10000000,-10000000,  -249,-10000000,-10000000,  -246,-10000000,     4,    -2,     2,
     7,     6,-10000000,-10000000,   -11,  -232,-10000000,-10000000,-10000000,-10000000,
  -233,-10000000,  -234,  -235,-10000000,  -237,  -238,  -239,  -242,-10000000,
-10000000,-10000000,    -1,-10000000,-10000000,-10000000,   -12,-10000000,  -243,  -263,
-10000000,-10000000 }

Definition at line 980 of file date.c.

Referenced by date_Dateparse().

Initial value:

{

     0,    48,    70,    22,    69,    68,    66,    65,    64,    63,
    62,    60,    59,    58,    57,    55 }

Definition at line 991 of file date.c.

Referenced by date_Dateparse().

Definition at line 1178 of file date.c.

Referenced by date_Dateparse().

Definition at line 1177 of file date.c.

Initial value:

{

     0,     4,     4,     5,     5,     5,     5,     5,     5,     5,
     5,     5,     6,     6,     6,     6,     6,     7,     7,     7,
    10,    10,    10,    10,    10,     8,     8,     8,     8,     8,
     8,     8,     8,     8,     8,     9,     9,    12,    12,    12,
    13,    11,    11,    15,    15,    15,    15,    15,     2,     2,
     1,     1,     1,    14,     3,     3 }

Definition at line 995 of file date.c.

Referenced by date_Dateparse().

Initial value:

{

     0,     0,     4,     3,     3,     3,     3,     3,     3,     3,
     3,     2,     5,     9,    11,    13,    15,     5,     3,     3,
     3,     5,     5,     7,     5,     7,    11,     3,    11,    11,
     5,     9,     5,     3,     7,     5,     7,     7,    15,     5,
     9,     5,     2,     7,     5,     5,     7,     3,     3,     3,
     3,     3,     3,     3,     1,     3 }

Definition at line 1003 of file date.c.

Referenced by date_Dateparse().

time_t date_DateRelDay [static]

Definition at line 88 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateRelMonth [static]

Definition at line 87 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t* date_DateRelPointer [static]

Definition at line 90 of file date.c.

Referenced by date_Dateparse(), and date_scan().

time_t date_DateRelSeconds [static]

Definition at line 89 of file date.c.

Referenced by date_Dateparse(), and date_scan().

Definition at line 176 of file date.c.

Referenced by date_Dateparse().

time_t date_DateSeconds [static]

Definition at line 84 of file date.c.

Referenced by date_Dateparse(), and date_scan().

Definition at line 1180 of file date.c.

Referenced by date_Dateparse().

time_t date_DateTimezone [static]

Definition at line 79 of file date.c.

Referenced by Convert(), date_Dateparse(), date_scan(), and RelativeMonth().

Definition at line 1181 of file date.c.

Referenced by date_Dateparse().

Definition at line 177 of file date.c.

Definition at line 170 of file date.c.

time_t date_DateYear [static]

Definition at line 85 of file date.c.

Referenced by date_Dateparse(), and date_scan().

TABLE MilitaryTable[] [static]

Initial value:

 {
    { "a",      tZONE,  HOUR(  1) },
    { "b",      tZONE,  HOUR(  2) },
    { "c",      tZONE,  HOUR(  3) },
    { "d",      tZONE,  HOUR(  4) },
    { "e",      tZONE,  HOUR(  5) },
    { "f",      tZONE,  HOUR(  6) },
    { "g",      tZONE,  HOUR(  7) },
    { "h",      tZONE,  HOUR(  8) },
    { "i",      tZONE,  HOUR(  9) },
    { "k",      tZONE,  HOUR( 10) },
    { "l",      tZONE,  HOUR( 11) },
    { "m",      tZONE,  HOUR( 12) },
    { "n",      tZONE,  HOUR(- 1) },
    { "o",      tZONE,  HOUR(- 2) },
    { "p",      tZONE,  HOUR(- 3) },
    { "q",      tZONE,  HOUR(- 4) },
    { "r",      tZONE,  HOUR(- 5) },
    { "s",      tZONE,  HOUR(- 6) },
    { "t",      tZONE,  HOUR(- 7) },
    { "u",      tZONE,  HOUR(- 8) },
    { "v",      tZONE,  HOUR(- 9) },
    { "w",      tZONE,  HOUR(-10) },
    { "x",      tZONE,  HOUR(-11) },
    { "y",      tZONE,  HOUR(-12) },
    { "z",      tZONE,  HOUR(  0) },
    { NULL }
}

Definition at line 350 of file date.c.

TABLE MonthDayTable[] [static]

Initial value:

 {
    { "january",        tMONTH,  1 },
    { "february",       tMONTH,  2 },
    { "march",          tMONTH,  3 },
    { "april",          tMONTH,  4 },
    { "may",            tMONTH,  5 },
    { "june",           tMONTH,  6 },
    { "july",           tMONTH,  7 },
    { "august",         tMONTH,  8 },
    { "september",      tMONTH,  9 },
    { "sept",           tMONTH,  9 },
    { "october",        tMONTH, 10 },
    { "november",       tMONTH, 11 },
    { "december",       tMONTH, 12 },
    { "sunday",         tDAY, 0 },
    { "monday",         tDAY, 1 },
    { "tuesday",        tDAY, 2 },
    { "tues",           tDAY, 2 },
    { "wednesday",      tDAY, 3 },
    { "wednes",         tDAY, 3 },
    { "thursday",       tDAY, 4 },
    { "thur",           tDAY, 4 },
    { "thurs",          tDAY, 4 },
    { "friday",         tDAY, 5 },
    { "saturday",       tDAY, 6 },
    { NULL }
}

Definition at line 189 of file date.c.

TABLE OtherTable[] [static]

Initial value:

 {
    { "tomorrow",       tDAY_UNIT,      1 },
    { "yesterday",      tDAY_UNIT,     -1 },
    { "today",          tDAY_UNIT,      0 },
    { "now",            tSEC_UNIT,      0 },
    { "last",           tUNUMBER,      -1 },
    { "this",           tSEC_UNIT,      0 },
    { "next",           tNEXT,          1 },














    { "ago",            tAGO,   1 },
    { "epoch",          tEPOCH,   0 },
    { "stardate",       tSTARDATE, 0},
    { NULL }
}

Definition at line 237 of file date.c.

TABLE TimezoneTable[] [static]

Definition at line 269 of file date.c.

TABLE UnitsTable[] [static]

Initial value:

 {
    { "year",           tMONTH_UNIT,    12 },
    { "month",          tMONTH_UNIT,     1 },
    { "fortnight",      tDAY_UNIT,      14 },
    { "week",           tDAY_UNIT,       7 },
    { "day",            tDAY_UNIT,       1 },
    { "hour",           tSEC_UNIT, 60 * 60 },
    { "minute",         tSEC_UNIT,      60 },
    { "min",            tSEC_UNIT,      60 },
    { "second",         tSEC_UNIT,       1 },
    { "sec",            tSEC_UNIT,       1 },
    { NULL }
}

Definition at line 220 of file date.c.


Generated on Sun Nov 30 18:43:34 2008 for eggdrop1.9 by  doxygen 1.5.6