Mercurial > mplayer.hg
diff m_option.c @ 22312:cca9ff25bed2
Move parsing of the -ss option to the option code.
Also fixes a memory leak of the parameter string.
author | uau |
---|---|
date | Sat, 24 Feb 2007 07:11:57 +0000 |
parents | 66fa884c46cd |
children | 37248dbbf6ff |
line wrap: on
line diff
--- a/m_option.c Fri Feb 23 22:14:15 2007 +0000 +++ b/m_option.c Sat Feb 24 07:11:57 2007 +0000 @@ -1188,13 +1188,56 @@ }; +static double parse_timestring(char *str) +{ + int a, b; + double d; + if (sscanf(str, "%d:%d:%lf", &a, &b, &d) == 3) + return 3600*a + 60*b + d; + else if (sscanf(str, "%d:%lf", &a, &d) == 2) + return 60*a + d; + else if (sscanf(str, "%lf", &d) == 1) + return d; + return -1e100; +} + + +static int parse_time(m_option_t* opt,char *name, char *param, void* dst, int src) +{ + if (param == NULL || strlen(param) == 0) + return M_OPT_MISSING_PARAM; + + double time = parse_timestring(param); + if (time == -1e100) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid time: '%s'\n", + name,param); + return M_OPT_INVALID; + } + + if (dst) + *(double *)dst = time; + return 1; +} + +m_option_type_t m_option_type_time = { + "Time", + "", + sizeof(double), + 0, + parse_time, + NULL, + copy_opt, + copy_opt, + NULL, + NULL +}; + + // Time or size (-endpos) static int parse_time_size(m_option_t* opt,char *name, char *param, void* dst, int src) { m_time_size_t ts; char unit[4]; - int a,b; - float d; double end_at; if (param == NULL || strlen(param) == 0) @@ -1221,15 +1264,9 @@ } } - /* End at time parsing. This has to be last because of - * sscanf("%f", ...) below */ - if (sscanf(param, "%d:%d:%f", &a, &b, &d) == 3) - end_at = 3600*a + 60*b + d; - else if (sscanf(param, "%d:%f", &a, &d) == 2) - end_at = 60*a + d; - else if (sscanf(param, "%f", &d) == 1) - end_at = d; - else { + /* End at time parsing. This has to be last because the parsing accepts + * even a number followed by garbage */ + if ((end_at = parse_timestring(param)) == -1e100) { mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid time or size: '%s'\n", name,param); return M_OPT_INVALID;