他人の空似自作物置場

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;
}