TERM(5)

名称
term - コンパイル済みの term ファイルの形式

書式
term

解説

コンパイル済みの terminfo 属性記述はディレクトリ /usr/share/misc/terminfo の下にあります。 UNIX システムの巨大なディレクトリを線形探索するのを避けるため、 /c/name という形の 2 階層の命名規則が用いられます。 (ここで、 name は端末の名前で、 c は name の最初の文字です。) ですから、 act4 は、 /usr/share/misc/terminfo/a/act4 というファイル名で見つけることができます。 同じ端末を示す同義な名前は、同じコンパイル済みファイルへの複数の リンクとして実装されています。

この形式は、全てのハードウェアで同じになるように選ばれています。 1 バイトが 8 ビット以上であることは仮定していますが、バイトオーダや 符号拡張の方式については仮定していません。

コンパイル済みのファイルは tic プログラムにより生成され、 setupterm ルーチンにより読み取られます。 このファイルは 6 つの部分に分割されます。すなわち、 ヘッダ、 端末の名称、 ブール値のフラグ、 数値、 文字列、および 文字列テーブルです。

ヘッダセクションはファイルの冒頭にあります。 このセクションは、以下に示す形式の short 型の整数 6 個からなります。 これらの整数は (1) マジックナンバ (8 進で 0432)、 (2) 名称セクションのバイト単位での大きさ、 (3) ブール値のセクションに含まれるバイトの個数、 (4) 数値セクションに含まれる short 型整数の個数、 (5) 文字列セクションに含まれるオフセットの個数 (short 型整数)、 (6) 文字列テーブルのバイト単位での大きさ です。

short 型の整数は 2 個の 8 ビットバイトに格納されています。 最初のバイトは値の最下位 8 ビットを、2 番目のバイトは最上位 8 ビットを 含みます。(すなわち、値は 256*second+first と表現されます。) 値 -1 は 2 バイト 0377, 0377 で表現されますが、その他の負の値は構文違反です。 一般に、この値は、あるケーパビリティがその端末に備わっていないことを 示します。 この形式は VAX と PDP-11 のハードウェアに 一致するものであることにご注意下さい (これらはリトルエンディアンマシンです)。これに一致しないハードウェアの マシンでは、整数を 2 個のバイトとして読み込み、 リトルエンディアン値を算出する必要があります。

次に現れるのは端末名セクションです。 これは、端末のさまざまな名前を `|' 文字で区切って列挙した、 terminfo 記述の最初の行を含みます。 このセクションは 1 個の ASCII NUL 文字で終端されます。

ブール型のフラグは、フラグ 1 個につき 1 バイトを占めます。 このバイトは、フラグが存在するかしないかに従って、0 か 1 となる必要があります。 ケーパビリティはファイル <term.h> に含まれるのと同じ順番に並びます。

数値セクションが偶数バイト目から開始されるように、 ブール値のセクションと数値セクションの間には、 必要なら 1 個のナルバイトを挿入します (これは PDP-11 のワードアドレスアーキテクチャの名残であり、 元々は奇数バイト境界上のワードをアドレスすることで発生する IOT トラップを 避けるためにデザインされました)。 すべての short 型整数は short 型のワード境界に揃えて配置されます。

数値セクションはフラグセクションと同様です。 各ケーパビリティは 2 バイトを占め、リトルエンディアンの short 型整数として格納されます。 もし表現された値が -1 なら、そのケーパビリティは存在しないものと 解釈されます。

文字列セクションもまた同様です。 各ケーパビリティは上記の形式に従い、2 バイトの short 型整数として 格納されます。 値 -1 は、ケーパビリティが存在しないことを意味します。 それ以外の場合、値は、文字列テーブルの先頭からのオフセットとして 解釈されます。 ^X や \c といった記法で示された特殊文字は、その記法を解釈した結果の形で 格納され、印刷可能表現では格納されません。 パッド情報 $<nn> とパラメータ情報 %x は解釈を行なわずそのままの形で 格納されます。

最後のセクションは文字列テーブルです。これは文字列セクションで参照されている すべての文字列ケーパビリティの値を含みます。 各文字列はナルで終端されています。

setupterm ルーチンでは、ファイルに実際に存在するケーパビリティ とは異なるものが予想され得ることにご注意下さい。 setupterm が再コンパイルされた後にデータベースが更新される (ファイルにいくつかの未知のエントリが含まれる結果になります)か、 データベースが最後にコンパイルされた後にプログラムが再コンパイルされる (存在しないエントリを生む結果になります)両方の可能性があります。 ルーチン setupterm は両方の可能性に備える必要があります - これが、データ内に個数と大きさが含まれている理由です。 また、新しいケーパビリティは常に、ブール値、数値、文字列の ケーパビリティリストのそれぞれの最後に追加しなければなりません。

数値にリトルエンディアンを使用して他には自ら記述した書式を使用しても、 商用 UNIX バージョンとのバイナリ terminfo エントリの互換性を 信用することは賢くはありません。 問題は、少なくとも 3 種の terminfo (HP-UX AIX, OSF/1) が SVr1 後に System V がら分岐し、 System V と XSI の Curses 拡張と (バイナリ書式において) 衝突する 拡張ケーパビリティを文字列テーブルに追加したことです。 terminfo ソースの互換性に関する詳細な議論は、 terminfo(5) を参照してください。

例として、Lear-Siegler ADM-3 の記述の 16 進数ダンプを示します。 これは、ポピュラーですが、馬鹿な初期の端末です:

adm3a|lsi adm3a,
        am,
        cols#80, lines#24,
        bel=^G, clear= 32$<1>, cr=^M, cub1=^H, cud1=^J,
        cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
        home=^^, ind=^J,

000  1a 01 10 00 02 00 03 00  82 00 31 00 61 64 6d 33  ........ ..1.adm3
0010  61 7c 6c 73 69 20 61 64  6d 33 61 00 00 01 50 00  a|lsi ad m3a...P.
0020  ff ff 18 00 ff ff 00 00  02 00 ff ff ff ff 04 00  ........ ........
0030  ff ff ff ff ff ff ff ff  0a 00 25 00 27 00 ff ff  ........ ..%.'...
0040  29 00 ff ff ff ff 2b 00  ff ff 2d 00 ff ff ff ff  ).....+. ..-.....
0050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
0060  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
0070  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
0080  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
0090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
00a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
00b0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
00c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
00d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
00e0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
00f0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
0100  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
0110  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
0120  ff ff ff ff ff ff 2f 00  07 00 0d 00 1a 24 3c 31  ....../. .....$<1
0130  3e 00 1b 3d 25 70 31 25  7b 33 32 7d 25 2b 25 63  >..=%p1% {32}%+%c
0140  25 70 32 25 7b 33 32 7d  25 2b 25 63 00 0a 00 1e  %p2%{32} %+%c....
0150  00 08 00 0c 00 0b 00 0a  00                       ........ .

いくつかの制限: コンパイル済みのエントリは 4096 バイトを超えることが できません。名前フィールドは 128 バイトを超えることができません。

関連ファイル
/usr/share/misc/terminfo/*/*    コンパイル済みの端末ケーパビリティデータベース

関連項目
curses(3X), terminfo(5).