#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] |
YYSTYPE * | date_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 |
YYSTYPE * | date_Datepv |
int * | date_Dateps |
int | date_Datestate |
int | date_Datetmp |
int | date_Datenerrs |
#define date_Dateclearin date_Datechar = -1 |
#define date_Dateerrok date_Dateerrflag = 0 |
#define EPOCH 1970 |
#define HOUR | ( | x | ) | ((int) (60 * x)) |
#define IsLeapYear | ( | x | ) | ((x % 4 == 0) && (x % 100 != 0 || x % 400 == 0)) |
#define SECSPERDAY (24L * 60L * 60L) |
#define tID 260 |
#define tISOBASE 272 |
#define TM_YEAR_BASE 1900 |
#define tMERIDIAN 261 |
#define tUNUMBER 268 |
#define YYABORT return(1) |
#define YYACCEPT return(0) |
#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;\ }
#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 YYERRCODE 256 |
#define YYFLAG (-10000000) |
#define YYLAST 261 |
#define YYLEX | ( | ) | date_Datelex() |
#define YYMAXDEPTH 150 |
#define YYNEW | ( | type | ) | malloc(sizeof(type) * date_Datenewmax) |
#define YYRECOVERING | ( | ) | (!!date_Dateerrflag) |
typedef int date_Datetabelem |
enum _DSTMODE |
enum _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] |
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] |
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 }
int date_Date_date_Dates[YYMAXDEPTH] |
YYSTYPE date_Date_date_Datev[YYMAXDEPTH] |
date_Datetabelem date_Dateact[] [static] |
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().
int date_Datechar |
date_Datetabelem date_Datechk[] [static] |
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] |
time_t date_DateDayNumber [static] |
time_t date_DateDayOrdinal [static] |
int date_Datedebug |
date_Datetabelem date_Datedef[] [static] |
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().
DSTMODE date_DateDSTmode [static] |
int date_Dateerrflag |
date_Datetabelem date_Dateexca[] [static] |
Initial value:
{ -1, 1, 0, -1, -2, 0, }
Definition at line 944 of file date.c.
Referenced by date_Dateparse().
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_DateHour [static] |
char* date_DateInput [static] |
int date_Datemaxdepth = YYMAXDEPTH [static] |
MERIDIAN date_DateMeridian [static] |
time_t date_DateMinutes [static] |
time_t date_DateMonth [static] |
time_t date_DateMonthOrdinal [static] |
int date_Datenerrs |
date_Datetabelem date_Datepact[] [static] |
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().
date_Datetabelem date_Datepgo[] [static] |
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().
int* date_Dateps |
date_Datetabelem date_Dater1[] [static] |
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().
date_Datetabelem date_Dater2[] [static] |
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] |
time_t date_DateRelMonth [static] |
time_t* date_DateRelPointer [static] |
time_t date_DateRelSeconds [static] |
int * date_Dates = date_Date_date_Dates |
time_t date_DateSeconds [static] |
int date_Datestate |
time_t date_DateTimezone [static] |
Definition at line 79 of file date.c.
Referenced by Convert(), date_Dateparse(), date_scan(), and RelativeMonth().
int date_Datetmp |
time_t date_DateYear [static] |
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 } }
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 } }
TABLE OtherTable[] [static] |
TABLE TimezoneTable[] [static] |
TABLE UnitsTable[] [static] |
Initial value: