Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.43 KB | None | 0 0
  1. /*
  2.  * Soubor:  proj1-kostra.c
  3.  * Datum:   2010/08/12
  4.  * Autor:   Kačer Donald, donald@fit.vutbr.cz
  5.  * Projekt: Jednoduchá komprese textu, projekt č. 1 pro předmět IZP
  6.  * Popis:   Program provádí... (doplňte)
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include <stdbool.h>
  14. #include <assert.h>
  15. #include <limits.h>
  16. #include <errno.h>
  17.  
  18.  
  19. enum tecodes                                                  /** Kódy chyb programu */
  20. {
  21.   EOK = 0,                                                    /**< Bez chyby */
  22.   ECLWRONG,                                                   /**< Chybný příkazový řádek. */
  23.   EUNKNOWN,                                                   /**< Neznámá chyba */
  24. };
  25.  
  26. enum tstates                                                  /** Stavové kódy programu */
  27. {
  28.   CHELP,                                                      /**< Nápověda */
  29.   CCOMP,                                                      /**< Komprimovat. */
  30.   CDECOMP,                                                    /**< Dekomprimovat. */
  31. };
  32.  
  33. const char *ECODEMSG[] =                                      /** Chybová hlášení odpovídající chybovým kódům. */
  34. {
  35.   "Vše v pořádku.\n",                                         /* EOK */
  36.   "Chybné parametry příkazového řádku!\n",                    /* ECLWRONG */
  37.   "Nastala nepředvídaná chyba! Vypněte počítač a rychle utečte.\n",
  38. };
  39.  
  40. const char *HELPMSG =
  41.   "Program Jednoduchá komprese - vzorová implementace.\n"
  42.   "Autor: Kačer Donald (c) 2010\n"
  43.   "Program provádí...\n"
  44.   "Použití: proj1 -h\n"
  45.   "         proj1 -c N\n"
  46.   "         proj1 -d N\n"
  47.   "Popis parametrů:\n"
  48.   "  [-c N - komrpimace]\n"
  49.   "  [-d N - dekomprimace]\n";
  50.  
  51. typedef struct params                                          /** Struktura obsahující hodnoty parametrů příkazové řádky */
  52. {
  53.   unsigned int N;                                              /**< Hodnota N z příkazové řádky. */
  54.   int ecode;                                                   /**< Chybový kód programu, odpovídá výčtu tecodes. */
  55.   int state;                                                   /**< Stavový kód programu, odpovídá výčtu tstates. */
  56. } TParams;
  57.  
  58. /**Vytiskne hlášení odpovídající chybovému kódu.
  59.  * @param ecode kód chyby programu
  60.  */
  61. void printECode(int ecode)
  62. {
  63.   if (ecode < EOK || ecode > EUNKNOWN)
  64.   { ecode = EUNKNOWN; }
  65.  
  66.   fprintf(stderr, "%s", ECODEMSG[ecode]);
  67. }
  68.  
  69. /**
  70.  * Zpracuje argumenty příkazového řádku a vrátí je ve struktuře TParams.
  71.  * Pokud je formát argumentů chybný, ukončí program s chybovým kódem.
  72.  * @param argc Počet argumentů.
  73.  * @param argv Pole textových řetězců s argumenty.
  74.  * @return Vrací analyzované argumenty příkazového řádku.
  75.  */
  76. TParams getParams(int argc, char *argv[])
  77. {
  78.   TParams result =
  79.   {                                                                     // inicializace struktury
  80.     .N = 0,
  81.     .ecode = EOK,
  82.     .state = CCOMP,
  83.   };
  84.  
  85.  
  86.   if (argc == 2 && strcmp("-h", argv[1]) == 0)
  87.   {                                                                     // tisk nápovědy
  88.     result.state = CHELP;
  89.   }
  90.   else if (argc == 3)
  91.   {                                                                     // dva parametry
  92.  
  93.  
  94.     if ((strcmp("-c", argv[1]) == 0))
  95.     {
  96.     result.state = CCOMP;
  97.     }
  98.  
  99.     else if ((strcmp("-d", argv[1]) == 0))
  100.     {
  101.     result.state = CDECOMP;
  102.     }
  103.  
  104.  
  105. int prevodN (int argc, char *argv[])
  106. {
  107.     char *endptr, *str; // do str musis dat ten argv[2] (2. parametr) - ale predtim testnout, jestli argc == 3
  108. // tady neni long ale unsigned long
  109.     unsigned long val;
  110.  
  111. // toto pak neni potreba, toto je jen pro testovani
  112.   if (argc < 2)
  113.     {
  114.     fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
  115.     exit(EXIT_FAILURE);
  116.     }
  117.  
  118.    errno = 0;
  119.  
  120.     val = strtoul(str, &endptr, 10);
  121.  
  122.    if (!isdigit(str[0]))
  123.     {
  124.     fprintf(stderr, "Prvni znak neni cislo");
  125.     exit(EXIT_FAILURE);
  126.     }
  127.  
  128.    if ((errno == ERANGE && (val == ULONG_MAX || val == 0)) || (errno != 0 && val == 0))
  129.     {
  130.     perror("strtoul");
  131.     exit(EXIT_FAILURE);
  132.     }
  133.  
  134.    if (endptr == str)
  135.     {
  136.     fprintf(stderr, "No digits were found\n");
  137.     exit(EXIT_FAILURE);
  138.     }
  139.  
  140.    printf("strtoul() returned %lu\n", val);
  141.  
  142.   // toto je potreba taky osetrit
  143.    if (*endptr != '\0')        /* Not necessarily an error... */
  144.         printf("Further characters after number: %s\n", endptr);
  145.  
  146.    exit(EXIT_SUCCESS);
  147. }
  148.  
  149.     //
  150.     // testování parametrů příkazového řádku
  151.     // a nastavení result.ecode a result.state
  152.     // na správnou hodnotu
  153.     //
  154.  
  155.   }
  156.   else
  157.   { // příliš mnoho parametrů
  158.     result.ecode = ECLWRONG;
  159.   }
  160.  
  161.   return result;
  162. }
  163.  
  164.  
  165.  
  166. int i=10;
  167. int *p1, *p2;
  168.  
  169.  
  170. int dekomprimace(char *strN)
  171. {
  172.   int c;
  173.   int i=0, isIn=0, pocet=0;
  174.   char *pole=malloc(N*sizeof(char));
  175.   if(pole==NULL)
  176.     return 0;
  177.  
  178.   while((c=getchar())!=EOF)
  179.     {
  180.     if(!isdigit(c) && !isIn )
  181.     {
  182.     putchar(c);
  183.     }
  184.     else if(isdigit(c))
  185.     {
  186.       if(isIn)
  187.       {
  188.       free(pole);
  189.       return 1;
  190.       }
  191.       isIn=1;
  192.       i=0;
  193.       pocet=c-'0';
  194.     }
  195.     else if(isIn)
  196.     {
  197.     pole[i]=(char)c;
  198.       i++;
  199.       if(i==N)
  200.       {
  201.         for(int j=0; j<pocet; j++)
  202.         {
  203.           for(int m=0; m<N; m++)
  204.             putchar(pole[m]);
  205.         }
  206.         isIn=0;
  207.       }
  208.     }
  209.   }
  210.  
  211.     free(pole);
  212.     return 1;
  213. }
  214.  
  215.  
  216.  
  217. int komprimace (void)
  218. {
  219.  
  220. int c;
  221. int predchozi_znak = NULL;
  222. int stejne_znaky = 0;                                        /* nejsou stejne znaky */
  223. int i = 1;                                                   /* pocitadlo */
  224. int max_i = 9;                                               /* maximum pocitadla na jeden znak */
  225.  
  226.   while ((c=getchar()) != EOF)  {
  227.  
  228.     if (isdigit(c) && (!isspace(c) || !isprint(c) || !ispunct(c)))          /* kontrola znaků */
  229.       {
  230.       putchar(i + '0');
  231.       putchar(predchozi_znak);
  232.       fprintf(stderr, "\nText obsahuje nepovolene znaky!");
  233.       return EXIT_FAILURE;
  234.       }
  235.  
  236.     else if (i == max_i)                                    /* pocitadlo presahlo maximum */
  237.       {
  238.       putchar(i + '0');
  239.       putchar(predchozi_znak);
  240.       i = 1;
  241.       }
  242.  
  243.     else if (predchozi_znak == c)                           /* stejne znaky posobe */
  244.       {
  245.       i++;
  246.       stejne_znaky = 1;
  247.       predchozi_znak = c;
  248.       }
  249.  
  250.      else if ((predchozi_znak != c) && stejne_znaky == 1)   /* byly stejne znaky a nasleduje jiny znak */
  251.       {
  252.       putchar(i + '0');
  253.       putchar(predchozi_znak);
  254.       i = 1;
  255.       stejne_znaky = 0;
  256.       predchozi_znak = c;
  257.       }
  258.  
  259.     else if (predchozi_znak == NULL)
  260.       {
  261.  
  262.       predchozi_znak = c;
  263.       }
  264.  
  265.     else
  266.       {
  267.       putchar(predchozi_znak);
  268.       predchozi_znak = c;
  269.       }
  270.     }
  271. }
  272.  
  273.  
  274.  
  275. int main(int argc, char *argv[])
  276. {
  277.   TParams params = getParams(argc, argv);
  278.   if (params.ecode != EOK)
  279.   { // něco nestandardního
  280.     printECode(params.ecode);
  281.     return EXIT_FAILURE;
  282.   }
  283.  
  284.   if (params.state == CHELP)
  285.   {
  286.     printf("%s", HELPMSG);
  287.     return EXIT_SUCCESS;
  288.   }
  289.  
  290.   if (params.state == CCOMP)
  291.   {
  292.     int komprimace(char *strN)
  293.     return EXIT_SUCCESS;
  294.   }
  295.  
  296.   if (params.state == CDECOMP)
  297.   {
  298.     int dekomprimace(char *strN)
  299.     return EXIT_SUCCESS;
  300.   }
  301.  
  302.  
  303.   return EXIT_SUCCESS;
  304. }
  305.  
  306. /* konec proj1-kostra.c */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement