#include <stdio.h>
#include <string.h>
#include <jctype.h>
#include <io.h>
#include "../inc/getopt.h"

#define  VERSION	"v1.2"

/*
  カタカナの半角文字を全角に変換するフィルタ。
  （愛用しているng(日本語 Micro Nemacs)が半角カタカナを表示できないため）
                                                                 Y.Tsuzi
*/

#define	msg(s) fputs(s, stderr)

static char *help_msg[] =
{
    "tozen.exe " VERSION " Y.Tsuzi[" __DATE__ "]\n",
    "カタカナの半角から全角へのフィルタ\n",
    NULL
};

int     tozen(FILE *, FILE *);
int     help(char **help);

char   *kana_to_zen_table[][3] =
{
    "。", NULL, NULL,
    "「", NULL, NULL,
    "」", NULL, NULL,
    "、", NULL, NULL,
    "・", NULL, NULL,
    "ヲ", NULL, NULL,
    "ァ", NULL, NULL,
    "ィ", NULL, NULL,
    "ゥ", NULL, NULL,
    "ェ", NULL, NULL,
    "ォ", NULL, NULL,
    "ャ", NULL, NULL,
    "ュ", NULL, NULL,
    "ョ", NULL, NULL,
    "ッ", NULL, NULL,
    "ー", NULL, NULL,
    "ア", NULL, NULL,
    "イ", NULL, NULL,
    "ウ", "ヴ", NULL,
    "エ", NULL, NULL,
    "オ", NULL, NULL,
    "カ", "ガ", NULL,
    "キ", "ギ", NULL,
    "ク", "グ", NULL,
    "ケ", "ゲ", NULL,
    "コ", "ゴ", NULL,
    "サ", "ザ", NULL,
    "シ", "ジ", NULL,
    "ス", "ズ", NULL,
    "セ", "ゼ", NULL,
    "ソ", "ゾ", NULL,
    "タ", "ダ", NULL,
    "チ", "ヂ", NULL,
    "ツ", "ヅ", NULL,
    "テ", "デ", NULL,
    "ト", "ド", NULL,
    "ナ", NULL, NULL,
    "ニ", NULL, NULL,
    "ヌ", NULL, NULL,
    "ネ", NULL, NULL,
    "ノ", NULL, NULL,
    "ハ", "バ", "パ",
    "ヒ", "ビ", "ピ",
    "フ", "ブ", "プ",
    "ヘ", "ベ", "ペ",
    "ホ", "ボ", "ポ",
    "マ", NULL, NULL,
    "ミ", NULL, NULL,
    "ム", NULL, NULL,
    "メ", NULL, NULL,
    "モ", NULL, NULL,
    "ヤ", NULL, NULL,
    "ユ", NULL, NULL,
    "ヨ", NULL, NULL,
    "ラ", NULL, NULL,
    "リ", NULL, NULL,
    "ル", NULL, NULL,
    "レ", NULL, NULL,
    "ロ", NULL, NULL,
    "ワ", NULL, NULL,
    "ン", NULL, NULL,
    "゛", NULL, NULL,
    "゜", NULL, NULL
};

char	*file[50];

int     main(int argc, char **argv)
{
    int     c;
    char   *data, *outfile = NULL, *infile = NULL;
    FILE   *in, *out;
    char  **fname = file;
    
    setopt(argc, argv);

    while ((c = getopt('-', "o:hH?", &data)) >= 0) {
	switch (c) {
	case 'o':
	    if (data != NULL)
		outfile = data;
	    break;
	case 'h':
	case 'H':
	case '?':
	    help(help_msg);
	    return 1;
	case 0:
	    if (data != NULL)
		*fname++ = data;
	    break;
	}
    }
    *fname = NULL;
    
    if (outfile != NULL) {
	if ((out = fopen(outfile, "w")) == NULL) {
	    msg("ファイルがオープンできません。\n");
	    return 1;
	}
    } else {
	out = stdout;
    }
    
    fname = file;
    
    if(!isatty(fileno(stdin))) {
	tozen(stdin, out);
    } else if(*fname == NULL) {
	help(help_msg);
	return 1;
    }
    
    while(*fname != NULL) {
	if ((in = fopen(*fname++, "r")) == NULL) {
	    msg("ファイルがオープンできません。\n");
	    return 1;
	}
	tozen(in, out);
	fclose(in);
    }
    
    fcloseall();

    return 0;
}

int     tozen(FILE *in, FILE *out)
{
    unsigned char c;
    char    buf[256];
    char   *kana = buf;
    int     kanji = 0;

    while (fgets(buf, sizeof buf, in) != NULL) {
	while (*kana != '\0') {
	    if (kanji) {
		kanji = 0;
		fputc(*kana, out);
	    } else if (iskanji(*kana)) {
		kanji = 1;
		fputc(*kana, out);
	    } else if (0xA1 <= *kana && *kana <= 0xDF) {
		c = *kana - 0xA1;
		if (*(kana + 1) == 0xDE) {
		    if (kana_to_zen_table[c][1] != NULL) {
			fputs(kana_to_zen_table[c][1], out);
			kana++;
		    } else {
			fputs(kana_to_zen_table[c][0], out);
		    }
		} else if (*(kana + 1) == 0xDF) {
		    if (kana_to_zen_table[c][2] != NULL) {
			fputs(kana_to_zen_table[c][2], out);
			kana++;
		    } else {
			fputs(kana_to_zen_table[c][0], out);
		    }
		} else {
		    fputs(kana_to_zen_table[c][0], out);
		}
	    } else {
		fputc(*kana, out);
	    }
	    kana++;
	}
	kana = buf;
    }

    return 0;
}

int     help(char **help)
{
    while (*help != NULL)
	msg(*help++);
    return 0;
}
