A cli nem más mint a command line interpreter rövidítése. Programom első körben parancssoros lesz. Szükség van egy eszközre ami a beírt parancsot felismeri és meghívja a hozzá tartozó kódot. Ezt egy switch szerkezet végzi el. Nyelvi megkötés, hogy a switch csak egész típusra tud összehasonlítást végezni. Ezért a parancsokat egy asszociatív tömbben (mapban) tárolom. A kulcs érték string típusú és maga a parancs. Az érték egész (int) típus. Ha érkezik egy parancs először megvizsgálom létezik-e, vagyis, hogy a map tartalmazza-e. Ha nem akkor visszatérek false értékkel. Ha igen a switch kiválasztja a megfelelő esetet (case) és végrehajtja azt. A cli a kapott stringet csak az első szóközig vizsgálja. A többit paraméternek fogja fel. A cli egy osztály és közvetlenül a main példányosítja.
//cli.h class c_cli { public: c_cli(); // konstruktor bool is_command(const std::string& s); bool add_line(const std::string& s); private: std::map<std::string, int> command; bool interpretation(const std::string& s); };
//cli.cpp extern bool halt; const int EXIT = 0; const int RENDER = 1; c_cli::c_cli() // konstruktor { command["exit"] = EXIT; command["render"] = RENDER; } bool c_cli::is_command(const std::string& s) { // Ha van ilyen parancs. if ( command.find(s.substr( 0, s.find(' ') )) != command.end() ) { return true; } return false; } bool c_cli::add_line(const std::string& s) { return interpretation(s); } bool c_cli::interpretation(const std::string& s) { // Le kell ellenőrizni létezik-e az adott 's' a map-ban, mert ha nem // akkor létrehozná, az pedig rossz. if ( command.find(s.substr( 0, s.find(' ') )) != command.end() ) { // Csak az első szóközig nézem, a többit paraméterként fogom fel. // A paraméter(ek) feldolgozása az adott parancs feladata switch (command[s.substr( 0, s.find(' ') )]) { case EXIT: halt = true; break; case RENDER: std::cout << "done"; break; } // end switch } // end if else { // Command not found. return false; } return true; }