Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- enum ecodes
- //ecodes - CHYBOVE HLASKY
- {
- EOK=0, //vse je vporadku
- ECLWRONG, //chybny vstup - chybne parametry(1)
- EUNKNOWN, //neznama chyba(2)
- };//!zakoncit strednikem
- enum states
- //states - stavove hlasky
- {
- HELP=0,//NULA NEMUSI BYT, JE ZADANA DEFAULTNE
- COMP,
- DECOMP
- };
- const char *ECODEMSG[]=
- //chybova hlasky, ktere se budou pojit s ecodes
- //musi byt oddeleno carkou (podle toho se vybere, ktera hlaska se zobrazi)
- {
- "Vse v poradku.\n", //pro EOK
- "Chybné parametry pøíkazového øádku!\n", //pro ECLWRONG
- "Nastala nepøedvídaná chyba! Vypnìte poèítaè a rychle uteète.\n", //pro EUNKNOWN
- };
- const char MSGHELP[]=
- {
- "Autor: Ondrej Chrastina\n"
- "Program provádí komprimaci a dekomprimaci, pripradne vytiskne napovedu, v zavislostina zadanych parametrech.\n"
- "Pouziti: proj1 -h\n"
- " proj1 -c N\n"
- " proj1 -d N\n"
- "\n"
- "Popis parametrù:\n"
- " -h Vypise tuto obrazovku s nápovedou.\n"
- " -c Program zkomprimuje vlozeny text podle zadanych kriterii.\n"
- " -d Program dekomprimuje vlozeny text podle zadanych kriterii.\n"
- "Priklad pouziti:\n"
- " Vstup: proj1 -c 3 << blabla ahoj\n"
- " Vystup: 2bla ahoj \n"
- " Vstup2: proj1 -d 3 << 2bla ahoj\n"
- " Vysptup2 blabla ahoj\n"
- };
- typedef struct params //definice datoveho typu struktury
- {
- unsigned int N;
- int ecode;
- int state;
- } TParams;
- void printECode(int ecode) //funkce, z nazvem printEcode, s parametrem typu int, nic nevraci
- {
- if (ecode < EOK || ecode > EUNKNOWN)//pokud neni ecode v rozmezi eok(to je 0) a euknown(to je 2) tak vystup ecode je eunknown
- {
- ecode = EUNKNOWN;
- }
- fprintf(stderr, "%s", ECODEMSG[ecode]);// vytiskne do chybovaho hlaseni stderr rezetec ecodemesg, ktery ma hodnotu (ecode)
- }
- unsigned int convert(char *hodnota)//funkce, ktera pretypuje N (vstup char a vystup unsigned int
- {
- unsigned int cislo=0,preteceni=0;
- int i;
- while(hodnota[i]!='\0')
- {
- if (hodnota[i]<'0' && hodnota[i]>'9') //osetreni, ze N je cislo (osetreni i pro to, ze cilo je kladne)
- {
- return 0;
- }
- hodnota[i]=hodnota[i]-'0'; //zaskani presne hodnoty cisla z nejake ascii hodnoty
- preteceni=cislo;
- cislo=cislo*10;
- cislo=cislo+hodnota[i]; //pokud uz proslo pripocte k 10tinasobku predchoziho cila prave nastene cislo
- i++;
- if(preteceni>cislo) //doslo k preteceni - jednicka vypadla ven a jede se od nuly
- {
- return 0; //kdyz vrati nulu - doslo k chybe (zde z duvodu preteceni)
- }
- }
- return cislo;
- }
- Tparams getParams(int argc, char *argv[]) //Zpracovani parametru - nastaveni ecodes a estates + kontrola zadani parametrů (vcetne N)
- {
- TParams result=
- {//inicializace struktury
- .N=0,
- .ecode=EOK,
- .state=COMP
- };
- if (argc==2&&strcmp("-h",argv[1])==0) //pokud ma vlozeni 2 parametry (jmeno a parametr) - zkontroluju, jetli parametr je -h
- {
- result.state=HELP;
- }
- else if (argc==3) //pokud to ma ty parametry 3 (jmeno a dva parametry)
- {
- if(strcmp ("-c", argv[1]==0)) //pokud je 1. parametr -c
- {
- result.state=COMP;
- if ((result.N=convert(argv[2]==0) //pokud ve funkci convert vysla nula - stala se chyba(doslo k preteceni pravdepodobne)
- {
- result.ecode=ECLWRONG;
- }
- result.ecode=EOK;
- }
- else if(strcmp("-d",argv[1]==0))
- {
- result.state=DECOMP;
- if (result.N=convert(argv[2]))==0)
- {
- result.ecode=ECLWRONG;
- }
- resul.ecode=EOK
- }
- else
- {//zadany jiny parametr, nez -c, nebo -h
- result.ecode=ECLWRONG;
- }
- }
- else
- {//prilis mnoho parametru
- result.ecode=ECLWRONG;
- }
- return result;
- }
- int main (int argc, char *argv[])
- {
- TParams params = getParams(argc, argv);
- if (params.ecode !=EOK)
- {//pokud je neco nestandartniho
- printECode(params.ecode);
- return EXIT_FAILURE;
- }
- unsigned int N;
- if (params.state==HELP)
- {
- printf("%s", MSGHELP);
- return EXIT_SUCCESS;
- }
- if (params.state==COMP)
- {
- //TADY JE POTREBA DOPSAT KOMPRIMACI, ZATIM JSEM SE HODIL PRINTF
- printf("potreba dopsat komprimaci");
- return EXIT_SUCCESS;
- }
- if (params.state==DECOMP)
- {
- int c;
- char buffer[N+1];
- while((c = getchar()) != EOF)
- {
- if(isdigit(c)!=0)
- {
- int x;
- x = c - '0';
- int i=0;
- for(i; i < N; i++)
- {
- buffer[i] = getchar();
- }
- for (x; x>0;x--)
- {
- for(i = 0; i<N; i++)
- {
- putchar(buffer[i]);
- }
- }
- }
- else
- {
- putchar(c);
- }
- }
- return EXIT_SUCCESS;
- }
- else
- {
- return EXIT_SUCCESS;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement