termcap (angl. term inal capability , vlastnosti terminálu ) - knihovna a databáze používaná na operačních systémech podobných Unixu. Umožňuje programům používat displej počítačového terminálu způsobem nezávislým na hardwaru, což značně zjednodušuje proces psaní přenosných textových aplikací. Bill Joy vytvořil první verzi knihovny termcap v roce 1978 [1] [2] pro operační systém BSD ; později byl portován do většiny unixových a unixových prostředí. Je známo, že návrh knihovny termcap byl ovlivněn návrhem databáze terminálů v dřívějším Inkompatibilním systému sdílení času . [3] Databáze termcap popisuje možnosti stovek různých terminálů. To umožňuje programům používat textový výstup nezávisle na typu terminálu. Textové editory vi a emacs používají termcap. Další programy naleznete v kategorii Termcap .
Zde jsou příklady polí obsažených v databázi:
Databáze termcap se skládají z jednoho nebo více popisů terminálů.
Každý popis musí obsahovat kanonický název terminálu. Může také obsahovat více aliasů. Tyto názvy se používají jako vyhledávací klíče v databázi termcap.
Popis obsahuje jednu nebo více vlastností, které mají standardní názvy. Vlastnosti mohou být následujících typů: Boolean , Numeric a String . Knihovna termcap nemá předdefinovaný typ pro každou z vlastností, takže typ je určen na základě syntaxe:
Aplikace, které používají termcap, očekávají, že společné vlastnosti budou určitého typu a získávají požadované hodnoty z databáze termcap pomocí volání knihovny, která úspěšně vracejí hodnotu pouze v případě, že se očekávaný typ shoduje s typem nalezeným v databázi.
Popisy lze vracet z databáze se změnami – přidáním, odebráním a předefinováním vlastností (například při změně velikosti obrazovky v emulátoru terminálu). Knihovna termcap vytvoří popis terminálu z požadovaného popisu, včetně odstranění nebo přepsání vlastností přijatých v době požadavku.
Data termcap jsou uložena v textovém formátu čitelném pro člověka. Knihovna termcap může vyžadovat text ze souborů nebo proměnných prostředí.
Proměnná prostředí TERM obsahuje název typu terminálu.
Proměnná prostředí TERMCAP může obsahovat samotnou databázi termcap. Nejčastěji se používá k uložení popisu jednoho terminálu, který je nastaven emulátorem terminálu, aby poskytoval vlastnosti terminálu shellu a závislým programům.
Proměnná prostředí TERMPATH je podporována pozdějšími implementacemi termcap a obsahuje cestu k souborům termcap.
Původní (a nejběžnější) implementace knihovny termcap přebírá data z plochého textového souboru. Vyhledávání velkého souboru termcap, například většího než 500 kB, může být pomalé. Pro urychlení vyhledávání lze využít speciální utilitu, například reorder , která umístí na začátek souboru uživatelem nejčastěji používané záznamy.
Implementace knihovny termcap BSD-4.4 ukládají popisy terminálů v hašované databázi (například Berkeley DB verze 1.85). Ukládají se dva typy záznamů: aliasy, které ukazují na kanonické záznamy, a kanonické záznamy samotné. Obsah položky termcap je uložen jako prostý text.
Původní implementace termcap byla navržena tak, aby měla nízkou paměť:
Pozdější implementace termcap obecně umožňují delší křestní jméno. Názvy vlastností však musí být dvoupísmenné ve všech implementacích.
Funkce tgetent použitá ke čtení popisu terminálu bere jako vstup adresu vyrovnávací paměti, jejíž velikost musí být dostatečně velká pro čtení dat (1024 bajtů). Pozdější implementace termcap mohou toto omezení zmírnit povolením nulového ukazatele jako parametru [4] nebo skrytím části, která se nevejde do vyrovnávací paměti, například prostřednictvím vlastnosti ZZ v implementaci termcap NetBSD . [5] Knihovna terminfo také emuluje rozhraní termcap, i když ve skutečnosti nepoužívá vyrovnávací paměť s pevnou velikostí.
Emulace rozhraní termcap v knihovně terminfo umožňuje uložit více položek bez omezení jejich pozice. Některé pozdější implementace termcap mohou mít také tuto vlastnost, ačkoli to obecně zůstává nezdokumentováno. [6]
Speciální vlastnost "hz" byla přidána pro podporu terminálu Hazeltine 1500, který měl nešťastnou volbu znaku vlnovky ('~') jako začátku únikové sekvence. [7] Pro podporu tohoto terminálu jsem musel napsat speciální kód, který při výstupu textu s vlnovkami provedl speciální substituci, aby se zabránilo provádění neočekávaných řídicích příkazů. [8] Kromě toho zabíraly místo na obrazovce značky atributů (například podtržítka na začátku a na konci). {{{1}}}Komentáře ve zdrojovém kódu popisují tuto funkci frází "Hazeltine braindamage" ("Lískové poškození mozku"). [9] Vzhledem k tomu, že Hazeltine 1500 byl v 70. letech oblíbeným terminálem, {{{1}}}bylo důležité implementovat pro něj podporu v termcapu.