Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
472
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.27 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. // // // //
  10. // V TOMTO SOUBORU MŮŽETE ZMĚNIT COKOLI VÁS NAPADNE.
  11. // TENTO SOUBOR VŮBEC NEMUSÍTE POUŽÍT.
  12. // // // //
  13.  
  14. // práce se vstupem/výstupem
  15. #include <stdio.h>
  16.  
  17. // obecné funkce jazyka C
  18. #include <stdlib.h>
  19.  
  20. // kvůli funkci strcmp
  21. #include <string.h>
  22.  
  23. // testování znaků - isalpha, isdigit, atd.
  24. #include <ctype.h>
  25.  
  26. // pro testování programu
  27. // #include <assert.h>
  28.  
  29. // limity číselných typů
  30. // #include <limits.h>
  31.  
  32. // typ bool, konstanty true, false
  33. #include <stdbool.h>
  34.  
  35. // proměnná errno
  36. // #include <errno.h>
  37.  
  38.  
  39. /** Kódy chyb programu */
  40. enum tecodes
  41. {
  42.   EOK = 0,     /**< Bez chyby */
  43.   ECLWRONG,    /**< Chybný příkazový řádek. */
  44.   // sem můžete přidat vlastní chybové kódy
  45.   EUNKNOWN,    /**< Neznámá chyba */
  46. };
  47.  
  48. /** Stavové kódy programu */
  49. enum tstates
  50. {
  51.   CHELP,       /**< Nápověda */
  52.   CCOMP,        /**< Komprimovat. */
  53.   CDECOMP,      /**< Dekomprimovat. */
  54. };
  55.  
  56. /** Chybová hlášení odpovídající chybovým kódům. */
  57. const char *ECODEMSG[] =
  58. {
  59.   /* EOK */
  60.   "Vše v pořádku.\n",
  61.   /* ECLWRONG */
  62.   "Chybné parametry příkazového řádku!\n",
  63.  
  64.   // sem můžete přidat vlastní chybová hlášení
  65.  
  66.   "Nastala nepředvídaná chyba! Vypněte počítač a rychle utečte.\n",
  67. };
  68.  
  69. const char *HELPMSG =
  70.   "Program Jednoduchá komprese - vzorová implementace.\n"
  71.   "Autor: Kačer Donald (c) 2010\n"
  72.   "Program provádí...\n"
  73.   "Použití: proj1 -h\n"
  74.   "         proj1 -c N\n"
  75.   "         proj1 -d N\n"
  76.   "Popis parametrů:\n"
  77. // sem doplňte svůj popis
  78.   "  [...]\n";
  79. char a
  80. 1111 1111
  81. -1
  82. /**
  83.  * Struktura obsahující hodnoty parametrů příkazové řádky.
  84.  */
  85. typedef struct params
  86. {
  87.   unsigned int N;   /**< Hodnota N z příkazové řádky. */
  88.   int ecode;        /**< Chybový kód programu, odpovídá výčtu tecodes. */
  89.   int state;        /**< Stavový kód programu, odpovídá výčtu tstates. */
  90. } TParams;
  91.  
  92. /**
  93.  * Vytiskne hlášení odpovídající chybovému kódu.
  94.  * @param ecode kód chyby programu
  95.  */
  96. void printECode(int ecode)
  97. {
  98.   if (ecode < EOK || ecode > EUNKNOWN)
  99.   { ecode = EUNKNOWN; }
  100.  
  101.   fprintf(stderr, "%s", ECODEMSG[ecode]);
  102. }
  103.  
  104. unsigned int getN(char * text, int * PChyba)
  105. {
  106.    unsigned int val = strtoul(str, &endptr, base);
  107.  
  108.    /* Check for various possible errors */
  109.  
  110.    if ((errno == ERANGE && (val == ULONG_MAX || val == 1))
  111.             || (errno != 0 && val == 0)) {
  112.         *PChyba=ERANGE;
  113.         return 0;        
  114.     }
  115.  
  116.    if (endptr == str) {
  117.         fprintf(stderr, "No digits were found\n");
  118.         exit(EXIT_FAILURE);
  119.     }
  120.  
  121.    /* If we got here, strtol() successfully parsed a number */
  122.  
  123.    printf("strtol() returned %ld\n", val);
  124.  
  125.    if (*endptr != '\0')        /* Not necessarily an error... */
  126.    {
  127.       *PChyba= ... ;
  128.       return 0;
  129.    }
  130.    
  131.    *PChyba=EOK;
  132.    return val;
  133. }
  134. /**
  135.  * Zpracuje argumenty příkazového řádku a vrátí je ve struktuře TParams.
  136.  * Pokud je formát argumentů chybný, ukončí program s chybovým kódem.
  137.  * @param argc Počet argumentů.
  138.  * @param argv Pole textových řetězců s argumenty.
  139.  * @return Vrací analyzované argumenty příkazového řádku.
  140.  */
  141. TParams getParams(int argc, char *argv[])
  142. {
  143.   TParams result =
  144.   { // inicializace struktury
  145.     .N = 0,
  146.     .ecode = EOK,
  147.     .state = CCOMP,
  148.   };
  149.  
  150.   /*
  151.    * Zastaralý způsob inicializace - nepřehledný, ale funguje i na starých
  152.    * překladačích:
  153.    * TParams result = {0, EOK, CCOMP};
  154.    */
  155.  
  156.   if (argc == 2 && strcmp("-h", argv[1]) == 0)
  157.   { // tisk nápovědy
  158.     result.state = CHELP;
  159.   }
  160.   else if (argc == 3)
  161.   { // dva parametry
  162.     if( strcmp("-c",argv[1])==0)
  163.     {
  164.        int ecode;
  165.        result.N=getN(argv[2], &ecode);
  166.        result.ecode=ecode;
  167.        result.state=CCOMPRESS;
  168.     }
  169.     else if ( )
  170.    
  171.    
  172.     else {
  173.        
  174.     }
  175.    
  176.     //
  177.     // testování parametrů příkazového řádku
  178.     // a nastavení result.ecode a result.state
  179.     // na správnou hodnotu
  180.     //
  181.     // převod textové reprezentace čísla na číselnou hodnotu
  182.     // pomocí systémových funkcí a ošetření všech problémů,
  183.     // které mohou nastat
  184.     //
  185.  
  186.   }
  187.   else
  188.   { // příliš mnoho parametrů
  189.     result.ecode = ECLWRONG;
  190.   }
  191.  
  192.   return result;
  193. }
  194.  
  195.  
  196.  
  197. /////////////////////////////////////////////////////////////////
  198. /**
  199.  * Hlavní program.
  200.  */
  201. int main(int argc, char *argv[])
  202. {
  203.   TParams params = getParams(argc, argv);
  204.   if (params.ecode != EOK)
  205.   { // něco nestandardního
  206.     printECode(params.ecode);
  207.     return EXIT_FAILURE;
  208.   }
  209.  
  210.   if (params.state == CHELP)
  211.   {
  212.     printf("%s", HELPMSG);
  213.     return EXIT_SUCCESS;
  214.   }
  215.  
  216.  
  217. //
  218. //  Sem patří volání funkcí, které zajistí zadanou funkčnost a ošetření
  219. //  chybových stavů.
  220. //
  221.  
  222.     if (params.state == COMP)
  223.     {
  224.      errcode = compress(params.N);
  225.      if(errcode != EOK)
  226.        {
  227.           printEcode(errcode);
  228.           return EXIT_FAILURE;
  229.        }
  230.   }
  231. //  else ...
  232.  
  233.   return EXIT_SUCCESS;
  234. }
  235.  
  236. /* konec proj1-kostra.c */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement