Gauche:内部エンコーディング

Gauche:内部エンコーディング

yaegashiさんのところから引越し。

内部エンコーディングを実行時に切替えるには?

WiLiKi の Debian パッケージで苦労したので、 Gauche が実行時に(コマンドラインオプションなどで) 内部エンコーディングを指定できるようにできないかと思いソースコードを眺めています。 char_euc_jp.h などの中で定義されているマクロ類を グローバル変数や関数ポインタに定義しなおせば実現できるような気がしますが、 SCM_CHAR_NBYTES() とか繰り返し読んでいるところではえらく速度が落ちそうです。

関連する話題

方法の検討

コンパイル時の選択でマクロ埋め込み(現在のバージョン)

コンパイル時選択、複数エンコーディングインストール可

別々のエンコーディング用にコンパイルされたバイナリやライラリファイルを (ディレクトリを分ける等で)同時にインストールできるようにする。

エンコーディング依存のマクロをポインタ経由の関数呼び出しに置き換える

エンコーディングに依存するモジュールのみ別のdsoとしてコンパイルする

マクロを関数に置き換えるよりも粒度の大きい方法。

エンコーディングマクロに依存している部分

yaegashi(2002/12/22 01:46:39 PST): エンコーディングにかかわる部分だけ別の .so に分離することは簡単かと考え、 手始めに SCM_CHAR_* マクロの呼び出され具合を src/*.o について調べてみたところ、 以下のファイルで使われていることがわかりました。 これらを libgauche から分離して、 エンコーディング毎に別ディレクトリに格納とかできるといいかな?

char.o:
         U SCM_CHAR_ENCODING_NAME
         U SCM_CHAR_MAX_BYTES
         U SCM_CHAR_NBYTES
         U SCM_CHAR_PUT
main.o:
         U SCM_CHAR_ENCODING_NAME
port.o:
         U SCM_CHAR_GET
         U SCM_CHAR_MAX_BYTES
         U SCM_CHAR_NBYTES
         U SCM_CHAR_NFOLLOWS
         U SCM_CHAR_PUT
read.o:
         U SCM_CHAR_MAX_BYTES
         U SCM_CHAR_NBYTES
         U SCM_CHAR_PUT
regexp.o:
         U SCM_CHAR_GET
         U SCM_CHAR_MAX_BYTES
         U SCM_CHAR_NBYTES
         U SCM_CHAR_NFOLLOWS
         U SCM_CHAR_PUT
string.o:
         U SCM_CHAR_BACKWARD
         U SCM_CHAR_GET
         U SCM_CHAR_MAX_BYTES
         U SCM_CHAR_NBYTES
         U SCM_CHAR_NFOLLOWS
         U SCM_CHAR_PUT
symbol.o:
         U SCM_CHAR_GET
         U SCM_CHAR_NBYTES

あと SCM_CHAR_MAX_BYTES が 構造体や配列の宣言で使われているところがありましたが、 これについてはサポートするエンコーディング中で最大のもの(6?)とかにしてしまえば よいでしょうか。


最終更新 : 2002/12/23 09:30:31 UTC