#
#	$@%m!<%^;zJ8;zNs$rJ?2>L>J8;zNs$KJQ49$9$k!#(J
#
#	$@;HMQK!(J: $kanastr = &roma2kana($romastr)
#
package roma2kana;

@kanatbl = (
	"\241\243",
	"\241\242",
	"\241\326",
	"\241\327",
	"\243\261",
	"\243\262",
	"\243\263",
	"\243\264",
	"\243\265",
	"\243\266",
	"\243\267",
	"\243\270",
	"\243\271",
	"\243\260",
	"\244\242",
	"\244\320",
	"\244\303 ",
	"\244\331",
	"\244\323",
	"\244\334",
	"\244\326",
	"\244\323\244\343",
	"\244\323\244\247",
	"\244\323\244\243",
	"\244\323\244\347",
	"\244\323\244\345",
	"\244\303 ",
	"\244\301\244\343",
	"\244\301\244\247",
	"\244\301",
	"\244\301\244\347",
	"\244\301\244\345",
	"\244\300",
	"\244\303 ",
	"\244\307",
	"\244\302",
	"\244\311",
	"\244\305",
	"\244\302\244\343",
	"\244\302\244\247",
	"\244\302\244\243",
	"\244\302\244\347",
	"\244\302\244\345",
	"\244\250",
	"\244\325\244\241",
	"\244\325\244\247",
	"\244\303 ",
	"\244\325\244\243",
	"\244\325\244\251",
	"\244\325",
	"\244\254",
	"\244\262",
	"\244\303 ",
	"\244\256",
	"\244\264",
	"\244\260",
	"\244\256\244\343",
	"\244\256\244\247",
	"\244\256\244\243",
	"\244\256\244\347",
	"\244\256\244\345",
	"\244\317",
	"\244\330",
	"\244\303 ",
	"\244\322",
	"\244\333",
	"\244\325",
	"\244\322\244\343",
	"\244\322\244\243",
	"\244\322\244\345",
	"\244\322\244\247",
	"\244\322\244\347",
	"\244\244",
	"\244\270\244\343",
	"\244\270\244\247",
	"\244\270",
	"\244\303 ",
	"\244\270\244\347",
	"\244\270\244\345",
	"\244\253",
	"\244\261",
	"\244\255",
	"\244\303 ",
	"\244\263",
	"\244\257",
	"\244\255\244\343",
	"\244\255\244\247",
	"\244\255\244\243",
	"\244\255\244\347",
	"\244\255\244\345",
	"\244\351",
	"\244\354",
	"\244\352",
	"\244\303 ",
	"\244\355",
	"\244\353",
	"\244\352\244\343",
	"\244\352\244\247",
	"\244\352\244\243",
	"\244\352\244\347",
	"\244\352\244\345",
	"\244\336",
	"\244\341",
	"\244\337",
	"\244\303 ",
	"\244\342",
	"\244\340",
	"\244\337\244\343",
	"\244\337\244\247",
	"\244\337\244\243",
	"\244\337\244\347",
	"\244\337\244\345",
	"\244\363",
	"\244\363 ",
	"\244\363",
	"\244\312",
	"\244\315",
	"\244\313",
	"\244\316",
	"\244\314",
	"\244\313\244\343",
	"\244\313\244\247",
	"\244\313\244\243",
	"\244\313\244\347",
	"\244\313\244\345",
	"\244\363 ",
	"\244\252",
	"\244\321",
	"\244\332",
	"\244\324",
	"\244\335",
	"\244\303 ",
	"\244\327",
	"\244\324\244\343",
	"\244\324\244\247",
	"\244\324\244\243",
	"\244\324\244\347",
	"\244\324\244\345",
	"\244\351",
	"\244\354",
	"\244\352",
	"\244\355",
	"\244\303 ",
	"\244\353",
	"\244\352\244\343",
	"\244\352\244\247",
	"\244\352\244\243",
	"\244\352\244\347",
	"\244\352\244\345",
	"\244\265",
	"\244\273",
	"\244\267\244\343",
	"\244\267\244\247",
	"\244\267",
	"\244\267\244\347",
	"\244\267\244\345",
	"\244\267",
	"\244\275",
	"\244\303 ",
	"\244\271",
	"\244\267\244\343",
	"\244\267\244\247",
	"\244\267\244\243",
	"\244\267\244\347",
	"\244\267\244\345",
	"\244\277",
	"\244\306",
	"\244\301",
	"\244\310",
	"\244\304",
	"\244\303 ",
	"\244\304",
	"\244\301\244\343",
	"\244\301\244\247",
	"\244\301\244\243",
	"\244\301\244\347",
	"\244\301\244\345",
	"\244\246",
	"\244\357",
	"\244\361",
	"\244\360",
	"\244\362",
	"\244\303 ",
	"\244\241",
	"\244\247",
	"\244\243",
	"\244\251",
	"\244\303",
	"\244\245",
	"\244\343",
	"\244\347",
	"\244\345",
	"\244\344",
	"\244\250",
	"\244\244",
	"\244\350",
	"\244\346",
	"\244\303 ",
	"\244\266",
	"\244\274",
	"\244\270",
	"\244\276",
	"\244\272",
	"\244\270\244\343",
	"\244\270\244\247",
	"\244\270\244\243",
	"\244\270\244\347",
	"\244\270\244\345",
	"\244\303 ",
	"\241\274",
);

@ctype = (
	  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  3,  4,  5,  1,
	  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 16,  1, 17,  1,  1,
	  1, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
	 33,  1, 34, 35, 36, 37,  1, 38, 39, 40, 41,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1 );

@nstate = (
	 76,240,234, 38, 40, 39, 47, 59, 56, 69, 79, 83, 86, 89, 96,113,
	120,124,130, 13, 35, 14,127, 17, 12,  9,103, 15, 11, 10,  8,  1,
	 77,  7,  6,  3,  2, 48, 29,  5, 16,  4,104,104,105,104,104,104,
	106,106,106,106,106,106,106,106,106,106,104,104,107,104,104,104,
	108,104,104,104,109,104,104,104,104,104,110,104,104,104,104,111,
	104,112, 24,104,136, 49,  0,  0,137,  0, 33,149,138,  0,  0,150,
	  0,  0,139,151,128, 37,141,142,129,152, 27, 20,131, 36,154,241,
	162, 34,132,  0,163,133,  0,134,164,  0, 30,  0,121,242,165,  0,
	122,  0,243,166,123,114, 22,168,  0,115,167,  0,125,116,  0,126,
	  0, 97, 21,117,118, 98,  0,  0,119, 99, 70, 23,  0,100, 71,101,
	  0, 72, 73,  0,102,  0, 90, 25, 74,  0, 91,  0,  0, 75, 92,  0,
	 18, 93, 63,155, 94,  0, 64, 84, 65, 95, 66, 85, 26,143,  0,  0,
	 67, 87,  0, 41, 43, 68, 88, 42, 31, 19, 50, 44,153, 51, 52,  0,
	 78, 45, 53,156,135, 80, 46,157, 54, 32,140,158,  0, 55,  0, 82,
	 28,159,  0, 57,  0,  0,160, 58, 61,161,189, 60,194,  0,190,  0,
	195, 81,191,224,196,  0, 62,225,192,  0,197,226,219,193,  0,198,
	220,227,  0,244,221,214,228,245,  0,215,222,246,209,216,  0,223,
	210,247,  0,217,211,204,248,  0,218,205,212,  0,199,206,235,213,
	200,  0,236,207,201,179,237,  0,208,180,202,  0,238,181,144,203,
	  0,239,145,182,  0,229,146,184,183,230,  0,185,147,231,  0,186,
	  0,  0,148,232,  0,187,  0,169,233,174,188,170,  0,175,  0,171,
	  0,176,  0,  0,  0,172,  0,177,  0,  0,173,  0,178 );

@pstate = (
	  0, 36, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
	  1,  1,  1,  1,  2, 35,  0,  0,  2,  0, 35,  5,  2,  0,  0,  5,
	  0,  0,  2,  5,  3,  2,  2,  2,  3,  5,  2,  3,  3,  5,  5, 34,
	  4,  5,  3,  0,  4,  3,  0,  3,  4,  0,  3,  0,  6, 34,  4,  0,
	  6,  0, 34,  4,  6,  7,  4,  4,  0,  7,  6,  0,  6,  7,  0,  6,
	  0,  8,  6,  7,  7,  8,  0,  0,  7,  8,  9,  7,  0,  8,  9,  8,
	  0,  9,  9,  0,  8,  0, 10,  8,  9,  0, 10,  0,  0,  9, 10,  0,
	  9, 10, 12, 11, 10,  0, 12, 11, 12, 10, 12, 11, 10, 11,  0,  0,
	 12, 11,  0, 13, 13, 12, 11, 13, 12, 11, 14, 13, 15, 14, 14,  0,
	 15, 13, 14, 16, 15, 15, 13, 16, 14, 13, 15, 16,  0, 14,  0, 15,
	 14, 16,  0, 17,  0,  0, 16, 17, 17, 16, 18, 17, 19,  0, 18,  0,
	 19, 17, 18, 20, 19,  0, 17, 20, 18,  0, 19, 20, 21, 18,  0, 19,
	 21, 20,  0, 22, 21, 23, 20, 22,  0, 23, 21, 22, 24, 23,  0, 21,
	 24, 22,  0, 23, 24, 25, 22,  0, 23, 25, 24,  0, 26, 25, 27, 24,
	 26,  0, 27, 25, 26, 28, 27,  0, 25, 28, 26,  0, 27, 28, 29, 26,
	  0, 27, 29, 28,  0, 30, 29, 31, 28, 30,  0, 31, 29, 30,  0, 31,
	  0,  0, 29, 30,  0, 31,  0, 32, 30, 33, 31, 32,  0, 33,  0, 32,
	  0, 33,  0,  0,  0, 32,  0, 33,  0,  0, 32,  0, 33 );

@nindex = (
	  0, 42, 66, 82, 94, 73,106,115,127,136,148,161,160,177,184,186,
	193,209,216,218,225,234,241,243,250,259,266,268,275,284,291,293,
	309,311, 93, 65,-36,-35 );

@out = (
	  3,  2,211, 17, 19, 18, 20, 21, 22, 15,179, 28, 34, 35, 36, 37,
	 38, 39,  7, 46, 47,  6, 49, 48, 51, 52, 53, 54, 55, 56, 57,  8,
	 63, 64, 65, 66, 67, 68,  1,128, 76,  9, 78, 50, 80, 10, 82, 83,
	 11, 85, 86, 12, 92, 93, 94, 95, 96, 97, 13,103,104,105,106,107,
	108, 74,127,114,115,117,118,119,120,121,116, 14,129,130,131,132,
	133,134,  4,140,141,142,  5,144,145, 45,151,152, 16,158,159,160,
	161, 77,167,168,169,170, 79,172,173, 84,180,181,182,183,184,185,
	186,187,188, 75,190, 81,194,195,196,197,198,199,200,201,202,203,
	204,143,210, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 40, 41, 42,
	 43, 44, 58, 59, 60, 61, 62, 69, 72, 70, 73, 71, 87, 88, 89, 90,
	 91, 98, 99,100,101,102,109,110,111,112,113,122,123,124,125,126,
	135,136,137,138,139,146,147,148,149,150,153,154,155,156,157,162,
	163,164,165,166,171,174,175,176,177,178,189,191,192,193,205,206,
	207,208,209 );

sub init {
	$state = 0;
	$kanastr = '';
}

sub trans {
	local($c) = @_;
	local($index);
	$index = $nindex[$state] + $ctype[ord($c)];
	if($index < 0 || $index >= 349){
		$state = 0;
	}
	else {
		$state = (($pstate[$index] == $state) ?
			$nstate[$index] : 0 );
	}
	$seq .= $c;
	if($state == 0){
		return 0;
	}
	if($state > 37){
		$str = $kanatbl[$out[$state-38]-2];
		$again = ($str =~ s/ $//);
		$kanastr .= $str;
		$state = 0;
		do trans($c) if $again;
		$seq = '';
		return 1;
	}
	return 0;
}

sub main'roma2kana {
	local($romastr) = @_;
	local($i);
	do init();
	for($i=0; $i < length($romastr); $i++){
		do trans(substr($romastr,$i,1));
	}
	do trans('');
	return $kanastr . $seq;
}

1;
