/** * Recebe a palavra a ser procurada * Consulta o "palavras.dat", que é uma lista, procurando pela * palavra pedida * Retorna a lista de índices que possuem a palavra pedida */ ListaDupla<int> man_pages_positions(char* palavra) { FILE* palavrasDat; palavrasDat = fopen("..\\palavras.dat", "rb"); //Lê a quantidade de palavras dos 4 bytes e guarda em "tamanho" char tamanhoC[4]; for(int i = 0; i < 4; i++) { tamanhoC[i] = fgetc(palavrasDat); } int tamanho = *((int*)&tamanhoC[0]); int pos = 0; bool achou = false; char palavraAtual[100]; while (!achou && pos < tamanho) { //Posiciona o leitor no inicio do registro da palavra fseek(palavrasDat, 4+(pos*size_max_word), SEEK_SET); //Pega palavra do registro fgets(palavraAtual, 100, palavrasDat); int cmpResult = strcmp(palavra, palavraAtual); //Buscando maior que encontrado, pega o ramo da esquerda if(cmpResult < 0) { pos++; pos = (2*pos)-1; //Buscando menor que encontrado, pega o ramo da direita } else if(cmpResult > 0) { pos++; pos = (2*pos); //Encontrado } else { achou = true; } } ListaDupla<int> indices; if(achou) { pos = *((int*)&palavraAtual[92]); int qtd = *((int*)&palavraAtual[96]); fseek(palavrasDat, 4+(tamanho*size_max_word)+pos*4, SEEK_SET); for(int i = 0; i < qtd; i++) { char indiceC[4]; for(int j = 0; j < 4; ++j){ indiceC[j] = fgetc(palavrasDat); } int indice = *((int*)&indiceC[0]); indices.adicionaDuplo(indice); } } else { printf("Nenhum arquivo encontrado com a palavra '%s'\n", palavra); } fclose(palavrasDat); return indices; }
/** * Pede as duas palavras, e obtem os indices de modo semelhante a * search_by_one_word, realiza as intersecção entre as listas de índices * Traduz os índices para o nome das manpages consultando "manpages.dat" */ void search_by_two_words() { //Pede a primeira palavra char palavra1[100]; scanf("%s", palavra1); //Pega a lista de índices que possuem a primeira palavra ListaDupla<int> indices1 = man_pages_positions(palavra1); //Pede a segunda palavra char palavra2[100]; scanf("%s", palavra2); //Pega índices da segunda palavra ListaDupla<int> indices2 = man_pages_positions(palavra2); //Intersecção de indices1 e indices2 ListaDupla<int> indices; while (!indices2.listaVazia()) { int atual = indices2.primeiro(); bool achou = false; for(int i = 0; i < indices1.verUltimo() && !achou; i++) { if(indices1.mostra(i) == atual) achou = true; } if(achou) indices.adicionaDuplo(atual); indices2.retiraDoInicioDuplo(); } FILE* manPagesDat; manPagesDat = fopen("..\\manpages.dat", "rb"); printf("\n\n"); while (!indices.listaVazia()) { fseek(manPagesDat, indices.primeiro()*(size_max_command+size_max_content), SEEK_SET); char comando[100]; fgets(comando, 100, manPagesDat); printf("%d - %s\n", indices.primeiro(), comando); indices.retiraDoInicioDuplo(); } fclose(manPagesDat); }