Termcap
termcap (англ. terminal capability, свойства терминала) — это библиотека и база данных, используемые в Unix-подобных операционных системах. Она позволяет программам независимо использовать аппаратное обеспечение компьютерного терминала, что значительно упрощает процесс написания портативных консольных приложений. Билл Джой создал первую версию библиотеки termcap в 1978 году[1][2] для операционной системы BSD; позже она была портирована на большинство Unix и Unix-подобных сред. Известно, что на дизайн библиотеки termcap повлиял дизайн окончательной базы данных в более ранней несовместимой системе разделения времени[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 создавалась для работы с использованием малого количества памяти:
Более поздние реализации termcap обычно допускают более длинное первое имя. Имена свойств, тем не менее, должны быть двухбуквенными во всех реализациях. Функция tgetent, используемая для чтения описания терминала, принимает на вход адрес буфера, чей размер должен быть достаточно большим для считывания данных (1024 байта). Более поздние реализации termcap могут ослаблять это ограничение путём разрешения нулевого указателя в качестве параметра[4] либо скрывая часть, которая не помещается в буфер, например, через свойство ZZ в реализации NetBSD termcap[5]. Библиотека terminfo также эмулирует интерфейс termcap, хотя и не использует буфер фиксированного размера на самом деле. Эмуляция интерфейса termcap в библиотеке terminfo позволяет хранить несколько записей без ограничения на их позицию. В некоторых поздних реализациях termcap такая возможность также может присутствовать, хотя, как правило, она остается недокументированной[6]. Устаревшие свойстваСпециальное свойство "hz" было добавлено для поддержки терминала Hazeltine 1500, в котором неудачно был выбран символ тильды ('~') в качестве начала управляющей последовательности[7]. Для поддержки данного терминала пришлось написать специальный код, который при выводе текста с тильдами делал специальную подстановку во избежание исполнения неожиданных управляющих команд[8]. Кроме того, маркеры атрибутов (например, начало и конец подчеркивания) занимали место на экране[источник не указан 3892 дня]. Комментарии в исходном коде описывают эту особенность фразой "Hazeltine braindamage" ("повреждением мозга Hazeltine")[9]. Поскольку Hazeltine 1500 был популярным терминалом в 1970-х[источник не указан 3892 дня], было важно реализовать его поддержку в termcap. См. такжеСсылки
Внешние ссылки |