/* * Soubor: proj1.c * Datum: 06.10.2008 * Autor: Vojtech Kalcik, xkalci01@stud.fit.vutbr.cz * Projekt: Sifrovani, projekt c. 1 pro predmet IZP * Popis: Program provadi sifrovani a dedesifrovani textu na vstupu podle klice. */ #include #include #include #include //konstanty #define POCET_CISLIC 10 /** * Funkce zjisti ktery znak z 36kove soustavy odpovida cislu. */ char najdi_znak(int cislo) { cislo += '0'; if(cislo > '9') { cislo = cislo + 'A' - ('9' + 1); } return (char)cislo; } /** * Struktura, kterou navrací funkce zpracuj_parametry. */ typedef struct parametry { bool zakodovat; char *klic; int stav; }Tparametry; /** * Prevede poradové cislo z ASCII tabulky na poradove cislo soustavy o zakladu 36 */ int z_charu_cislo(char znak) { int cislo = 0; if((znak >= '0')&&(znak<='9')) { cislo = znak - '0'; } else if((znak >= 'A')&&(znak<='Z')) { cislo = znak - 'A' + POCET_CISLIC; } return cislo; } /** * Zasifruje nebo desifruje dany znak. */ char koduj(char znak, char klic, bool zakodovat) { int cislo; if(zakodovat)// pro -encode { cislo = (z_charu_cislo(znak) + z_charu_cislo(klic)) % 36; } else// pro -decode { cislo = z_charu_cislo(znak) - z_charu_cislo(klic); if (cislo < 0) { cislo = cislo + 36; } } return najdi_znak(cislo); } /** * Kontroluje jestli znak patri do pripustnych znaku. */ bool pripustny_znak(char znak) { return (((znak >= '0')&&(znak <= '9'))||((znak >= 'A')&&(znak <= 'Z'))); } /** * Kontroluje jestli text neobsahuje nepripustny znak. */ bool spravny_text(char *znak) { bool vrat = true; for(int i = 0; (znak[i]) && (vrat); i++) { vrat = pripustny_znak(znak[i]); } return vrat; } /** Kódy stavů programu.*/ enum tstav { ST_OK = 0, /**< Bez chyby. */ ST_NAPOVEDA, /**< Zobrazi nápovedu. */ ST_MALO_P, /**< Malo parametru programu. */ ST_SP_P1, /**< Prvni parametr se nerovna ani -encode ani -decode. */ ST_SP_KLIC /**< V klici je nepripustny znak. */ }; /** * Hlaseni. Jejich poradi v poli odpovida poradi konstant ve vyctu tstav. */ const char *STAVY[] = { "Vse v poradku.", "Autor: Vojtech Kalcik, xkalci01@stud.fit.vutbr.cz\n" "Projekt: Sifrovani, projekt c. 1 pro predmet IZP\n" "Popis: Program provadi sifrovani a desifrovani textu na vstupu podle klice.\n" "\n" "Prvni parametr programu je -encode nebo -decode.\n" "Druhy parametr je klic, pomoci ktereho se sifruje nebo desifruje text ze standartniho vstupu.\n" "Pripustne znaky vstupu jsou 0-9, A-Z.\n" "Parametr -h vypise napovedu.\n", "Malo parametru!", "Prvni parametr je spatny!", "Klic obsahuje nepripustny znak!" }; /** * Zareaguje podle toho jakej je stav programu */ bool stav_programu (int stav) { bool navrat = true; if(stav != ST_OK) { FILE *vystup = stdout; navrat = false; if(stav > ST_NAPOVEDA) { vystup = stderr; } fprintf(vystup, "%s\n", STAVY[stav]); } return navrat; } /** *Zpracovani parametru */ Tparametry zpracuj_parametry(int argc, char *argv[]) { Tparametry navrat = { // inicializace struktury .zakodovat = true, .klic = NULL, .stav = ST_OK }; if((argc >= 2) && (strcmp(argv[1], "-h") == 0)) { navrat.stav = ST_NAPOVEDA; } else if (argc >= 3) { if(strcmp(argv[1], "-encode") == 0) { navrat.zakodovat = true; } else if(strcmp(argv[1], "-decode") == 0) { navrat.zakodovat = false; } else { navrat.stav = ST_SP_P1; } if (spravny_text(argv[2])) { navrat.klic = argv[2]; } else { navrat.stav = ST_SP_KLIC; } } else { navrat.stav = ST_MALO_P; } return navrat; } /** *Hlavni program */ int main(int argc, char *argv[]) { int poradi = 0; int znak = 0; bool pokracuj = true; Tparametry parametry = zpracuj_parametry(argc, argv); if (stav_programu(parametry.stav)) { int pocet_pismen_klic = strlen(parametry.klic); while (((znak = getchar()) != '\n')&&(znak != EOF)&&(pokracuj)) { pokracuj = pripustny_znak(znak); if(pokracuj) { putchar(koduj(znak, parametry.klic[poradi], parametry.zakodovat)); poradi++; if(poradi == pocet_pismen_klic) { poradi = 0; } } } if (pokracuj) { return EXIT_SUCCESS; } else { printf("\nNepripustny znak!\n"); return EXIT_FAILURE; } } else { if(parametry.stav == ST_NAPOVEDA) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } } // Konec souboru proj1.c