/* komento.cpp */ //------------------------------------------------------------------------- // // Ohjelma, joka tulkitsee komentoja. Komennot voidaan lyhent„„ // alkup„„st„. Jos lyhenne ei ole yksik„sitteinen, k„ytet„„n // ensimm„ist„ l”ytynytt„. // // Komennon lis„„miseksi pit„„ tehd„ funktio, joka saa parametrinaan // merkkijonon, esim. komentoa // ynn„„ 2 3 // varten tehdaan funktio // int ynnaa(const string ¶m) // joka ko. kutsusta saa parametrinaan merkkijonon "2 3" // Funktio palauttaa tiedon siit„, olivatko parametrit oikein (=0) // vai ei (!=0). Jos parametrit ovat oikein, "suoritetaan komento" // eli ynn„„-tapauksessa lasketaan tulos ja tulostetaan se. // My”s v„hint„„n 1 rivinvaihto pit„„ tulostaa! // Funktiossa on huomattava, ett„ param voi olla my”s "", muttei NULL! // Jonossa ei ole alku- eik„ lopputyhji„. Muut tyhj„ saattavat // olla 2-kertaisia! // // Komentotaulukko pit„„ t„ytt„„ siten, ett„ lyhyimm„t kommennot on // listan alussa (esim. jos on komennot y ja ynn„„, niin y pit„„ olla // ensin). // // Projektiin: komento.c, mjonot.c, help.c, mjonotpp.cpp // (ja vstring.cpp / BC 3.1) // // Vesa Lappalainen 12.4.1996, 2.4.2000 // //------------------------------------------------------------------------- #include #include #include #include #include "mjonotpp.h" #include "help.h" #include "dyntaul.h" //---------------------------------------------------------------------------- typedef int (*pKomentoFunktio)(const string &); // Funktiotyyppi komentoja varten //---------------------------------------------------------------------------- class cKomento { string komento; // Komennon nimi pKomentoFunktio komfun; // Komennon suorittava funktio public: cKomento(const char *s,pKomentoFunktio f=NULL) : komento(s), komfun(f) {;} cKomento(const string &s,pKomentoFunktio f=NULL) : komento(s), komfun(f) {;} int operator==(const cKomento &kom) const { return onko_samat(komento,kom.komento) == 0; } int suorita(const string ¶m) const { if ( komfun ) return komfun(param); return 1; } const string& getKomento() const { return komento; } }; //---------------------------------------------------------------------------- // Toteutettavat funktiot: // //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- int avustus(const string ¶m) { cHelp help("komento"); if ( param != "" ) return help.aihe(param); help.hakemisto(); return 0; } //---------------------------------------------------------------------------- int ynnaa(const string ¶m) { double luku,summa = 0; istrstream p((char *)param.c_str()); while ( p ) { luku = 0; p >> luku; summa += luku; } cout << "Tulos on " << summa << endl; return 0; } //---------------------------------------------------------------------------- int muuta_isoksi(const string ¶m) { string isona(param); jono_isoksi(isona); cout << param << " isona on " << isona << endl; return 0; } //---------------------------------------------------------------------------- int palindromi(const string &s) { int alku = 0, loppu = s.length() - 1; for ( ; alku < loppu; alku++, loppu-- ) if ( s[alku] != s[loppu] ) return 0; return 1; } int palindromiko(const string ¶m) { cout << "Sana \"" << param << "\" " << (palindromi(param) ? "on":"ei ole") << " palindromi!" << endl; return 0; } //--------------------------------------------------------------------------- // Perit„„n dynaamisen taulukon versiosta komentotaulukko: //--------------------------------------------------------------------------- class cKomennot : public cDynTaulu { public: cKomennot(int koko) : cDynTaulu(koko) { ; } int tulkitse(const string &s) const; const cKomento *etsi(const string &s) const { int i = cDynTaulu::etsi(cKomento(s+"*")); if ( i < 0 ) return NULL; return alkiot[i]; } }; //--------------------------------------------------------------------------- int cKomennot::tulkitse(const string &jono) const { string komento,param(jono); komento = erota(param,' '); poista_tyhjat(komento); poista_lopputyhjat(poista_alkutyhjat(param)); if ( komento == "" ) return 1; const cKomento *kom = etsi(komento); if ( !kom ) { cout << "En tunne komentoa " << jono_isoksi(komento) << endl; return 1; } if ( kom->suorita(param) ) { cout << "Virhe kommennossa " << kom->getKomento() << endl; return 1; } return 0; } //--------------------------------------------------------------------------- int main(void) { cKomennot komennot(10); komennot.lisaa(cKomento("?" ,avustus )); komennot.lisaa(cKomento("+" ,ynnaa )); komennot.lisaa(cKomento("Ynn„„" ,ynnaa )); komennot.lisaa(cKomento("Isoksi" ,muuta_isoksi )); komennot.lisaa(cKomento("Palindromiko",palindromiko )); string s; while ( 1 ) { cout << "Anna komento>"; lue_rivi(cin,s); if ( s == "" ) break; komennot.tulkitse(s); } return 0; }