Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.71 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.  
  27.   "Vse v poradku.\n",   //pro EOK
  28.  
  29.   "Chybné parametry pøíkazového øádku!\n",    //pro ECLWRONG
  30.  
  31.   "Nastala nepøedvídaná chyba! Vypnìte poèítaè a rychle uteète.\n", //pro EUNKNOWN
  32.  
  33. };
  34.  
  35.  
  36. const char MSGHELP[]=
  37. {
  38. "Autor: Ondrej Chrastina\n"
  39. "Program provádí komprimaci a dekomprimaci, pripradne vytiskne napovedu, v zavislostina zadanych parametrech.\n"
  40. "Pouziti: proj1 -h\n"
  41. "         proj1 -c N\n"
  42. "     proj1 -d N\n"
  43. "\n"
  44. "Popis parametrù:\n"
  45. "  -h    Vypise tuto obrazovku s nápovedou.\n"
  46. "  -c    Program zkomprimuje vlozeny text podle zadanych kriterii.\n"
  47. "  -d    Program dekomprimuje vlozeny text podle zadanych kriterii.\n"
  48. "Priklad pouziti:\n"
  49. "  Vstup:       proj1 -c 3 << blabla ahoj\n"
  50. "  Vystup:  2bla ahoj \n"
  51. "  Vstup2:  proj1 -d 3 << 2bla ahoj\n"
  52. "  Vysptup2 blabla ahoj\n"
  53. };
  54.  
  55.  
  56. typedef struct params //definice datoveho typu struktury
  57. {
  58. unsigned int N;
  59. int ecode;
  60. int state;
  61. } TParams;
  62.  
  63.  
  64. void printECode(int ecode) //funkce, z nazvem printEcode, s parametrem typu int, nic nevraci
  65. {
  66.  
  67. if (ecode < EOK || ecode > EUNKNOWN)//pokud neni ecode v rozmezi eok(to je 0) a euknown(to je 2) tak vystup ecode je eunknown
  68.  
  69.   {
  70.   ecode = EUNKNOWN;
  71.   }
  72.  
  73.  
  74.  
  75.   fprintf(stderr, "%s", ECODEMSG[ecode]);// vytiskne do chybovaho hlaseni stderr rezetec ecodemesg, ktery ma hodnotu (ecode)
  76.  
  77.  }
  78.  
  79. unsigned int convert(char *hodnota)//funkce, ktera pretypuje N (vstup char a vystup unsigned int
  80. {
  81. unsigned int cislo=0,preteceni=0;
  82. int i;
  83. while(hodnota[i]!='\0')
  84.   {
  85.   if (hodnota[i]<'0' && hodnota[i]>'9') //osetreni, ze N je cislo (osetreni i pro to, ze cilo je kladne)
  86.     {
  87.     return 0;
  88.     }
  89.   hodnota[i]=hodnota[i]-'0';    //zaskani presne hodnoty cisla z nejake ascii hodnoty
  90.  
  91.   preteceni=cislo;
  92.   cislo=cislo*10;
  93.   cislo=cislo+hodnota[i]; //pokud uz proslo pripocte k 10tinasobku predchoziho cila prave nastene cislo
  94.   i++;
  95.   if(preteceni>cislo)   //doslo k preteceni - jednicka vypadla ven a jede se od nuly   
  96.     {
  97.     return 0;       //kdyz vrati nulu - doslo k chybe (zde z duvodu preteceni)
  98.     }
  99.   }  
  100. return cislo;
  101. }
  102.  
  103.  
  104. Tparams getParams(int argc, char *argv[])  //Zpracovani parametru - nastaveni ecodes a estates + kontrola zadani parametrů (vcetne N)
  105. {
  106. TParams result=
  107.   {//inicializace struktury
  108.   .N=0,
  109.   .ecode=EOK,
  110.   .state=COMP
  111.   };
  112.  
  113.   if (argc==2&&strcmp("-h",argv[1])==0) //pokud ma vlozeni 2 parametry (jmeno a parametr) - zkontroluju, jetli parametr je -h
  114.   {
  115.   result.state=HELP;
  116.   }
  117.  
  118. else if (argc==3) //pokud to ma ty parametry 3 (jmeno a dva parametry)
  119.   {
  120.   if(strcmp ("-c", argv[1]==0)) //pokud je 1. parametr -c
  121.     {
  122.     result.state=COMP;
  123.     if ((result.N=convert(argv[2]==0) //pokud ve funkci convert vysla nula - stala se chyba(doslo k preteceni pravdepodobne)
  124.       {
  125.       result.ecode=ECLWRONG;
  126.       }
  127.     result.ecode=EOK;
  128.     }
  129.   else if(strcmp("-d",argv[1]==0))
  130.     {
  131.     result.state=DECOMP;
  132.     if (result.N=convert(argv[2]))==0)
  133.       {
  134.       result.ecode=ECLWRONG;
  135.       }
  136.     resul.ecode=EOK  
  137.     }
  138.   else
  139.     {//zadany jiny parametr, nez -c, nebo -h
  140.     result.ecode=ECLWRONG;
  141.     }
  142.   }
  143.   else
  144.     {//prilis mnoho parametru
  145.     result.ecode=ECLWRONG;
  146.     }
  147. return result;
  148. }
  149.  
  150.  
  151. int main (int argc, char *argv[])
  152. {
  153. TParams params = getParams(argc, argv);
  154.  
  155. if (params.ecode !=EOK)
  156.   {//pokud je neco nestandartniho
  157.   printECode(params.ecode);
  158.   return EXIT_FAILURE;
  159.   }
  160. unsigned int N;
  161. if (params.state==HELP)
  162.   {
  163.   printf("%s", MSGHELP);
  164. return EXIT_SUCCESS;
  165.   }
  166. if (params.state==COMP)
  167.   {
  168.   //TADY JE POTREBA DOPSAT KOMPRIMACI, ZATIM JSEM SE HODIL PRINTF
  169.   printf("potreba dopsat komprimaci");
  170.   return EXIT_SUCCESS;
  171.   }
  172. if (params.state==DECOMP)
  173.   {
  174.   int c;
  175.  
  176.   char buffer[N+1];
  177.  
  178.   while((c = getchar()) != EOF)
  179.  
  180.     {
  181.  
  182.     if(isdigit(c)!=0)
  183.  
  184.       {
  185.  
  186.       int x;
  187.  
  188.       x = c - '0';
  189.  
  190.       int i=0;
  191.  
  192.       for(i; i < N; i++)
  193.  
  194.         {
  195.  
  196.         buffer[i] = getchar();
  197.  
  198.         }
  199.  
  200.       for (x; x>0;x--)
  201.  
  202.         {
  203.  
  204.         for(i = 0; i<N; i++)
  205.  
  206.           {
  207.  
  208.           putchar(buffer[i]);
  209.  
  210.           }
  211.  
  212.         }
  213.  
  214.       }
  215.  
  216.     else
  217.  
  218.       {
  219.  
  220.       putchar(c);
  221.  
  222.       }
  223.  
  224.     }
  225.   return EXIT_SUCCESS;
  226.   }
  227.  
  228. else
  229.   {
  230.   return EXIT_SUCCESS;
  231.   }
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement