O Programa está estruturado da seguinte maneira: main.c - A parte de tratamento de linha de comando e de processamento do arquivo estão aqui. common.{c,h} - Definições usadas em todo o programa, configurações em tempo de tempo de compilacao e funcões auxiliares usadas em todos o programa encontram-se aqui. {bmh,shitand*}.c - Nesse arquivos econtram-se as implementacões dos algoritmos BMH, shift-and aproximado e exato. Cada arquivo apresenta duas funcoes: uma para fazer o preprocessamento do padrao de busca e outra para realizar a busca propriamente dita. Em cada um desses módulos, variáveis "globais no módulo" são usadas para guardar os valores gerados pelo preprocessamento e usados pelas funcoes de busca. A estrutura do programa pode ser bem vista pela funcao main: Inicia-se pelo processamento da linha de comando. Durante esse processamento, decide-se que algoritmo sera usado. Essa escolha sera aramazenada na forma de duas variáveis: find_func, um ponteiro para a funcao de busca escolhida, e preprocess_func, um ponteiro para a funcao de preprocessamento do padrao de busca correspondente a funcao de busca escolhida. Após isso, realiza-se o preprocessamento do padrao de busca. Passa-se a ler linha-a-linha o arquivo, passando cada linha linha lida para ser analisada pela funcao de busca. A funcao, por sua vez, retorna com sucesso na primeira ocorrencia que case. Sendo esse o caso, de haver uma ocorrencia do padrao na linha, ela sera impressa e passa-se para a linha seguinte. Observe: o algoritmo, devida a forma como que ele foi implementado, apresentará problemas se, em alguma linha lida, aparecer um caractere \0. A busca nessa linha sera feita apenas até esse caractere. Se a linha casa, toda a linha, mesmo o conteúdo apos o '\0' será impressa.