Streamtools: Refactor rescaling code
[jpcrr.git] / streamtools / timeparse.cpp
blob767e9ef01b136ec6bfaa44f400b7976f458462e4
1 #include "timeparse.hpp"
2 #include <string>
3 #include <sstream>
4 #include <stdexcept>
6 #define MAXTIME 0xFFFFFFFFFFFFFFFFULL
8 uint64_t parse_timespec(const std::string& str)
10 uint64_t scale = 0;
11 uint64_t value = 0;
12 for(int i = 0; str[i]; i++) {
13 if(isdigit((unsigned char)str[i])) {
14 if(scale == 1)
15 goto bad;
16 else if(scale > 1)
17 scale /= 10;
18 uint64_t num = str[i] - '0';
19 if((MAXTIME - num) / 10 < value)
20 goto bad;
21 value = 10 * value + num;
22 } else if(str[i] == '.') {
23 if(scale > 0)
24 goto bad;
25 scale = 1000000000L;
26 } else
27 goto bad;
30 if(scale) {
31 if(MAXTIME / scale < value)
32 goto bad;
33 value *= scale;
36 return value;
37 bad:
38 std::stringstream str_err;
39 str_err << "Bad timespec: " << str;
40 throw std::runtime_error(str_err.str());