Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

$ cc -о badterm badterm.с -lncurses

$ ./badterm

'unlisted': unknown terminal type.

$

Обратите внимание на строку компиляции в примере: в этой системе Linux мы используем реализацию ncurses библиотеки curses со стандартным заголовочным файлом, находящимся в стандартном каталоге. В таких системах вы можете просто включить файл curses.h и задать

– lncurses
для библиотеки.

В функции выбора пункта меню хорошо было бы иметь возможность очищать экран, перемещать курсор по экрану

и записывать его положение на экране. После вызова функции
setupterm
вы можете обращаться к характеристикам базы данных terminfo с помощью вызовов трех функций, по одной на каждый тип характеристики:

#include <term.h>

int tigetflag(char *capname);

int tigetnum(char *capname);

char *tigetstr(char *capname);

Функции

tigetflag
,
tigetnum
и
tigetstr
возвращают значения характеристик terminfo булева или логического, числового и строкового типов соответственно. В случае сбоя (например, характеристика не представлена)
tigetflag
вернет -1,
tigetnum
 — -2, a
tigetstr
— (char*)-1.

Вы можете применять базу данных terminfo для определения размера экрана терминала, извлекая характеристики

cols
и
lines
с помощью следующей программы sizeterm.c:

#include <stdio.h>

#include <term.h>

#include <curses.h>

#include <stdlib.h>

int main {

 int nrows, ncolumns;

 setupterm(NULL, fileno(stdout), (int *)0);

 nrows = tigetnum("lines");

 ncolumns = tigetnum("cols");

 printf("This terminal has %d columns and %d rows\n", ncolumns, nrows);

 exit(0);

}

$ echo $TERM

vt100

$ ./sizeterm

This terminal has 80 columns and 24 rows

Если запустить эту программу в окне рабочей станции, вы получите результат, отражающий размер текущего окна:

$ echo $TERM

xterm

$ ./sizeterm

This terminal has 88 columns and 40 rows

$

Если применить функцию

tigetstr
для получения характеристики перемещения курсора (
cup
) терминала типа xterm, вы получите параметризованный ответ:
\Е[%p1%d;%p2%dH
.

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

Вы можете заменить параметры в характеристике реальными значениями с помощью функции

tparm
.
До девяти параметров можно заменить значениями и получить в результате применяемую escape-последовательность символов.

#include <term.h>

char *tparm(char *cap, long p1, long p2, ..., long p9);

После формирования escape-последовательности с помощью

tparm
, ее нужно отправить на терминал. Для корректной обработки этой последовательности не следует пересылать строку на терминал с помощью функции
printf
. Вместо нее примените одну из специальных функций, обеспечивающих корректную обработку любых задержек, необходимых для завершения операции, выполняемой терминалом. К ним относятся следующие:

#include <term.h>

int putp(char *const str);

int tputs(char *const str, int affcnt, int (*putfunc)(int));

В случае успешного завершения функция

putp
вернет константу
OK
,в противном случае —
ERR
. Эта функция принимает управляющую строку терминала и посылает ее в стандартный вывод stdout.

Итак, для перемещения в строку 5 и столбец 30 на экране можно применить блок программного кода, подобный приведенному далее:

char *cursor;

char *esc_sequence;

cursor = tigetstr("cup");

esc_sequence = tparm(cursor, 5, 30);

putp(esc_sequence);

Функция

tputs
предназначена для ситуаций, в которых терминал не доступен через стандартный вывод
stdout
, и позволяет задать функцию, применяемую для вывода символов. Она возвращает результат заданной пользователем функции
putfunc
. Параметр
affcnt
предназначен для обозначения количества строк, подвергшихся изменению. Обычно он устанавливается равным 1. Функция, используемая для вывода строки, должна иметь те же параметры и возвращать тип значения как у функции
putfunc
. В действительности
putp(string)
эквивалентна вызову
tputs (string, 1, putchar)
. В следующем примере вы увидите применение функции
tputs
, используемой с функцией вывода, определенной пользователем.

Имейте в виду, что в некоторых старых дистрибутивах Linux последний параметр функции

tputs
определен как
int (*putfunc)(char)
, что заставит вас изменить определение функции
char_to_terminal
из упражнения 5.6.

Примечание

Если вы обратитесь к страницам интерактивного справочного руководства за информацией о функции

tparm
и характеристиках терминалов, то можете встретить функцию
tgoto
. Причина, по которой мы не используем эту функцию, хотя она, очевидно, предлагает более легкий способ перемещения курсора, заключается в том, что она не включена в стандарт X/Open (Single UNIX Specification Version 2) по данным издания 1997 г. Следовательно, мы не рекомендуем применять любую из этих функций в ваших новых программах.

Поделиться:
Популярные книги

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Безымянный раб

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
фэнтези
9.31
рейтинг книги
Безымянный раб

Волк 4: Лихие 90-е

Киров Никита
4. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 4: Лихие 90-е

Кремлевские звезды

Ромов Дмитрий
6. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кремлевские звезды

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Восход. Солнцев. Книга VIII

Скабер Артемий
8. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VIII

Кровь и Пламя

Михайлов Дем Алексеевич
7. Изгой
Фантастика:
фэнтези
8.95
рейтинг книги
Кровь и Пламя

Объединитель

Астахов Евгений Евгеньевич
8. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Объединитель

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Дайте поспать!

Матисов Павел
1. Вечный Сон
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Дайте поспать!

Бальмануг. Студентка

Лашина Полина
2. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. Студентка

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII