Develop and Download Open Source Software

Show incremental difference of selected versions of 2. 内部コードの扱い.

category(Tag) tree

file info

category(Tag)
root
file name
2.internal_code.txt
last update
2007-01-08 19:31
type
Plain Text
editor
Seiji Kaneko
description
language
Japanese
translate
--- /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() の呼び出し時のみに使われる。バッファされた文字がない場合、何
+も出力されない。
+