Projekt 1

/* ========================================================================== */
/*                                                                            */
/*   projekt1.c                                                               */
/*   (C) 2008 Filip Munk xmunkf00@stud.fit.vutbr.cz                           */
/*                                                                            */
/*   Enkoduje ci dekoduje zadany text pomoci zadaneho klice                   */
/*                                                                            */
/* ========================================================================== */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
////////////////////////////////////////////////////////////////////////////////////////////
 
//zaklad soustavy znaku 0 - 35
const int BASE =35;
//Pocet cislic
const int NUMBERS =10;
//Jednicka se tentokrat odecita skutecne aby to fungovalo.
//Mohl bych to odecist rucne a napsat proste cislo.. toto je ale vymluvnejsi. vic to vysvetluje.
//Je ale potreba odecist jedna zde, aby nevznikla tato nutnost v kodu nekolikrate.
//Timto si nemusim pamatovat ani znak pred A ani znak po 9 v ASCII tabulce
const int SPACE ='A'-'9'-1;
//Konstanty pro funkci myprint
 
////////////////////////////////////////////////////////////////////////////////////////////
 
//standartni string
const int TEXT=3;
// tisk string na stderr
const int ERROR=2;
//tisk znaku
const int CHAR=1;
//standartni tisk stringu
const int NOERR=0;
// Konstanty pouzivane jako pojmenovani erroru
 
////////////////////////////////////////////////////////////////////////////////////////////
 
//prirazuje textovy retezec pro hlasky z MYTXT
//spatny argument
const int BADARGNUM=0;
//spatna vstupni data
const int BADINPUT=1;
//spatna data v klici
const int BADCODE=2;
 
////////////////////////////////////////////////////////////////////////////////////////////
 
//Chybove hlasky pouzivane funkci myprint
const char * MYTXT[] =
{
    "\nChyba - byl zadan nespravny pocet parametru...\nPouzijte prosim napovedu. Vyvolate ji parametrem -h\n"
    ,"\nChyba - Neplatna vstupni data! Procist napovedu. parametr -h\n"
    ,"\nChyba - Neplatna data v argumentu! Procist napovedu. parametr -h \n"
};
 
////////////////////////////////////////////////////////////////////////////////////////////
 
//Kontroluje znaky ocekava ASCII hodnotu cisla na vstupu.Vrati 1/0 pokud je znak neplatny/platny
int check_char(int letter)
{
    int res =1;
 
    if ((letter>='0' && letter<='9')||(letter>='A' && letter<='Z'))
    {
        res=0;
    }
    return res;
}
 
 
//Kontroluje zadany text. Ocekava string vrasi 1/0 pokud jediny znak v textu neplatny/vsechny platne/
int check_txt(char * txt)
{
    int i=0;
    int len=0;
    int res=0;
 
    len=strlen(txt);
    while ( i<len)
    {
        if (check_char(txt[i])!=0)
        {
            res=1;
        }
        i++;
    }
    return res;
}
//Tato funkce enkoduje zadany text pomoci klice v argumentu programu.
//Prvni ocekavana promenna je znak textu, Druha promena pak znak klice.
//Posouva postupne znaky z ASCII tabulky tak, aby vysledek byl spravny znak v tabulce.
int encode (int letter, int Code)
{
 
 
 
    letter-='0';
    if (letter> NUMBERS)
    {
        letter-=SPACE;
    }
    Code-='0';
    if (Code> NUMBERS)
    {
        Code-=SPACE;
    }
    letter+=Code;
    if (letter>BASE)
    {
        letter -=(BASE+1);
    }
 
 
    letter+='0';
    if (letter>'9')
    {
        letter+=(SPACE);
    }
 
    return letter;
}
//Funkce pouze pro tisk napovedy.
void print_help(void)
{
    printf("\nProgram koder (projekt 1) - verze 1.4.\n"
           "Autor: Filip Munk (c) 2008\n\n"
           "Format vstupu: [PARAMETR] [KLIC]\n\n\n"
           "  PARAMETRY\n\n"
           "\t-h\t  \tVypise tuto obrazovku.\n"
           "\t-encode\t [KLIC] Enkoduje zadany text podle klice.\n"
           "\t-decode\t [KLIC] Dekoduje zadany text podle klice.\n\n"
           "  KLIC\n\n"
           "Program na vstupu zpracuje pouze cislice[0-9] a VELKA pismena anglicke abecedy.\n\n"
          );
}
//Tato funkce dekoduje zadany text pomoci klice v argumentu programu.
//Prvni ocekavana promenna je znak textu, Druha promena pak znak klice.
//Posouva postupne znaky z ASCII tabulky tak, aby vysledek byl spravny znak v tabulce.
//Vraci vysledny znak
int decode (int letter,int Code)
{
 
    letter-='0';
    if (letter> 10)
    {
        letter-=SPACE;
    }
    Code-='0';
    if (Code> 10)
    {
        Code-=SPACE;
    }
    letter-=Code;
    //Pokud se dostane pod nulu przacne pocitat zase od Z
    if (letter<0)
    {
        letter +=BASE+1;
    }
 
 
    letter+='0';
    if (letter>'9')
    {
        letter+=SPACE;
    }
 
    return letter;
}
//Jednoducha funkce pouze pro ruzny zpusob tisku znaku.
//Pro tuto funkci jsou vytvoreny konstanty.
//Na vstupu ocekava cislo typu hlasky , dale cislo znaku ci hlasky
int myprint (int mytype, int num)
{
    if (mytype==3)
    {
        printf("%s", MYTXT[num]);
    }
    if (mytype==2)
    {
        fprintf(stderr,"%s", MYTXT[num]);
    }
    if (mytype==1)
    {
        putchar(num);
    }
    if (mytype==0)
    {
        printf("%i",num);
    }
    return EXIT_SUCCESS;
}
 
//Ve funkci main zjistuji zadane parametry a volam funkce s prectenym znakem.
int main(int argc, char *argv[])
{
 
    int letter,Code,len,res;
    int a=0;
 
 
    if (argc==3 && (strcmp(argv[1],"-encode")==0 || strcmp(argv[1],"-decode")==0))
    {
//Do promene len ulozi delku druheho argumentu/
        if (check_txt(argv[2])==1)
        {
            myprint(ERROR,BADCODE);
            return EXIT_FAILURE;
        }
        len=strlen(argv[2]);
        //nacita ze standartniho vstupu do promenne letter, do konce radku.
        while ((letter=getchar())!= '\n')
        {
            //zajistuje , aby a nebylo vic nez index posledniho znaku v poli.
            if (a>=len)
            {
                a=0;
            }
            Code=argv[2][a];
            a++;
            //kontroluje funkcni znaky pomoci funkce check_char
            //Pokud je znak platny posleho funkci encode/decode.
            if (check_char(letter)==0 && check_char(Code)==0)
            {
                if (strcmp(argv[1],"-encode")==0)
                {
                    res=encode(letter,Code);
                }
                else
                {
                    res=decode(letter,Code);
                }
 
                myprint(CHAR,res);
 
            }
            else
            {
                myprint(ERROR,BADINPUT);
                return EXIT_FAILURE;
            }
        }
    }
    else if (argc==2 && strcmp(argv[1],"-h")==0)
    {
        print_help();
    }
    else
    {
        myprint(ERROR,BADARGNUM);
        return EXIT_FAILURE;
    }
    myprint(CHAR,'\n');
    return EXIT_SUCCESS;
}
//konec projekt1.c