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. USENIX Conference Proceedings. — Boston, MA: USENIX. — Т. Summer 1982. — С. 79—91.
  2. fa.info-terms mailing list comments on termcap/terminfo in 1985. Дата обращения: 3 марта 2015. Архивировано 18 марта 2015 года.
  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 (17 декабря 2006). Дата обращения: 3 марта 2015. Архивировано 2 апреля 2015 года.
  6. X/Open Curses, Issue 4 Version 2 — Reference Pages. The Open Group (1997). Дата обращения: 3 марта 2015. Архивировано 20 июня 2010 года.
  7. Commands & Utilities Issue 5 — Reference Pages. The Open Group (1997). Дата обращения: 3 марта 2015. Архивировано 20 июня 2010 года.
  8. Thomas E. Dickey. Announcing ncurses 5.3 (12 октября 2002). Дата обращения: 3 марта 2015. Архивировано 11 ноября 2014 года.
  9. Todd C. Miller. OpenBSD read_bsd_terminfo.c module (недоступная ссылка — история) (1999).
  10. Thomas E. Dickey. Announcing ncurses 5.6 (17 декабря 2006). Дата обращения: 3 марта 2015. Архивировано 8 марта 2015 года.
  11. Большая часть этих ограничений была установлена до того, как X/Open и Open Software Foundation объединились в The Open Group, поэтому во многих источниках ссылаются на X/Open.
  12. Terminfo Source Format (ENHANCED CURSES) — Minimum Guaranteed Limits. The Open Group (1997). Дата обращения: 3 марта 2015. Архивировано 17 декабря 2009 года.

Внешние ссылки