2. 内部コードの扱いと、制御の流れ

  skf は、内部構造上は、入力から読み込んだコードを 「言語+ Unicode のコードポイント (UTF-32 範囲)」の組に変換し、それを所定のコード系に変換する構造になっている。処理の都合 (速度的な判断) から、入力の口 (すべて 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 用のエンコーディング向け入り口が別個に存在するが、1.95 ではエンコーディング関連の設定直後 u_in が呼ばれている。
  (5) b_in:	B-Right/V 入力を扱う。
  (6) t_in:	透過入力を扱う。
  
  入り口数は preconvert で判定するコードセット種別依存であり、両方を同期して変更することにより変更可能である。


2.3 内部特殊コード
2.3.1 変換時の特殊コード
  内部コードは UTF-32 であるため、入力起因では U+d800 - U+dfff は現れない。このため v1.95 以降では skf 内部で特殊な処理をする場合の代替文字として流用している。この文字は変換表に登録されており、in_converter.c の入り口関数で生成される。
  この文字自体は oconv() は素通しで、*_private_oconv() 中で所定の変換処理が呼ばれる。
  v1.94 以前にはこのようなコードの扱いはない。

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() の呼び出し時のみに使われる。バッファされた文字がない場合、何も出力されない。

