termcap (eng. term inal capability , terminal properties ) - bibliotek och databas som används på Unix-liknande operativsystem. Det tillåter program att använda displayen på en datorterminal på ett hårdvaruoberoende sätt, vilket avsevärt förenklar processen att skriva bärbara textbaserade applikationer. Bill Joy skapade den första versionen av termcap-biblioteket 1978 [1] [2] för BSD- operativsystemet ; senare portades den till de flesta Unix- och Unix-liknande miljöer. Utformningen av termcap-biblioteket är känt för att ha påverkats av utformningen av terminaldatabasen i det tidigare Incompatible Timesharing System . [3] Termcap-databasen beskriver kapaciteten hos hundratals olika terminaler. Detta tillåter program att använda textutmatning oberoende av typen av terminal. Vi och emacs textredigerare använder termcap. Andra program finns i kategorin Termcap .
Här är exempel på fält som finns i databasen:
Termcap-databaserna består av en eller flera terminalbeskrivningar.
Varje beskrivning måste innehålla terminalens kanoniska namn. Den kan också innehålla flera alias. Dessa namn används som söknycklar i termcap-databasen.
Beskrivningen innehåller en eller flera egenskaper som har standardnamn. Egenskaper kan vara av följande typer: Boolean , Numeric och String . Termcap-biblioteket har inte en fördefinierad typ för var och en av egenskaperna, så typen bestäms utifrån syntaxen:
Applikationer som använder termcap förväntar sig att gemensamma egenskaper är av en viss typ och hämtar de önskade värdena från termcap-databasen med hjälp av biblioteksanrop som endast framgångsrikt returnerar ett värde om den förväntade typen matchar den som finns i databasen.
Beskrivningar kan returneras från databasen med ändringar - lägga till, ta bort och omdefiniera egenskaper (till exempel när du ändrar skärmstorleken i en terminalemulator). Termcap-biblioteket skapar en terminalbeskrivning från den begärda beskrivningen, inklusive, ta bort eller åsidosätta de egenskaper som mottogs vid tidpunkten för begäran.
Termcap-data lagras i läsbart textformat. Termcap-biblioteket kan begära text från filer eller miljövariabler.
Miljövariabeln TERM innehåller namnet på terminaltypen.
Miljövariabeln TERMCAP kan innehålla själva termcap-databasen. Det används oftast för att lagra en enda terminalbeskrivning, som ställs in av terminalemulatorn för att ge terminalens egenskaper till skalet och beroende program.
Miljövariabeln TERMPATH stöds av senare implementeringar av termcap och innehåller sökvägen till termcap-filerna.
Den ursprungliga (och vanligaste) implementeringen av termcap-biblioteket tar sina data från en platt textfil. Att söka i en stor termcap-fil, till exempel större än 500 KB, kan vara långsam. För att påskynda sökningen kan ett speciellt verktyg användas, till exempel reorder , som placerar de mest använda posterna av användaren i början av filen.
BSD-4.4-implementationer av termcap-biblioteket lagrar terminalbeskrivningar i en hashad databas (till exempel Berkeley DB version 1.85). Två typer av poster lagras: alias som pekar på kanoniska poster och själva kanoniska poster. Innehållet i en termcap-post lagras i klartext.
Den ursprungliga implementeringen av termcap var designad för att ha lågt minne:
Senare implementeringar av termcap tillåter i allmänhet ett längre förnamn. Egendomsnamn måste dock bestå av två bokstäver i alla implementeringar.
Den tgetent- funktion som används för att läsa terminalbeskrivningen tar som indata adressen till en buffert vars storlek måste vara tillräckligt stor för att läsa data (1024 byte). Senare implementeringar av termcap kan lätta på denna begränsning genom att tillåta en noll-pekare som en parameter [4] eller genom att dölja den del som inte passar i bufferten, till exempel genom ZZ- egenskapen i NetBSD- implementeringen av termcap. [5] Terminfo - biblioteket emulerar också termcap-gränssnittet, även om det faktiskt inte använder en buffert med fast storlek.
Emulering av termcap-gränssnittet i terminfo-biblioteket låter dig lagra flera poster utan att begränsa deras position. Vissa senare implementeringar av termcap kan också ha denna funktion, även om den i allmänhet förblir odokumenterad. [6]
Den speciella egenskapen "hz" lades till för att stödja Hazeltine 1500-terminalen, som hade ett olyckligt val av tilde-karaktären ('~') som början på en flyktsekvens. [7] För att stödja den här terminalen var jag tvungen att skriva en speciell kod som, när man matade ut text med tildes, gjorde en speciell ersättning för att undvika att exekvera oväntade kontrollkommandon. [8] Dessutom tog attributmarkörer (som start- och slutunderstreck) upp skärmutrymmet. {{{1}}}Kommentarer i källkoden beskriver denna funktion med frasen "Hazeltine hjärnskada" ("Hazeltine hjärnskada"). [9] Eftersom Hazeltine 1500 var en populär terminal på 1970- {{{1}}}talet var det viktigt att implementera stöd för den i termcap.