/*
 *	app.c
 *
 *	nvlogd.exe - 不揮発性ログダンプユーティリティ
 *	Copyright (C) 2015-2016 Naoyuki Sawa
 *
 *	* Fri Oct 30 21:25:15 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Sun Feb 21 21:02:01 JST 2016 Naoyuki Sawa
 *	- 「Boehm GC」をマルチスレッド対応にした事,及び,それに伴ってclipbpe.cモジュールを修正した事に伴い、当ツールもプロジェクト設定の変更を行ってリビルドしました。
 *	  詳細は、/clip/tool/gc/README.TXT と /clip/clipbpe.c の2015/11/03のコメントを参照して下さい。
 *	- libclipのライブラリ化の伴い、以下の変更を行いました。
 *	  ・extclip.hとextclip.cを削除しました。extclip.hとextclip.cはlibclipに含まれるようになったからです。
 *	  ・"CLiP Files"を削除しました。CLiPライブラリの各モジュールはlibclipに含まれるようになったからです。
 *	  当ツールの動作には変更有りません。
 */
#include "app.h"
#define VERSION		"20160221"	//最終更新日
/****************************************************************************
 *	
 ****************************************************************************/
__declspec(noreturn) static void usage();
static int subr(int argc, char* argv[]);
/****************************************************************************
 *	main
 ****************************************************************************/
int main(int argc, char* argv[]) {
	int exitCode;
	program_invocation_short_name = basename((program_invocation_name = argv[0]));//呼び出し元プログラムの起動に使用された名前を設定する。
//	putenv("GC_LOG_FILE=CON");//ログ出力先を指定する。
//	GC_set_find_leak(1);//メモリリーク検出を開始する。
	SEH_init();
//	if(!(TBL_RegTbl = LockResource(LoadResource(NULL, FindResource(NULL, "RegTbl", "RegTbl"))))) { DIE(); }
//	if(!(pPrpKey = REG_open_key(TBL_RegTbl, RegKey_PrpTbl))) { DIE(); }
//	PrpHdr_init(phApp, pPrpKey, PrpTbl_App);
	exitCode = subr(argc, argv);
//	CHECK_LEAKS();//メモリリークを検出する。
//	cputs("ok");
//	getch();
	return exitCode;
}
/****************************************************************************
 *	usage
 ****************************************************************************/
__declspec(noreturn) static void usage() {
	fprintf(stderr, "nvlogd.exe - 不揮発性ログダンプユーティリティ (%s)\n", VERSION);
	fprintf(stderr, "Copyright (C) 2015-2016 Naoyuki Sawa\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "USAGE:\n");
	fprintf(stderr, "  nvlogd.exe [option ...] nvlog.bin\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "  nvlog.bin  不揮発性ログファイル名。\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "OPTIONS:\n");
	fprintf(stderr, "  -h         使い方を表示します。\n");
	exit(EXIT_FAILURE);
}
/****************************************************************************
 *	subr
 ****************************************************************************/
static int subr(int argc, char* argv[]) {
	{
		int opt;
		opterr = 0; //オプションエラーは当プログラム内で処理するので、getopt()内でのエラー表示は不要。
		while((opt = getopt(argc, argv, "h")) != -1) {	//コマンドラインオプションを処理する。
			switch(opt) {
			case 'h':
			default:
				usage();
			}
		}
	}
	{
		char nvlog[NVLOG_SIZE];
		FILE* fp;
		//不揮発性ログファイルを読み込む。
		if(optind >= argc) { usage(); }
		fp = fopen(argv[optind], "rb");	//バイナリモード
		if(!fp) { error(EXIT_FAILURE, errno, "%sが開けません。", argv[optind]); }
		fread(nvlog, 1, NVLOG_SIZE, fp);
		fclose(fp);
		//不揮発性ログをダンプ表示する。
		nvlog_dump(stdout, nvlog);
	}
	return EXIT_SUCCESS;
}
