Loading src/cmdplus.cpp +32 −69 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <algorithm> #include <cstdio> #include <cstring> #include <iostream> Loading @@ -35,16 +36,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define KTSKEY 1 cmdplus::Cmd::Cmd() { _Key = nullptr; _SKey = '\0'; _Value = nullptr; _Help = nullptr; _Found = false; _Required = false; _nextCmd = nullptr; } const char *cmdplus::Cmd::getKey() { const std::string &cmdplus::Cmd::getKey() { return _Key; } Loading @@ -52,19 +50,19 @@ const char cmdplus::Cmd::getShortkey() { return _SKey; } const char *cmdplus::Cmd::getValue() { const std::string &cmdplus::Cmd::getValue() { return _Value; } unsigned long cmdplus::Cmd::getValueSize_t() { return atoi(_Value); return atoi(_Value.c_str()); } int cmdplus::Cmd::getValueInt() { return atoi(_Value); return atoi(_Value.c_str()); } const char *cmdplus::Cmd::getHelp() { const std::string &cmdplus::Cmd::getHelp() { return _Help; } Loading @@ -77,25 +75,10 @@ bool cmdplus::Cmd::getRequired() { } cmdplus::Cmd *cmdplus::Cmd::nextCmd() { return _nextCmd; return _nextCmd.get(); } cmdplus::Cmd::~Cmd() { delete[] _Key; delete[] _Value; delete[] _Help; Cmd *cur=_nextCmd;; _nextCmd=nullptr; while(cur){ Cmd *next=cur->_nextCmd; cur->_nextCmd=nullptr; delete cur->_nextCmd; cur=next; } } cmdplus::CmdController::CmdController() { Loading @@ -109,63 +92,53 @@ cmdplus::CmdController::CmdController(CmdController& ins){ } void cmdplus::CmdController::registerCmd(const char *key, const char skey,bool required, const char *defaultvalue, const char *help) { if (!key || !skey || !help) { void cmdplus::CmdController::registerCmd(const std::string &key, const char skey,bool required, const std::string &defaultvalue,const std::string &help) { if (key.empty() || !skey || help.empty()) { throw "cmd parser key,skey or help not set!"; } /*if key exist overwriting options*/ for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd=curdcmd->nextCmd()) { if (strcmp(key,curdcmd->getKey()) == 0) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd=curdcmd->nextCmd()) { if (key==curdcmd->getKey()) { /*set new shortkey*/ curdcmd->_SKey = skey; /*set reqirement flag*/ curdcmd->_Required = required; /*set new value*/ delete[] curdcmd->_Value; curdcmd->_Value = new char[strlen(defaultvalue)+1]; memcpy(curdcmd->_Value,defaultvalue,strlen(defaultvalue)); curdcmd->_Value[strlen(defaultvalue)] = '\0'; curdcmd->_Value=defaultvalue;; /*set new help*/ delete[] curdcmd->_Help; curdcmd->_Help = new char[strlen(help) + 1]; memcpy(curdcmd->_Help,help,strlen(help)); curdcmd->_Help[strlen(help)] = '\0'; curdcmd->_Help=help; return; } } /*create new key value store*/ if (!_firstCmd) { _firstCmd = new Cmd; _lastCmd = _firstCmd; _firstCmd = std::shared_ptr<Cmd>(new Cmd()); _lastCmd = _firstCmd.get(); } else { _lastCmd->_nextCmd = new Cmd; _lastCmd = _lastCmd->_nextCmd; _lastCmd->_nextCmd = std::unique_ptr<Cmd>(new Cmd()); _lastCmd = _lastCmd->_nextCmd.get(); } /*set new key*/ _lastCmd->_Key = new char[strlen(key) + 1]; memcpy(_lastCmd->_Key,key,strlen(key)+1); _lastCmd->_Key = key; /*set new shortkey*/ _lastCmd->_SKey = skey; /*set reqirement flag*/ _lastCmd->_Required = required; /*set new value*/ if (defaultvalue) { _lastCmd->_Value = new char[strlen(defaultvalue) + 1]; memcpy(_lastCmd->_Value,defaultvalue,strlen(defaultvalue)+1); } _lastCmd->_Value =defaultvalue; /*set new help*/ _lastCmd->_Help = new char[strlen(help) + 1]; memcpy(_lastCmd->_Help,help,strlen(help)+1); _lastCmd->_Help = help; } void cmdplus::CmdController::registerCmd(const char *key, const char skey, bool required, unsigned long defaultvalue, const char *help) { void cmdplus::CmdController::registerCmd(const std::string &key, const char skey, bool required, unsigned long defaultvalue,const std::string &help) { char buf[255]; snprintf(buf,255,"%lu",defaultvalue); registerCmd(key,skey,required,buf,help); } void cmdplus::CmdController::registerCmd(const char *key, const char skey, bool required, int defaultvalue, const char *help) { void cmdplus::CmdController::registerCmd(const std::string &key, const char skey, bool required, int defaultvalue, const std::string &help) { char buf[255]; snprintf(buf,255,"%d",defaultvalue); registerCmd(key, skey, required, buf, help); Loading Loading @@ -201,15 +174,13 @@ void cmdplus::CmdController::parseCmd(int argc,char** argv){ skey = argv[args][1]; } for (Cmd *curcmd = _firstCmd; curcmd; curcmd = curcmd->nextCmd()) { for (Cmd *curcmd = _firstCmd.get(); curcmd; curcmd = curcmd->nextCmd()) { if (keytype == KTKEY) { if (strcmp(key,curcmd->getKey()) == 0) { if (key==curcmd->getKey()) { curcmd->_Found = true; int valuesize = (strlen(argv[args]) - (kendpos+1)); if (valuesize > 0) { delete[] curcmd->_Value; curcmd->_Value = new char[valuesize+1]; memcpy(curcmd->_Value,argv[args]+(kendpos+1),(strlen(argv[args])-(kendpos+1))); std::copy(argv[args]+(kendpos+1),argv[args]+(strlen(argv[args])-(kendpos+1)),std::back_inserter(curcmd->_Value)); curcmd->_Value[valuesize] = '\0'; } } Loading @@ -217,22 +188,16 @@ void cmdplus::CmdController::parseCmd(int argc,char** argv){ if (curcmd->getShortkey()== skey) { curcmd->_Found = true; if (++args<argc) { int valuesize = strlen(argv[args]); delete[] curcmd->_Value; curcmd->_Value = new char[valuesize + 1]; memcpy(curcmd->_Value,argv[args],strlen(argv[args])); curcmd->_Value[valuesize] = '\0'; std::copy(argv[args],argv[args]+strlen(argv[args]),std::back_inserter(curcmd->_Value)); } } } } delete[] key; } } bool cmdplus::CmdController::checkRequired() { for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd = curdcmd->nextCmd()) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd = curdcmd->nextCmd()) { if (curdcmd->getRequired() && !curdcmd->_Found) { return false; } Loading @@ -241,7 +206,7 @@ bool cmdplus::CmdController::checkRequired() { } void cmdplus::CmdController::printHelp() { for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd = curdcmd->nextCmd()) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd = curdcmd->nextCmd()) { std::cout << "--" << curdcmd->getKey() << " -" << curdcmd->getShortkey() << " " << curdcmd->getHelp() Loading @@ -249,9 +214,9 @@ void cmdplus::CmdController::printHelp() { } } cmdplus::Cmd *cmdplus::CmdController::getCmdbyKey(const char *key) { for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd = curdcmd->nextCmd()) { if (strcmp(key,curdcmd->getKey()) == 0) { cmdplus::Cmd *cmdplus::CmdController::getCmdbyKey(const std::string &key) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd = curdcmd->nextCmd()) { if (key==curdcmd->getKey()) { return curdcmd; } } Loading @@ -259,6 +224,4 @@ cmdplus::Cmd *cmdplus::CmdController::getCmdbyKey(const char *key) { } cmdplus::CmdController::~CmdController() { delete _firstCmd; _lastCmd = nullptr; } src/cmdplus.h +18 −16 Original line number Diff line number Diff line Loading @@ -24,31 +24,33 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include<memory> #include<string> #pragma once namespace cmdplus { class Cmd { public: const char *getKey(); const std::string &getKey(); const char getShortkey(); const char *getValue(); const std::string &getValue(); unsigned long getValueSize_t(); int getValueInt(); const char *getHelp(); const std::string &getHelp(); bool getFound(); bool getRequired(); Cmd *nextCmd(); ~Cmd(); private: Cmd(); ~Cmd(); char *_Key; std::string _Key; char _SKey; char *_Value; char *_Help; std::string _Value; std::string _Help; bool _Found; bool _Required; Cmd *_nextCmd; std::unique_ptr<Cmd> _nextCmd; friend class CmdController; }; Loading @@ -62,17 +64,17 @@ namespace cmdplus { CmdController(CmdController &ins); void registerCmd(const char *key,char skey,bool required,const char *defaultvalue,const char *help); void registerCmd(const char *key,char skey,bool required,unsigned long defaultvalue, const char *help); void registerCmd(const char *key,char skey,bool required,int defaultvalue, const char *help); void registerCmd(const std::string &key,char skey,bool required,const std::string &defaultvalue,const std::string &help); void registerCmd(const std::string &key,char skey,bool required,unsigned long defaultvalue, const std::string &help); void registerCmd(const std::string &key,char skey,bool required,int defaultvalue, const std::string &help); void printHelp(); void parseCmd(int argc,char** argv); bool checkRequired(); Cmd *getCmdbyKey(const char *key); Cmd *getCmdbyKey(const std::string &key); ~CmdController(); private: CmdController(); ~CmdController(); Cmd *_firstCmd; std::shared_ptr<Cmd> _firstCmd; Cmd *_lastCmd; }; }; Loading
src/cmdplus.cpp +32 −69 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <algorithm> #include <cstdio> #include <cstring> #include <iostream> Loading @@ -35,16 +36,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define KTSKEY 1 cmdplus::Cmd::Cmd() { _Key = nullptr; _SKey = '\0'; _Value = nullptr; _Help = nullptr; _Found = false; _Required = false; _nextCmd = nullptr; } const char *cmdplus::Cmd::getKey() { const std::string &cmdplus::Cmd::getKey() { return _Key; } Loading @@ -52,19 +50,19 @@ const char cmdplus::Cmd::getShortkey() { return _SKey; } const char *cmdplus::Cmd::getValue() { const std::string &cmdplus::Cmd::getValue() { return _Value; } unsigned long cmdplus::Cmd::getValueSize_t() { return atoi(_Value); return atoi(_Value.c_str()); } int cmdplus::Cmd::getValueInt() { return atoi(_Value); return atoi(_Value.c_str()); } const char *cmdplus::Cmd::getHelp() { const std::string &cmdplus::Cmd::getHelp() { return _Help; } Loading @@ -77,25 +75,10 @@ bool cmdplus::Cmd::getRequired() { } cmdplus::Cmd *cmdplus::Cmd::nextCmd() { return _nextCmd; return _nextCmd.get(); } cmdplus::Cmd::~Cmd() { delete[] _Key; delete[] _Value; delete[] _Help; Cmd *cur=_nextCmd;; _nextCmd=nullptr; while(cur){ Cmd *next=cur->_nextCmd; cur->_nextCmd=nullptr; delete cur->_nextCmd; cur=next; } } cmdplus::CmdController::CmdController() { Loading @@ -109,63 +92,53 @@ cmdplus::CmdController::CmdController(CmdController& ins){ } void cmdplus::CmdController::registerCmd(const char *key, const char skey,bool required, const char *defaultvalue, const char *help) { if (!key || !skey || !help) { void cmdplus::CmdController::registerCmd(const std::string &key, const char skey,bool required, const std::string &defaultvalue,const std::string &help) { if (key.empty() || !skey || help.empty()) { throw "cmd parser key,skey or help not set!"; } /*if key exist overwriting options*/ for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd=curdcmd->nextCmd()) { if (strcmp(key,curdcmd->getKey()) == 0) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd=curdcmd->nextCmd()) { if (key==curdcmd->getKey()) { /*set new shortkey*/ curdcmd->_SKey = skey; /*set reqirement flag*/ curdcmd->_Required = required; /*set new value*/ delete[] curdcmd->_Value; curdcmd->_Value = new char[strlen(defaultvalue)+1]; memcpy(curdcmd->_Value,defaultvalue,strlen(defaultvalue)); curdcmd->_Value[strlen(defaultvalue)] = '\0'; curdcmd->_Value=defaultvalue;; /*set new help*/ delete[] curdcmd->_Help; curdcmd->_Help = new char[strlen(help) + 1]; memcpy(curdcmd->_Help,help,strlen(help)); curdcmd->_Help[strlen(help)] = '\0'; curdcmd->_Help=help; return; } } /*create new key value store*/ if (!_firstCmd) { _firstCmd = new Cmd; _lastCmd = _firstCmd; _firstCmd = std::shared_ptr<Cmd>(new Cmd()); _lastCmd = _firstCmd.get(); } else { _lastCmd->_nextCmd = new Cmd; _lastCmd = _lastCmd->_nextCmd; _lastCmd->_nextCmd = std::unique_ptr<Cmd>(new Cmd()); _lastCmd = _lastCmd->_nextCmd.get(); } /*set new key*/ _lastCmd->_Key = new char[strlen(key) + 1]; memcpy(_lastCmd->_Key,key,strlen(key)+1); _lastCmd->_Key = key; /*set new shortkey*/ _lastCmd->_SKey = skey; /*set reqirement flag*/ _lastCmd->_Required = required; /*set new value*/ if (defaultvalue) { _lastCmd->_Value = new char[strlen(defaultvalue) + 1]; memcpy(_lastCmd->_Value,defaultvalue,strlen(defaultvalue)+1); } _lastCmd->_Value =defaultvalue; /*set new help*/ _lastCmd->_Help = new char[strlen(help) + 1]; memcpy(_lastCmd->_Help,help,strlen(help)+1); _lastCmd->_Help = help; } void cmdplus::CmdController::registerCmd(const char *key, const char skey, bool required, unsigned long defaultvalue, const char *help) { void cmdplus::CmdController::registerCmd(const std::string &key, const char skey, bool required, unsigned long defaultvalue,const std::string &help) { char buf[255]; snprintf(buf,255,"%lu",defaultvalue); registerCmd(key,skey,required,buf,help); } void cmdplus::CmdController::registerCmd(const char *key, const char skey, bool required, int defaultvalue, const char *help) { void cmdplus::CmdController::registerCmd(const std::string &key, const char skey, bool required, int defaultvalue, const std::string &help) { char buf[255]; snprintf(buf,255,"%d",defaultvalue); registerCmd(key, skey, required, buf, help); Loading Loading @@ -201,15 +174,13 @@ void cmdplus::CmdController::parseCmd(int argc,char** argv){ skey = argv[args][1]; } for (Cmd *curcmd = _firstCmd; curcmd; curcmd = curcmd->nextCmd()) { for (Cmd *curcmd = _firstCmd.get(); curcmd; curcmd = curcmd->nextCmd()) { if (keytype == KTKEY) { if (strcmp(key,curcmd->getKey()) == 0) { if (key==curcmd->getKey()) { curcmd->_Found = true; int valuesize = (strlen(argv[args]) - (kendpos+1)); if (valuesize > 0) { delete[] curcmd->_Value; curcmd->_Value = new char[valuesize+1]; memcpy(curcmd->_Value,argv[args]+(kendpos+1),(strlen(argv[args])-(kendpos+1))); std::copy(argv[args]+(kendpos+1),argv[args]+(strlen(argv[args])-(kendpos+1)),std::back_inserter(curcmd->_Value)); curcmd->_Value[valuesize] = '\0'; } } Loading @@ -217,22 +188,16 @@ void cmdplus::CmdController::parseCmd(int argc,char** argv){ if (curcmd->getShortkey()== skey) { curcmd->_Found = true; if (++args<argc) { int valuesize = strlen(argv[args]); delete[] curcmd->_Value; curcmd->_Value = new char[valuesize + 1]; memcpy(curcmd->_Value,argv[args],strlen(argv[args])); curcmd->_Value[valuesize] = '\0'; std::copy(argv[args],argv[args]+strlen(argv[args]),std::back_inserter(curcmd->_Value)); } } } } delete[] key; } } bool cmdplus::CmdController::checkRequired() { for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd = curdcmd->nextCmd()) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd = curdcmd->nextCmd()) { if (curdcmd->getRequired() && !curdcmd->_Found) { return false; } Loading @@ -241,7 +206,7 @@ bool cmdplus::CmdController::checkRequired() { } void cmdplus::CmdController::printHelp() { for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd = curdcmd->nextCmd()) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd = curdcmd->nextCmd()) { std::cout << "--" << curdcmd->getKey() << " -" << curdcmd->getShortkey() << " " << curdcmd->getHelp() Loading @@ -249,9 +214,9 @@ void cmdplus::CmdController::printHelp() { } } cmdplus::Cmd *cmdplus::CmdController::getCmdbyKey(const char *key) { for (Cmd *curdcmd = _firstCmd; curdcmd; curdcmd = curdcmd->nextCmd()) { if (strcmp(key,curdcmd->getKey()) == 0) { cmdplus::Cmd *cmdplus::CmdController::getCmdbyKey(const std::string &key) { for (Cmd *curdcmd = _firstCmd.get(); curdcmd; curdcmd = curdcmd->nextCmd()) { if (key==curdcmd->getKey()) { return curdcmd; } } Loading @@ -259,6 +224,4 @@ cmdplus::Cmd *cmdplus::CmdController::getCmdbyKey(const char *key) { } cmdplus::CmdController::~CmdController() { delete _firstCmd; _lastCmd = nullptr; }
src/cmdplus.h +18 −16 Original line number Diff line number Diff line Loading @@ -24,31 +24,33 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include<memory> #include<string> #pragma once namespace cmdplus { class Cmd { public: const char *getKey(); const std::string &getKey(); const char getShortkey(); const char *getValue(); const std::string &getValue(); unsigned long getValueSize_t(); int getValueInt(); const char *getHelp(); const std::string &getHelp(); bool getFound(); bool getRequired(); Cmd *nextCmd(); ~Cmd(); private: Cmd(); ~Cmd(); char *_Key; std::string _Key; char _SKey; char *_Value; char *_Help; std::string _Value; std::string _Help; bool _Found; bool _Required; Cmd *_nextCmd; std::unique_ptr<Cmd> _nextCmd; friend class CmdController; }; Loading @@ -62,17 +64,17 @@ namespace cmdplus { CmdController(CmdController &ins); void registerCmd(const char *key,char skey,bool required,const char *defaultvalue,const char *help); void registerCmd(const char *key,char skey,bool required,unsigned long defaultvalue, const char *help); void registerCmd(const char *key,char skey,bool required,int defaultvalue, const char *help); void registerCmd(const std::string &key,char skey,bool required,const std::string &defaultvalue,const std::string &help); void registerCmd(const std::string &key,char skey,bool required,unsigned long defaultvalue, const std::string &help); void registerCmd(const std::string &key,char skey,bool required,int defaultvalue, const std::string &help); void printHelp(); void parseCmd(int argc,char** argv); bool checkRequired(); Cmd *getCmdbyKey(const char *key); Cmd *getCmdbyKey(const std::string &key); ~CmdController(); private: CmdController(); ~CmdController(); Cmd *_firstCmd; std::shared_ptr<Cmd> _firstCmd; Cmd *_lastCmd; }; };