diff options
Diffstat (limited to 'src/db')
-rw-r--r-- | src/db/upnp/Util.cxx | 64 |
1 files changed, 17 insertions, 47 deletions
diff --git a/src/db/upnp/Util.cxx b/src/db/upnp/Util.cxx index fba63983d..0fd0d03db 100644 --- a/src/db/upnp/Util.cxx +++ b/src/db/upnp/Util.cxx @@ -143,56 +143,26 @@ csvToStrings(const char *s, T &tokens) { std::string current; tokens.clear(); - enum states {TOKEN, ESCAPE}; - states state = TOKEN; - - while (*s != 0) { - const char ch = *s++; - - switch (ch) { - case ',': - switch(state) { - case TOKEN: - tokens.push_back(current); - current.clear(); - continue; - case ESCAPE: - current += ','; - state = TOKEN; - continue; - } - break; - case '\\': - switch(state) { - case TOKEN: - state=ESCAPE; - continue; - case ESCAPE: - current += '\\'; - state = TOKEN; - continue; - } - break; - default: - switch(state) { - case ESCAPE: - state = TOKEN; - break; - case TOKEN: - break; - } - current += ch; + while (true) { + char ch = *s++; + if (ch == 0) { + tokens.push_back(current); + return true; } + + if (ch == '\\') { + ch = *s++; + if (ch == 0) + return false; + } else if (ch == ',') { + tokens.push_back(current); + current.clear(); + continue; + } + + current.push_back(ch); } - switch(state) { - case TOKEN: - tokens.push_back(current); - break; - case ESCAPE: - return false; - } - return true; } template bool csvToStrings<std::list<std::string>>(const char *, std::list<std::string> &); |