#!/usr/bin/perl

# chksrc.pl
# つかいかた
# ・16進数のテキストで書いた命令リストを食わせる (バイナリではなく、文字で書くことに注意)
# ・各バイト間は空白文字で区切ること
# ・セミコロン以降は無視
# ・入力できなさそうだなーと思ったらエラーを出してくれる
# ・入力できそうならニックネーム変換してくれる
#
my $lasteom = 0;

my @allowed_charset = (0x5..0x13,0x19..0x1c,0x26..0x34,0x3a..0x3e,0x40..0x48,0x50,0x80..0xa9,0xab..0xaf,0xb1..0xdc,0xde..0xe3);
my @charset = (
"[0x00]" , "イ゛", "ヴ"  , "エ゛", "オ゛", "ガ"  , "ギ"  , "グ"  , # 0x07
"ゲ"  , "ゴ"  , "ザ"  , "ジ"  , "ズ"  , "ゼ"  , "ゾ"  , "ダ"  , # 0x0f
"ヂ"  , "ヅ"  , "デ"  , "ド"  , "ナ゛", "ニ゛", "ヌ゛", "ネ゛", # 0x17
"ノ゛", "バ"  , "ビ"  , "ブ"  , "ボ"  , "マ゛", "ミ゛", "ム゛", # 0x1f
"ィ゛", "あ゛", "い゛", "う゛", "え゛", "お゛", "が"  , "ぎ"  , # 0x27
"ぐ"  , "げ"  , "ご"  , "ざ"  , "じ"  , "ず"  , "ぜ"  , "ぞ"  , # 0x2f
"だ"  , "ぢ"  , "づ"  , "で"  , "ど"  , "な゛", "に゛", "ぬ゛", # 0x37
"ね゛", "の゛", "ば"  , "び"  , "ぶ"  , "べ"  , "ぼ"  , "ま゛", # 0x3f
"パ"  , "ピ"  , "プ"  , "ポ"  , "ぱ"  , "ぴ"  , "ぷ"  , "ぺ"  , # 0x47
"ぽ"  , "ま゜", "み゜", "0x4B", "0x4C", "も゜", "0x4E", "0x4F", # 0x4f
"[EOM]" , "[0x51]", "[0x52]", "[0x53]", "ポケモン", "[0x55]", "……", "[0x57]",  # 0x57
"[0x58]", "[0x59]", "[0x5A]", "パソコン", "わざマシン", "トレーナー", "ロケットだん", "[0x5F]", #0x5f
"Ａ"  , "Ｂ"  , "P: ", "[0x63]", "[0x64]", "[0x65]", "[0x66]", "[0x67]", # 0x67
"[0x68]", "[0x69]", "[0x6A]", "[0x6B]", "[0x6C]", "[0x6D]", ":L", "[0x6F]", # 0x6f
"ど"  , "H"   , "『"  , "ID"  , "No"  , "…", "━", "￣", #0x77
"[0x78]", "┏"   , "＝"  , "┓"   , "┃┃"  , "┗", "┛", " ", #0x7f
"ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", # 0x87
"ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", # 0x8f
"チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", # 0x97
"ノ", "ハ", "ヒ", "フ", "ホ", "マ", "ミ", "ム", # 0x9f
"メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "ル", "レ", # 0xa7
"ロ", "ワ", "ヲ", "ン", "ッ", "ャ", "ュ", "ョ", # 0xaf
"ィ", "あ", "い", "う", "え", "お", "か", "き", # 0xb7
"く", "け", "こ", "さ", "し", "す", "せ", "そ", # 0xbf
"た", "ち", "つ", "て", "と", "な", "に", "ぬ", # 0xc7
"ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", # 0xcf
"み", "む", "め", "も", "や", "ゆ", "よ", "ら", # 0xd7
"り", "る", "れ", "ろ", "わ", "を", "ん", "っ", # 0xdf
"ゃ", "ゅ", "ょ", "ー", "゜", "゛", "？", "！", # 0xe7
"。", "ァ", "ゥ", "ェ", "[0xEC]", "[0xED]", "▼", "♂", # 0xef
"円", "Ｘ", "．", "／", "ォ", "♀", "０", "１", # 0xf7
"２", "３", "４", "５", "６", "７", "８", "９", # 0xff
		);

my %charset_table;

foreach my $h (@allowed_charset){
	$charset_table{$h} = $charset[$h];
}

my $linecount = 0;

my @code;

while(my $line = <>){
	$linecount++;
	chomp $line;
	$line =~ s/^([^;]*);.*$/\1/;
	$line =~ s/(\s+)/ /g;
	my @cmdline = split(/\s+/,$line);

	for(my $i = 0; $i < @cmdline; $i++){
		my $n = hex($cmdline[$i]);

		if($lasteom >= 5 and $n != 0x50){ print "\n!!! line $linecount char $i should be 0x50 !!!\n"; exit 1; }
		if($n == 0x50){ $lasteom = -1; }
		if(exists($charset_table{$n})){
			if($n != 0x50){ print $charset_table{$n}; }
			else{ print "\n"; }
		}else{
			print "\n!!! code $n ($cmdline[$i]) is not writable !!!\n";
			exit 1;
		}
		push @code, $n;
		$lasteom++;
	}
}

for(my $i = 0; $i < @code; $i++){
	printf("%02x ",$code[$i]);
}
	printf("\n");
