Terminfo

Termapi.svg

Terminfo to biblioteka i baza danych , która umożliwia programom korzystanie z terminali wyświetlacza w sposób niezależny od urządzenia. Mary Ann Horton wdrożyła pierwszą bibliotekę terminfo w latach 1981–1982 jako ulepszenie w stosunku do termcap . Ulepszenia obejmują

Terminfo zostało dołączone do UNIX System V Release 2 i wkrótce stało się preferowaną formą opisu terminali w Systemie V, zamiast termcap (którego BSD nadal używało). Zostało to naśladowane w pcurses w latach 1982–1984 przez Pavela Curtisa i było dostępne w innych implementacjach systemu UNIX , dostosowując lub wprowadzając poprawki Mary Horton. Więcej informacji można znaleźć w artykule opublikowanym w comp.sources.unix z grudnia 1986 roku.

Baza danych terminfo może opisywać możliwości setek różnych terminali wyświetlających. Dzięki temu programy zewnętrzne mogą wyświetlać oparte na znakach , niezależnie od typu terminala.

Niektóre konfiguracje to:

  • Liczba linii na ekranie
  • tryb mono; stłumić kolor
  • Użyj widocznego dzwonka zamiast sygnału dźwiękowego

Model danych

Bazy danych Terminfo składają się z jednego lub więcej opisów terminali.

Indeksy

Każdy opis musi zawierać kanoniczną nazwę terminala. Może również zawierać jeden lub więcej aliasów dla nazwy terminala. Nazwa kanoniczna lub aliasy to klucze, za pomocą których biblioteka przeszukuje bazę danych terminfo.

Wartości danych

Opis zawiera jedną lub więcej możliwości, które mają konwencjonalne nazwy. Możliwości są wpisane: boolean , numeric i string . Biblioteka terminfo ma z góry określone typy dla każdej nazwy możliwości. Sprawdza typy każdej zdolności według składni:

  • łańcuchowe mają znak „=” między nazwą zdolności a jej wartością,
  • numeryczne mają znak „#” między nazwą zdolności a jej wartością oraz
  • boolowskie nie mają powiązanej wartości (zawsze są prawdziwe , jeśli są określone).

Aplikacje korzystające z terminfo znają typy odpowiednich możliwości i uzyskują wartości możliwości z bazy danych terminfo przy użyciu wywołań biblioteki, które zwracają pomyślnie tylko wtedy, gdy nazwa możliwości odpowiada jednej z predefiniowanych możliwości.

Podobnie jak termcap , niektóre właściwości ciągów reprezentują sekwencje specjalne , które mogą być wysyłane do hosta przez naciśnięcie specjalnych klawiszy na klawiaturze. Inne możliwości reprezentują ciągi znaków, które mogą być wysyłane przez aplikację do terminala. W tym drugim przypadku biblioteka terminfo (podobnie jak biblioteka termcap) służy do zastępowania parametrów aplikacji w wysyłanym łańcuchu znaków. Funkcje te zapewniają oparte na stosie parser wyrażeń, który jest używany przede wszystkim w celu zminimalizowania liczby znaków wysyłanych dla sekwencji sterujących, które mają opcjonalne parametry, takie jak SGR (Select Graphic Redition) . W przeciwieństwie do tego, biblioteki termcap zapewniają ograniczony zestaw operacji, które są przydatne dla większości terminali.

Hierarchia

Opisy Terminfo można konstruować poprzez włączanie treści jednego opisu do innego, pomijanie możliwości z dołączonego opisu lub przesłanianie lub dodawanie możliwości. Bez względu na to, jaki model przechowywania jest używany, biblioteka terminfo zwraca opis terminala z żądanego opisu, używając danych skompilowanych przy użyciu samodzielnego narzędzia (np. tic ).

Model przechowywania

Dane Terminfo są przechowywane jako plik binarny , co czyni go mniej prostym do modyfikacji niż termcap . Dane mogą być pobierane przez bibliotekę terminfo z plików, w których są przechowywane. Same dane są zorganizowane jako tabele odpowiednio dla funkcji boolowskich, numerycznych i łańcuchowych. Jest to schemat opracowany przez Mary Horton i poza pewnymi różnicami dotyczącymi dostępnych nazw jest używany w większości implementacji terminfo. X/Open nie określa formatu skompilowanego opisu terminala. W rzeczywistości nawet nie wspomina o wspólnym tic lub infocmp media. Ponieważ skompilowane wpisy terminfo nie zawierają metadanych identyfikujących indeksy w tabelach, do których przypisana jest każda właściwość, niekoniecznie są one kompatybilne między implementacjami. Ponieważ jednak większość implementacji wykorzystuje tę samą ogólną strukturę tabeli (w tym rozmiary nagłówków i elementów danych), możliwe jest automatyczne tworzenie niestandardowych bibliotek terminfo, które mogą odczytywać dane dla danej implementacji. Na przykład ncurses można zbudować tak, aby pasowały do ​​danych terminfo dla kilku innych implementacji.

Drzewo katalogów

Oryginalna (i najpowszechniejsza) implementacja biblioteki terminfo pobiera dane z hierarchii katalogów . Używając pierwszego znaku nazwy terminala jako jednego ze składników ścieżki, a nazwy opisu terminala jako nazwy pliku do pobrania, biblioteka terminfo zwykle przewyższa przeszukiwanie dużego pliku termcap. [ potrzebne źródło ]

Haszowana baza danych

Niektóre implementacje terminfo przechowują opis terminala w zhaszowanej bazie danych (np. coś w rodzaju Berkeley DB wersja 1.85). Przechowują one dwa typy rekordów: aliasy wskazujące na wpis kanoniczny oraz sam wpis kanoniczny, który zawiera dane dotyczące możliwości terminala.

Ograniczenia i rozszerzenia

Open Group dokumentuje limity terminfo (minimalne wartości gwarantowane), które dotyczą tylko pliku źródłowego. Szczególnie interesujące są dwa z nich:

  • Maksymalnie 14 znaków dla aliasów terminali
  • Maksymalnie 32 767 dla ilości liczbowych

Limit 14 znaków odnosi się do bardzo starych systemów plików, które mogą reprezentować nazwy plików nie dłuższe niż ta liczba. Chociaż te systemy plików są generalnie przestarzałe, ograniczenia te były udokumentowane od późnych lat 80. i od tego czasu nie były sprawdzane.

Limit 32 767 dotyczy wartości dodatnich w 16-bitowej wartości uzupełnienia do dwóch ze znakiem. Wpis terminfo może używać liczb ujemnych do reprezentowania anulowanych lub nieobecnych wartości.

W przeciwieństwie do termcap terminfo ma zarówno reprezentację źródłową, jak i skompilowaną. Granice skompilowanej reprezentacji są nieokreślone. Jednak większość implementacji odnotowuje w swojej dokumentacji tic (kompilator informacji terminalowych), że skompilowane wpisy nie mogą przekraczać rozmiaru 4096 bajtów.

Zobacz też

Linki zewnętrzne