diff options
Diffstat (limited to 'src/Common')
-rw-r--r-- | src/Common/Util.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/Common/Util.h b/src/Common/Util.h index 04b666c..71d7b69 100644 --- a/src/Common/Util.h +++ b/src/Common/Util.h @@ -22,6 +22,7 @@ #include <string> #include <locale> +#include <vector> namespace Mad { namespace Common { @@ -54,6 +55,64 @@ class Util { return str.substr(beg, end); } + + static std::vector<std::string> split(const std::string &str) { + std::vector<std::string> ret; + std::string temp; + bool quoteSingle = false, quoteDouble = false, escape = false; + + size_t beg = 0; + + for(size_t cur = 0; cur < str.length(); ++cur) { + if(!escape) { + if(str[cur] == ' ' && !quoteSingle && !quoteDouble) { + if(cur == beg && temp.empty()) { + ++beg; + } + else { + temp += str.substr(beg, cur-beg); + ret.push_back(temp); + temp.clear(); + beg = cur+1; + } + + continue; + } + + if(str[cur] == '"' && !quoteSingle) { + temp += str.substr(beg, cur-beg); + beg = cur+1; + + quoteDouble = !quoteDouble; + continue; + } + if(str[cur] == '\'' && !quoteDouble) { + temp += str.substr(beg, cur-beg); + beg = cur+1; + + quoteSingle = !quoteSingle; + continue; + } + + if(str[cur] == '\\') { + escape = true; + continue; + } + } + + if(escape && ((!quoteSingle && !quoteDouble) || (quoteSingle && str[cur] == '\'') || (quoteDouble && (str[cur] == '"' || str[cur] == '\\')))) { + temp += str.substr(beg, cur-beg-1); + beg = cur; + } + + escape = false; + } + + temp += str.substr(beg, std::string::npos); + ret.push_back(temp); + + return ret; + } }; } |