スポンサーリンク

UNVIS(3) FreeBSD ライブラリ関数マニュアル UNVIS(3)

名称

unvis, strunvis − キャラクタの画像表現のデコード

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <vis.h>

int

unvis(char *cp, int c, int *astate, int flag);

int

strunvis(char *dst, const char *src);

解説

unvis() および strunvis() 関数は、例えば vis(3) 関数によって作り出された ようなキャラクタの画像表現をデコードして元の形に戻します。 unvisは c にあ る連続するキャラクタとともに有効なシーケンスが認識されるまで呼び出され、 それが認識されるとデコードされたキャラクタが cp によって指されるキャラク タのところに置かれます。 strunvisは、 src により指されるキャラクタを dst により指されるバッファへデコードします。

strunvis() 関数は、エスケープシーケンスをデコードしながら単に srcdst へコピーし、 dst に置かれたキャラクタの数を返すか、または無効なエスケープ シーケンスが検出された場合には −1 を返します。 dst のサイズは、 src のサ イズに等しくなければなりません (すなわち、デコード中には拡張は起こりませ ん)。

unvis() 関数は、任意のバイトストリームをデコードできるステートマシンをイ ンプリメントしています。デコードされるそのバイトに付随するすべてのステー トは、 unvis() 関数の外に保存されますから (すなわち、ステートへのポインタ は渡されますから)、異なるストリームをデコードする呼び出しを自由に混在する ことができます。バイトストリームのデコードを開始するには、まず整数をゼロ に初期化します。この整数へのポインタおよびデコード先キャラクタへのポイン タとともに連続するバイトのそれぞれに unvis() を呼び出します。 unvis() 関 数は、適切に取扱わねばならないいくつかのリターンコードを持っています。そ れらは次の通りです:

       0 (ゼロ)

キャラクタがもう一つ必要であり、まだ何も認識されていませ ん。

UNVIS_VALID
有効なキャラクタが認識され、cp によって指される場所に置 かれています。

UNVIS_VALIDPUSH
有効なキャラクタが認識され、cp によって指される場所に置 かれています。しかし、現在渡されているそのキャラクタをも う一度渡す必要があります。

UNVIS_NOCHAR
有効なシーケンスが検出されたが、キャラクタは作成されてい ません。このリターンコードは、キャラクタの間の論理的区切 りを示すために必要です。

UNVIS_SYNBAD
無効なエスケープシーケンスが検出されたか、またはデコーダ が不明のステートにあります。デコーダはスタート時のステー トに置かれます。

ストリームのすべてのバイトが処理されたとき、 flag を UNVIS_END に設定して もう一度 unvis() を呼び出して残っているキャラクタを抽出します (渡された キャラクタは無視されます)。

次のような部分的コードは、 unvis() の適切な使用法を示しています。

int state = 0;
char out;

while ((ch = getchar()) != EOF) {
again:

switch(unvis(&out, ch, &state, 0)) {

case 0:

case UNVIS_NOCHAR:

break;

case UNVIS_VALID:

(void) putchar(out);

break;

case UNVIS_VALIDPUSH:

(void) putchar(out);

goto again;

case UNVIS_SYNBAD:

(void)fprintf(stderr, "bad sequence!\n");

exit(1);

}

}
if (unvis(&out, (char)0, &state, UNVIS_END) == UNVIS_VALID)

(void) putchar(out);

関連項目

vis(1)

歴史

unvis() 関数は、 4.4BSD ではじめて登場しました。

FreeBSD 10.0 December 11, 1993 FreeBSD 10.0

スポンサーリンク