mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-28 05:50:43 +00:00
parseutils: Extend small_strptime to be used in avformat
The strptime implementation is supposed to support whitespace and %T.
This commit is contained in:
parent
249796e256
commit
108f2f381a
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user