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

