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)