Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.07 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. enum ecodes
  7. //ecodes - CHYBOVE HLASKY
  8. {
  9. EOK=0, //vse je vporadku
  10. ECLWRONG, //chybny vstup - chybne parametry(1)
  11. EUNKNOWN, //neznama chyba(2)
  12. };//!zakoncit strednikem
  13.  
  14. enum states
  15. //states - stavove hlasky
  16. {
  17. HELP=0,//NULA NEMUSI BYT, JE ZADANA DEFAULTNE
  18. COMP,
  19. DECOMP
  20. };
  21.  
  22. const char *ECODEMSG[]=
  23. //chybova hlasky, ktere se budou pojit s ecodes
  24. //musi byt oddeleno carkou (podle toho se vybere, ktera hlaska se zobrazi)
  25. {
  26.   "Vse v poradku.\n",   //pro EOK
  27.   "Chybné parametry prikazového radku!\n",    //pro ECLWRONG
  28.   "Nastala nepredvidana chyba! Vypnete pocítac a rychle utecte.\n",    //pro EUNKNOWN
  29. };
  30.  
  31.  
  32. const char MSGHELP[]=
  33. {
  34. "Autor: Ondrej Chrastina\n"
  35. "Program provadí komprimaci a dekomprimaci, pripradne vytiskne napovedu, v zavislostina zadanych parametrech.\n"
  36. "Pouziti: proj1 -h\n"
  37. "         proj1 -c N\n"
  38. "     proj1 -d N\n"
  39. "\n"
  40. "Popis parametrù:\n"
  41. "  -h    Vypise tuto obrazovku s nápovedou.\n"
  42. "  -c    Program zkomprimuje vlozeny text podle zadanych kriterii.\n"
  43. "  -d    Program dekomprimuje vlozeny text podle zadanych kriterii.\n"
  44. "Priklad pouziti:\n"
  45. "  Vstup:       proj1 -c 3 <<< ''blabla ahoj''\n"
  46. "  Vystup:  2bla ahoj \n"
  47. "  Vstup2:  proj1 -d 3 <<< ''2bla ahoj''\n"
  48. "  Vysptup2 blabla ahoj\n"
  49. };
  50.  
  51.  
  52. typedef struct params //definice datoveho typu struktury
  53. {
  54. unsigned int N;
  55. int ecode;
  56. int state;
  57. } TParams;
  58.  
  59. /*-------------------------------------------------------------------- funkce pro tisk Ecodu-----------------------------------------------------------------------*/
  60.  
  61. void printECode(int ecode) //funkce, z nazvem printEcode, s parametrem typu int, nic nevraci
  62. {
  63. if (ecode < EOK || ecode > EUNKNOWN)//pokud neni ecode v rozmezi eok(to je 0) a euknown(to je 2) tak vystup ecode je eunknown
  64.   {
  65.   ecode = EUNKNOWN;
  66.   }
  67.  
  68.   fprintf(stderr, "%s", ECODEMSG[ecode]);// vytiskne do chybovaho hlaseni stderr rezetec ecodemesg, ktery ma hodnotu (ecode)
  69.  }
  70. /*-----------------------------------------------------------Funkce pro pretypovani N---------------------------------------------------------------------------*/
  71.  
  72. unsigned int convert(char *hodnota)//funkce, ktera pretypuje N (vstup char a vystup unsigned int
  73. {
  74. unsigned int cislo=0,preteceni=0;
  75. int i=0;
  76. while(hodnota[i]!='\0')
  77.   {
  78.   if (hodnota[i]<'0' && hodnota[i]>'9') //osetreni, ze N je cislo (osetreni i pro to, ze cilo je kladne)
  79.     {
  80.     return 0;
  81.     }
  82.   hodnota[i]=hodnota[i]-'0';    //zaskani presne hodnoty cisla z nejake ascii hodnoty
  83.  
  84.   preteceni=cislo;
  85.   cislo=cislo*10;
  86.   cislo=cislo+hodnota[i]; //pokud uz proslo pripocte k 10tinasobku predchoziho cila prave nastene cislo
  87.   i++;
  88.   if(preteceni>cislo)   //doslo k preteceni - jednicka vypadla ven a jede se od nuly   
  89.     {
  90.     return 0;       //kdyz vrati nulu - doslo k chybe (zde z duvodu preteceni)
  91.     }
  92.   }  
  93. return cislo;
  94. }
  95.  
  96.  
  97. /*---------------------------------------------------------------Zpracovani parametru-------------------------------------------------------------------------*/
  98.  
  99.  
  100. TParams getParams(int argc, char *argv[])  //Zpracovani parametru - nastaveni ecodes a estates + kontrola zadani parametrů (vcetne N)
  101. {
  102. TParams result=
  103.   {//inicializace struktury
  104.   .N=0,
  105.   .ecode=EOK,
  106.   .state=COMP
  107.   };
  108.  
  109.   if (argc==2&&strcmp("-h",argv[1])==0) //pokud ma vlozeni 2 parametry (jmeno a parametr) - zkontroluju, jetli parametr je -h
  110.   {
  111.   result.state=HELP;
  112.   }
  113.  
  114. else if (argc==3) //pokud to ma ty parametry 3 (jmeno a dva parametry)
  115.   {
  116.   if(strcmp ("-c", argv[1])==0) //pokud je 1. parametr -c
  117.     {
  118.     result.state=COMP;
  119.     if ((result.N=convert(argv[2]))==0) //pokud ve funkci convert vysla nula - stala se chyba(doslo k preteceni pravdepodobne)
  120.       {
  121.       result.ecode=ECLWRONG;
  122.       }
  123.     result.ecode=EOK;
  124.     }
  125.   else if(strcmp("-d",argv[1])==0)
  126.     {
  127.     result.state=DECOMP;
  128.     if ((result.N=convert(argv[2]))==0)
  129.       {
  130.       result.ecode=ECLWRONG;
  131.       }
  132.     result.ecode=EOK;  
  133.     }
  134.   else
  135.     {//zadany jiny parametr, nez -c,-d nebo -h
  136.     result.ecode=ECLWRONG;
  137.     }
  138.   }
  139.   else
  140.     {//prilis mnoho parametru
  141.     result.ecode=ECLWRONG;
  142.     }
  143. return result;
  144. }
  145. /*-------------------------------------------------------------------- DEKOMPRIMACE-----------------------------------------------------------------------------*/
  146.  
  147. int dekomprimace(unsigned int N)
  148. {
  149. printf("Dekomprimace\n");
  150. int c=0;
  151. char *buffer = malloc((N+1) * sizeof(char));
  152. if(buffer==NULL)        //ochrana proti nedodtatku paměti
  153. {
  154. return 1;
  155. }
  156. while((c = getchar()) != EOF)
  157.   {
  158.   if(isdigit(c)!=0)
  159.     {
  160.     int x;
  161.     x = c - '0';
  162.     for(unsigned int i=0; i < N; i++)
  163.       {
  164.       buffer[i] = getchar();
  165.       if(isdigit(buffer[i])!=0)
  166.         {                                           //TADY JE PORTEBA DOPSAT OCHRANU, ABY NA VSTUPU NABYLY
  167.         printf("Byla zadana 2 cisla vedle sebe - Musim pak prepsat na estate.eclwrong ;-)") ;   //2 CISLA
  168.         }                                           //!!!!!! POZOR
  169.       }
  170.     for (; x>0;x--)
  171.       {
  172.       for(unsigned int i = 0; i<N; i++)
  173.         {
  174.         putchar(buffer[i%N]);
  175.         }
  176.       }
  177.     }
  178.   else
  179.     {
  180.     putchar(c);
  181.     }
  182.   }
  183. return 0;
  184. }
  185. /*-----------------------------------------------------------------------KOMPRIMACE-----------------------------------------------------------------------------*/
  186.  
  187.  
  188. int komprimace(unsigned int N)
  189. {
  190. printf("Komprimace\n");
  191. char *buffer1 = malloc((N+1) * sizeof(char));//definice bufferù a jejich dynamické alokování
  192. char *buffer2 = malloc((N+1) * sizeof(char));
  193.  
  194. if(buffer1==NULL)
  195. {
  196. return 1;
  197. }
  198.  
  199. if (buffer1==NULL)
  200. {
  201. return 1;
  202. }
  203. unsigned int i=0,pocet=1; //vlozeni pomocnych promenych (pocet je promena, do ktere se bude vkladat pocet shodujicich se blokù znakù)
  204. char c=0;
  205.  
  206. while((c = getchar()) != EOF && i!=(2*N))
  207.   {
  208.     if(i < N)               //prvotní nacteni do bufferu ze vstupu
  209.       {
  210.       buffer1[i%N] = c;
  211.       i++;
  212.       }
  213.       else if(i < 2 * N)
  214.         {
  215.         buffer2[i%N] = c;
  216.         i++;
  217.         }
  218.   }
  219. while(strcmp(buffer1, buffer2) == 0)        //porovvnani buffer (jestli se bloky neopakuji
  220.   {
  221.   pocet++;                                  //pokud se tovnaji naèti do bufferu 2 dalsi blok znakù a znovu skoc na provnavani
  222.   unsigned int ochrana=0;
  223.   while((c=getchar())!= EOF && ochrana<N)
  224.     {
  225.     ochrana++;
  226.     i++;
  227.     c=getchar();
  228.     buffer2[i%N]=c;
  229.     }
  230.   }
  231.   putchar(pocet);
  232.   putchar(buffer1[i%N]);
  233.  
  234.   while((c = getchar()) != EOF)             //vytisknuti prvniho znaku a posunuti znaku o jeden a nacteni dalsiho znaku
  235.     {
  236.     unsigned int j=0;
  237.     putchar(buffer1[j%N]);
  238.     while(j<N)
  239.       {
  240.       buffer1[j%N]=buffer1[(j+1)%N];
  241.       j++;
  242.       }
  243.     while(j==N)
  244.       {
  245.        buffer1[(j-1)%N]=buffer2[j%N];     // PRESUNUTI PRVNIHO ZNAKU Z BUFFERU2 NA POSLEDNI ZNAK BUFFERU 1
  246.        j++;
  247.       }
  248.     while (j>N&&j<(2*N))
  249.       {
  250.       buffer2[j%N]=buffer2[(j+1)%N];
  251.       j++;
  252.       }
  253.     c=buffer2[(j-1)%N];
  254.       while(strcmp(buffer1, buffer2) == 0)
  255.         {
  256.         pocet++;
  257.         unsigned int ochrana=0;
  258.         while((c=getchar())!= EOF && ochrana<N)
  259.           {
  260.           ochrana++;
  261.           i++;
  262.           c=getchar();
  263.           buffer2[i%N]=c;
  264.           }
  265.         }
  266.   putchar(pocet);
  267.   putchar(buffer1[i%N]);
  268.  
  269.   }
  270. unsigned int k=0;
  271. while(k<(2*N))
  272.   {
  273.     if(k < N)
  274.       {
  275.       putchar (buffer1[i%N]);
  276.       k++;
  277.       i--;
  278.       }
  279.       else if(k < (2 * N))
  280.         {
  281.         putchar (buffer2[i%N]);
  282.         k++;
  283.         }
  284.   }
  285.  
  286. free(buffer1);
  287. free(buffer2);
  288. return 0;
  289. }
  290.  
  291. int main (int argc, char *argv[])
  292. {
  293. TParams params = getParams(argc, argv);
  294.  
  295. if (params.ecode !=EOK)
  296.   {//pokud je neco nestandartniho
  297.   printECode(params.ecode);
  298.   return EXIT_FAILURE;
  299.   }
  300. unsigned int N=0;
  301.  
  302. if (params.state==HELP)
  303.   {
  304.   printf("%s", MSGHELP);
  305. return EXIT_SUCCESS;
  306.   }
  307. if (params.state==COMP)
  308.   {
  309.   N=convert(argv[2]);
  310.   komprimace(N);
  311.   return EXIT_SUCCESS;
  312.   }
  313. if (params.state==DECOMP)
  314.   {//zde volat funkci dekomprese
  315.   N=convert(argv[2]);
  316.   dekomprimace(N);
  317.   return EXIT_SUCCESS;
  318.   }
  319.  
  320. else
  321.   {
  322.   return EXIT_SUCCESS;
  323.   }
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement