lib/eggdrop/date.h File Reference

Go to the source code of this file.

Defines

#define EGG_TIMEZONE_LOOKUP   -100000

Functions

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


Define Documentation

#define EGG_TIMEZONE_LOOKUP   -100000

Definition at line 4 of file date.h.

Referenced by date_scan().


Function Documentation

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 }


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