パスワードを忘れた? アカウント作成
726230 journal

route99の日記: pfaedit 日本語化

日記 by route99
BSDタイプライセンスのフォントエディタpfaeditを日本語化するには、

1、インプットメソッド有効化
1、EUC-JPのカタログ作成
1、カタログの翻訳

pfaeditは独自ツールキットgdrawがある。インプットメソッドはgtextfield.c
に追加する形になるだろう。

カタログはアーカイブ内の pfaedit/nomen.*.c である。
日本語なら pfaedit/nomen.ja.c を作る。
ファイルを置くだけでよく、Makefile 等の変更はいらない。
通常は pfaedit/nomen.en.c をコピーして文字列宣言を
書き変えることにするのがよいだろう。唯一やることは

static enum encoding enc = e_iso8859_1;

を該当のエンコーディングに変えることだ。
エンコーディングのリストは inc/charset.h にある。
すでにShift_JIS(e_sjis)はうまくいく。しかし、「表」のように2バイト目に「'\'」
が来るものはそのあとに\を入れる必要がある。

e_sjis が良いなら同じように e_euc も使えそうだがそうではない。
コードに埋めこむためのツールのソース pfaedit/makenomenh.c を
みるとすぐ分るが、なかで e_sjis などがハードコードされている。
そのため、そのままで使える日本語エンコーディングはe_sjis しかない。

そこでEUC-JP(e_euc)に対応させてみる。
まず、nomen.*.c はどう使われているかをみる。
一度ビルドした後、nomen.*.cを編集してmakeしてみる、
するとmakenomenhにより、Cソースを生成し、それをコンパイル
しているようだ。そのため pfaedit/makenomenh.c を見る。
とりあえず、237行目にsjisという文字列がある。
どうやらここで変換しているようだ。

また、400行目くらいにある配列で

{e_sjis, "e_sjis"},

という宣言がある。パーズや生成でつかうのだろう。
とりあえず、このあとに

{e_euc, "e_euc"},

を埋めておく。

237行目にもどる。

どうやら1文字読みこみ、ASCII(<0x80)ならリターン、
コメントから片仮名ならunicode_from_jis201というテーブルを引いて
リターンしている。
それ以外ならもう一文字読みこんで、引き算でやってるのでよけいに分り
にくいがこれはSJIS漢字コードをJISコード(0x2121で始まるやつ)に変換しているだけだ。
最後にunicode_from_jis208テーブルを引いて返している。
ただこのテーブルは0x2121が先頭に来るようで、添字で行っている
計算はそのためのようだ。

これならeuc変換を追加することは簡単である(jisx0201なしで)。
else の直前に以下のelse ifを追加すればいい。

} else if ( enc == e_euc ) {
       ch1 = charval(buffer);
       if ( ch1 < 0x80 )
return( ch1 );
       ch2 = charval(buffer);
       ch1 &= 0x7f;
       ch2 &= 0x7f;
return( unicode_from_jis208[(ch1-21)*94+(ch2-21)] );

結局SJISと違うのは、&= のとこだけ。

pfaedit/nomen.ja.c をいくつか 日本語訳してから、
make し、 ./pfaedit/pfaedit してみる。
予想通りうまく行った。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...