Terminfoterminfo – библиотека и база данных, позволяющая программам использовать дисплей терминала в аппаратно-независимом стиле. Марк Хортон создал первую версию библиотеки terminfo в 1981-1982 годах как модернизированную версию termcap.[1] Улучшения включали в себя:
Библиотека terminfo была включена в UNIX System V Release 2 и вскоре стала более предпочтительной формой хранения описаний терминалов в System V, чем termcap (которую BSD продолжило использовать).[2] Данное поведение было в дальнейшем реализовано в pcurses в 1982-1984 годах Павелом Кёртисом, и было доступно в других UNIX-реализациях, включая дополнения Марка Хортона.[3] Подробности можно найти в новостной группе comp.sources.unix от декабря 1986 года.[4] База данных terminfo может описывать характеристики сотен различных дисплеев терминала. Это позволяет программам использовать текстовый вывод, не зависящий от типа терминала. Примеры характеристик:
Модель данныхБазы данных termcap состоят из одного или нескольких описаний терминалов. ИндексыКаждое описание должно содержать каноническое имя терминала. Оно может также содержать несколько псевдонимов. Эти названия используются как ключи для поиска в базе termcap. ЗначенияОписание содержит одно или несколько свойств, которые имеют стандартные имена. Свойства могут иметь следующие типы: логический, числовой и строковый. Библиотека termcap не имеет предопределенного типа для каждого из свойств, поэтому тип определяется исходя из синтаксиса:
Приложения, использующие terminfo, ожидают, что свойства будут иметь определенный тип, и получают нужные значения из базы данных terminfo, используя библиотечные вызовы, которые успешно возвращают значение только при совпадении ожидаемого типа с найденным в базе. Как и в termcap, некоторые строковые характеристики представляют собой escape-последовательности, которые могут быть отправлены хосту путём нажатия специальных клавиш на клавиатуре. Другие свойства представляют собой строки, которые могут быть отправлены на терминал из приложения. В последнем случае библиотека terminfo служит (как и termcap) для подстановки параметров приложения в отправляемую строку. Эти функции предоставляют стековый парсер выражений, который изначально использовался для минимизации длины выходной строки, которая может содержать различные дополнительные параметры (например, управляющие последовательности для задания цвета). В библиотеке termcap, напротив, предоставлен минимальный набор полезных операций, совместимых с большинством терминалов. ИерархияОписания terminfo составляются путём слияния двух описаний, добавлением, удалением или переопределением свойств. Вне зависимости от модели хранения данных, библиотека terminfo возвращает запрошенное описание, используя данные, скомпилированные внешним инструментом (например, tic). Модель храненияДанные terminfo хранятся в виде двоичного файла, что делает его редактирование более сложным, чем termcap. Свойства хранятся в раздельных таблицах для логических, числовых и строковых значений. Эта схема разработана Марком Хортоном, и, за исключением некоторых различий в наборе доступных имён, она используется в большинстве реализаций terminfo.[5] Спецификация X/Open не определяет формат скомпилированного описания терминала и даже не содержит упоминаний утилит tic или infocmp.[6][7] Поскольку скомпилированные описания terminfo не содержат метаданных, определяющих, под каким индексом идет определенное свойство, они не обязательно совместимы между различными реализациями. Тем не менее, поскольку большинство реализаций используют одинаковую общую структуру таблиц (включая размеры заголовков и полей данных), существует возможность автоматического создания специальных библиотек terminfo, способных прочитать данные определенной реализации. Например, ncurses совместим с форматом хранения данных нескольких различных реализаций terminfo.[8] Древовидная структураОригинальная (и самая распространенная) реализация библиотеки terminfo считывает данные из древовидной структуры. В terminfo первый символ имени описания терминала используется в качестве компоненты пути, а полное имя - в качестве имени файла. Это помогает искать нужное описание быстрее, чем в termcap. Хешированная база данныхНекоторые реализации terminfo хранят описания терминалов в хешированной базе данных (например, Berkeley DB версии 1.85).[9][10] Хранятся два типа записей: псевдонимы, указывающие путь к канонической записи, и собственно канонические записи, содержащие полный набор свойств. Ограничения и расширенияThe Open Group устанавливает ограничения terminfo (минимальные гарантированные значения), которые касаются только исходного файла.[11][12] Два из этих ограничений представляют особый интерес:
Ограничение в 14 символов введено для совместимости с очень старыми файловыми системами, которые не могут отображать более длинные имена файлов. В то время как такие файловые системы обычно являются устаревшими, сами ограничения были документированы в конце 1980-х и до сих пор не подвергались пересмотру. Верхняя числовая граница 32 767 является максимальным положительным знаковым 16-битным значением. Запись terminfo может содержать отрицательные числа для представления отсутствующих или пропущенных значений. В отличие от termcap, terminfo имеет исходное и скомпилированное представление. Ограничения для скомпилированного представления не представлены в спецификации. Однако, большинство реализаций ссылаются на tic (terminal information compiler, компилятор информации терминала), чьи скомпилированные описания не могут превышать 4 096 байт. См. такжеСсылки
Внешние ссылки |