#include #include "libdados.h" #include "huffman.h" int main() { char cmd[150]; /* Comando diff arq1 arq2 */ char in[150]; /* Nome do arquivo de entrada */ char out[150]; /* Nome do arquivo de saida */ char cod[150]; /* Nome do arquivo-codigo de Huffman */ char acao[10]; /* Acao a ser tomada conforme indicado na entrada */ int i; /* Numero do heap desejado */ int c; /* Chave a ser inserida no heap */ Heap h[10]; /* array de heaps */ /* ------------------------------------------------------------ VÁLIDO APENAS PARA LINUX Declarações para verificação do uso da memória dinâmica. A variável 'lixo' está sendo usada apenas para contornar um problema do funcionamento das funções da biblioteca 'malloc': a memória por ela apontada é desalocada logo a seguir! ------------------------------------------------------------ */ void *lixo = malloc(1); /* truque: variável auxiliar */ struct mallinfo info; int MemDinInicial, MemDinFinal; free(lixo); /* truque */ info = mallinfo(); MemDinInicial = info.uordblks; /* ------------------------------------------------------- */ /* Executa o teste */ for(i=0; i<10; i++) h[i].n = -1; fscanf(stdin,"%s",acao); while(strcmp(acao,"t")!=0) { switch(*acao) { case 'c': /* Cria heap i */ fscanf(stdin, "%d", &i); if ((i / 10) < 1) { if (!VazioHeap(&h[i])) DestroiHeap(&h[i]); CriaHeap(&h[i]); } else fprintf(stdout,"Indice invalido\n"); break; case 'd': /* Destroi heap i */ fscanf(stdin, "%d", &i); if ((i / 10) < 1) { DestroiHeap(&h[i]); } else fprintf(stdout,"Indice invalido\n"); break; case 'v': /* Verifica se o heap e vazio */ fscanf(stdin, "%d", &i); if ((i / 10) < 1) fprintf(stdout,"%d\n", VazioHeap(&h[i])); else fprintf(stdout,"Indice invalido\n"); break; case 'e': /* Extrai minimo do heap i */ fscanf(stdin, "%d", &i); if ((i / 10) < 1) { if (ExtraiMinOk(&h[i], &c, NULL)) fprintf (stdout,"%d\n", c); } else fprintf(stdout,"Indice invalido\n"); break; case 'i': /* insere chave no heap com info = NULL */ fscanf(stdin, "%d %d", &i, &c); if ((i / 10) < 1) { if (!InsereOk(&h[i], c, NULL)) fprintf(stdout, "Erro ao inserir valor\n"); } else fprintf(stdout,"Indice invalido\n"); break; case 'p': /* Imprime chaves do Heap */ fscanf(stdin, "%d", &i); if ((i / 10) < 1) { ImprimeChaves(h[i]); } else fprintf(stdout,"Indice invalido\n"); break; case 'z': /* Compacta arquivo */ fscanf(stdin, "%s %s %s", in, out, cod); Compacta(cod, in, out); break; case 'u': /* Descompacta arquivo */ fscanf(stdin, "%s %s %s", in, out, cod); Descompacta(cod, in, out); break; case '=': /* Compara dois arquivos */ fscanf(stdin, "%s %s", in, out); sprintf(cmd, "diff %s %s > NULL", in, out); c = system(cmd); if (c == 0) fprintf(stdout, "Arquivos IGUAIS\n"); else fprintf(stdout, "Arquivos DIFERENTES\n"); break; default: fprintf(stderr,"Ação %s inválida\n",acao); exit(-1); } fscanf(stdin,"%s",acao); } for (i=0; i<10; i++) DestroiHeap(&h[i]); /* ------------------------------------------------------------ Verificação do uso da memória dinâmica. ------------------------------------------------------------ */ info = mallinfo(); MemDinFinal = info.uordblks; if (MemDinInicial!=MemDinFinal) printf("\n\nMemória dinâmica não foi totalmente liberada (%d, %d)\n", MemDinInicial,MemDinFinal); /* ------------------------------------------------------------ */ printf("\n\nFim da execução.\n\n"); return 0; } /* testheap */ /* author: Gustavo Sverzut Barbieri (http://www.gustavobarbieri.com.br) */