diff options
author | geronimo <geronimo013@gmx.de> | 2012-08-02 08:07:59 +0200 |
---|---|---|
committer | geronimo <geronimo013@gmx.de> | 2012-08-02 08:07:59 +0200 |
commit | adb7d83292e1502ca7c21a123b104412cb22d160 (patch) | |
tree | ecb448802df0d35f1c3289c4f0e7c246ee5c021a /libs/util/src | |
parent | 5416f2e39cfedc474c87e0a3eeff067fbb25dceb (diff) | |
download | cmp-adb7d83292e1502ca7c21a123b104412cb22d160.tar.gz cmp-adb7d83292e1502ca7c21a123b104412cb22d160.tar.bz2 |
worked out processing of some meta data, extended json list elements
Diffstat (limited to 'libs/util/src')
-rw-r--r-- | libs/util/src/util.cc | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/libs/util/src/util.cc b/libs/util/src/util.cc index 61027a1..fa679da 100644 --- a/libs/util/src/util.cc +++ b/libs/util/src/util.cc @@ -59,3 +59,141 @@ const char *restOfLine(char *buf, int bufSize, const char *src) return *s ? s : NULL; } + +double parseAspect(const std::string &input, const char **next) +{ + return parseAspect(input.c_str(), next); +} + +double parseAspect(const char *input, const char **next) +{ + enum { Double, TwoInt, OneInt } mode = OneInt; + char buf[32]; + char *pd, *pmd, *nextBuf; + const char *ps, *pms; + + for (pd = buf, pmd = buf + sizeof(buf) - 1, ps=input, pms = input + strlen(input); ps < pms && pd < pmd; ++ps) { + switch (*ps) { + case ' ': + case '\t': + continue; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + *pd++ = *ps; + break; + + case '.': + mode = Double; + pms = ps; + break; + + case ':': + mode = TwoInt; + pms = ps; + break; + + default: + pms = --ps; + break; + } + } + *pd = 0; + + if (mode == OneInt) { + if (next) *next = ps; + return strtod(buf, NULL); + } + nextBuf = mode == TwoInt ? pd + 1 : pd; + + for (pd = nextBuf; ps < pms && pd < pmd; ++ps) { + switch (*ps) { + case ' ': + case '\t': + continue; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + *pd++ = *ps; + break; + + case '.': + mode = Double; + pms = ps; + break; + + case ':': + mode = TwoInt; + pms = ps; + break; + + default: + pms = --ps; + break; + } + } + *pd = 0; + if (next) *next = ps; + if (mode == Double) return strtod(buf, NULL); + long a = atol(buf); + long b = atol(nextBuf); + + return (double)a / (double)b; +} + +long parseInt(const std::string &input, const char **next) +{ + return parseInt(input.c_str(), next); +} + +long parseInt(const char *input, const char **next) +{ + char buf[32]; + char *pd, *pmd; + const char *ps, *pms; + + for (pd = buf, pmd = buf + sizeof(buf) - 1, ps=input, pms = input + strlen(input); ps < pms && pd < pmd; ++ps) { + switch (*ps) { + case ' ': + case '\t': + continue; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + *pd++ = *ps; + break; + + default: + pms = --ps; + break; + } + } + *pd = 0; + if (next) *next = ps; + + return atol(buf); +} |