#include "app.h"
/****************************************************************************
 *	
 ****************************************************************************/
__declspec(noreturn) static void usage();
static void ShiftJisToUtf8(FILE* fp);
static void Utf8ToShiftJis(FILE* fp);
/****************************************************************************
 *	
 ****************************************************************************/
int main(int argc, char* argv[]) {
	int opt;
	void (*fn)(FILE* fp) = &ShiftJisToUtf8;
	//コマンドラインオプションを処理する。
	opterr = 0; //オプションエラーは当プログラム内で処理するので、getopt()内でのエラー表示は不要。
	while((opt = getopt(argc, argv, "ush")) != -1) {
		switch(opt) {
		case 'u': fn = &ShiftJisToUtf8; break;
		case 's': fn = &Utf8ToShiftJis; break;
		case 'h':
		default:  usage();
		}
	}
	//ファイルが指定されていなければ、標準入力から読み込む。
	if(optind == argc) {
		(*fn)(stdin);
	//ファイルが指定されていたら、各ファイルを読み込む。
	} else {
		int i;
		for(i = optind; i < argc; i++) {
			FILE* fp = fopen(argv[i], "r");
			if(!fp) { die("%s が開けません。\n", argv[i]); }
			(*fn)(fp);
			fclose(fp);
		}
	}
	return EXIT_SUCCESS;
}
/*---------------------------------------------------------------------------*/
__declspec(noreturn) static void usage() {
	fprintf(stderr, "dpunicnv - シフトJIS⇔UTF-8変換フィルタ (%s)\n", VERSION);
	fprintf(stderr, "Copyright (C) 2015-2016 Naoyuki Sawa\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "USAGE:\n");
	fprintf(stderr, "  dpunicnv [option] [filename ...]\n");
	fprintf(stderr, "  ・filenameを指定しなければ、標準入力から読み込みます。\n");
	fprintf(stderr, "  ・filenameは、ワイルドカードによる複数指定も可能です。\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "OPTIONS:\n");
	fprintf(stderr, "  -u シフトJIS⇒UTF-8変換を行います。(デフォルト)\n");
	fprintf(stderr, "  -s UTF-8⇒シフトJIS変換を行います。\n");
	fprintf(stderr, "  -h 使い方を表示します。\n");
	exit(EXIT_FAILURE);
}
/****************************************************************************
 *	
 ****************************************************************************/
static void ShiftJisToUtf8(FILE* fp) {
	char*    glbuf = NULL;	//┬getline()用
	int      glcap = 0;	//┘
    //{{2015/03/06削除:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
    //	char*    buf1;		//┬UTF-8用
    //	int      len1;		//┘
    //	wchar_t* buf2;		//┬UCS-2用
    //	int      len2;		//┘
    //}}2015/03/06削除:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
	while(getline(&glbuf, &glcap, fp) != EOF) {
    //{{2015/03/06変更:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
    //		//シフトJIS⇒Unicode(UCS-2)
    //		len2 = ShiftJisToUnicodeStr(glbuf, NULL, 0);
    //		buf2 = malloc((len2 + 1) * sizeof(wchar_t));
    //		if(!buf2) { DIE(); }
    //		ShiftJisToUnicodeStr(glbuf, buf2, len2 + 1);
    //		//UCS-2⇒UTF-8
    //		len1 = Ucs2ToUtf8Str(buf2, NULL, 0);
    //		buf1 = malloc(len1 + 1);
    //		if(!buf1) { DIE(); }
    //		Ucs2ToUtf8Str(buf2, buf1, len1 + 1);
    //		printf("%s", buf1);
    //		//バッファ開放
    //		free(buf1);
    //		free(buf2);
    //↓2015/03/06変更:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
		//シフトJIS⇒UTF-8
		unsigned char* buf = strdup_ShiftJisToUtf8(glbuf);
		printf("%s", buf);
		//バッファ開放
		free(buf);
    //}}2015/03/06変更:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
	}
	//バッファ開放
	free(glbuf);
}
/*--------------------------------------------------------------------------*/
static void Utf8ToShiftJis(FILE* fp) {
	char*    glbuf = NULL;	//┬getline()用
	int      glcap = 0;	//┘
    //{{2015/03/06削除:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
    //	char*    buf1;		//┬シフトJIS用
    //	int      len1;		//┘
    //	wchar_t* buf2;		//┬UCS-2用
    //	int      len2;		//┘
    //}}2015/03/06削除:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
	while(getline(&glbuf, &glcap, fp) != EOF) {
    //{{2015/03/06変更:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
    //		//UTF-8⇒UCS-2
    //		len2 = Utf8ToUcs2Str(glbuf, NULL, 0);
    //		buf2 = malloc((len2 + 1) * sizeof(wchar_t));
    //		if(!buf2) { DIE(); }
    //		Utf8ToUcs2Str(glbuf, buf2, len2 + 1);
    //		//Unicode(UCS-2)⇒シフトJIS
    //		len1 = UnicodeToShiftJisStr(buf2, NULL, 0);
    //		buf1 = malloc(len1 + 1);
    //		if(!buf1) { DIE(); }
    //		UnicodeToShiftJisStr(buf2, buf1, len1 + 1);
    //		printf("%s", buf1);
    //		//バッファ開放
    //		free(buf1);
    //		free(buf2);
    //↓2015/03/06変更:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
		//UTF-8⇒シフトJIS
		char* buf = strdup_Utf8ToShiftJis(glbuf);
		printf("%s", buf);
		//バッファ開放
		free(buf);
    //}}2015/03/06変更:clipunic.cにstrdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加したことに伴い、当ツールもそれらの関数を利用するように変更しました。
	}
	//バッファ開放
	free(glbuf);
}
