Překladače - implementace příkazu CD

 

Následuje ukázka implementace příkazu CD s parametry ve zjednodušené formě podle příkazů na Příkazovém řádku Windows.

package wintrainer;

/**
 *
 * @author sarka
 */

// trida pro zpracovani prikazu CD

public class TCd {
    public String out = new String(); // po vyhodnoceni bude zobrazeno v okne
    TData data;                       // v konstruktoru bude predan odkaz na data (adresarova struktura apod.)

    public TCd(TData nodes) {
        data = nodes;
    }

    void getHelp() {
        out = "Zobrazí název nebo změní aktuální adresář.\n"
        +"CHDIR [jednotka:][cesta]\n"
        +"CHDIR [..]\n"
        +"CD [jednotka:][cesta]\n"
        +"CD [..]\n\n"
        +"..   Nastaví nadřazený adresář jako aktuální.\n"
        +"Příkazem CD jednotka: zobrazíte aktuální adresář zadané jednotky.\n"
        +"Příkazem CD bez parametrů zobrazíte aktuální jednotku a adresář.";
    }

    public int run (String params) {
        if (params == null) return 1;   // chyba ve vyhodnocovani
        params = params.trim();
        int delka = params.length();
        if (delka == 0) {               // prikaz CD bez parametru, vypise aktivni uzel
          out = data.active.getFullName(); return 0; 
        }
        out = "";    // vycistime vypis

        char [] rad = params.toCharArray();   // zkonvertujeme na zpracovatelne pole
        int pos = 0;
        String dir = new String();

        // provedeme analyzu parametru prikazu CD:
        switch (rad[0]) {    
            case '/':       // prepinace, zatim funguje jen "CD /?" pro vypis napovedy
                if (rad[1] == '?') getHelp(); return 0;
            case '\"':      // parametrem je nazev adresare v uvozovkach
                pos++;
                while (pos < delka && rad[pos] != '\"') dir = dir + rad[pos]; // nacteme cely nazev
                if (rad[pos] != '\"') return 1;     // ukoncovaci symbol neni, chyba uzivatele
                if (data.changeNode(dir)) return 0;
                return 1;
            case '\\':     // prikaz "CD \" znamena presun do korenoveho adresare aktivniho disku
                if (delka == 1) {
                    if(data.goToRoot()) return 0;
                    return 1;
                }  // jinak default
            default:
                if (data.changeNode(params)) return 0;  // presun do bezne zadaneho adresare, funguji i "teckove"
                return 1;

        }
    }
}