#include "parseCmdLine.h" #include "trim.h" #include using namespace std; std::vector parseCmdLine(char * cmdline) { enum { WSSKIP, GATHERING, SQUOTE, DQUOTE } state = WSSKIP; vector args; string arg; for (; *cmdline; cmdline++) { char c = *cmdline; switch (state) { case WSSKIP: if (!isspace(c)) { if (c == '\'') { state = SQUOTE; arg = ""; } else if (c == '"') { state = DQUOTE; arg = ""; } else { state = GATHERING; arg = c; } } break; case GATHERING: if (c == '\'') { state = SQUOTE; } else if (c == '"') { state = DQUOTE; } else if (isspace(c)) { args.push_back(arg); state = WSSKIP; } else { arg += c; } break; case SQUOTE: if (c == '\'') { state = GATHERING; } else { arg += c; } break; case DQUOTE: if (c == '"') { state = GATHERING; } else { arg += c; } break; } } switch (state) { case WSSKIP: break; case GATHERING: args.push_back(arg); break; case SQUOTE: cerr << "Warning: unmatched '\\'' character!" << endl; break; case DQUOTE: cerr << "Warning: unmatched '\"' character!" << endl; break; } for (int args_len = args.size(), i = 0; i < args_len; i++) { args[i] = trim(args[i]); } return args; }