diff options
-rw-r--r-- | src/Common/Util.h | 59 | ||||
-rw-r--r-- | src/madc.cpp | 10 |
2 files changed, 67 insertions, 2 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; + } }; } diff --git a/src/madc.cpp b/src/madc.cpp index 06d65af..af39f2d 100644 --- a/src/madc.cpp +++ b/src/madc.cpp @@ -20,6 +20,7 @@ #include "Net/ClientConnection.h" #include "Net/IPAddress.h" #include "Common/RequestManager.h" +#include "Common/Util.h" #include "Client/RequestProcessor.h" #include <iostream> @@ -48,13 +49,18 @@ static void handleCommand(char *cmd) { if(!*cmd) return; - if(std::strcmp(cmd, "quit") == 0) { + std::vector<std::string> splitCmd = Mad::Common::Util::split(cmd); + + if(splitCmd.empty()) + return; + + if(splitCmd[0] == "quit") { processor->requestDisconnect(); rl_callback_handler_remove(); } else { - std::cerr << "Unknown command \"" << cmd << "\"." << std::endl; + std::cerr << "Unknown command \"" << splitCmd[0] << "\"." << std::endl; } add_history(cmd); |