|
|
|
@ -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) |
|
|
|
|