summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nncmpp.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/nncmpp.c b/nncmpp.c
index 7cddc83..895667b 100644
--- a/nncmpp.c
+++ b/nncmpp.c
@@ -3358,18 +3358,27 @@ mpd_read_time (const char *value, int *sec, int *optional_msec)
if (!value)
return;
- char *end, *period = strchr (value, '.');
- if (optional_msec && period)
+ char *end = NULL;
+ long n = strtol (value, &end, 10);
+ if (n < 0 || (*end && *end != '.'))
+ return;
+
+ int msec = 0;
+ if (*end == '.')
{
- unsigned long n = strtoul (period + 1, &end, 10);
- if (*end)
+ // In practice, MPD always uses three decimal digits
+ size_t digits = strspn (++end, "0123456789");
+ if (end[digits])
return;
- // XXX: this relies on three decimal places
- *optional_msec = MIN (INT_MAX, n);
+
+ if (digits--) msec += (*end++ - '0') * 100;
+ if (digits--) msec += (*end++ - '0') * 10;
+ if (digits--) msec += *end++ - '0';
}
- unsigned long n = strtoul (value, &end, 10);
- if (end == period || !*end)
- *sec = MIN (INT_MAX, n);
+
+ *sec = MIN (INT_MAX, n);
+ if (optional_msec)
+ *optional_msec = msec;
}
static void