Commit a9b85ee2 authored by jan.koester's avatar jan.koester
Browse files

modern version released

parent 75199961
Loading
Loading
Loading
Loading
+32 −69
Original line number Diff line number Diff line
@@ -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>
@@ -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;
}

@@ -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;
}

@@ -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() {
@@ -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);
@@ -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';
                    }
                }
@@ -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;
        }
@@ -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() 
@@ -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;
        }
    }
@@ -259,6 +224,4 @@ cmdplus::Cmd *cmdplus::CmdController::getCmdbyKey(const char *key) {
}

cmdplus::CmdController::~CmdController() {
    delete _firstCmd;
    _lastCmd = nullptr;
}
+18 −16
Original line number Diff line number Diff line
@@ -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;
    };
    
@@ -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;
    };
};