tail head cat sleep
QR code linking to this page

manページ  — UNVIS

名称

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

内容

ライブラリ

Standard C Library (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() 関数は、適切に取扱わねばならないいくつかのリターンコードを 持っています。それらは次の通りです:
amp;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() 関数は、 BSD 4.4 ではじめて登場しました。

UNVIS (3) December 11, 1993

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

When people say "Drive safe!" I'm like no, a safe is for keeping money, I drive car.
— Artur Bagyants