Termcap

Termcap (terminal capability；タームキャップ) は、Unix系オペレーティングシステムで利用されるライブラリ兼、単一ファイル形式のデータベースであり、端末をデバイスに依存せず扱えるよう設計されている。これにより、移植性の高いテキストモードアプリケーションの開発が容易となる。1978年にビル・ジョイがBSD用に作成しPeter H. Salus, "The history of Unix is as much about collaboration as it is about technology", Byte, October 1994.Kenneth C. R. C. Arnold and Elan Amir, "Screen Updating and Cursor Movement Optimization: A Library Package"、その後他のUnix系OSに移植された。

Termcapデータベースには、画面の行・列数、カーソル操作用の制御文字列、画面消去やスクロール方法、特殊キーの制御方法など、端末ごとに異なる数百種類の機能が記述されており、viやEmacsなどのスクリーンエディタで利用されている。

Terminfoと異なり、Termcapは単一ファイル形式で構成され、初期Unix端末向けに設計された点が特徴である。

データモデル
termcapデータベースは1個以上の端末の記述からなる。

インデックス
各記述は端末のカノニカル名を含んでいなければならない。1個以上のエイリアスを含んでいてもよい。
termcapライブラリはカノニカル名・エイリアスをキーにしてデータベースを検索する。

値
記述は1個以上のケーパビリティを含む。ケーパビリティは慣習的な名前を持ち、真偽型、数値型、文字列型のいずれかになる。
各ケーパビリティに既定の型はなく、次のように構文によって判断される：
 文字列型ケーパビリティは名前と値の間に「=」を含む
 数値型ケーパビリティは名前と値の間に「#」を含む
 真偽型ケーパビリティは値を持たない（指定されたものがtrueになる）

termcapを使うアプリケーションはよく使われるケーパビリティが特定の型であることを前提にしており、ケーパビリティが前提通りの型でないと失敗するライブラリ関数を使って値を取得する。

階層構造
termcapの記述は他の記述をインクルードでき、そのときインクルードしたケーパビリティの一部を無効にしたり上書きしたり追加することができる。
ストレージモデルが何であれ、termcapライブラリは要求があったときに記述をインクルードして構築する。

ストレージモデル
termcapのデータはテキストで保存されるため、編集が容易である。そのテキストはファイルまたは環境変数に保存できる。

環境変数
環境変数 TERM には端末の種類名をセットする。

環境変数 TERMCAP にはtermcapデータベースをセットできる。
使われ方としては、端末エミュレータがその特性をシェルに伝えるために1個の記述を入れるという手法がよくある。

環境変数 TERMPATH は比較的新しい実装で使われ、termcapファイルを検索するパスをセットする。

フラットなファイル構造
オリジナルの（そしてほとんどの）実装では、フラットなテキストファイルからデータを抽出する。
500 KBといった大きなファイルから記述を検索するのは遅いので、reorderのようなユーティリティが使われる。これはよく使われるエントリをファイルの最初の方に配置するものである。

ハッシュデータベース
BSD-4.4ベースの実装では記述をハッシュデータベースに保存する（例：Berkeley DB version 1.85など）。
この場合、カノニカルなエントリと、カノニカルなエントリを指すエイリアスという2種類のレコードが保存される。
エントリのテキストはそのまま保存される。

制限と拡張
オリジナルの実装は使用メモリが少なくなるように設計された：
 16ビットに収まるように最初の名前は2文字
 ケーパビリティ名は2文字
 記述は1023文字まで
 インクルードできる記述は1個まで。最後に置かなければならない

比較的新しい実装ではエントリの最初に2文字の名前を書かなくてもよくなっている。

ケーパビリティ名は未だに全ての実装で2文字である。

端末の記述を読み込む tgetent 関数は、呼び出す側が十分なサイズのバッファを用意せねばならず、そのサイズは1024バイトとされていた。
新しい実装ではバッファの代わりにNULLポインタを渡すことでこの制限が緩和されているThe GNU Termcap Library。
またterminfoがtermcapをエミュレートしている場合もあり、その場合は固定長バッファは使わない。

terminfoによりエミュレーションの場合は、他のエントリを複数インクルードすることができ、位置の制限もない。
はっきりと文書化されてはいないが、いくつかの新しいtermcap実装でもこの機能が取り入れられている
。

廃止された機能
"hz"ケーパビリティはHazeltine 1500のために特別に定義されていた。不幸なことにこの端末はASCII文字のチルド（「~」）を制御シーケンスに使っていた。

関連情報
端末
curses
Terminfo

参考文献

外部リンク
最新のtermcapデータ
Termcap/Terminfo Resources Page（エリック・レイモンドのウェブサイト内）

Category:UNIX