diff --git a/doc/en/sidplayfp.pod b/doc/en/sidplayfp.pod index ea87e1a..39ef750 100644 --- a/doc/en/sidplayfp.pod +++ b/doc/en/sidplayfp.pod @@ -63,7 +63,7 @@ Can include an optional level, defaults to 1. =item B<-b>I<< >> -Set start time in [mins:]secs format (compatible with sid2wav). +Set start time in [mins:]secs[.milli] format (compatible with sid2wav). =item B<-ds>I<< >> @@ -104,7 +104,7 @@ combined with the track selection to form -ols. =item B<-t>I<< >> -Set play length in [mins:]secs format (0 is endless). +Set play length in [mins:]secs[.milli] format (0 is endless). =item B<-v>I<< [f] >> diff --git a/src/args.cpp b/src/args.cpp index fb9e038..4e76cd1 100644 --- a/src/args.cpp +++ b/src/args.cpp @@ -86,6 +86,7 @@ bool parseTime(const char *str, uint_least32_t &time) return false; uint_least32_t _time; + uint_least32_t milliseconds = 0; char *sep = (char *) strstr (str, ":"); if (!sep) @@ -93,21 +94,41 @@ bool parseTime(const char *str, uint_least32_t &time) _time = atoi (str); } else - { // Read in MM:SS format - // TODO parse milliseconds too + { // Read in MM:SS[.mmm] format int val; *sep = '\0'; val = atoi (str); if (val < 0 || val > 99) return false; _time = (uint_least32_t) val * 60; + // parse milliseconds + char *milli = (char *) strstr (sep+1, "."); + if (milli) + { + char *start = milli + 1; + char *end; + milliseconds = strtol(start, &end, 10); + switch (end - start) + { + case 1: milliseconds *= 100; break; + case 2: milliseconds *= 10; break; + case 3: break; + default: return false; + } + + if (milliseconds < 0 || milliseconds > 999) + return false; + + *milli = '\0'; + } val = atoi (sep + 1); if (val < 0 || val > 59) return false; _time += (uint_least32_t) val; } - time = _time * 1000; + time = _time * 1000 + milliseconds; +std::cout << time << std::endl; return true; }