/*
 *	EPK - EPK展開ユーティリティ
 *
 *	"EPK"形式のアーカイブを展開するためのツールです。
 *	『こころナビ』のBGMを取り出すために作りました。
 *
 *	2004/05/02現在で、既に一年近く前のゲームです。
 *	一年前には全然知らなかったゲームですが、最近体験版を遊びました。
 *	音楽の良さにひかれて、製品版購入を決定しました。
 *	特に印象に残る曲はないのですけれど、全体の雰囲気がすごくいいです。
 *	選曲が絶妙で、特にWab世界において音と絵がたいへんマッチしてます。
 *	あと、メインテーマ「lhythmic life」を出すまでの引っ張りも。
 *	つい先程、一人目のルファナシナリオをクリアしました。
 *	ゲームもいい雰囲気ですね。気に入りました。
 *
 *	Copyright (C) 2004 Naoyuki Sawa
 *
 *	* Sun May 02 16:36:00 JST 2004 Naoyuki Sawa
 *	- 作成開始。
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define VERSION		"20040502"

const char* APPNAME;
const char* ARCHIVE;

typedef struct _ITEM {
	int name_pos;	/* アイテム名位置 (ファイル先頭からの絶対位置) */
	int data_pos;	/* データ位置 (ファイル先頭からの絶対位置) */
	int data_len;	/* データ長 */
	int _resv1;
} ITEM;

typedef struct _HDR {
	char sig[4];	/* "EPX " */
	int hdr_len;	/* ヘッダ長 (使う必要ありません) */
	int item_cnt;	/* アイテム数 */
	int _resv1;
	ITEM item[0];
} HDR;

void
usage()
{
	printf("EPK - EPK展開ユーティリティ (%s)\n", VERSION);
	printf("USAGE:\n");
	printf("\t%s <アーカイブファイル名>\n", APPNAME);
	printf("EXAMPLE:\n");
	printf("\t%s \"C:\\Program Files\\Q-X\\こころナビ\\MUS.EPK\"\n", APPNAME);
	exit(-1);
}

int
main(int argc, char* argv[])
{
	int retval;
	int file_len;
	int i;
	FILE* fp;
	unsigned char* file_data;
	HDR* hdr;
	ITEM* item;
	char* name;
	void* data;

	APPNAME = argv[0];
	if(argc != 1 + 1) usage();
	ARCHIVE = argv[1];

	fp = fopen(ARCHIVE, "rb");
	if(!fp) {
		printf("## %s が開けません。\n", ARCHIVE);
		exit(-1);
	}

	retval = fseek(fp, 0, SEEK_END);
	if(retval != 0) {
		printf("## fseek エラー\n");
		exit(-1);
	}

	file_len = ftell(fp);

	file_data = (unsigned char*)malloc(file_len);
	if(!file_data) {
		printf("## malloc エラー\n");
		exit(-1);
	}

	rewind(fp);

	printf("ファイル読み込み中...\n");
	retval = fread(file_data, 1, file_len, fp);
	if(retval != file_len) {
		printf("## fread エラー\n");
		exit(-1);
	}

	fclose(fp);

	hdr = (HDR*)file_data;
	if(memcmp(hdr->sig, "EPK ", 4) != 0) {
		printf("## HDR エラー\n");
		exit(-1);
	}

	for(i = 0; i < hdr->item_cnt; i++) {
		item = &hdr->item[i];
		name = &file_data[item->name_pos];
		data = &file_data[item->data_pos];
		puts(name);

		fp = fopen(name, "wb");
		if(!fp) {
			printf("## fopen エラー\n");
			exit(-1);
		}

		retval = fwrite(data, 1, item->data_len, fp);
		if(retval != item->data_len) {
			printf("## fwrite エラー\n");
			exit(-1);
		}

		fclose(fp);
	}

	printf("OK\n");

	return 0;
}
