summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-11-18 00:19:43 +0100
committerwm4 <wm4@nowhere>2012-11-18 00:25:25 +0100
commit39428525c372e593f042c107e35e38b5409afc07 (patch)
tree4db99961b2674112d5229df4c85462de1b8503cd /core
parentaf8ded53dbe1d1699df51e6fdc9fef4e464b8a7b (diff)
downloadmpv-39428525c372e593f042c107e35e38b5409afc07.tar.bz2
mpv-39428525c372e593f042c107e35e38b5409afc07.tar.xz
m_option: fix braindead --start, --length, --end option parsing bugs
The option type m_option_type_rel_time was completely broken. It interpreted everything starting with a number as percent position. This is because sscanf() semantics are idiotic (trailing string doesn't need to be matched), and due to my own idiocy this was overlooked when testing. Fix by considering sscanf() evil and not using it. (bstr_sscanf() is a straight wrapper around sscanf()). Even if the percent code was fixed, there was another bug: it always interpreted times as negative (starting from end for --start). Fix the basic logic.
Diffstat (limited to 'core')
-rw-r--r--core/m_option.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/core/m_option.c b/core/m_option.c
index 693c95cf96..dcb849a34d 100644
--- a/core/m_option.c
+++ b/core/m_option.c
@@ -1259,16 +1259,16 @@ static int parse_rel_time(const m_option_t *opt, struct bstr name,
return M_OPT_MISSING_PARAM;
// Percent pos
- double percent;
- if (bstr_sscanf(param, "%lf%%", &percent) == 1) {
- if (percent >= 0 && percent <= 100) {
+ if (bstr_endswith0(param, "%")) {
+ double percent = bstrtod(bstr_splice(param, 0, -1), &param);
+ if (param.len == 0 && percent >= 0 && percent <= 100) {
t.type = REL_TIME_PERCENT;
t.pos = percent;
goto out;
}
}
- double sign = bstr_eatstart0(&param, "-") ? -1 : +1;
+ bool sign = bstr_eatstart0(&param, "-");
double time;
if (parse_timestring(param, &time, 0)) {
t.type = sign ? REL_TIME_NEGATIVE : REL_TIME_ABSOLUTE;