touhouSE_old.zip/touhouSE_src/thmj.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "lib.h"
#include "main.h"
void thmj_convert(unsigned char *in,int in_size,unsigned char *out, int out_size){
char data[0x1000];
int addr = 0xFF0;
int a,p,len;
unsigned char *ep;
memset(data,0,0x1000);
ep = out + out_size;
while(TRUE){
a = *in + 0x100;
in++;
while(a>0x01){
if(a&0x01==1){
*out = *in;
data[addr] = *in;
out++;
in++;
addr++;
if(addr>=0x1000)addr = 0;
} else {
p = in[0] + ((in[1]&0xF0)*16);
len = (in[1]&0x0F) + 3;
in+=2;
while(len){
*out = data[p];
data[addr] = data[p];
out++;
addr++;
if(addr>=0x1000)addr = 0;
p++;
if(p>=0x1000)p = 0;
len--;
}
}
a = a/2;
if(out>=ep)goto LOOP_END;
}
if(out>=ep)goto LOOP_END;
}
LOOP_END:
return;
}
char *thmj_extract(int num){
int i,size;
char *data,*fn,*out;
size = list[num].size;
data = malloc(size);
fseek(fp,list[num].addr,SEEK_SET);
fread(data,1,size,fp);
if(strncmp(data,"LZSS",4)==0){
out = malloc(*(int*)&data[4]);
thmj_convert(data+8,size-8,out,*(int*)&data[4]);
list[num].size = *(int*)&data[4];
free(data);
data = out;
}
return data;
}
void thmj_putfile(char *data,int size,char *fn){
FILE *fp;
fp = fopen2(fn,"wb");
fwrite(data,1,size,fp);
fclose(fp);
}
int thmj_getlist(char *filename){
int flist,size,last;
char head[8],*data,*str,*s;
int i,k,t,ret;
unsigned char len;
list_free();
ret = 0;
fp = fopen(filename,"rb");
if(fp == NULL){
//printf("指定されたファイルが存在しません\n");
ret = 1;
goto end;
}
fseek(fp,0,SEEK_END);
dat_size = ftell(fp);
fseek(fp,0,SEEK_SET);
if(dat_size < 16){
//printf("dat構成情報を読み取れません\nファイルサイズが小さすぎます\n");
ret = 2;
goto end;
}
fread(head,1,8,fp);
if(*(int *)head != 0x4B434150){//識別子PACK
//printf("dat形式がth11形式ではありません\n");
ret = 3;
goto end;
}
fcount = *(int*)&head[4];
if(dat_size <= fcount*80){
//printf("メモリー確保に失敗しました\n格納されたファイル数が多すぎます\n");
ret = 4;
goto end;
}
list = malloc(sizeof(LIST)*fcount);
if(data == NULL){
//printf("メモリー確保に失敗しました\n格納されたファイル数が多すぎます\n");
ret = 5;
goto end;
}
i = 0;
while(i < fcount){
fread(list[i].fn,1,64,fp);
if(strlen(list[i].fn)>=64){
//printf("ファイルリストが異常です(%d)\n",t);
return 6;
}
fseek(fp,8,SEEK_CUR);
fread(&list[i].addr,4,1,fp);
fread(&list[i].comp_size,4,1,fp);
list[i].size = list[i].comp_size;
i++;
}
/*
i = 0;
while(i < fcount){
printf("0x%08x %8d %s\n",list[i].addr,list[i].size,list[i].fn);
i++;
}*/
printf("%d個のファイルを検出しました。\n",fcount);
strcpy(dat_name,filename);
end:
return ret;
}