summaryrefslogtreecommitdiff
path: root/libs/util/src
diff options
context:
space:
mode:
authorgeronimo <geronimo013@gmx.de>2012-08-02 08:07:59 +0200
committergeronimo <geronimo013@gmx.de>2012-08-02 08:07:59 +0200
commitadb7d83292e1502ca7c21a123b104412cb22d160 (patch)
treeecb448802df0d35f1c3289c4f0e7c246ee5c021a /libs/util/src
parent5416f2e39cfedc474c87e0a3eeff067fbb25dceb (diff)
downloadcmp-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.cc138
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);
+}