equal
deleted
inserted
replaced
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; |