termcap

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

termcap (англ. terminal capability, свойства терминала) – библиотека и база данных, используемая на Unix-подобных операционных системах. Она позволяет программам использовать дисплей компьютерного терминала аппаратно независимо, что очень упрощает процесс написания переносимых консольных приложений. Билл Джой создал первую версию библиотеки termcap в 1978 году [1],[2] для операционной системы BSD; в дальнейшем она была портирована под большинство Unix- и Unix-подобных окружений. Известно, что на дизайн библиотеки termcap повлиял дизайн базы данных терминалов в более ранней Incompatible Timesharing System [3]. База данных termcap описывает возможности сотен различных терминалов. Это позволяет программам использовать текстовый вывод, не зависящий от типа терминала. Текстовые редакторы vi и emacs используют termcap.

Вот примеры полей, содержащихся в базе данных:

  • сколько строк и столбцов содержит дисплей;
  • какую строку послать, чтобы переместить курсор в произвольную позицию (включая формат кодирования строки и столбца);
  • как прокрутить экран на одну или несколько строк;
  • какой отступ требуется для операции прокрутки.

Модель данных[править | править код]

Базы данных termcap состоят из одного или нескольких описаний терминалов.

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

Каждое описание должно содержать каноническое имя терминала. Оно может также содержать несколько псевдонимов. Эти названия используются как ключи для поиска в базе termcap.

Значения[править | править код]

Описание содержит одно или несколько свойств, которые имеют стандартные имена. Свойства могут иметь следующие типы: логический, числовой и строковый. Библиотека termcap не имеет предопределенного типа для каждого из свойств, поэтому тип определяется исходя из синтаксиса:

  • строковые свойства имеют знак "=" между именем свойства и его значением;
  • числовые свойства имеют знак "#" между свойством и значением;
  • логические свойства не имеют значения (всегда считаются истинными, если они указаны).

Приложения, использующие termcap, ожидают, что распространенные свойства будут иметь определенный тип, и получают нужные значения из базы данных termcap, используя библиотечные вызовы, которые успешно возвращают значение только при совпадении ожидаемого типа с найденным в базе.

Иерархия[править | править код]

Описания могут возвращаться из базы данных с изменениями: добавлением, удалением и переопределением свойств (например, при изменении размера экрана в эмуляторе терминала). Библиотека termcap создает описание терминала из запрошенного описания, включая, удаляя или переопределяя свойства, полученные на момент запроса.

Модель хранения данных[править | править код]

Данные termcap хранятся в текстовом виде, удобном для изменения человеком. Библиотека termcap может запрашивать текст из файлов или переменных окружения.

Переменные окружения[править | править код]

Переменная окружения TERM содержит имя типа терминала.

Переменная окружения TERMCAP может содержать саму базу данных termcap. Чаще всего она используется для хранения единственного описания терминала, которое устанавливается эмулятором терминала для предоставления характеристик терминала командной оболочке и зависимым программам.

Переменная окружения TERMPATH поддерживается более поздними реализациями termcap и содержит путь к файлам termcap.

Плоский файл[править | править код]

Оригинальная (и наиболее распространенная) реализация библиотеки termcap получает данные из плоского текстового файла. Поиск по большому файлу termcap, например больше 500 Кб, может быть медленным. Для ускорения поиска может использоваться специальная утилита, например reorder, которая помещает наиболее часто используемые пользователем записи в начало файла.

Хешированная база данных[править | править код]

Реализации библиотеки termcap для BSD-4.4 хранят описания терминалов в хешированной базе данных (например, Berkeley DB версии 1.85). Хранятся два типа записей: псевдонимы, указывающие на канонические записи, и сами канонические записи. Содержимое записи termcap хранится в виде обычного текста.

Ограничения и расширения[править | править код]

Оригинальная реализация termcap создавалась для работы с использованием малого количества памяти:

  • первое имя должно состоять из 2 символов (16 бит);
  • имя свойств должны состоять из 2 букв;
  • описания должны быть ограничены 1023 символами;
  • только одна запись termcap может иметь собственные определения, и она должна быть размещена последней.

Более поздние реализации termcap обычно допускают более длинное первое имя. Имена свойств, тем не менее, должны быть двухбуквенными во всех реализациях.

Функция tgetent, используемая для чтения описания терминала, принимает на вход адрес буфера, чей размер должен быть достаточно большим для считывания данных (1024 байта). Более поздние реализации termcap могут ослаблять это ограничение путём разрешения нулевого указателя в качестве параметра[4] либо скрывая часть, которая не помещается в буфер, например, через свойство ZZ в реализации NetBSD termcap[5]. Библиотека terminfo также эмулирует интерфейс termcap, хотя и не использует буфер фиксированного размера на самом деле.

Эмуляция интерфейса termcap в библиотеке terminfo позволяет хранить несколько записей без ограничения на их позицию. В некоторых поздних реализациях termcap такая возможность также может присутствовать, хотя, как правило, она остается недокументированной[6].

Устаревшие свойства[править | править код]

Специальное свойство "hz" было добавлено для поддержки терминала Hazeltine 1500, в котором неудачно был выбран символ тильды ('~') в качестве начала управляющей последовательности[7]. Для поддержки данного терминала пришлось написать специальный код, который при выводе текста с тильдами делал специальную подстановку во избежание исполнения неожиданных управляющих команд[8]. Кроме того, маркеры атрибутов (например, начало и конец подчеркивания) занимали место на экране[источник не указан 3662 дня]. Комментарии в исходном коде описывают эту особенность фразой "Hazeltine braindamage" ("повреждением мозга Hazeltine")[9]. Поскольку Hazeltine 1500 был популярным терминалом в 1970-х[источник не указан 3662 дня], было важно реализовать его поддержку в termcap.

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

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

  1. Peter H. Salus, "The history of Unix is as much about collaboration as it is about technology", Byte, October 1994. Дата обращения: 27 февраля 2015. Архивировано 25 февраля 2015 года.
  2. Kenneth C. R. C. Arnold and Elan Amir, "Screen Updating and Cursor Movement Optimization: A Library Package". Дата обращения: 27 февраля 2015. Архивировано 28 сентября 2007 года.
  3. alt.sys.pdp10 posting. Дата обращения: 27 февраля 2015. Архивировано 27 февраля 2015 года.
  4. The GNU Termcap Library. Дата обращения: 1 марта 2015. Архивировано 5 сентября 2015 года.
  5. NetBSD termcap file format. Дата обращения: 1 марта 2015. Архивировано 2 апреля 2015 года.
  6. Discussion of termcap in vi. Дата обращения: 1 марта 2015. Архивировано 7 августа 2011 года.
  7. termcap(5) — страница справки man по форматам файлов FreeBSD  (англ.)
  8. Stallman, Richard M. The Termcap Library and Database, Second Edition. Gnu.org (1992). Дата обращения: 17 мая 2014. Архивировано 14 марта 2015 года.
  9. termcap.src. Apple Computer. Дата обращения: 17 мая 2014. Архивировано 18 сентября 2016 года.

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