Doom Browser!
Enviado: Qua Jun 23, 2010 11:20 pm
por Fabio914
Isto não é um projeto...
Como eu estava fazendo um trabalho de faculdade (de implementação de Árvore-B para manipulação de de indices de arquivos), e portanto eu tava mexendo com arquivos; me veio a idéia de fazer um tool (inútil) para brincar com arquivos. Então eu fiz um pequeno leitor de wads agora de noite, com ele é possível ver o conteúdo de um wad e recuperar um lump (gravar este lump em um arquivo separado). Eu testei esse tool com o Doom2.wad e deu certo... Divirtam-se...
Compilando no Windows (coloque gcc no PATH antes):
Compilando no Linux:
db.c
Como eu estava fazendo um trabalho de faculdade (de implementação de Árvore-B para manipulação de de indices de arquivos), e portanto eu tava mexendo com arquivos; me veio a idéia de fazer um tool (inútil) para brincar com arquivos. Então eu fiz um pequeno leitor de wads agora de noite, com ele é possível ver o conteúdo de um wad e recuperar um lump (gravar este lump em um arquivo separado). Eu testei esse tool com o Doom2.wad e deu certo... Divirtam-se...
Compilando no Windows (coloque gcc no PATH antes):
Código: Selecionar todos
gcc.exe db.c -o db.exe -ansi -O2
Código: Selecionar todos
gcc db.c -o db -ansi -O2
Código: Selecionar todos
/*************************************************************
* Doom Browser! *
* *
* Criado por Fabio de Albuquerque Dela Antonio *
* (fabio914) *
* *
* Versao 0.1 *
* *
* ATENCAO: NAO ME RESPONSABILIZO POR EVENTUAIS DANOS QUE *
* ESTE PROGRAMA POSSA CAUSAR AO SEU COMPUTADOR. *
* *
* VOCE E LIVRE PARA EDITAR, DISTRIBUIR E REUTILIZAR *
* ESTE PROGRAMA, DESDE QUE MANTENHA MEU NOME NOS *
* CREDITOS. *
* *
* Descricao: Programa para visualizar e recuperar dados *
* de um arquivo wad. *
* *
* OBSERVACAO: Nao eh possivel recuperar dados de mapas *
* (pois sao lumps com nomes repetidos). *
* *
* fabio914@gmail.com
* *
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PROG_NOME "Doom Browser"
#define VER_NOME "0.1"
typedef struct {
long filepos;
int size;
char name[9];
} Referencia;
#define IWAD 1
#define PWAD 2
#define OK 1
#define ERRO 0
int RecebeTipo(FILE **wad){
char tipo[5];
fseek(*wad,0,SEEK_SET);
fread(tipo,sizeof(char),4,*wad);
tipo[4] = '\0';
return (strcmp(tipo,"IWAD")==0) ? IWAD : PWAD;
}
int MontaTabelaRefs(FILE **wad,Referencia **tabela,int *n_lumps){
long offset_primeira_pos;
int i;
fseek(*wad,4,SEEK_SET);
fread(n_lumps,4,1,*wad);
fread(&offset_primeira_pos,4,1,*wad);
(*tabela) = (Referencia *)malloc((*n_lumps)*sizeof(Referencia));
if( (*tabela) == NULL ) return ERRO;
fseek(*wad,offset_primeira_pos,SEEK_SET);
for(i=0;i<(*n_lumps);i++){
fread(&((*tabela)[i].filepos),4,1,*wad);
fread(&((*tabela)[i].size),4,1,*wad);
fread(((*tabela)[i].name),sizeof(char),8,*wad);
(*tabela)[i].name[8] = '\0';
}
return OK;
}
#define ENCONTRADO 1
#define NAO_ENCONTRADO 0
/* Busca sequencial sucks! */
int BuscaRef(char name[9], Referencia **tabela, int *n_lumps, long *filepos, int *size) {
int i;
for(i=0;i<(*n_lumps);i++){
if(strcmp(name,(*tabela)[i].name)==0){
(*filepos) = (*tabela)[i].filepos;
(*size) = (*tabela)[i].size;
return ENCONTRADO;
}
}
return NAO_ENCONTRADO;
}
int RecuperaLump(char name[9], FILE **wad, Referencia **tabela, int *n_lumps){
long filepos;
int size;
FILE *lump;
char file_name[15];
char *dados;
if(BuscaRef(name,tabela,n_lumps,&filepos,&size)){
if(size == 0) return ERRO;
sprintf(file_name,"%s.lmp",name);
lump = fopen(file_name,"wb");
dados = (char *)malloc(size*sizeof(char));
if(dados == NULL) return ERRO;
fseek(*wad,filepos,SEEK_SET);
fread(dados,sizeof(char),size,*wad);
fwrite(dados,sizeof(char),size,lump);
free(dados);
fflush(lump);
fclose(lump);
return OK;
} else return ERRO;
}
void ListaRefs(Referencia **tabela, int *n_lumps){
int i;
char c;
printf("Conteudo do WAD:\n");
for(i=0;i<(*n_lumps);i++){
if(i==0) scanf("%c",&c);
if((i % 80)==0 && i!=0) { printf("Pressione qualquer tecla para continuar...\n"); scanf("%c",&c); }
if((*tabela)[i].size == 0) printf("%s \(marcador\)\n",(*tabela)[i].name);
else printf("%s\n",(*tabela)[i].name);
}
}
int main(int argc, char *argv[]){
if(argc < 2){
printf("Uso: db <aquivowad>.wad\n");
exit(ERRO);
}
printf("Inicializando %s! v.%s.\n",PROG_NOME,VER_NOME);
FILE *wad;
int tipo;
Referencia *tabela;
int n_lumps;
long lump_pos;
int size_lump;
char comando[10];
char argumento[9];
int sair = 0;
wad = fopen(argv[1],"rb");
if(wad == NULL) { printf("Erro: Impossivel abrir arquivo %s.\n",argv[1]); exit(ERRO); }
printf("Lido: %s.\n",argv[1]);
tipo = RecebeTipo(&wad);
if(tipo == IWAD) printf("Tipo: IWAD.\n");
else printf("Tipo: PWAD.\n");
printf("Montando tabela de referencias.\n");
if(MontaTabelaRefs(&wad,&tabela,&n_lumps))
printf("Lido: %d lumps.\n",n_lumps);
else { printf("Erro: Impossivel alocar tabela de referencias!\n"); fclose(wad); exit(ERRO); }
printf("Digite HELP para lista de comandos disponiveis.\n");
do {
printf("%s$>",argv[1]);
scanf("%s",comando);
if(strcmp(comando,"HELP")==0){
printf("BUSCA <lump> : Busca lump no arquivo.\n");
printf("HELP : Mostra comandos disponiveis.\n");
printf("LISTA : Lista lumps do arquivo.\n");
printf("RECUPERA <lump> : Grava lump em arquivo separado.\n");
printf("SAIR : Sai do programa.\n");
}
else if(strcmp(comando,"BUSCA")==0){
if(scanf("%s",argumento)!=EOF){
if(BuscaRef(argumento,&tabela,&n_lumps,&lump_pos,&size_lump))
printf("Encontrado: %s.\nTamanho: %d bytes.\nPosicao: 0x%x.\n",argumento,size_lump,(unsigned int)lump_pos);
else printf("Erro: Lump nao encontrado!\n");
} else printf("Erro: Impossivel ler nome do lump.\n");
}
else if(strcmp(comando,"RECUPERA")==0){
if(scanf("%s",argumento)!=EOF){
if(RecuperaLump(argumento,&wad,&tabela,&n_lumps))
printf("Recuperado: %s.\n",argumento);
else printf("Erro: Impossivel recuperar lump!\n");
} else printf("Erro: Impossivel ler nome do lump.\n");
}
else if(strcmp(comando,"LISTA")==0){
ListaRefs(&tabela,&n_lumps);
}
else if(strcmp(comando,"SAIR")==0) sair = 1;
else printf("Comando invalido!\n");
} while(!sair);
fclose(wad);
printf("Arquivo %s fechado.\n",argv[1]);
free(tabela);
printf("Tabela desmontada.\n");
return 0;
}