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 хранятся в текстовом виде, удобном для изменения человеком. Библиотека 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] Кроме того, маркеры атрибутов (например, начало и конец подчеркивания) занимали место на экране.{{{1}}}
Комментарии в исходном коде описывают эту особенность фразой "Hazeltine braindamage" ("повреждением мозга Hazeltine").[9] Поскольку Hazeltine 1500 был популярным терминалом в 1970-х,{{{1}}}
было важно реализовать его поддержку в termcap.
См. также
Ссылки
- Peter H. Salus, "The history of Unix is as much about collaboration as it is about technology", Byte, October 1994.
- Kenneth C. R. C. Arnold and Elan Amir, "Screen Updating and Cursor Movement Optimization: A Library Package"
- alt.sys.pdp10 posting
- The GNU Termcap Library
- NetBSD termcap file format
- Discussion of termcap in vi
-
termcap(5)
— страница справки man по форматам файлов FreeBSD (англ.) - Stallman, Richard M. The Termcap Library and Database, Second Edition . Gnu.org (1992). Дата обращения: 17 мая 2014.
- termcap.src . Apple Computer. Дата обращения: 17 мая 2014.