termcap (eng. term inal capability , terminal properties ) - bibliotek og database, der bruges på Unix-lignende operativsystemer. Det giver programmer mulighed for at bruge visningen af en computerterminal på en hardwareuafhængig måde, hvilket i høj grad forenkler processen med at skrive bærbare tekstbaserede applikationer. Bill Joy skabte den første version af termcap-biblioteket i 1978 [1] [2] til BSD -operativsystemet ; senere blev det overført til de fleste Unix- og Unix-lignende miljøer. Udformningen af termcap-biblioteket er kendt for at være blevet påvirket af designet af terminaldatabasen i det tidligere Incompatible Timesharing System . [3] Termcap-databasen beskriver mulighederne for hundredvis af forskellige terminaler. Dette tillader programmer at bruge tekstoutput uafhængigt af terminaltypen. Vi- og emacs- teksteditorerne bruger termcap. Andre programmer kan findes i Termcap kategorien .
Her er eksempler på felter i databasen:
Termcap-databaserne består af en eller flere terminalbeskrivelser.
Hver beskrivelse skal indeholde det kanoniske navn på terminalen. Det kan også indeholde flere aliaser. Disse navne bruges som søgenøgler i termcap-databasen.
Beskrivelsen indeholder en eller flere egenskaber, der har standardnavne. Egenskaber kan være af følgende typer: Boolean , Numeric og String . Termcap-biblioteket har ikke en foruddefineret type for hver af egenskaberne, så typen bestemmes ud fra syntaksen:
Applikationer, der bruger termcap, forventer, at almindelige egenskaber er af en bestemt type og henter de ønskede værdier fra termcap-databasen ved hjælp af bibliotekskald, der kun returnerer en værdi, hvis den forventede type matcher den, der findes i databasen.
Beskrivelser kan returneres fra databasen med ændringer - tilføjelse, fjernelse og omdefinering af egenskaber (for eksempel ved ændring af skærmstørrelsen i en terminalemulator). Termcap-biblioteket opretter en terminalbeskrivelse ud fra den ønskede beskrivelse, herunder fjernelse eller tilsidesættelse af de egenskaber, der blev modtaget på tidspunktet for anmodningen.
Termcap-dataene gemmes i menneskelæsbart tekstformat. Termcap-biblioteket kan anmode om tekst fra filer eller miljøvariabler.
Miljøvariablen TERM indeholder navnet på terminaltypen.
TERMCAP- miljøvariablen kan indeholde selve termcap-databasen. Det er mest almindeligt brugt til at gemme en enkelt terminalbeskrivelse, som er sat op af terminalemulatoren for at give terminalens karakteristika til shell og afhængige programmer.
TERMPATH- miljøvariablen understøttes af senere implementeringer af termcap og indeholder stien til termcap-filerne.
Den originale (og mest almindelige) implementering af termcap-biblioteket tager sine data fra en flad tekstfil. Søgning i en stor termcap-fil, for eksempel større end 500 KB, kan være langsom. For at fremskynde søgningen kan der bruges et særligt værktøj, for eksempel reorder , som placerer de mest brugte poster af brugeren i begyndelsen af filen.
BSD-4.4-implementeringer af termcap-biblioteket gemmer terminalbeskrivelser i en hashed database (f.eks. Berkeley DB version 1.85). To typer poster gemmes: aliaser, der peger på kanoniske poster, og selve kanoniske poster. Indholdet af en termcap-indgang gemmes i almindelig tekst.
Den oprindelige implementering af termcap var designet til at have lav hukommelse:
Senere implementeringer af termcap tillader generelt et længere fornavn. Ejendomsnavne skal dog være på to bogstaver i alle implementeringer.
Den tgetent- funktion, der bruges til at læse terminalbeskrivelsen, tager som input adressen på en buffer, hvis størrelse skal være stor nok til at læse dataene (1024 bytes). Senere implementeringer af termcap kan lempe denne begrænsning ved at tillade en null-pointer som en parameter [4] eller ved at skjule den del, der ikke passer i bufferen, såsom gennem ZZ- egenskaben i NetBSD- implementeringen af termcap. [5] Terminfo -biblioteket emulerer også termcap -grænsefladen, selvom det faktisk ikke bruger en buffer med fast størrelse.
Emulering af termcap-grænsefladen i terminfo-biblioteket giver dig mulighed for at gemme flere poster uden at begrænse deres position. Nogle senere implementeringer af termcap kan også have denne funktion, selvom den generelt forbliver udokumenteret. [6]
Den særlige egenskab "hz" blev tilføjet for at understøtte Hazeltine 1500-terminalen, som havde et uheldigt valg af tilde-karakteren ('~') som starten på en escape-sekvens. [7] For at understøtte denne terminal, var jeg nødt til at skrive en speciel kode, der, når jeg udsender tekst med tilder, foretog en særlig substitution for at undgå at udføre uventede kontrolkommandoer. [8] Derudover optog attributmarkører (såsom start- og slutunderstregninger) skærmplads. {{{1}}}Kommentarer i kildekoden beskriver denne funktion med sætningen "Hazeltin hjerneskade" ("Hazeltin hjerneskade"). [9] Da Hazeltine 1500 var en populær terminal i 1970'erne, {{{1}}}var det vigtigt at implementere støtte til den i termcap.