Show incremental difference of selected versions of 2. 内部コードの扱い.
--- /tmp/DOCMAN2PtNVgZ 2024-05-31 08:28:29.989304782 +0900
+++ /tmp/DOCMAN2d1PuFT 2024-05-31 08:28:29.989304782 +0900
@@ -1,23 +1,89 @@
-2. 内部コードの扱い
-
- skf は、内部構造上は、入力から読み込んだコードを 「言語+ Unicode のコードポイント (UCS4)」の組に変換し、それを所定のコード系に変換する構造になっている。処理の都合 (速度的な判断) から、入力の口 (すべて in_converter.c で定義) は複数あり、上記の組が一旦すべて oconv.c の oconv() 関数を通過して、genoconv.c の各コード系の処理を通した後、実際の所定のコードに変換するためのルーチン (oconv.h と oconv,c で定義) が呼ばれるようになっている。
- また、genoconv で処理できないものは一旦 plug_convert.c に渡されて、または genoconv.c 中で直接変換されて再度 Unicode → genoconv のルートを通る。1.94 までではこの入り口も oconv() であったが、1.95 からは post_oconv() と入り口が分離されている。
- 現在言語は announce 以外で外部から直接は見えることはないが、内部ではすでに特にコード判定論理で見ているため、注意が必要である。言語の扱いに関しては、関連の章を参照のこと。
-
-2.1.1 内部コードへの入り口
- 上記説明の通り、in_convert.c にすべて集約されている。1.95 では入り口は以下の 6つである。
-
- (1) e_in: EUC, iso-2022 系コードセットなどを受ける。詳細は別途記載のテーブル参照。
- (2) s_in: Shift_JIS, Big5 グループ、GBK/GB18030 などを受ける。詳細は別途記載のテーブル参照。
- (3) ks_in: EBCDIC 関連コードセットを扱う。
- (4) u_in: Unicode(TM) の各種エンコーティングを扱う。UTF-8/UTF-7 用のエンコーディング向け入り口が形式的に存在するが、エンコーディング関連の設定直後 u_in が呼ばれている。
- (5) b_in: Bright/V 入力を扱う。
- (6) t_in: 透過入力を扱う。
-
- 入り口数は preconvert で判定するコードセット種別依存であり、両方を同期して変更することにより変更可能である。
-
-2.1.2 内部特殊コード
- 内部コードは UCS-4 であるため、入力起因では U+d800 - U+dfff は現れない。このため v1.95 以降では skf 内部で特殊な処理をする場合の代替文字として流用している。この文字は変換表に登録されており、in_converter.c の入り口関数で生成される。
- この文字自体は oconv() は素通しで、*_private_oconv() 中で所定の変換処理が呼ばれる。
-
+2. 内部コードの扱いと、制御の流れ
+
+ skf は、内部構造上は、入力から読み込んだコードを 「言語+ Unicode のコ
+ードポイント (UCS4)」の組に変換し、それを所定のコード系に変換する構造に
+なっている。処理の都合 (速度的な判断) から、入力の口 (すべて in_converter.
+c で定義) は複数あり、上記の組が一旦すべて oconv.c の oconv() 関数を通過
+して、genoconv.c の各コード系の処理を通した後、実際の所定のコードに変換
+するためのルーチン (oconv.h と oconv,c で定義) が呼ばれるようになってい
+る。
+ また、genoconv で処理できないものは一旦 plug_convert.c に渡されて、ま
+たは genoconv.c 中で直接変換されて再度 Unicode → genoconv のルートを通
+る。1.94 までではこの入り口も oconv() であったが、1.95 からは post_oconv
+() と入り口が分離されている。
+ 現在言語は announce 以外で外部から直接は見えることはないが、内部ではす
+でに特にコード判定論理で見ているため、注意が必要である。言語の扱いに関し
+ては、関連の章を参照のこと。
+ また、内部で渡されている skf_ucode は 32bit の符号付き整数が格納できる
+変数である。ここで、符号付きであることに注意。UCS-4 の文字はそのままは格
+納できず、かつ EOF を符号付きのまま後段の処理に送ることができる。
+
+2.1 制御の流れ
+ 入力のバイトストリームは、以下の制御フローで変換される。
+
+ rvGETC (skf_fileio.c またはマクロ)
+ ↓ (16 bit integer)
+ デコード指定があるときは、デコーダ (in_decoder.c)
+ ↓ (16 bit integer)
+ *_in (in_converter.c)
+ ↓ (skf_ucode)
+ oconv (oconv.c)
+ ↓ (skf_ucode)
+ o_*_conv (genconv.c)
+ ↓ (16 bit integer) ↓ (skf_ucode)
+ ↓ (plug_convert)
+ ↓ ↓ (skf_ucode)
+ ↓ post_oconv (oconv.c)
+ ↓ ↓ (skf_ucode)
+ ↓ o_*_conv (genconv.c)
+ ↓ ↓ (16 bit integer)
+ SKF_*_OUT* (oconv.c またはマクロ)
+ ↓ (16 bit integer)
+ SKFputc (skf_fileio.c)
+
+2.2 内部コードへの入り口
+ 上記説明の通り、in_convert.c にすべて集約されている。1.95 では入り口は
+以下の 6つである。
+
+ (1) e_in: EUC, iso-2022 系コードセットなどを受ける。詳細は別途記載
+のテーブル参照。
+ (2) s_in: Shift_JIS, Big5 グループ、GBK/GB18030 などを受ける。詳細
+は別途記載のテーブル参照。
+ (3) ks_in: EBCDIC 関連コードセットを扱う。
+ (4) u_in: Unicode(TM) の各種エンコーティングを扱う。UTF-8/UTF-7 用
+のエンコーディング向け入り口が形式的に存在するが、エンコーディング関連の
+設定直後 u_in が呼ばれている。
+ (5) b_in: Bright/V 入力を扱う。
+ (6) t_in: 透過入力を扱う。
+
+ 入り口数は preconvert で判定するコードセット種別依存であり、両方を同期
+して変更することにより変更可能である。
+
+
+2.3 内部特殊コード
+2.3.1 変換時の特殊コード
+ 内部コードは UCS-4 であるため、入力起因では U+d800 - U+dfff は現れない。
+このため v1.95 以降では skf 内部で特殊な処理をする場合の代替文字として流
+用している。この文字は変換表に登録されており、in_converter.c の入り口関
+数で生成される。
+ この文字自体は oconv() は素通しで、*_private_oconv() 中で所定の変換処
+理が呼ばれる。
+
+2.3.2 EOF 群
+ skf は 0 以下の文字コードは EOF として扱われる。但し、内部の処理として
+は入力から与えられた EOF と、処理の過程で発生した擬似的な EOF があり、値
+として区別されている。以下に個々の種別と、用法を示す。
+
+ (1) sEOF: 入力起因の EOF である。oconv に渡された場合は EOF がその
+まま出力されるが、in_convert.c 中の関数で EOF を検出した場合には、複数フ
+ァイルを結合する関係で、oconv() が直接呼び出されることはなく一旦 skf.c
+に制御が戻される。
+ (2) sOCD: MIME などのデコーダ判定の、特定文字集合の文字列の終端文
+字を検出したことを示す。出力は oconv() で握りつぶされる。また、sEOF 同様
+一旦 skf.c に制御が戻り、in_codeset を更新した上で、後続文字を処理するた
+め再度 preconvert() が呼び出される。
+ (3) sFLSH: oconv() でバッファしている文字を出力させるためのダミー文
+字。oconv() の呼び出し時のみに使われる。バッファされた文字がない場合、何
+も出力されない。
+
| |