curs_termcap(3x) curs_termcap(3x)
PC, UP, BC, ospeed, tgetent, tgetflag, tgetnum, tgetstr,
tgoto, tputs
- terminfo 機能データベースへの直接の curses インターフェイス
#include <curses.h>
#include <term.h>
extern char PC;
extern char * UP;
extern char * BC;
extern short ospeed;
int tgetent(char *bp, const char *name);
int tgetflag(char *id);
int tgetnum(char *id);
char *tgetstr(char *id, char **area);
char *tgoto(const char *cap, int col, int row);
int tputs(const char *str, int affcnt, int (*putc)(int));
これらのルーチンは termcap ライブラリを使うプログラムが
変換するのを助けるため、ライブラリに含まれています。
これらのルーチンは terminfo データベースを使って
エミュレートされ、引数は (termcap ライブラリと) 同じです。
したがって、それらは terminfo 収録項目 (エントリ) が
コンパイルされている収録項目の機能項目 (ケーパビリティ) を
問い合わせることしかできません。
tgetent ルーチンは name に対応する収録項目をロードします。
このルーチンは次の値を返します。
1 成功のとき
0 そのような収録項目がない (または、ジェネリック・タイプで
あり、curses アプリケーションを実行するには情報が
少なすぎる)
-1 terminfo データベースが見つからない
このルーチンは termcap ライブラリと 2 つの点で異なります。
o このエミュレーションはバッファ・ポインタ bp を
無視します。
termcap ライブラリはこのポインタが指す領域に端末記述の
コピーを格納します。
しかし、ncurses は端末記述をコンパイルされた
バイナリ形式で格納し、それは同じものではありません。
o 戻り値に違いがあります。
termcap ライブラリは端末記述が generic 機能項目で
マークされているかどうか、または端末記述が
カーソル・アドレッシングを持つかどうか、
チェックしません。
tgetflag ルーチンは id に対するブール値収録項目を取得します。
できない場合はゼロです。
tgetnum ルーチンは id に対する数値収録項目を取得します。
できない場合は -1 です。
tgetstr ルーチンは id に対する文字列収録項目を返します。
できない場合はゼロです。
返された文字列を出力するには tputs を使ってください。
引数 area は次のように使われます。
o 呼び出し側のアプリケーションが管理するバッファへの
ポインタのアドレスとみなします。
o しかし、ncurses はその area が NULL でないことと、
結果を返すパッファ・ポインタも NULL でないことを
確かめます。
どちらかのチェックに失敗したときは、引数 area は
無視されます。
o チェックが成功すると、ncurses は area で指される
バッファへ返す値をコピーし、area の値はこの値の
終端ヌルを通り越した点まで増やされます。
(訳注: *area と思われる)
o 戻り値そのものはメモリにロードされた端末記述内の
アドレスです。
tgetflag, tgetnum, tgetstr の引数 id の最初の 2 文字だけが
検索の際に比較されます。
tgoto ルーチンは引数から与えられた機能項目のインスタンスを
生成します。
このルーチンからの出力は tputs に渡すものです。
tputs ルーチンは curs_terminfo(3x) マニュアル・ページで
説明しています。
このルーチンは termcap 名によっても terminfo 名によっても
機能項目を検索することができます。
変数 PC, UP, BC はそれぞれ terminfo 収録項目 pad_char,
cursor_up, backspace_if_not_bs のデータとして tgetent が
設定します。
ncurses は UP を使いません。
PC は tdelay_output 関数で使います。
BC は tgoto エミュレーションで使います。
変数 ospeed は端末の速度を反映してシステム固有の
コーディングで ncurses が設定します。
特記がない限り、整数を返すルーチンは失敗のとき ERR を、
正常終了のとき OK (SVr4 は「ERR 以外の整数値」としか
指定していません) を返します。
ポインタを返すルーチンはエラーのとき NULL を返します。
ca その他のパラメータ化された文字列を tgetstr を呼び出して
読み出すなら、旧式で十分な互換性のない termcap の
表記法ではなく、terminfo の表記法で返されることに
注意してください。
ともに terminfo 形式の文字列を terminfo として展開する
tgoto または tparm の呼び出しだけしか行わないならば
問題を引き起こしません。
(tgoto 関数は、もし termcap をサポートするように構成されて
いれば、"%p" パラメータか "$<..>" ディレイを探すことにより、
文字列が実際に terminfo 形式かどうかチェックします。そして
文字列が terminfo のように見えないときは termcap 形式の
パーサ (構文解析ルーチン) を呼び出します。)
terminfo が文字列機能項目でパディングを表す仕様が termcap と
異なっているため、tputs("50"); は 50 ミリ秒の処理待ちをせず、
リテラル "50" を出力します。
これにうまく対処してください。
termcap には terminfo の sgr 文字列に対応するものがないことに
注意してください。
その結果のひとつとして、termcap アプリケーションは
me (terminfo の sgr0) が代替文字セットをリセットしないものと
仮定します。
この実装は termcap インターフェイスに見せるデータを
チェックし修正して、この点での termcap の制限に適応させます。
これらの関数は XSI Curses standard, Issue 4 に記載されて
います。
しかし、これらは廃止予定と注記されており、将来の
バージョンでは削除されるかもしれません。
XSI Curses standard も SVr4 もマニュアル・ページで
tgetent の戻り値を正しく記述していません。しかし、SVr1 以来
3 つとも実際には値を返していました。
特に XSI Curses documentation の手落ちは、tgetent が
OK または ERR を返すものと誤解していました。
これらの関数の目的は termcap ライブラリとの互換性を
与えることなので、それは ncurses でよりも
XCurses, Issue 4, Version 2 での欠陥となっています。
特定の termcap アプリケーションをサポートするために、
いくつかの外部変数が用意されています。
しかし、termcap アプリケーションによるそれらの変数の使用に
ついてはあまり説明されていません。たとえば、入力と出力を
区別していません。
特に、一部のアプリケーションは ospeed を宣言したり
修正したりすると報告されています。
引数 id の初めの 2 文字だけが使われるという注釈は、多くの
開発者から忘れられています。
オリジナルの BSD 4.2 termcap ライブラリ
(とその歴史的遺物) は tgetstr, tgetnum, tgetflag に渡される
パラメータ名の終端ヌル NUL を必要としませんでした。
いくつかのアプリケーションは、termcap インターフェイスには
パラメータ名に終端 NUL が必要ないとみなしています。
これらの問題を考慮すると、
o 特別な場合として、tgetflag は端末記述の最後にあった
1 文字の識別子と一致しました。
ポータブル・プログラムでこの動作に依存してはいけません。
この実装は 1 文字の機能項目名との一致を許していません。
o この実装は termcap インターフェイスの検索による
2 文字より長い拡張機能項目名との一致を許していません。
curses(3x), terminfo(5), term_variables(3x), putc(3).
http://invisible-island.net/ncurses/tctest.html
curs_termcap(3x)