/*
 *	app.c
 *
 *	real.exe - UNIXコマンド「time」互換ツール
 *	Copyright (C) 2015-2017 Naoyuki Sawa
 *
 *	* Wed Oct 07 21:12:15 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	- UnxUtils(http://sourceforge.net/projects/unxutils/)には「time」コマンドが含まれていません。
 *	  既存のWin32用「time」互換ツールとしては、Windows Server 2003 Resource Kit Toolsに含まれている「timeit」コマンドが有りますが、「timeit」コマンドはWindows 7上で動作しません。
 *	- そこで、「time」互換ツールを自作する事にしました。
 *	  'real.exe'と命名した理由は、本物の「time」コマンドはUser CPU時間,System CPU時間,Real CPU時間を表示するのに対して、今回作った'real.exe'はReal CPU時間だけを表示するからです。
 *	* 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に含まれるようになったからです。
 *	  当ツールの動作には変更有りません。
 *	* Tue May 09 22:14:45 JST 2017 Naoyuki Sawa
 *	- ライブラリのバグ修正に伴う、ツールのリビルドを行いました。
 *	  詳細は、clipmisc.cの'Sun May 07 09:13:01 JST 2017 Naoyuki Sawa'のコメントを参照して下さい。
 *	- 前回更新後〜本日までの間に、他のツール群に対して行ったのと同じビルド設定の変更を、当ツールにも対しても適用しました。
 */
#include "app.h"
#define VERSION		"20170509"	//最終更新日
/****************************************************************************
 *	ローカル関数宣言
 ****************************************************************************/
static int subr(int argc, char* argv[]);
__declspec(noreturn) static void usage();
/****************************************************************************
 *	main
 ****************************************************************************/
int main(int argc, char* argv[]) {
	int exitCode;
//	putenv("GC_LOG_FILE=CON");//ログ出力先を指定する。
//	GC_set_find_leak(1);//メモリリーク検出を開始する。
	exitCode = subr(argc, argv);
//	CHECK_LEAKS();//メモリリークを検出する。
//	cputs("ok");
//	getch();
	return exitCode;
}
/****************************************************************************
 *	ローカル関数
 ****************************************************************************/
static int subr(int argc, char* argv[]) {
	int opt, exitCode, t;
	FILE* output = stdout;
	opterr = 0;	//オプションエラーは当プログラム内で処理するので、getopt()内でのエラー表示は不要。
	while((opt = getopt(argc, argv, "he")) != -1) {
		switch(opt) {
		default:
		case 'h':
			usage();
			break;
		case 'e':
			output = stderr;
			break;
		}
	}
	if(optind >= argc) { usage(); }
	t = GetTickCount();
	exitCode = _spawnvp(_P_WAIT, argv[optind], &argv[optind]);
	if(exitCode == -1) { die("%sを実行できません。(%s)", argv[optind], strerror(errno)); }
	t = GetTickCount() - t;
	fprintf(output, "%u", t);
	return exitCode;
}
/*--------------------------------------------------------------------------*/
__declspec(noreturn) static void usage() {
	fprintf(stderr, "real.exe - UNIXコマンド「time」互換ツール (%s)\n", VERSION);
	fprintf(stderr, "Copyright (C) 2015-2017 Naoyuki Sawa\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "USAGE:\n");
	fprintf(stderr, "  real.exe [OPTION ...] COMMAND [ARG ...]]\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "OPTIONS:\n");
	fprintf(stderr, "  -e 実行時間を標準エラー出力に表示します。\n");
	fprintf(stderr, "     このオプションを指定しなければ、実行時間を標準出力に表示します。\n");
	fprintf(stderr, "  -h 使い方を表示します。\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "NOTE:\n");
	fprintf(stderr, "  本物の「time」コマンドはUser CPU時間,System CPU時間,Real CPU時間を表示しますが、\n");
	fprintf(stderr, "  今回作った'real.exe'はReal CPU時間だけをミリ秒単位で表示します。\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "EXAMPLE:\n");
	fprintf(stderr, "  real.exe -e MkRegTbl.bat RegTbl.txt\n");
	fprintf(stderr, "  'MkRegTbl.bat RegTbl.txt'を実行し、実行時間を標準エラー出力に表示します。\n");
	exit(EXIT_FAILURE);
}
