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