terminfo este o bibliotecă și o bază de date care permite programelor să utilizeze afișajul terminalului într-un stil independent de dispozitiv. Mark Horton a creat prima versiune a bibliotecii terminfo în 1981-1982 ca o versiune actualizată a termcap . [1] Îmbunătățirile au inclus:
Biblioteca terminfo a fost inclusă în UNIX System V Release 2 și a devenit în curând forma preferată pentru stocarea descrierilor terminalelor în System V peste termcap (pe care BSD a continuat să o folosească). [2] Acest comportament a fost implementat în continuare în pcurses în 1982-1984 de către Pavel Curtis și a fost disponibil în alte implementări UNIX , inclusiv adăugările lui Mark Horton. [3] Detalii pot fi găsite în grupul de știri comp.sources.unix , decembrie 1986. [patru]
Baza de date terminfo poate descrie caracteristicile a sute de afișaje terminale diferite. Acest lucru permite programelor să utilizeze textul de ieșire independent de tipul de terminal.
Exemple de caracteristici:
Bazele de date termcap constau din una sau mai multe descrieri ale terminalelor.
Fiecare descriere trebuie să conțină numele canonic al terminalului. De asemenea, poate conține mai multe pseudonime. Aceste nume sunt folosite ca chei de căutare în baza de date termcap.
Descrierea conține una sau mai multe proprietăți care au nume standard. Proprietățile pot fi de următoarele tipuri: Boolean , Numeric și String . Biblioteca termcap nu are un tip predefinit pentru fiecare dintre proprietăți, așa că tipul este determinat pe baza sintaxei:
Aplicațiile care folosesc terminfo se așteaptă ca proprietățile să fie de un anumit tip și obțin valorile dorite din baza de date terminfo folosind apeluri de bibliotecă care returnează cu succes o valoare doar dacă tipul așteptat se potrivește cu cel găsit în baza de date.
Ca și în cazul termcap , unele caracteristici ale șirurilor sunt secvențe de escape care pot fi trimise gazdei prin apăsarea tastelor speciale de pe tastatură. Celelalte proprietăți sunt șiruri de caractere care pot fi trimise către terminal din aplicație. În acest din urmă caz, biblioteca terminfo servește (ca termcap) pentru înlocuirea parametrilor aplicației în șirul trimis. Aceste funcții oferă un parser de expresii bazat pe stivă , care a fost utilizat inițial pentru a minimiza lungimea șirului de ieșire, care poate conține diverși parametri opționali (cum ar fi secvențele de escape de culoare). În schimb, biblioteca termcap oferă un set minim de operațiuni utile care sunt compatibile cu majoritatea terminalelor.
Descrierile Terminfo sunt compuse prin îmbinarea a două definiții, adăugarea, eliminarea sau redefinirea proprietăților. Indiferent de modelul de stocare a datelor, biblioteca terminfo returnează descrierea solicitată folosind date compilate de un instrument extern (cum ar fi tic ).
Datele terminfo sunt stocate ca fișier binar , ceea ce face mai dificil de editat decât termcap . Proprietățile sunt stocate în tabele separate pentru valori booleene, numerice și șir. Această schemă a fost dezvoltată de Mark Horton și, cu excepția unor diferențe în setul de nume disponibile, este folosită în majoritatea implementărilor terminfo. [5] Specificația X/Open nu definește formatul unei descrieri compilate a terminalului și nici măcar nu menționează utilitatile tic sau infocmp . [6] [7] Deoarece descrierile de termeni compilate nu conțin metadate care specifică la ce index se află o anumită proprietate, acestea nu sunt neapărat compatibile între implementări. Cu toate acestea, deoarece majoritatea implementărilor utilizează aceeași structură generală de tabel (inclusiv antet și dimensiunile câmpurilor de date), este posibil să se genereze automat biblioteci terminfo personalizate care pot citi date specifice implementării. De exemplu, ncurses este compatibil cu formatul de stocare a datelor al mai multor implementări diferite ale terminfo. [opt]
Implementarea originală (și cea mai comună) a bibliotecii terminfo citește datele dintr-o structură arborescentă . În terminfo, primul caracter al numelui descrierii terminalului este folosit ca componentă a căii, iar numele complet calificat este folosit ca nume de fișier. Acest lucru vă ajută să căutați descrierea corectă mai rapid decât în termcap.
Unele implementări terminfo stochează descrieri ale terminalelor într-o bază de date hashing (de exemplu, Berkeley DB versiunea 1.85). [9] [10] Sunt stocate două tipuri de înregistrări: aliasuri, care indică calea către înregistrarea canonică și înregistrările canonice propriu-zise, care conțin setul complet de proprietăți.
Grupul deschis stabilește limitele termeninfo (valori minime garantate) care se aplică numai fișierului sursă. [11] [12] Două dintre aceste restricții prezintă un interes deosebit:
Limita de 14 caractere este pentru compatibilitatea cu sisteme de fișiere foarte vechi care nu pot afișa nume de fișiere mai lungi. Deși astfel de sisteme de fișiere sunt de obicei învechite, limitele în sine au fost documentate la sfârșitul anilor 1980 și nu au fost încă revizuite.
Limita numerică superioară 32767 este valoarea maximă de 16 biți cu semn pozitiv. Intrarea terminfo poate conține numere negative pentru a reprezenta valori lipsă sau lipsă.
Spre deosebire de termcap , terminfo are o reprezentare brută și compilată. Constrângerile pentru vizualizarea compilată nu sunt furnizate în specificație. Cu toate acestea, majoritatea implementărilor se referă la tic (compilator de informații terminal), ale cărui descrieri compilate nu pot depăși 4.096 de octeți.