terminfo

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

terminfoбиблиотека и база данных, позволяющая программам использовать дисплей терминала в аппаратно-независимом стиле. Марк Хортон создал первую версию библиотеки 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 символов;
  • максимальное допустимое числовое значение принято равным 32 767.

Ограничение в 14 символов введено для совместимости с очень старыми файловыми системами, которые не могут отображать более длинные имена файлов. В то время как такие файловые системы обычно являются устаревшими, сами ограничения были документированы в конце 1980-х и до сих пор не подвергались пересмотру.

Верхняя числовая граница 32 767 является максимальным положительным знаковым 16-битным значением. Запись terminfo может содержать отрицательные числа для представления отсутствующих или пропущенных значений.

В отличие от termcap, terminfo имеет исходное и скомпилированное представление. Ограничения для скомпилированного представления не представлены в спецификации. Однако, большинство реализаций ссылаются на tic (terminal information compiler, компилятор информации терминала), чьи скомпилированные описания не могут превышать 4 096 байт.

См. также[править | править код]

Ссылки[править | править код]

  1. Horton, Mark, "The New Curses and Terminfo Package", USENIX Conference Proceedings, vol. Summer 1982, Boston, MA: USENIX, pp. 79–91 
  2. fa.info-terms mailing list comments on termcap/terminfo in 1985.
  3. pcurses shar file from 1986 showing change history (недоступная ссылка — история). Архивировано 27 сентября 2007 года.
  4. pcurses complete posting.
  5. Thomas E. Dickey. term - format of compiled term file (December 17, 2006).
  6. X/Open Curses, Issue 4 Version 2 — Reference Pages. The Open Group (1997).
  7. Commands & Utilities Issue 5 — Reference Pages. The Open Group (1997).
  8. Thomas E. Dickey. Announcing ncurses 5.3 (October 12, 2002).
  9. Todd C. Miller. OpenBSD read_bsd_terminfo.c module (1999).
  10. Thomas E. Dickey. Announcing ncurses 5.6 (December 17, 2006).
  11. Большая часть этих ограничений была установлена до того, как X/Open и Open Software Foundation объединились в The Open Group, поэтому во многих источниках ссылаются на X/Open.
  12. Terminfo Source Format (ENHANCED CURSES) — Minimum Guaranteed Limits. The Open Group (1997).

Внешние ссылки[править | править код]