mcabber/src/utils.c
changeset 802 dd860da62002
parent 735 2f027806cd48
child 803 8f8d8f8157a2
equal deleted inserted replaced
801:d8e0a1ce3e8a 802:dd860da62002
    23 
    23 
    24 #include <stdio.h>
    24 #include <stdio.h>
    25 #include <stdlib.h>
    25 #include <stdlib.h>
    26 #include <string.h>
    26 #include <string.h>
    27 #include <stdarg.h>
    27 #include <stdarg.h>
       
    28 
       
    29 /* For Cygwin (thanks go to Yitzchak Scott-Thoennes) */
       
    30 #ifdef __CYGWIN__
       
    31 #  define timezonevar
       
    32    extern long timezone;
       
    33 #endif
    28 #include <time.h>
    34 #include <time.h>
    29 #include <unistd.h>
    35 #include <unistd.h>
    30 #include <sys/types.h>
    36 #include <sys/types.h>
    31 #include <sys/stat.h>
    37 #include <sys/stat.h>
    32 #include <ctype.h>
    38 #include <ctype.h>
   185 
   191 
   186   return ((ret == -1) ? -1 : 0);
   192   return ((ret == -1) ? -1 : 0);
   187 }
   193 }
   188 
   194 
   189 //  from_iso8601(timestamp, utc)
   195 //  from_iso8601(timestamp, utc)
   190 // This function comes from the Gaim project, gaim_str_to_time().
   196 // This function came from the Gaim project, gaim_str_to_time().
   191 // (Actually date may not be pure iso-8601)
   197 // (Actually date may not be pure iso-8601)
   192 // Thanks, guys!
   198 // Thanks, guys!
       
   199 // ** Modified by somian 10 Apr 2006 with advice from ysth.
   193 time_t from_iso8601(const char *timestamp, int utc)
   200 time_t from_iso8601(const char *timestamp, int utc)
   194 {
   201 {
   195   struct tm t;
   202   struct tm t;
   196   time_t retval = 0;
   203   time_t retval = 0;
   197   char buf[32];
   204   char buf[32];
   198   char *c;
   205   char *c;
   199   int tzoff = 0;
   206   int tzoff = 0;
       
   207   int hms_succ = 0;
   200 
   208 
   201   time(&retval);
   209   time(&retval);
   202   localtime_r(&retval, &t);
   210   localtime_r(&retval, &t);
   203 
   211 
   204   /* Reset time to midnight (00:00:00) */
   212   /* Reset time to midnight (00:00:00) */
   228   c+=2;
   236   c+=2;
   229   if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */
   237   if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */
   230     c++; /* skip the "T" */
   238     c++; /* skip the "T" */
   231 
   239 
   232     /* 2 digit hour */
   240     /* 2 digit hour */
   233     if (sscanf(c, "%02d:%02d:%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3 ||
   241     if (sscanf(c, "%02d:%02d:%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3)
   234         sscanf(c, "%02d%02d%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3) {
   242     {
       
   243       hms_succ = 1;
       
   244       c += 8;
       
   245     }
       
   246     else if (sscanf(c, "%02d%02d%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3)
       
   247     {
       
   248        hms_succ = 1;
       
   249        c += 6;
       
   250     }
       
   251 
       
   252     if (hms_succ) {
   235       int tzhrs, tzmins;
   253       int tzhrs, tzmins;
   236       c+=8;
   254 
   237       if (*c == '.') /* dealing with precision we don't care about */
   255       if (*c == '.') /* dealing with precision we don't care about */
   238         c += 4;
   256         c += 4;
   239 
   257 
   240       if ((*c == '+' || *c == '-') &&
   258       if ((*c == '+' || *c == '-') &&
   241           sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) {
   259           sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) {
   243         if (*c == '+')
   261         if (*c == '+')
   244           tzoff *= -1;
   262           tzoff *= -1;
   245       }
   263       }
   246 
   264 
   247       if (tzoff || utc) {
   265       if (tzoff || utc) {
   248 
   266 #ifdef HAVE_TM_GMTOFF
   249 //#ifdef HAVE_TM_GMTOFF
       
   250         tzoff += t.tm_gmtoff;
   267         tzoff += t.tm_gmtoff;
   251 //#else
   268 #else
   252 //#   ifdef HAVE_TIMEZONE
   269 #  ifdef HAVE_TIMEZONE
   253 //        tzset();    /* making sure */
   270         tzset();    /* making sure */
   254 //        tzoff -= timezone;
   271         tzoff -= timezone;
   255 //#   endif
   272 #  endif
   256 //#endif
   273 #endif
   257       }
   274       }
   258     }
   275     }
   259   }
   276   }
   260 
   277 
   261   t.tm_isdst = -1;
   278   t.tm_isdst = -1;