parseutils: Extend small_strptime to be used in avformat

The strptime implementation is supposed to support whitespace and %T.
This commit is contained in:
Luca Barbato 2015-04-06 01:25:52 +02:00
parent 249796e256
commit 108f2f381a

View File

@ -404,61 +404,69 @@ static const char *small_strptime(const char *p, const char *fmt, struct tm *dt)
{
int c, val;
for(;;) {
while((c = *fmt++)) {
if (c != '%') {
if (av_isspace(c))
for (; *p && av_isspace(*p); p++);
else if (*p != c)
return NULL;
else p++;
continue;
}
c = *fmt++;
if (c == '\0') {
return p;
} else if (c == '%') {
c = *fmt++;
switch(c) {
case 'H':
val = date_get_num(&p, 0, 23, 2);
if (val == -1)
return NULL;
dt->tm_hour = val;
break;
case 'M':
val = date_get_num(&p, 0, 59, 2);
if (val == -1)
return NULL;
dt->tm_min = val;
break;
case 'S':
val = date_get_num(&p, 0, 59, 2);
if (val == -1)
return NULL;
dt->tm_sec = val;
break;
case 'Y':
val = date_get_num(&p, 0, 9999, 4);
if (val == -1)
return NULL;
dt->tm_year = val - 1900;
break;
case 'm':
val = date_get_num(&p, 1, 12, 2);
if (val == -1)
return NULL;
dt->tm_mon = val - 1;
break;
case 'd':
val = date_get_num(&p, 1, 31, 2);
if (val == -1)
return NULL;
dt->tm_mday = val;
break;
case '%':
goto match;
default:
switch(c) {
case 'H':
val = date_get_num(&p, 0, 23, 2);
if (val == -1)
return NULL;
}
} else {
match:
if (c != *p)
dt->tm_hour = val;
break;
case 'M':
val = date_get_num(&p, 0, 59, 2);
if (val == -1)
return NULL;
p++;
dt->tm_min = val;
break;
case 'S':
val = date_get_num(&p, 0, 59, 2);
if (val == -1)
return NULL;
dt->tm_sec = val;
break;
case 'Y':
val = date_get_num(&p, 0, 9999, 4);
if (val == -1)
return NULL;
dt->tm_year = val - 1900;
break;
case 'm':
val = date_get_num(&p, 1, 12, 2);
if (val == -1)
return NULL;
dt->tm_mon = val - 1;
break;
case 'd':
val = date_get_num(&p, 1, 31, 2);
if (val == -1)
return NULL;
dt->tm_mday = val;
break;
case 'T':
p = small_strptime(p, "%H:%M:%S", dt);
if (!p)
return NULL;
break;
case '%':
if (*p++ != '%')
return NULL;
break;
default:
return NULL;
}
}
return p;
}
time_t av_timegm(struct tm *tm)