Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 47.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include "gzip.h"
  4. #include <unistd.h>
  5. #include "huffman.h"
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. FILE* gzFile;
  10.  
  11. long getOrigFileSize(FILE * gzFile);
  12. int isDynamicHuffman(unsigned char rb);
  13. void bits2String(char *strBits, unsigned char byte);
  14. int getNumberOfCodes(int necessaryBits, int exp);
  15. int bitsAddicionaisHDIST(int index);
  16. void lengthLengthAlfa();
  17. void getHuffmanCodes(int lengths [], int n_codes, HuffmanTree * tree);
  18. unsigned int_to_int(unsigned k);
  19.  
  20. unsigned char byte;  //varavel temporaria para armazenar um byte lido directamente do ficheiro
  21. unsigned int rb = 0;  //ultimo byte lido (podera ter mais que 8 bits, se tiverem sobrado alguns de leituras anteriores)
  22. char availBits = 0;
  23. int hLit, hDist, hcLen;
  24. int *hLit_lengths;
  25. int *hDist_lengths;
  26. unsigned char * output_stream;
  27. void checkaNaArvore(int * lengths, int size);
  28.  
  29. // raizes das 3 arvores
  30. HuffmanTree* HCLen_tree = createHFTree();
  31. HuffmanTree* hDist_tree = createHFTree();
  32. HuffmanTree* hLit_tree = createHFTree();
  33.  
  34. int main() {
  35.     char oneChar;
  36.     long fileSize;
  37.     long origFileSize;
  38.     int numBlocks = 0;
  39.     char needBits = 0;
  40.     gzipHeader gzh;
  41.    
  42.    
  43.     gzFile = fopen("FAQ.txt.gz", "rb");
  44.     if (!gzFile) {
  45.         perror("FAQ.txt.gz"); exit(EXIT_FAILURE);
  46.     }
  47.    
  48.     fseek(gzFile, 0L, SEEK_END);
  49.     fileSize = ftell(gzFile);
  50.     fseek(gzFile, 0L, SEEK_SET);
  51.    
  52.     //ler tamanho do ficheiro original (acrescentar: e definir Vector com s�mbolos
  53.     origFileSize = getOrigFileSize(gzFile);
  54.    
  55.     //--- ler cabe�alho
  56.     int erro = getHeader(gzFile, &gzh);
  57.     if (erro != 0)
  58.     {
  59.         printf ("Formato inválido!!!");
  60.         return -1;
  61.     }
  62.    
  63.     //--- Para todos os blocos encontrados
  64.     char BFINAL;
  65.    
  66.     do
  67.     {
  68.         //--- ler o block header: primeiro byte depois do cabecalho do ficheiro
  69.         needBits = 3;
  70.         if (availBits < needBits)
  71.         {
  72.             fread(&byte, 1, 1, gzFile);
  73.             rb = (byte << availBits) | rb;
  74.             availBits += 8;
  75.         }
  76.        
  77.         //obter BFINAL
  78.         //ver se � o �ltimo bloco
  79.         BFINAL = rb & 0x01; //primeiro bit e o menos significativo
  80.         rb = rb >> 1; //descartar o bit correspondente ao BFINAL
  81.         availBits -=1;
  82.        
  83.         //analisar block header e ver se � huffman din�mico
  84.         if (!isDynamicHuffman(rb))  //ignorar bloco se n�o for Huffman din�mico
  85.             continue;
  86.         rb = rb >> 2; //descartar os 2 bits correspondentes ao BTYPE
  87.         availBits -= 2;
  88.         printf("BITS-> %d\n",availBits);
  89.        
  90.         //--- Se chegou aqui --> compactado com Huffman din�mico --> descompactar
  91.        
  92.         hLit = getNumberOfCodes(5,0x1F);
  93.         hDist = getNumberOfCodes(5,0x1F);
  94.         hcLen = getNumberOfCodes(4,0x0F);
  95.         printf("\nValores dos codigos:\n____________________________________\n| HLIT: %d | HDIST: %d | HCLEN: %d |\n|__________|___________|___________|\n\n\n", hLit, hDist, hcLen);
  96.        
  97.         // alfabeto de comprimentos de codigos
  98.         lengthLengthAlfa();
  99.        
  100.         //hLit_lengths = comprimentos dos códigos do alfabeto de literais e comprimentos
  101.         hLit_lengths = (int*)malloc(sizeof(int) * (hLit+257));
  102.         checkaNaArvore(hLit_lengths, hLit+257);
  103.        
  104.         printf("Comprimentos dos códigos do alfabeto de literais e comprimentos:\n");
  105.         for (int i=0; i<hLit+257; i++) {
  106.             printf("hLit_lengths[%d] -> %d\n", i, hLit_lengths[i]);
  107.         }
  108.         printf("_________________________________________\n");
  109.         printf("Criar árvore para hLit:\n");
  110.         getHuffmanCodes(hLit_lengths, hLit+257, hLit_tree);
  111.         printf("_________________________________________\n");
  112.        
  113.         //hDist_lengths = comprimentos dos códigos do alfabeto de distancias
  114.         hDist_lengths = (int*)malloc(sizeof(int) * (hDist+1));
  115.         checkaNaArvore(hDist_lengths, hDist + 1);
  116.        
  117.        
  118.         printf("Comprimentos dos códigos do alfabeto de distâncias:\n");
  119.         for (int i=0; i<hDist+1; i++) {
  120.             printf("hDist_lengths[%d] -> %d\n", i, hDist_lengths[i]);
  121.         }
  122.         printf("_________________________________________\n");
  123.         printf("Criar árvore para hDist:\n");
  124.         getHuffmanCodes(hDist_lengths, hDist+1, hDist_tree);
  125.         printf("_________________________________________\n");
  126.        
  127.        
  128.         // ______________________ decoding the actual data bytes ___________________________________________________________
  129.         char *aux;
  130.         HuffmanTree value;
  131.         int index,indexDist;
  132.         char *symbol = (char*)malloc(sizeof(char)*18);
  133.         int k = 0;
  134.         int i=0;
  135.         // availBits = 0;
  136.         printf("BITS-> %d\n",availBits);
  137.         int needBits = 1;
  138.        
  139.        
  140.         printf("-------------->>.. DECODING .. <<------------\n");
  141.         int auxi=0;
  142.         char* to_copy = (char*)malloc(sizeof(char)*50);
  143.         //char *final[99999];
  144.         char *strr[20];
  145.         strr[0]='\0';
  146.        
  147.         int recua=0;
  148.         int bitsAddi=0;
  149.         int bitLido=0;
  150.         do{
  151.            // usleep(200000);
  152.             //printf("iteração: %d\n", i);
  153.             // procurar proxima folha na arvore de literais/comprimentos
  154.             // lê 1 bit da input stream
  155.             if (availBits < needBits) {
  156.                 //printf("A ler um byte...\n");
  157.                 fread(&byte, 1, 1, gzFile);
  158.                 availBits = 8;
  159.             }
  160.            
  161.             rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  162.            
  163.             byte = byte >> 1; // discarda um bit já lido
  164.            
  165.             //printf("symbol int: %d\n", rb);
  166.            
  167.             symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  168.             printf("symbol[%d] = %c\n", k, symbol[k]);
  169.             i++;
  170.             k++;
  171.             availBits--;
  172.             // anda um bit para a frente a partir da root da árvore hLit
  173.             //index = nextNode(hLit_tree, rb);
  174.             //printf("andou um nó para a frente. teste = %d\n", index);
  175.             ///TESTE
  176.            
  177.             index=findNode(hLit_tree,symbol,0);
  178.            
  179.             ////
  180.             //strr
  181.             /*
  182.              TODO------------------------------------------------------==============================================================<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  183.              -Fazer uma string acumuladora para fazer o findNode v
  184.              -ao encontrar uma folha -> igualar string a \0  v
  185.              -MEter as condições quando encontra cod de distancia e ir a arvore de dist ta mesma maneira (ATENÇÃO BITS ADICIONAIS)
  186.              -Tratar do seg fault da leitura do ficheiro X
  187.              ------------------------------------------------------==============================================================<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  188.              
  189.              
  190.              */
  191.            
  192.             //index=findNode(hLit_tree,"111110100",0);
  193.            
  194.            
  195.            
  196.            
  197.            
  198.            
  199.             //printf("andou um nó para a frente. teste = %d\n", index);
  200.             if (index >= 0) {
  201.                 // é uma folha!
  202.                
  203.                 printf("(LEAF = %d)encontrei folha!\n",index);
  204.                
  205.                 printf("> %d\n",index);
  206.                 printf("STRING : %s\n",symbol);
  207.                 //symbol[k]='\0';
  208.                
  209.                 //copiar para output stream
  210.                
  211.                
  212.                 memset(symbol, ' ', (sizeof(char))*18); //limpa o array
  213.                 k=0;
  214.                 //final[i]=static_cast<char>(index);
  215.                 bitsAddi=0;
  216.                 recua=0;
  217.                 if(index>=257 && index<=264){
  218.                     recua=index-254;
  219.                    
  220.                     //// LER CODIGO DA ARVORE HDIST
  221.                    
  222.                    
  223.                    do{
  224.                     if (availBits < needBits) {
  225.                         //printf("A ler um byte...\n");
  226.                         fread(&byte, 1, 1, gzFile);
  227.                         availBits = 8;
  228.                     }
  229.                    
  230.                     rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  231.                    
  232.                     byte = byte >> 1; // discarda um bit já lido
  233.                    
  234.                     //printf("symbol int: %d\n", rb);
  235.                    
  236.                     symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  237.                     printf("symbol[%d] = %c\n", k, symbol[k]);
  238.                     i++;
  239.                     k++;
  240.                     availBits--;
  241.                     // anda um bit para a frente a partir da root da árvore hLit
  242.                     //index = nextNode(hLit_tree, rb);
  243.                     //printf("andou um nó para a frente. teste = %d\n", index);
  244.                     ///TESTE
  245.                    
  246.                     indexDist=findNode(hDist_tree,symbol,0);
  247.                        printf("<<Index de entrada %d\n",indexDist);
  248.                        indexDist=bitsAddicionaisHDIST(indexDist);
  249.                     printf("*******************************************INDEX HDIST->  %d\n",indexDist);
  250.                    
  251.                    } while(indexDist<=0);
  252.                    
  253.                    
  254.                    
  255.                    
  256.                    
  257.                    
  258.                    
  259.                    
  260.                 }else if(index>=265 && index<=268){
  261.                      recua=index-254+(index-265);
  262.                      /// LER 1 BIT ADICIONAL
  263.                     printf("=====RECUA %d + 1 bit adicional\n",recua);
  264.                     if(availBits < 1) {
  265.                         fread(&byte, 1, 1, gzFile);
  266.                         rb = byte << availBits | rb;
  267.                         availBits += 8;
  268.                     }
  269.                     for(int i=0; i<1; i++){
  270.                         bitLido=(rb & 0x01);
  271.                         rb = rb >> 1;
  272.                         availBits -=1;
  273.                        printf("Bit extra-> %d\n",bitLido);
  274.                         if(bitLido==1) {
  275.                            
  276.                             recua += pow(2.0, i);
  277.                         }
  278.                    
  279.                     }
  280.                     //// LER CODIGO DA ARVORE HDIST
  281.                    
  282.                    
  283.                    
  284.                     do{
  285.                         if (availBits < needBits) {
  286.                             //printf("A ler um byte...\n");
  287.                             fread(&byte, 1, 1, gzFile);
  288.                             availBits = 8;
  289.                         }
  290.                        
  291.                         rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  292.                        
  293.                         byte = byte >> 1; // discarda um bit já lido
  294.                        
  295.                         //printf("symbol int: %d\n", rb);
  296.                        
  297.                         symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  298.                         printf("symbol[%d] = %c\n", k, symbol[k]);
  299.                         i++;
  300.                         k++;
  301.                         availBits--;
  302.                         // anda um bit para a frente a partir da root da árvore hLit
  303.                         //index = nextNode(hLit_tree, rb);
  304.                         //printf("andou um nó para a frente. teste = %d\n", index);
  305.                         ///TESTE
  306.                        
  307.                         indexDist=findNode(hDist_tree,symbol,0);
  308.                         printf("<<Index de entrada %d\n",indexDist);
  309.                         indexDist=bitsAddicionaisHDIST(indexDist);
  310.                        printf("*******************************************=======INDEX HDIST->  %d\n",indexDist);
  311.                        
  312.                     } while(indexDist<=0);
  313.                    
  314.                    
  315.                 }else if(index>=269 && index<=272){
  316.                     recua=index-250+(index-269)*3;
  317.                     //LER 2 BITS ADICIONAIS
  318.                     printf("=====RECUA %d + 2 bits adicional\n",recua);
  319.                     if(availBits < 1) {
  320.                         fread(&byte, 1, 1, gzFile);
  321.                         rb = byte << availBits | rb;
  322.                         availBits += 8;
  323.                     }
  324.                     for(int i=0; i<2; i++){
  325.                         bitLido=(rb & 0x01);
  326.                         rb = rb >> 1;
  327.                         availBits -=1;
  328.                         printf("Bit extra-> %d\n",bitLido);
  329.                         if(bitLido==1) {
  330.                             //ca = '1';
  331.                             recua += pow(2.0, i);
  332.                         }
  333.                     }
  334.                     //// LER CODIGO DA ARVORE HDIST
  335.                    
  336.                    
  337.                    
  338.                    
  339.                    
  340.                     do{
  341.                         if (availBits < needBits) {
  342.                             //printf("A ler um byte...\n");
  343.                             fread(&byte, 1, 1, gzFile);
  344.                             availBits = 8;
  345.                         }
  346.                        
  347.                         rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  348.                        
  349.                         byte = byte >> 1; // discarda um bit já lido
  350.                        
  351.                         //printf("symbol int: %d\n", rb);
  352.                        
  353.                         symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  354.                         printf("symbol[%d] = %c\n", k, symbol[k]);
  355.                         i++;
  356.                         k++;
  357.                         availBits--;
  358.                         // anda um bit para a frente a partir da root da árvore hLit
  359.                         //index = nextNode(hLit_tree, rb);
  360.                         //printf("andou um nó para a frente. teste = %d\n", index);
  361.                         ///TESTE
  362.                        
  363.                        indexDist=findNode(hDist_tree,symbol,1);
  364.                         printf("<<Index de entrada %d\n",indexDist);
  365.                         indexDist=bitsAddicionaisHDIST(indexDist);
  366.                         printf("*******************************************=======INDEX HDIST->  %d\n",indexDist);
  367.                        
  368.                     } while(indexDist<0);
  369.                    
  370.                    
  371.                    
  372.                    
  373.                    
  374.                 } else if(index>=273 && index<=276){
  375.                     recua=index-238+(index-273)*7;
  376.                     //LER 3 BITS ADICIONAIS
  377.                     printf("=====RECUA %d + 3 bits adicional\n",recua);
  378.                     if(availBits < 3) {
  379.                         fread(&byte, 1, 1, gzFile);
  380.                         rb = byte << availBits | rb;
  381.                         availBits += 8;
  382.                     }
  383.                     for(int i=0; i<3; i++){
  384.                         bitLido=(rb & 0x01);
  385.                         rb = rb >> 1;
  386.                         availBits -=1;
  387.                        printf("Bit extra-> %d\n",bitLido);
  388.                         if(bitLido==1) {
  389.                            // ca = '1';
  390.                             recua += pow(2.0, i);
  391.                         }
  392.                    
  393.                     }
  394.                     //// LER CODIGO DA ARVORE HDIST
  395.                    
  396.                    
  397.                    
  398.                    do{
  399.                         if (availBits < needBits) {
  400.                             //printf("A ler um byte...\n");
  401.                             fread(&byte, 1, 1, gzFile);
  402.                             availBits = 8;
  403.                         }
  404.                        
  405.                         rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  406.                        
  407.                         byte = byte >> 1; // discarda um bit já lido
  408.                        
  409.                         //printf("symbol int: %d\n", rb);
  410.                        
  411.                         symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  412.                         printf("symbol[%d] = %c\n", k, symbol[k]);
  413.                         i++;
  414.                         k++;
  415.                         availBits--;
  416.                         // anda um bit para a frente a partir da root da árvore hLit
  417.                         //index = nextNode(hLit_tree, rb);
  418.                         //printf("andou um nó para a frente. teste = %d\n", index);
  419.                         ///TESTE
  420.                        
  421.                         indexDist=findNode(hDist_tree,symbol,1);
  422.                        printf("<<Index de entrada %d\n",indexDist);
  423.                        indexDist=bitsAddicionaisHDIST(indexDist);
  424.                         printf("*******************************************=======INDEX HDIST->  %d\n",indexDist);
  425.                        
  426.                    } while(indexDist<0);
  427.                    
  428.                 }else if(index>=277 && index<=280){
  429.                     recua=index-210+(index-277)*15;
  430.                     //LER 4 BITS ADICIONAIS
  431.                     printf("=====RECUA %d + 4 bits adicional\n",recua);
  432.                     if(availBits < 1) {
  433.                         fread(&byte, 1, 1, gzFile);
  434.                         rb = byte << availBits | rb;
  435.                         availBits += 8;
  436.                     }
  437.                     for(int i=0; i<4; i++){
  438.                         bitLido=(rb & 0x01);
  439.                         rb = rb >> 1;
  440.                         availBits -=1;
  441.                         printf("Bit extra-> %d\n",bitLido);
  442.                         if(bitLido==1) {
  443.                            // ca = '1';
  444.                             recua += pow(2.0, i);
  445.                         }
  446.                    
  447.                    
  448.                     }
  449.                     //// LER CODIGO DA ARVORE HDIST
  450.                    
  451.                    
  452.                     do{
  453.                         if (availBits < needBits) {
  454.                             //printf("A ler um byte...\n");
  455.                             fread(&byte, 1, 1, gzFile);
  456.                             availBits = 8;
  457.                         }
  458.                        
  459.                         rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  460.                        
  461.                         byte = byte >> 1; // discarda um bit já lido
  462.                        
  463.                         //printf("symbol int: %d\n", rb);
  464.                        
  465.                         symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  466.                         printf("symbol[%d] = %c\n", k, symbol[k]);
  467.                         i++;
  468.                         k++;
  469.                         availBits--;
  470.                         // anda um bit para a frente a partir da root da árvore hLit
  471.                         //index = nextNode(hLit_tree, rb);
  472.                         //printf("andou um nó para a frente. teste = %d\n", index);
  473.                         ///TESTE
  474.                        
  475.                         indexDist=findNode(hDist_tree,symbol,1);
  476.                         printf("<<Index de entrada %d\n",indexDist);
  477.                         indexDist=bitsAddicionaisHDIST(indexDist);
  478.                         printf("*******************************************=======INDEX HDIST->  %d\n",indexDist);
  479.                        
  480.                     } while(indexDist<0);
  481.                    
  482.                    
  483.                 }else if(index>=281 && index<=284){
  484.                     recua=index-150+(index-281)*31;
  485.                     //LER 5 BITS ADICIONAIS
  486.                     printf("=====RECUA %d + 5 bits adicional\n",recua);
  487.                     if(availBits < 1) {
  488.                         fread(&byte, 1, 1, gzFile);
  489.                         rb = byte << availBits | rb;
  490.                         availBits += 8;
  491.                     }
  492.                     for(int i=0; i<5; i++){
  493.                         bitLido=(rb & 0x01);
  494.                         rb = rb >> 1;
  495.                         availBits -=1;
  496.                         printf("Bit extra-> %d\n",bitLido);
  497.                         if(bitLido==1) {
  498.                            // ca = '1';
  499.                             recua += pow(2.0, i);
  500.                         }
  501.                    
  502.                    
  503.                     }
  504.                     //// LER CODIGO DA ARVORE HDIST
  505.                    
  506.                    
  507.                    
  508.                    
  509.                     do{
  510.                         if (availBits < needBits) {
  511.                             //printf("A ler um byte...\n");
  512.                             fread(&byte, 1, 1, gzFile);
  513.                             availBits = 8;
  514.                         }
  515.                        
  516.                         rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  517.                        
  518.                         byte = byte >> 1; // discarda um bit já lido
  519.                        
  520.                         //printf("symbol int: %d\n", rb);
  521.                        
  522.                         symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  523.                         printf("symbol[%d] = %c\n", k, symbol[k]);
  524.                         i++;
  525.                         k++;
  526.                         availBits--;
  527.                         // anda um bit para a frente a partir da root da árvore hLit
  528.                         //index = nextNode(hLit_tree, rb);
  529.                         //printf("andou um nó para a frente. teste = %d\n", index);
  530.                         ///TESTE
  531.                        
  532.                         indexDist=findNode(hDist_tree,symbol,1);
  533.                         printf("<<Index de entrada %d\n",indexDist);
  534.                         indexDist=bitsAddicionaisHDIST(indexDist);
  535.                        printf("*******************************************=======INDEX HDIST->  %d\n",indexDist);
  536.                        
  537.                        
  538.                        
  539.                        
  540.                        
  541.                     } while(indexDist<0);
  542.                    
  543.                    
  544.                 }
  545.                 else if(index==285){
  546.                     recua=258;
  547.                     printf("=====RECUA %d + 0 bits adicional\n",recua);
  548.                     //// LER CODIGO DA ARVORE HDIST
  549.                    
  550.                    
  551.                     do{
  552.                         if (availBits < needBits) {
  553.                             //printf("A ler um byte...\n");
  554.                             fread(&byte, 1, 1, gzFile);
  555.                             availBits = 8;
  556.                         }
  557.                        
  558.                         rb = byte & 0x01; // guarda apenas o bit maissignificativo (o da direita) -------------------------------------------------->>> ATENÇÃO !!!! Aqui também é para ler da direita para a esquerda? Vamos descobrir
  559.                        
  560.                         byte = byte >> 1; // discarda um bit já lido
  561.                        
  562.                         //printf("symbol int: %d\n", rb);
  563.                        
  564.                         symbol[k] = rb+ '0'; // vai guardando todos os bits lidos
  565.                         printf("symbol[%d] = %c\n", k, symbol[k]);
  566.                         i++;
  567.                         k++;
  568.                         availBits--;
  569.                         // anda um bit para a frente a partir da root da árvore hLit
  570.                         //index = nextNode(hLit_tree, rb);
  571.                         //printf("andou um nó para a frente. teste = %d\n", index);
  572.                         ///TESTE
  573.                        
  574.                         indexDist=findNode(hDist_tree,symbol,1);
  575.                         printf("<<Index de entrada %d\n",indexDist);
  576.                         indexDist=bitsAddicionaisHDIST(indexDist);
  577.                        printf("*******************************************=======INDEX HDIST->  %d\n",indexDist);
  578.                        
  579.                        
  580.                     } while(indexDist<0);
  581.                    
  582.                    
  583.                 }
  584.                    
  585.                     printf("=====>>>>>>>>>>>>RECUA FINAL %d \n",recua);
  586.                
  587.                
  588.                
  589.                
  590.                
  591.                
  592.                
  593.             }
  594.            
  595.             else if (index == -1) {
  596.                 printf("Este nó não existe\n");
  597.                 printf("STRING : %s",symbol);
  598.                 break;
  599.             }
  600.            
  601.             else { //index == -2
  602.                 printf("(NODE)Continues searching \n");
  603.                 printf("STRING : %s\n",symbol);
  604.                 continue; // ainda nao se encontrou uma folha!
  605.             }
  606.            
  607.            
  608.            
  609.         }while(index!=256);
  610.        
  611.        
  612.        
  613.        
  614.         //actualizar numero de blocos analisados
  615.         numBlocks++;
  616.     } while(BFINAL == 0);
  617.    
  618.     //terminações
  619.     fclose(gzFile);
  620.     printf("End: %d bloco(s) analisado(s).\n", numBlocks);
  621.    
  622.    
  623.     //teste da função bits2String: RETIRAR antes de criar o executável final
  624.     char str[9];
  625.     bits2String(str, 0x03);
  626.     printf("%s\n", str);
  627.    
  628.    
  629.     //RETIRAR antes de criar o executável final-
  630.     system("PAUSE");
  631.     return EXIT_SUCCESS;
  632. } // ________________________________________________________________________________________________
  633. int bitsAddicionaisHDIST(int index){
  634.     int num=index;
  635.     int bitLido;
  636.     if(index>=0 && index<=3){
  637.         num=index+1;
  638.        
  639.        
  640.     }else if(index>=4 && index<=5){
  641.         num=index+1+(index-4);
  642.         // LER 1 BITS ADICIONAIS
  643.         if(availBits < 1) {
  644.             fread(&byte, 1, 1, gzFile);
  645.             rb = byte << availBits | rb;
  646.             availBits += 8;
  647.         }
  648.         for(int i=0; i<1; i++){
  649.             bitLido=(rb & 0x01);
  650.             rb = rb >> 1;
  651.             availBits -=1;
  652.             printf("<<Bit extra-> %d\n",bitLido);
  653.             if(bitLido==1) {
  654.                 // ca = '1';
  655.                 num += pow(2.0, i);
  656.             }
  657.            
  658.            
  659.         }
  660.        
  661.     }else if(index>=6 && index<=7){
  662.         num=index+3+(index-6)*3;
  663.         // LER 2 BITS ADICIONAIS
  664.         if(availBits < 1) {
  665.             fread(&byte, 1, 1, gzFile);
  666.             rb = byte << availBits | rb;
  667.             availBits += 8;
  668.         }
  669.         for(int i=0; i<2; i++){
  670.             bitLido=(rb & 0x01);
  671.             rb = rb >> 1;
  672.             availBits -=1;
  673.             printf("<<Bit extra-> %d\n",bitLido);
  674.             if(bitLido==1) {
  675.                 // ca = '1';
  676.                 num += pow(2.0, i);
  677.             }
  678.            
  679.            
  680.         }
  681.            
  682.     }else if(index>=8 && index<=9){
  683.         num=index+9+(index-8)*7;
  684.         // LER 3 BITS ADICIONAIS
  685.         if(availBits < 1) {
  686.             fread(&byte, 1, 1, gzFile);
  687.             rb = byte << availBits | rb;
  688.             availBits += 8;
  689.         }
  690.         for(int i=0; i<3; i++){
  691.             bitLido=(rb & 0x01);
  692.             rb = rb >> 1;
  693.             availBits -=1;
  694.             printf("<<Bit extra-> %d\n",bitLido);
  695.             if(bitLido==1) {
  696.                 // ca = '1';
  697.                 num += pow(2.0, i);
  698.             }
  699.            
  700.            
  701.         }
  702.        
  703.     }else if(index>=10 && index<=11){
  704.         num=index+23+(index-10)*15;
  705.         // LER 4 BITS ADICIONAIS
  706.         if(availBits < 1) {
  707.             fread(&byte, 1, 1, gzFile);
  708.             rb = byte << availBits | rb;
  709.             availBits += 8;
  710.         }
  711.         for(int i=0; i<4; i++){
  712.             bitLido=(rb & 0x01);
  713.             rb = rb >> 1;
  714.             availBits -=1;
  715.             printf("<<Bit extra-> %d\n",bitLido);
  716.             if(bitLido==1) {
  717.                 // ca = '1';
  718.                 num += pow(2.0, i);
  719.             }
  720.            
  721.            
  722.         }
  723.        
  724.     }else if(index>=12 && index<=13){
  725.         num=index+53+(index-12)*31;
  726.         // LER 5 BITS ADICIONAIS
  727.         if(availBits < 1) {
  728.             fread(&byte, 1, 1, gzFile);
  729.             rb = byte << availBits | rb;
  730.             availBits += 8;
  731.         }
  732.         for(int i=0; i<5; i++){
  733.             bitLido=(rb & 0x01);
  734.             rb = rb >> 1;
  735.             availBits -=1;
  736.             printf("<<Bit extra-> %d\n",bitLido);
  737.             if(bitLido==1) {
  738.                 // ca = '1';
  739.                 num += pow(2.0, i);
  740.             }
  741.            
  742.            
  743.         }
  744.        
  745.     }else if(index>=14 && index<=15){
  746.         num=index+115+(index-14)*62;
  747.         // LER 6 BITS ADICIONAIS
  748.         if(availBits < 1) {
  749.             fread(&byte, 1, 1, gzFile);
  750.             rb = byte << availBits | rb;
  751.             availBits += 8;
  752.         }
  753.         for(int i=0; i<6; i++){
  754.             bitLido=(rb & 0x01);
  755.             rb = rb >> 1;
  756.             availBits -=1;
  757.             printf("<<Bit extra-> %d\n",bitLido);
  758.             if(bitLido==1) {
  759.                 // ca = '1';
  760.                 num += pow(2.0, i);
  761.             }
  762.            
  763.            
  764.         }
  765.     }else if(index>=16 && index<=17){
  766.         num=index+241+(index-16)*127;
  767.         // LER 7 BITS ADICIONAIS
  768.         if(availBits < 1) {
  769.             fread(&byte, 1, 1, gzFile);
  770.             rb = byte << availBits | rb;
  771.             availBits += 8;
  772.         }
  773.         for(int i=0; i<7; i++){
  774.             bitLido=(rb & 0x01);
  775.             rb = rb >> 1;
  776.             availBits -=1;
  777.             printf("<<Bit extra-> %d\n",bitLido);
  778.             if(bitLido==1) {
  779.                 // ca = '1';
  780.                 num += pow(2.0, i);
  781.             }
  782.            
  783.            
  784.         }
  785.        
  786.     }else if(index>=18 && index<=19){
  787.         num=index+495+(index-18)*255;
  788.         // LER 8 BITS ADICIONAIS
  789.         if(availBits < 1) {
  790.             fread(&byte, 1, 1, gzFile);
  791.             rb = byte << availBits | rb;
  792.             availBits += 8;
  793.         }
  794.         for(int i=0; i<8; i++){
  795.             bitLido=(rb & 0x01);
  796.             rb = rb >> 1;
  797.             availBits -=1;
  798.             printf("<<Bit extra-> %d\n",bitLido);
  799.             if(bitLido==1) {
  800.                 // ca = '1';
  801.                 num += pow(2.0, i);
  802.             }
  803.            
  804.            
  805.         }
  806.        
  807.     }else if(index>=20 && index<=21){
  808.         num=index+1005+(index-20)*511;
  809.         // LER 9 BITS ADICIONAIS
  810.         if(availBits < 1) {
  811.             fread(&byte, 1, 1, gzFile);
  812.             rb = byte << availBits | rb;
  813.             availBits += 8;
  814.         }
  815.         for(int i=0; i<9; i++){
  816.             bitLido=(rb & 0x01);
  817.             rb = rb >> 1;
  818.             availBits -=1;
  819.             printf("<<Bit extra-> %d\n",bitLido);
  820.             if(bitLido==1) {
  821.                 // ca = '1';
  822.                 num += pow(2.0, i);
  823.             }
  824.            
  825.            
  826.         }
  827.        
  828.     }else if(index>=22 && index<=23){
  829.         num=index+2027+(index-22)*1023;
  830.         // LER 10 BITS ADICIONAIS
  831.         if(availBits < 1) {
  832.             fread(&byte, 1, 1, gzFile);
  833.             rb = byte << availBits | rb;
  834.             availBits += 8;
  835.         }
  836.         for(int i=0; i<10; i++){
  837.             bitLido=(rb & 0x01);
  838.             rb = rb >> 1;
  839.             availBits -=1;
  840.             printf("<<Bit extra-> %d\n",bitLido);
  841.             if(bitLido==1) {
  842.                 // ca = '1';
  843.                 num += pow(2.0, i);
  844.             }
  845.            
  846.            
  847.         }
  848.        
  849.     }else if(index>=24 && index<=25){
  850.         num=index+4073+(index-24)*2047;
  851.         // LER 11 BITS ADICIONAIS
  852.         if(availBits < 1) {
  853.             fread(&byte, 1, 1, gzFile);
  854.             rb = byte << availBits | rb;
  855.             availBits += 8;
  856.         }
  857.         for(int i=0; i<11; i++){
  858.             bitLido=(rb & 0x01);
  859.             rb = rb >> 1;
  860.             availBits -=1;
  861.             printf("<<Bit extra-> %d\n",bitLido);
  862.             if(bitLido==1) {
  863.                 // ca = '1';
  864.                 num += pow(2.0, i);
  865.             }
  866.            
  867.            
  868.         }
  869.        
  870.     }else if(index>=26 && index<=27){
  871.         num=index+8167+(index-26)*4095;
  872.         // LER 12 BITS ADICIONAIS
  873.         if(availBits < 1) {
  874.             fread(&byte, 1, 1, gzFile);
  875.             rb = byte << availBits | rb;
  876.             availBits += 8;
  877.         }
  878.         for(int i=0; i<12; i++){
  879.             bitLido=(rb & 0x01);
  880.             rb = rb >> 1;
  881.             availBits -=1;
  882.             printf("<<Bit extra-> %d\n",bitLido);
  883.             if(bitLido==1) {
  884.                 // ca = '1';
  885.                 num += pow(2.0, i);
  886.             }
  887.            
  888.            
  889.         }
  890.        
  891.     }else if(index>=28 && index<=29){
  892.         num=index+16357+(index-28)*8191;
  893.         // LER 12 BITS ADICIONAIS
  894.         if(availBits < 1) {
  895.             fread(&byte, 1, 1, gzFile);
  896.             rb = byte << availBits | rb;
  897.             availBits += 8;
  898.         }
  899.         for(int i=0; i<12; i++){
  900.             bitLido=(rb & 0x01);
  901.             rb = rb >> 1;
  902.             availBits -=1;
  903.             printf("<<Bit extra-> %d\n",bitLido);
  904.             if(bitLido==1) {
  905.                 // ca = '1';
  906.                 num += pow(2.0, i);
  907.             }
  908.            
  909.            
  910.         }
  911.        
  912.     }
  913.     return num;
  914. }
  915.  
  916. int getNumberOfCodes(int necessaryBits, int exp){
  917.     int code = 0;
  918.     while (availBits < necessaryBits){
  919.         fread(&byte, 1, 1, gzFile);
  920.         rb = byte << availBits | rb;
  921.         availBits += 8;
  922.     }
  923.    
  924.    
  925.     code = rb & exp; //retirar últimos len(exp) bits
  926.     rb = rb >> necessaryBits;
  927.     availBits -= necessaryBits;
  928.    
  929.     return code;
  930. }
  931.  
  932.  
  933. // armazena num array os comprimentos dos codigos do "alfabeto de comprimentos de codigos"
  934. void lengthLengthAlfa(){
  935.    
  936.     int sequence [] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
  937.     int length = 0;
  938.     int codeLength []={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  939.    
  940.     hcLen+=4;
  941.    
  942.     printf("Comprimento dos codigos do 'alfabeto de comprimentos de codigos':\n\n");
  943.    
  944.     for(int i = 0 ;i < hcLen ; i++){
  945.         length = getNumberOfCodes(3,0x07); //0x07- 3 bits menos significativos
  946.         codeLength[sequence[i]] = length;
  947.         printf("index: %d -> comprimento: %d\n",sequence[i], codeLength[sequence[i]]);
  948.     }
  949.    
  950.     int n_codes = sizeof(codeLength) / sizeof(int);
  951.    
  952.     // gets the codes for the alphabet of code lengths
  953.     getHuffmanCodes(codeLength, n_codes, HCLen_tree);
  954. }
  955.  
  956.  
  957. // gets the codes for each symbol
  958. // lengths is an array with the lenghts for each symbol in the tree
  959. // n_codes is the size of lengths
  960. void getHuffmanCodes(int lengths [], int n_codes, HuffmanTree* tree) {
  961.    
  962.     int *codes = (int*)malloc(sizeof(int)*n_codes);
  963.    
  964.     // initializes all array values to 0
  965.     for (int i=0; i<n_codes; i++) {
  966.         codes[i] = 0;
  967.     }
  968.    
  969.     int maxBits=0;
  970.    
  971.     for (int i=0; i<n_codes; i++){
  972.         if(maxBits<=lengths[i]){
  973.             printf("        LENGHTS-> %d\n",lengths[i]);
  974.             maxBits=lengths[i];}
  975.     }
  976.     printf("MaxBits= %d\n", maxBits);
  977.    
  978.     char bl_count[maxBits+1];
  979.    
  980.     // gets the number of codes of each code length
  981.     for (int i=1; i<=maxBits; i++) {
  982.         int count=0;
  983.        
  984.         for (int j=0; j<n_codes; j++) {
  985.             if (lengths[j] == i)
  986.                 count++;
  987.         }
  988.        
  989.         bl_count[i] = count;
  990.         printf("bl_count[%d] = %d\n", i, bl_count[i]);
  991.     }
  992.    
  993.     int code = 0;
  994.    
  995.     bl_count[0] = 0; // bl_count[maxBits+1]
  996.    
  997.     int firstCode[maxBits];
  998.    
  999.     // calculates the first code for each code length
  1000.     for (int bits=1; bits<=maxBits; bits++) {
  1001.         code = (code + bl_count[bits-1]) << 1; //aplicar a formula
  1002.         firstCode[bits] = code; // primeiro codigo de cada comprimento
  1003.         printf("firstCode[%d] = %d\n", bits, firstCode[bits]);
  1004.     }
  1005.    
  1006.    
  1007.     // gets the codes for each symbol starting from the firstCode
  1008.     for (int i=1; i<=maxBits; i++) {
  1009.         int n = firstCode[i];
  1010.         for (int j = 0; j < n_codes; j++) {
  1011.             if(lengths[j]==i){
  1012.                 codes[j] = n;
  1013.                 n++;
  1014.             }
  1015.         }
  1016.     }
  1017.    
  1018.     for(int i=0; i<n_codes; i++)
  1019.         printf("codes[%d]= %d\n", i, codes[i]);
  1020.    
  1021.     char binario [n_codes];
  1022.    
  1023.     for (int i=0; i<n_codes; i++){
  1024.         if(lengths[i]>0){
  1025.             printf("LENGHTS-> %d\n",lengths[i]);
  1026.             char s [lengths[i]];
  1027.             int temp=codes[i];
  1028.             int bin;
  1029.             printf("%d -> codigo %d: ",i, codes[i]);
  1030.             for(int j=0; j<lengths[i];j++) {
  1031.                 bin = temp % 2;
  1032.                 temp = temp / 2;
  1033.                
  1034.                 if (bin == 1) {
  1035.                     s[lengths[i]-1 - j] = '1';
  1036.                    
  1037.                 }
  1038.                 else {
  1039.                     s[lengths[i]-1 - j] = '0';
  1040.                 }
  1041.             }
  1042.             s[lengths[i]]='\0';
  1043.             printf("%s\n", s);
  1044.             addNode(tree,s,i,1);
  1045.            
  1046.         }
  1047.        
  1048.     }
  1049. }
  1050.  
  1051.  
  1052. //gets the lengths of the codes
  1053. void checkaNaArvore(int *lengths, int size){
  1054.    
  1055.     int unsigned bitLido;
  1056.     int resultado;
  1057.     int resultado_ant;
  1058.     int index=0;
  1059.    
  1060.     while(true) {
  1061.         if (index >= size){
  1062.             break;
  1063.         }
  1064.         if(availBits < 1) {
  1065.             fread(&byte, 1, 1, gzFile);
  1066.            
  1067.             rb = byte << availBits | rb;
  1068.             availBits += 8;
  1069.         }
  1070.        
  1071.         bitLido=(rb & 0x01);
  1072.         //printf("\nbitlido=%d",bitLido);
  1073.         rb = rb >> 1;
  1074.         availBits -=1;
  1075.         //printf("BITS-> %d\n",availBits);
  1076.         char ca;
  1077.         if(bitLido==1)
  1078.             ca='1';
  1079.         else
  1080.             ca='0';
  1081.        
  1082.         resultado=nextNode(HCLen_tree, ca);
  1083.        
  1084.         if(resultado==-2){
  1085.             continue;
  1086.         }
  1087.        
  1088.         else if(resultado==-1){
  1089.             printf("deu bosta");
  1090.             break;
  1091.         }
  1092.        
  1093.         else{
  1094.             int acum;
  1095.             if(resultado!=16)
  1096.                 resultado_ant=resultado;
  1097.             //printf("\nresultado=%d",resultado);
  1098.             if(resultado==16){
  1099.                 acum=3;
  1100.                 //printf("\nresultado anterior: %d",resultado_ant);
  1101.                 if(availBits < 2) {
  1102.                     fread(&byte, 1, 1, gzFile);
  1103.                     rb = byte << availBits | rb;
  1104.                     availBits += 8;
  1105.                 }
  1106.                 for(int i=0; i<2; i++){
  1107.                     bitLido=(rb & 0x01);
  1108.                     rb = rb >> 1;
  1109.                     availBits -=1;
  1110.                     if(bitLido==1) {
  1111.                         ca = '1';
  1112.                         acum+=pow(2.0,i);//
  1113.                     }
  1114.                     else
  1115.                         ca='0';
  1116.                     //printf("\ndepois do 16: %c",ca);
  1117.                 }
  1118.                 //printf("\nRepete o 16 %d vezes",acum);
  1119.                 for(int i=0; i<acum; i++){
  1120.                     //printf("\n%d",index);
  1121.                     lengths[index]=resultado_ant;
  1122.                     index++;
  1123.                    
  1124.                 }
  1125.             }
  1126.             else if(resultado==17){
  1127.                 acum=3;
  1128.                 if(availBits < 3) {
  1129.                     fread(&byte, 1, 1, gzFile);
  1130.                     rb = byte << availBits | rb;
  1131.                     availBits += 8;
  1132.                 }
  1133.                 for(int i=0; i<3; i++){
  1134.                     bitLido=(rb & 0x01);
  1135.                     rb = rb >> 1;
  1136.                     availBits -=1;
  1137.                     printf("BITS-> %d\n",availBits);
  1138.                     if(bitLido==1) {
  1139.                         ca = '1';
  1140.                         acum += pow(2.0, i);
  1141.                     }
  1142.                     else
  1143.                         ca='0';
  1144.                     //printf("\ndepois do 17: %c",ca);
  1145.                 }
  1146.                 //printf("\nRepete o 17 %d vezes",acum);
  1147.                 for(int i=0; i<acum; i++){
  1148.                     //printf("\n%d",index);
  1149.                     lengths[index]=0;
  1150.                     index++;
  1151.                    
  1152.                 }
  1153.             }
  1154.             else if(resultado==18){
  1155.                 acum=11;
  1156.                 if(availBits < 7) {
  1157.                     fread(&byte, 1, 1, gzFile);
  1158.                     rb = byte << availBits | rb;
  1159.                     availBits += 8;
  1160.                 }
  1161.                 for(int i=0; i<7; i++){
  1162.                     bitLido=(rb & 0x01);
  1163.                     rb = rb >> 1;
  1164.                     availBits -=1;
  1165.                     printf("BITS-> %d\n",availBits);
  1166.                     if(bitLido==1) {
  1167.                         ca = '1';
  1168.                         acum += pow(2.0, i);
  1169.                     }
  1170.                     else
  1171.                         ca='0';
  1172.                     //printf("\ndepois do 18: %c",ca);
  1173.                 }
  1174.                 //printf("\nRepete o 18 %d vezes",acum);
  1175.                 for(int i=0; i<acum; i++){
  1176.                     //printf("\n%d",index);
  1177.                     lengths[index]=0;
  1178.                     index++;
  1179.                    
  1180.                 }
  1181.             }
  1182.             else {
  1183.                 //printf("\n%d",index);
  1184.                 lengths[index] = resultado;
  1185.                 index++;
  1186.             }
  1187.         }
  1188.     }
  1189. }
  1190.  
  1191.  
  1192.  
  1193. int isDynamicHuffman(unsigned char rb)
  1194. {
  1195.     unsigned char BTYPE = rb & 0x03;
  1196.    
  1197.     if (BTYPE == 0) //--> sem compress�o
  1198.     {
  1199.         printf("Ignorando bloco: sem compactacao!!!\n");
  1200.         return 0;
  1201.     }
  1202.     else if (BTYPE == 1)
  1203.     {
  1204.         printf("Ignorando bloco: compactado com Huffman fixo!!!\n");
  1205.         return 0;
  1206.     }
  1207.     else if (BTYPE == 3)
  1208.     {
  1209.         printf("Ignorando bloco: BTYPE = reservado!!!\n");
  1210.         return 0;
  1211.     }
  1212.     else
  1213.         return 1;
  1214. }
  1215.  
  1216. //Le o cabecalho do ficheiro gzip: devolve erro (-1) se o formato for inválido, ou devolve 0 se ok
  1217. int getHeader(FILE *gzFile, gzipHeader *gzh) //obtem cabecalho
  1218. {
  1219.     unsigned char byte;
  1220.    
  1221.     //Identificacao 1 e 2: valores fixos
  1222.     fread(&byte, 1, 1, gzFile);
  1223.     (*gzh).ID1 = byte;
  1224.     if ((*gzh).ID1 != 0x1f) return -1; //erro no cabecalho
  1225.    
  1226.     fread(&byte, 1, 1, gzFile);
  1227.     (*gzh).ID2 = byte;
  1228.     if ((*gzh).ID2 != 0x8b) return -1; //erro no cabe�alho
  1229.    
  1230.     //Método de compress�o (deve ser 8 para denotar o deflate)
  1231.     fread(&byte, 1, 1, gzFile);
  1232.     (*gzh).CM = byte;
  1233.     if ((*gzh).CM != 0x08) return -1; //erro no cabe�alho
  1234.    
  1235.     //Flags
  1236.     fread(&byte, 1, 1, gzFile);
  1237.     unsigned char FLG = byte;
  1238.    
  1239.     //MTIME
  1240.     char lenMTIME = 4;
  1241.     fread(&byte, 1, 1, gzFile);
  1242.     (*gzh).MTIME = byte;
  1243.     for (int i = 1; i <= lenMTIME - 1; i++)
  1244.     {
  1245.         fread(&byte, 1, 1, gzFile);
  1246.         (*gzh).MTIME = (byte << 8) + (*gzh).MTIME;
  1247.     }
  1248.    
  1249.     //XFL (not processed...)
  1250.     fread(&byte, 1, 1, gzFile);
  1251.     (*gzh).XFL = byte;
  1252.    
  1253.     //OS (not processed...)
  1254.     fread(&byte, 1, 1, gzFile);
  1255.     (*gzh).OS = byte;
  1256.    
  1257.     //--- Check Flags
  1258.     (*gzh).FLG_FTEXT = (char)(FLG & 0x01);
  1259.     (*gzh).FLG_FHCRC = (char)((FLG & 0x02) >> 1);
  1260.     (*gzh).FLG_FEXTRA = (char)((FLG & 0x04) >> 2);
  1261.     (*gzh).FLG_FNAME = (char)((FLG & 0x08) >> 3);
  1262.     (*gzh).FLG_FCOMMENT = (char)((FLG & 0x10) >> 4);
  1263.    
  1264.     //FLG_EXTRA
  1265.     if ((*gzh).FLG_FEXTRA == 1)
  1266.     {
  1267.         //ler 2 bytes XLEN + XLEN bytes de extra field
  1268.         //1� byte: LSB, 2�: MSB
  1269.         char lenXLEN = 2;
  1270.        
  1271.         fread(&byte, 1, 1, gzFile);
  1272.         (*gzh).xlen = byte;
  1273.         fread(&byte, 1, 1, gzFile);
  1274.         (*gzh).xlen = (byte << 8) + (*gzh).xlen;
  1275.        
  1276.         (*gzh).extraField = new unsigned char[(*gzh).xlen];
  1277.        
  1278.         //ler extra field (deixado como est�, i.e., n�o processado...)
  1279.         for (int i = 0; i <= (*gzh).xlen - 1; i++)
  1280.         {
  1281.             fread(&byte, 1, 1, gzFile);
  1282.             (*gzh).extraField[i] = byte;
  1283.         }
  1284.     }
  1285.     else
  1286.     {
  1287.         (*gzh).xlen = 0;
  1288.         (*gzh).extraField = 0;
  1289.     }
  1290.    
  1291.     //FLG_FNAME: ler nome original
  1292.     if ((*gzh).FLG_FNAME == 1)
  1293.     {
  1294.         (*gzh).fName = new char[1024];
  1295.         unsigned int i = 0;
  1296.         do
  1297.         {
  1298.             fread(&byte, 1, 1, gzFile);
  1299.             if (i <= 1023)  //guarda no m�ximo 1024 caracteres no array
  1300.                 (*gzh).fName[i] = byte;
  1301.             i++;
  1302.         }while(byte != 0);
  1303.         if (i > 1023)
  1304.             (*gzh).fName[1023] = 0;  //apesar de nome incompleto, garantir que o array termina em 0
  1305.     }
  1306.     else
  1307.         (*gzh).fName = 0;
  1308.    
  1309.     //FLG_FCOMMENT: ler coment�rio
  1310.     if ((*gzh).FLG_FCOMMENT == 1)
  1311.     {
  1312.         (*gzh).fComment = new char[1024];
  1313.         unsigned int i = 0;
  1314.         do
  1315.         {
  1316.             fread(&byte, 1, 1, gzFile);
  1317.             if (i <= 1023)  //guarda no m�ximo 1024 caracteres no array
  1318.                 (*gzh).fComment[i] = byte;
  1319.             i++;
  1320.         }while(byte != 0);
  1321.         if (i > 1023)
  1322.             (*gzh).fComment[1023] = 0;  //apesar de coment�rio incompleto, garantir que o array termina em 0
  1323.     }
  1324.     else
  1325.         (*gzh).fComment = 0;
  1326.    
  1327.    
  1328.     //FLG_FHCRC (not processed...)
  1329.     if ((*gzh).FLG_FHCRC == 1)
  1330.     {
  1331.         (*gzh).HCRC = new unsigned char[2];
  1332.         fread(&byte, 1, 1, gzFile);
  1333.         (*gzh).HCRC[0] = byte;
  1334.         fread(&byte, 1, 1, gzFile);
  1335.         (*gzh).HCRC[1] = byte;
  1336.     }
  1337.     else
  1338.         (*gzh).HCRC = 0;
  1339.    
  1340.     return 0;
  1341. }
  1342.  
  1343. long getOrigFileSize(FILE * gzFile)
  1344. {
  1345.     //salvaguarda posi��o actual do ficheiro
  1346.     long fp = ftell(gzFile);
  1347.    
  1348.     //�ltimos 4 bytes = ISIZE;
  1349.     fseek(gzFile, -4, SEEK_END);
  1350.    
  1351.     //determina ISIZE (s� correcto se cabe em 32 bits)
  1352.     unsigned long sz = 0;
  1353.     unsigned char byte;
  1354.     fread(&byte, 1, 1, gzFile);
  1355.     sz = byte;
  1356.     for (int i = 0; i <= 2; i++)
  1357.     {
  1358.         fread(&byte, 1, 1, gzFile);
  1359.         sz = (byte << 8*(i+1)) + sz;
  1360.     }
  1361.    
  1362.    
  1363.     //restaura file pointer
  1364.     fseek(gzFile, fp, SEEK_SET);
  1365.    
  1366.     return sz;
  1367. }
  1368. void bits2String(char *strBits, unsigned char byte)
  1369. {
  1370.     char mask = 0x01;  //get LSbit
  1371.    
  1372.     strBits[8] = 0;
  1373.     for (char bit, i = 7; i >= 0; i--)
  1374.     {
  1375.         bit = byte & mask;
  1376.         strBits[i] = bit +48; //converter valor numérico para o caracter alfanumérico correspondente
  1377.         byte = byte >> 1;
  1378.     }
  1379. }
  1380.  
  1381.  
  1382. unsigned int_to_int(unsigned k) {
  1383.     if (k == 0) return 0;
  1384.     if (k == 1) return 1;                       /* optional */
  1385.     return (k % 2) + 10 * int_to_int(k / 2);
  1386. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement