他人の空似自作物置場

touhouSE_old.zip/touhouSE_src/main.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "main.h"
#include "png.h"
#include "lib.h"
#include "th075.h"
#include "th105.h"
#include "th11.h"
#include "th12.h"
#include "thmj.h"
#include "tnb.h"
#include <windows.h>
#pragma comment (lib,"Comdlg32.lib")

#define DAT_NUM	6

LIST *list = NULL;

FILE *fp = NULL;
short fcount = 0;
int dat_size = 0;
char dat_name[256] = "";

int dat_ver = 0;

int getlist(char *filename){
	int i,a;
	int (*func[])(char*) = {th105_getlist,th075_getlist,th11_getlist,th12_getlist,thmj_getlist,tnb_getlist};

	i = DAT_NUM;
	while(i > 0){
		i--;
		a = func[i](filename);
		if(a == 0){
			dat_ver = i;
			return 0;
		}
	}
	return 1;
}
void putfile(char *data,int size,char *fn){
	void (*func[])(char*,int,char*) = {th105_putfile,th075_putfile,th11_putfile,th12_putfile,thmj_putfile,tnb_putfile};

	func[dat_ver](data,size,fn);
}
char *extract(int num){
	char *(*func[])(int) = {th105_extract,th075_extract,th11_extract,th12_extract,thmj_extract,tnb_extract};

	return func[dat_ver](num);
}

void list_free(void){
	if(fp != NULL){
		fclose(fp);
		fp = NULL;
	}
	if(list == NULL)return;
	fcount = 0;
	free(list);
	list = NULL;
}
void GetAppDir(char *str){
	int i;

	GetModuleFileName(NULL,str,256);
	i = strlen(str)-1;
	while(str[i] != '\\' && str[i] != '/' && i > 0)i--;
	str[i] = '\0';
}
char *Open(char *s){
	static char fn[256];
	char dir[256];
	OPENFILENAME ofn;

	if(s == NULL || strlen(s)==0){
		GetAppDir(dir);
		strcat(dir,"\\");
		memset(&ofn,0,sizeof(OPENFILENAME));

		ofn.lStructSize = sizeof(OPENFILENAME);
		ofn.lpstrFilter = "SDTファイル(*.sdt)\0th*.dat\0All files(*.*)\0*.*\0\0";
		ofn.lpstrFile = fn;
		ofn.nMaxFile = 256;
		ofn.lpstrInitialDir = dir;
		ofn.Flags = OFN_FILEMUSTEXIST;
		ofn.lpstrTitle = "ファイルを開く";
		ofn.lpstrDefExt = "dat";

		if(!GetOpenFileName(&ofn)){
			return NULL;
		}
	} else {
		strcpy(fn,s);
	}
	SetAppDir();
	return fn;
}
int main(int argc,char *argv[]){
	char dat_type[][17] = {{"緋想天"},{"萃夢想"},{"地霊殿"},{"星蓮船"},{"幻想麻雀"},{"テンドーブレード"}};
	int i,count,size;
	char *str,*fn,s[256],*open_fn[2];
	FILE *fp;
	time_t t,a,b;

	SetAppDir();
	if(argc < 2){
		open_fn[1] = Open(NULL);
		open_fn[0] = argv[0];
		argv = open_fn;
		argc = 2;
	}

	i = 1;
	while(i < argc){
		printf("%sを展開します。\n",argv[i]);
		if(0 != getlist(argv[i])){
			printf("未対応のdat形式です\n");
		} else {
			if(fcount)printf("\nフォーマット:%s\nファイル展開を始めます。\n\n",dat_type[dat_ver]);
			time(&t);
			size = 0;
			count = 0;
			while(count < fcount){
				str = extract(count);
				fn = list[count].fn;
				if(dat_ver == 2)size += list[count].comp_size;//地霊殿
				else size += list[count].size;

				putfile(str,list[count].size,fn);

				free(str);
				count++;
				time(&a);
				a = a-t;
				b = (double)(dat_size-size)*a/size;//time_tが4バイトの場合オーバーフローするのでdoubleにキャスト
				printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%5d/%5d %02d:%02d(残り%02d:%02d)",count,fcount,(int)a/60,(int)a%60,(int)b/60,(int)b%60);
			}
		}
		list_free();
		printf("\n展開終了しました\n");
		i++;
	}
	printf("全ての処理が終了しました\n終了する場合はENTERを押してください\n");
	getchar();
	return 0;
}