#include "app.h"
/****************************************************************************
 *	
 ****************************************************************************/
__declspec(noreturn) static void usage();
/****************************************************************************
 *	
 ****************************************************************************/
int main(int argc, char* argv[]) {
	int opt_w = 80;
	{
		int opt;
		char* endptr;
		opterr = 0; //オプションエラーは当プログラム内で処理するので、getopt()内でのエラー表示は不要。
		while((opt = getopt(argc, argv, "w:h")) != -1) {	//コマンドラインオプションを処理する。
			switch(opt) {
//{{アプリケーション特有の処理
			case 'w':
				opt_w = strtoul(optarg, &endptr, 0);
				if(!opt_w || *endptr) { usage(); }
				break;
//}}アプリケーション特有の処理
			case 'h':
			default:
				usage();
			}
		}
	}
	{
		char* glbuf = NULL;	//┬getline()用バッファ
		int   glcap = 0;	//┘
		FILE* fp = stdin;	//入力ファイルが指定されていなければ、標準入力を一回処理する。
		do {
			if(optind < argc) {	//入力ファイルが指定されていたら…
				fp = fopen(argv[optind], "r");		//入力ファイルを開く。
				if(!fp) { error(EXIT_FAILURE, errno, "%s が開けません。", argv[optind]); }
			}
			while(getline(&glbuf, &glcap, fp) != EOF) {	//一行読み込む。ファイル終端でなければ…
//{{アプリケーション特有の処理
				char** v = textwrap(strchomp(glbuf), opt_w);
				int i;		//  ~~~~~~~~文字列を折り返す前に、末尾の改行文字を削除する。textwrap()は制御コードを認識しないので、textwrap()に渡す前に改行文字を削除しておく必要が有る。
				for(i = 0; v[i]; i++) {
					puts(v[i]);
				}
				strfreev(v);
//}}アプリケーション特有の処理
			}
			if(optind < argc) {	//入力ファイルが指定されていたら…
				fclose(fp);	//入力ファイルを閉じる。
				optind++;	//次の入力ファイルへ進める。
			}
		} while(optind < argc);
		free(glbuf);	//getline()用バッファを開放する。
	}
	return EXIT_SUCCESS;
}
/*---------------------------------------------------------------------------*/
__declspec(noreturn) static void usage() {
	fprintf(stderr, "TextWrap - シフトJIS文字列折り返しツール (%s)\n", VERSION);
	fprintf(stderr, "Copyright (C) 2016 Naoyuki Sawa\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "USAGE:\n");
	fprintf(stderr, "  TextWrap.exe [option] [filename ...]\n");
	fprintf(stderr, "  ・filenameを指定しなければ、標準入力から読み込みます。\n");
	fprintf(stderr, "  ・filenameは、ワイルドカードによる複数指定も可能です。\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "OPTIONS:\n");
	fprintf(stderr, "  -w 1行の最大バイト数を指定します。\n");
	fprintf(stderr, "     このオプションを指定しなければ、80バイトとなります。\n");
	fprintf(stderr, "  -h 使い方を表示します。\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "EXAMPLE:\n");
	fprintf(stderr, "  C:\\UnxUtils\\usr\\local\\wbin\\expand.exe Sample.txt | TextWrap.exe -w76\n");
	fprintf(stderr, "    Sample.txtを、1行の最大76バイトで折り返して表示します。\n");
	fprintf(stderr, "    TextWrap.exeはタブを展開しないので、先にexpand.exeを通しています。\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "NOTE:\n");
	fprintf(stderr, "  当ツールの機能は、Unixのfoldコマンドや、nkf.exeの'-f'オプションと同じです。\n");
	fprintf(stderr, "  foldやnkf.exeの方が高機能なので、敢えて当ツールを使用する必要は有りません。\n");
	fprintf(stderr, "  当ツールを作成した目的は、clipstr.cモジュールのtextwrap()の検証のためです。\n");
	exit(EXIT_FAILURE);
}
