/* # skkinput (Simple Kana-Kanji Input)
 * maketable.c --- Create kana-kanji table for skkinput
 * This file is part of skkinput.
 * Copyright (C) 1997
 * Takashi SAKAMOTO (sakamoto@yajima.kuis.kyoto-u.ac.jp)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with skkinput; see the file COPYING.  If not, write to
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 */
#include <stdio.h>

struct roma_kana_table {
  unsigned char *prefix ;
  unsigned char *kana ;
  unsigned char *katakana ;
} ;

/* ローマ字かなの変換テーブル「ａ」編 */
static struct roma_kana_table skk_roma_kana_a[] = {
  { "",   "あ",   "ア"   },
  { "b" , "ば",   "バ"   },  { "by", "びゃ", "ビャ" },
  { "ch", "ちゃ", "チャ" },  { "cy", "ちゃ", "チャ" }, 
  { "d",  "だ",   "ダ"   },  { "dh", "でゃ", "デャ" },
  { "dy", "ぢゃ", "ヂャ" },
  { "f",  "ふぁ", "ファ" },  { "fy", "ふゃ", "フャ" },
  { "g",  "が",   "ガ"   },  { "gy", "ぎゃ", "ギャ" },
  { "h",  "は",   "ハ"   },  { "hy", "ひゃ", "ヒャ" },
  { "j",  "じゃ", "ジャ" },  { "jy", "じゃ", "ジャ" },
  { "k",  "か",   "カ"   },  { "ky", "きゃ", "キャ" },
  { "m",  "ま",   "マ"   },  { "my", "みゃ", "ミャ" },
  { "n",  "な",   "ナ"   },  { "ny", "にゃ", "ニャ" },
  { "p",  "ぱ",   "パ"   },  { "py", "ぴゃ", "ピャ" },
  { "r",  "ら",   "ラ"   },  { "ry", "りゃ", "リャ" },
  { "s",  "さ",   "サ"   },  { "sh", "しゃ", "シャ" },
  { "sy", "しゃ", "シャ" }, 
  { "t",  "た",   "タ"   },  { "th", "てぁ", "テァ" },
  { "ty", "ちゃ", "チャ" },
  { "v",  "う゛ぁ", "ヴァ" },{ "w",  "わ",   "ワ" },
  { "x",  "ぁ",   "ァ"   },  { "xk", "か",   "ヵ" },
  { "xw", "ゎ",   "ヮ"   },  { "xy", "ゃ",   "ャ" },
  { "y",  "や",   "ヤ"   },
  { "z",  "ざ",   "ザ"   },  { "zy", "じゃ", "ジャ" },
  { NULL, NULL,     NULL }
} ;

/* ローマ字かなの変換テーブル「ｉ」編 */
static struct roma_kana_table skk_roma_kana_i[] = {
  { "",   "い",     "イ"   },
  { "b",  "び",     "ビ"   }, {"by", "びぃ", "ビィ"},
  { "ch", "ち",     "チ"   }, {"cy", "ちぃ", "チィ"},
  { "d",  "ぢ",     "ヂ"   }, {"dh", "でぃ", "ディ"},
  { "dy", "ぢぃ",   "ヂィ" },
  { "f",  "ふぃ",   "フィ" }, {"fy", "ふぃ", "フィ"},
  { "g",  "ぎ",     "ギ"   }, {"gy", "ぎぃ", "ギィ"},
  { "h",  "ひ",     "ヒ"   }, {"hy", "ひぃ", "ヒィ"},
  { "j",  "じ",     "ジ"   }, {"jy", "じぃ", "ジィ"},
  { "k",  "き",     "キ"   }, {"ky", "きぃ", "キィ"},
  { "m",  "み",     "ミ"   }, {"my", "みぃ", "ミィ"},
  { "n",  "に",     "ニ"   }, {"ny", "にぃ", "ニィ"},
  { "p",  "ぴ",     "ピ"   }, {"py", "ぴぃ", "ピィ"},
  { "r",  "り",     "リ"   }, {"ry", "りぃ", "リィ"},
  { "s",  "し",     "シ"   }, {"sh", "し",   "シ"},
  { "sy", "しぃ",   "シィ" },
  { "t",  "ち",     "チ"   }, {"th", "てぃ", "ティ"},
  { "ty", "ちぃ",   "チィ" },
  { "v",  "う゛ぃ", "ヴィ" }, {"w",  "うぃ", "ウィ"},
  { "x",  "ぃ",     "ィ"   }, {"xw", "ゐ",   "ヰ"},
  { "z",  "じ",     "ジ"   }, {"zy", "じぃ", "ジィ"},
  { NULL, NULL,     NULL   }
} ;

/* ローマ字かなの変換テーブル「ｕ」編 */
static struct roma_kana_table skk_roma_kana_u[] = {
  { "",   "う",   "ウ"   },
  { "b",  "ぶ",   "ブ"   }, { "by", "びゅ", "ビュ" },
  { "ch", "ちゅ", "チュ" }, { "cy", "ちゅ", "チュ" },
  { "d",  "づ",   "ヅ"   }, { "dh", "でゅ", "デュ" },
  { "dy", "ぢゅ", "ヂュ" },
  { "f",  "ふ",   "フ"   }, { "fy", "ふゅ", "フュ" },
  { "g",  "ぐ",   "グ"   }, { "gy", "ぎゅ", "ギュ" },
  { "h",  "ふ",   "フ"   }, { "hy", "ひゅ", "ヒュ" },
  { "j",  "じゅ", "ジュ" }, { "jy", "じゅ", "ジュ" },
  { "k",  "く",   "ク"   }, { "ky", "きゅ", "キュ" },
  { "m",  "む",   "ム"   }, { "my", "みゅ", "ミュ" },
  { "n",  "ぬ",   "ヌ"   }, { "ny", "にゅ", "ニュ" },
  { "p",  "ぷ",   "プ"   }, { "py", "ぴゅ", "ピュ" },
  { "r",  "る",   "ル"   }, { "ry", "りゅ", "リュ" },
  { "s",  "す",   "ス"   }, { "sh", "しゅ", "シュ" },
  { "sy", "しゅ", "シュ" },
  { "t",  "つ",   "ツ"   }, { "th", "てゅ", "テュ" },
  { "ts", "つ",   "ツ"   }, { "ty", "ちゅ", "チュ" },
  { "v",  "う゛", "ヴ"   }, { "w",  "う",   "ウ"   },
  { "x",  "ぅ",   "ゥ"   }, { "xt", "っ",   "ッ"   },
  { "xts","っ",   "ッ"   }, { "xy", "ゅ",   "ュ"   },
  { "y",  "ゆ",   "ユ"   },
  { "z",  "ず",   "ズ"   }, { "zy", "じゅ", "ジュ" },
  { NULL, NULL,     NULL }
} ;

/* ローマ字かなの変換テーブル「ｅ」編 */
static struct roma_kana_table skk_roma_kana_e[] = {
  { "",   "え",     "エ"   },
  { "b",  "べ",     "ベ"   }, { "by", "びぇ", "ビェ" },
  { "ch", "ちぇ",   "チェ" }, { "cy", "ちぇ", "チェ" },
  { "d",  "で",     "デ"   }, { "dh", "でぇ", "デェ" },
  { "dy", "ぢぇ",   "ヂェ" },
  { "f",  "ふぇ",   "フェ" }, { "fy", "ふぇ", "フェ" },
  { "g",  "げ",     "ゲ"   }, { "gy", "ぎぇ", "ギェ" },
  { "h",  "へ",     "ヘ"   }, { "hy", "ひぇ", "ヒェ" },
  { "j",  "じぇ",   "ジェ" }, { "jy", "じぇ", "ジェ" },
  { "k",  "け",     "ケ"   }, { "ky", "きぇ", "キェ" },
  { "m",  "め",     "メ"   }, { "my", "みぇ", "ミェ" },
  { "n",  "ね",     "ネ"   }, { "ny", "にぇ", "ニェ" },
  { "p",  "ぺ",     "ペ"   }, { "py", "ぴぇ", "ピェ" },
  { "r",  "れ",     "レ"   }, { "ry", "りぇ", "リェ" },
  { "s",  "せ",     "セ"   }, { "sh", "しぇ", "シェ" },
  { "sy", "しぇ",   "シェ" },
  { "t",  "て",     "テ"   }, { "th", "てぇ", "テェ" },
  { "ty", "ちぇ",   "チェ" },
  { "v",  "う゛ぇ", "ヴェ" }, { "w",  "うぇ", "ウェ" },
  { "x",  "ぇ",     "ェ"   }, { "xk", "け",   "ヶ"   },
  { "xw", "ゑ",     "ヱ"   },
  { "y",  "いぇ",   "イェ" },
  { "z",  "ぜ",     "ゼ"   }, { "zy", "じぇ", "ジェ" },
  { NULL, NULL,     NULL   }
} ;

/* ローマ字かなの変換テーブル「ｏ」編 */
static struct roma_kana_table skk_roma_kana_o[] = {
  { "",   "お",     "オ"   },
  { "b",  "ぼ",     "ボ"   }, { "by", "びょ", "ビョ" },
  { "ch", "ちょ",   "チョ" }, { "cy", "ちょ", "チョ" },
  { "d",  "ど",     "ド"   }, { "dh", "でょ", "デョ" },
  { "dy", "ぢょ",   "ヂョ" },
  { "f",  "ふぉ",   "フォ" }, { "fy", "ふょ", "フョ" },
  { "g",  "ご",     "ゴ"   }, { "gy", "ぎょ", "ギョ" },
  { "h",  "ほ",     "ホ"   }, { "hy", "ひょ", "ヒョ" },
  { "j",  "じょ",   "ジョ" }, { "jy", "じょ", "ジョ" },
  { "k",  "こ",     "コ"   }, { "ky", "きょ", "キョ" },
  { "m",  "も",     "モ"   }, { "my", "みょ", "ミョ" },
  { "n",  "の",     "ノ"   }, { "ny", "にょ", "ニョ" },
  { "p",  "ぽ",     "ポ"   }, { "py", "ぴょ", "ピョ" },
  { "r",  "ろ",     "ロ"   }, { "ry", "りょ", "リョ" },
  { "s",  "そ",     "ソ"   }, { "sh", "しょ", "ショ" },
  { "sy", "しょ",   "ショ" },
  { "t",  "と",     "ト"   }, { "th", "てょ", "テョ" },
  { "ty", "ちょ",   "チョ" },
  { "v",  "う゛ぉ", "ヴォ" }, { "w",  "を",   "ヲ"   },
  { "x",  "ぉ",     "ォ"   }, { "xy", "ょ",   "ョ"   },
  { "y",  "よ",     "ヨ"   },
  { "z",  "ぞ",     "ゾ"   }, { "zy", "じょ", "ジョ" },
  { NULL, NULL,     NULL   }
} ;

void print_string( unsigned char *string )
{
  int chara, length ;

  printf( "{\n" ) ;
  length = 0 ;

  while( *string != '\0' ){
    if( *string & 0x80 ){
      chara = ( ( *string ) << 8 ) | *( string + 1 ) ;
      printf( "\t{ CHARSET_JISX0208_1983, 0x%04x }, \n", chara & 0x7F7F ) ;
      string ++ ;
      string ++ ;
    } else {
      chara = *string ;
      printf( "\t{ CHARSET_ASCII, '%c' }, \n", chara ) ;
      string ++ ;
    }
    length ++ ;
  }
  while( length < 4 ){
    printf( "\t{ CHARSET_ASCII, '\\0' }, \n" ) ;
    length ++ ;
  }
  printf( "},\n" ) ;
  return ;
}

void maketable( struct roma_kana_table *table )
{
  struct roma_kana_table *ptr = table ;
  while( ptr->prefix != NULL ){
    printf( "{\n" ) ;
    print_string( ptr->prefix ) ;
    print_string( ptr->kana ) ;
    print_string( ptr->katakana ) ;
    printf( "},\n" ) ;
    ptr ++ ;
  }
  /* 終端文字列。*/
  printf( "{\n" ) ;
  print_string( "" ) ;
  print_string( "" ) ;
  print_string( "" ) ;
  printf( "},\n" ) ;
  return ;
}

int main( void )
{
  printf( "static struct roma_kana_table skk_roma_kana_a[] = {\n" ) ;
  maketable( skk_roma_kana_a ) ;
  printf( "} ;\n" ) ;
  printf( "static struct roma_kana_table skk_roma_kana_i[] = {\n" ) ;
  maketable( skk_roma_kana_i ) ;
  printf( "} ;\n" ) ;
  printf( "static struct roma_kana_table skk_roma_kana_u[] = {\n" ) ;
  maketable( skk_roma_kana_u ) ;
  printf( "} ;\n" ) ;
  printf( "static struct roma_kana_table skk_roma_kana_e[] = {\n" ) ;
  maketable( skk_roma_kana_e ) ;
  printf( "} ;\n" ) ;
  printf( "static struct roma_kana_table skk_roma_kana_o[] = {\n" ) ;
  maketable( skk_roma_kana_o ) ;
  printf( "} ;\n" ) ;
  return 0 ;
}
