diff --git a/Makefile b/Makefile index d11fc4b..804d4d5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ TARGET := pppc.exe -OBJS := pppc.o session_notification.o resources.o pport.o +OBJS := pppc.o session_notification.o resources.o pport.o parseCmdLine.o CXXFLAGS := -O2 -Wall LDFLAGS := -mwindows diff --git a/parseCmdLine.cc b/parseCmdLine.cc new file mode 100644 index 0000000..d9ee2f7 --- /dev/null +++ b/parseCmdLine.cc @@ -0,0 +1,111 @@ + +#include "parseCmdLine.h" +#include +using namespace std; + +static std::string trim(const std::string & orig) +{ + const char ws[] = " \t\r\n\v\f"; + size_t first = orig.find_first_not_of(ws); + size_t last = orig.find_last_not_of(ws); + if (first == string::npos || last == string::npos) + { + return ""; + } + return string(orig, first, last - first + 1); +} + +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; +} diff --git a/parseCmdLine.h b/parseCmdLine.h new file mode 100644 index 0000000..b516d5b --- /dev/null +++ b/parseCmdLine.h @@ -0,0 +1,10 @@ + +#ifndef PARSECMDLINE_H +#define PARSECMDLINE_H + +#include +#include + +std::vector parseCmdLine(char * cmdline); + +#endif diff --git a/pppc.cc b/pppc.cc index 9cb81a1..e279fd9 100644 --- a/pppc.cc +++ b/pppc.cc @@ -2,9 +2,12 @@ #include #include #include +#include +#include #include "session_notification.h" #include "pport.h" #include "resources.h" +#include "parseCmdLine.h" using namespace std; #define APP_NAME "Parallel Port Power Controller" @@ -21,6 +24,8 @@ int WinMain( LPSTR lpCmdLine, int nCmdShow) { + vector args = parseCmdLine(lpCmdLine); + m_hInstance = hInstance; /* Load the application icon */