Операционная система UNIX. Руководство программиста

     

Пример программы, работающей с terminfo


Программа termhl - это простой пример использования подпрограмм terminfo. Она является вариантом программы highlight (см. раздел Примеры программ, работающих с curses), в котором не используются возможности curses более высокого уровня. Программу termhl можно использовать в качестве фильтра, вставляющего последовательности символов, необходимые для включения режимов подсветки и подчеркивания и для отключения всех атрибутов.

/* Версия программы highlight уровня terminfo */

#include <curses.h> #include <term.h>

int ulmode = 0; /* Режим подчеркивания */

main (argc, argv) int argc; char **argv; { FILE *fd; int c, c2; int outch();

if (argc > 2) { fprintf (stderr, "Откуда: termhl [file]\n"); exit(1); }

if (argc == 2) { fd = fopen (argv [1], "r"); if (fd == NULL) { perror (argv [1]); exit(2); } } else { fd = stdin; } setupterm ((char*) 0, 1, (int*) 0);

for (;;) { c = getc (fd); if (c == EOF) break (); if (c == '\') { c2 = getc (fd); switch (c2) { case 'B': tputs (enter_bold_mode, 1, outch); continue; case 'U': tputs (enter_underline_mode, 1, outch); ulmode = 1; continue; case 'N': tputs (exit_attribute_mode, 1, outch); ulmode = 0; continue; } putch (c); putch (c2); } else putch (c); }

fclose (fd); fflush (stdout); resetterm (); exit (0); }

/* Функция putch подобна putchar, */ /* но проверяет необходимость подчеркивания */

putch (c) int c; { outch (c); if (ulmode && underline_char) { outch ('\b'); tputs (underlihe_char, 1, outch); } }

/* outchar передается tputs в качестве параметра */ /* как функция, которую нужно вызывать вместо putchar */

outch (c) int c; { putchar (c); }

Познакомимся поближе с подпрограммами terminfo на примере использования функции tputs (cap, affcnt, outc) в этой программе. tputs() добавляет символы-заполнители. Некоторые терминалы имеют возможность задерживать вывод. Их описания в базе данных terminfo, быть может, содержат цепочки, подобные $<20>, что означает задержку на 20 миллисекунд (см. ниже раздел Указание характеристик терминала). tputs генерирует достаточное для задержки на это время количество символов-заполнителей.


tputs() имеет три параметра. Первый является цепочкой символов, определяющей характеристику (атрибут вывода), которую необходимо реализовать. Второй - количество затрагиваемых этим строк. (Некоторые запросы требуют добавления символов-заполнителей в количестве, зависящем от этого параметра. Например, запрос на вставку строки, insert_line, может привести к копированию всех строк ниже текущей, для чего нужно время, пропорциональное количеству копируемых строк. Если ни одна строка не затрагивается, в качестве affcnt используется 1. Единица вместо нуля берется для надежности, так как affcnt умножается на некоторый интервал времени, а умножение чего-либо на 0 дает 0). Третий параметр - это подпрограмма, вызываемая для вывода каждого символа.
Для понимания желательности использования подпрограмм уровня curses вместо подпрограмм уровня terminfo (там, где это возможно), полезно обратить внимание на проверку значения underline_char в примере. Некоторые терминалы имеют управляющий символ, указывающий начало подчеркивания, и еще один символ, указывающий конец подчеркивания. Другим необходимо указание кода подчеркивания при выводе каждого символа. Программа termhl хранит значение этого режима, и, если необходимо, выводит underline_char для подчеркивания очередного символа. Из-за наличия такого рода мелких деталей, с которыми программы уровня terminfo
должны разбираться самостоятельно, и предпочтительнее работать на уровне curses.
Программа termhl была написана для иллюстрации применения подпрограмм terminfo, поэтому она получилась сложнее, чем могла бы быть. Вместо непосредственного вывода enter_bold_mode, enter_underline_mode и exit_attribute_mode можно было бы использовать подпрограмму vidattr [см. curses(3X)]. Фактически, в последнем случае программа была бы более надежна, поскольку существует несколько способов изменения атрибутов вывода.


Содержание раздела