107char *
strptime(
const char *buf,
const char *fmt,
struct tm *tm)
110 const unsigned char *bp, *ep;
111 int alt_format,
i, split_year = 0, neg = 0, offs;
125 while(isspace(*bp)) bp++;
129 if(c !=
'%')
goto literal;
137 if(c != *bp++)
return NULL;
165 new_fmt =
"%m/%d/%y";
170 new_fmt =
"%Y-%m-%d";
180 new_fmt =
"%I:%M:S %p";
185 new_fmt =
"%H:%M:%S";
224 if(split_year)
i += tm->tm_year % 100;
232 bp =
conv_num(bp, &tm->tm_mday, 1, 31);
240 bp =
conv_num(bp, &tm->tm_hour, 0, 23);
248 bp =
conv_num(bp, &tm->tm_hour, 1, 12);
249 if(tm->tm_hour == 12) tm->tm_hour = 0;
261 bp =
conv_num(bp, &tm->tm_min, 0, 59);
274 if(tm->tm_hour > 11)
return NULL;
275 tm->tm_hour +=
i * 12;
280 bp =
conv_num(bp, &tm->tm_sec, 0, 61);
285#define TIME_MAX INT64_MAX
292 if(*bp <
'0' || *bp >
'9')
303 }
while((sse * 10 <=
TIME_MAX) && rulim && *bp >=
'0' && *bp <=
'9');
311 tm = localtime(&sse);
329 bp =
conv_num(bp, &tm->tm_wday, 0, 6);
369 i += (tm->tm_year / 100) * 100;
383 if(strncasecmp((
const char *)bp,
gmt, 3) == 0 || strncasecmp((
const char *)bp,
utc, 3) == 0)
396 ep =
find_string(bp, &
i, (
const char *
const *)_tzname, NULL, 2);
401 tm->TM_GMTOFF = -(_timezone);
404 tm->TM_ZONE = _tzname[
i];
429 while(isspace(*bp)) bp++;
434 if(*bp++ !=
'M')
return NULL;
437 if(*bp++ !=
'T')
return NULL;
460 tm->TM_GMTOFF = -5 -
i;
463 tm->TM_ZONE = __UNCONST(
nast[
i]);
473 tm->TM_GMTOFF = -4 -
i;
476 tm->TM_ZONE = __UNCONST(
nadt[
i]);
482 if((*bp >=
'A' && *bp <=
'I') || (*bp >=
'L' && *bp <=
'Y'))
486 if(*bp >=
'A' && *bp <=
'I')
487 tm->TM_GMTOFF = (
'A' - 1) - (
int)*bp;
488 else if(*bp >=
'L' && *bp <=
'M')
489 tm->TM_GMTOFF =
'A' - (int)*bp;
490 else if(*bp >=
'N' && *bp <=
'Y')
491 tm->TM_GMTOFF = (int)*bp -
'M';
506 offs = offs * 10 + (*bp++ -
'0');
510 if(
i == 2 && *bp ==
':')
524 if(
i >= 60)
return NULL;
526 offs = (offs / 100) * 100 + (
i * 50) / 30;
531 if(neg) offs = -offs;
534 tm->TM_GMTOFF = offs;
546 while(isspace(*bp)) bp++;