
- •1.1. Форматный ввод/вывод
- •1.2. Нефайловая работа с терминалом
- •1.3. Управление распределением динамической памяти
- •1.4. Работа со строками и символами
- •1.5. Средства отладки
- •5. Язык си. Руководство оператора.
- •5.1. Стадии подготовки программы
- •5.2. Проблемы промежуточных файлов
- •5.3. Эмуляция eis
- •5.5. Инициализация fpu
- •5.6. Форматный вывод чисел с плавающей запятой
- •5.7. Оптимизация
- •5.8. Компоновка
- •5.9. Создание автономных программ
- •5.10. Сообщения оператору
- •6.1. Ввод и обработка командной строки
- •6.2 Управление стартовыми действиями
- •7. Пакет работы с терминалом
- •7.1. Обновление экрана
- •7.2. Запуск
- •7.3. Вывод
- •7.4. Ввод
- •7.5. Завершение работы
- •7.6. Оптимизация движения курсора
- •9. Краткое описание компилятора си фирмы dec.
- •10. Перечень ошибок
7.6. Оптимизация движения курсора
На непосредственное управление перемещением курсора выполняет функция mvcur(). Ей необходимо задать исходное положение и место назначения. например:
mvcur(0, 0, LINES/2, COLS/2);
передвинет строки ('\n'), то строка будет очищена до конца и текущие
координаты (y,x) будут изменены на начало следующей строки.
При возврате каретки ('\r') курсор передвинется на начало строки. знаки табуляции ('\t') будут выводятся по отношению к текущему окну (табуляция имеет длину 8) (а не экрану терминала). Табуляция выводится соответствующим числом пробелов, и, если они не все помещаются на текущей строке, то оставшиеся будут перенесены в начало следующей (что, повидимому, не совсем корректно). addch() возвращает ERR, если после вывода символа курсор должен выйти за пределы окна (вывод последнего символа в последней строке, если скроллинг запрещен, см. scrollok()). Ошибка не возникает при выводе табуляции, при запрещенном скроллинге лишние пробелы выводятся в начало последней строки (это тоже не корректно).
char *str;
window *win;
addstr(str); /* + */
waddstr (win, str);
добавляет строку str в окно, начиная с текущих координат (y,x вращает
ERR, если строка попытается выйти за границы экрана (см. addch()). char vert,hor; /* символы для рамки */
window *win;
box (win, vert, hor);
создает рамку по границе (внутри) окна, используя vert в качестве
символа для создания вертикальных сторон и hor - для горизонтальных.
Углы остаются пустыми. window *win; clear(); /* + */ wclear(win);
очищает окно и устанавливает для этого окна флаг "clear". Если окно
является экраном, то при вызове refresh() для такого окна с
установленным флагом "clear" будет выполнена аппаратная очистка
экрана. Текущие координаты (y,x) в окне устанавливаются в (0,0).
window *scr;
bool bollf;
clearok (scr,boolf); /* + */
Управляет флагов "clear" для экрана scr. (если окно экраном не является, то функция смысла не имеет). Если boolf - TRUE, это вызывает очистку экрана (аппаратную) при следующем вызове refresh(), или ее (очистки) подавление, если boolf - FALSE. В отличии от clear clearok() не изменяет содержание экрана. Если scr - curscr, то при вызове refresh() произойдет очистка экрана, даже если окно, переданное refresh не является экраном.
window *win;
erase(); /* + */
werase(win);
стирает окно, не устанавливая флаг очистки. Это аналогично clear(),за исключением того, что никогда не вызывает выполнения аппаратной очистки экрана в refresh(). Функция erase() не имеет связанной команды с "mv".
window *win;
ctobot(); /* + */
wctobot(win);
очищает окно, начиная от текущих координат (y,x) до конца окна. Команда не имеет связанной команды с "mv".
window *win;
ctoeol(); /* + */
wctoeol(win);
стирает информацию в окне, начиная с текущих координат (y,x) и до конца строки. Функция не имеет связанной команды с "мv".
window *win;
delch(); /* + */
wdelch(win);
стирает символ в текущих координатах (y,x). Каждый символ строки, стоящий после уничтоженного символа, перемещается влево и последний символ строки становится пробелом. текущие координаты не изменяются.
window *win;
deleteln(); /* + */
wdeleteln (win);
стирает текущую строку. Каждая строка ниже текущей перемещается вверх, по- следняя строка становится пустой. Текущие координаты неизменяются.
char c;
window *win;
insch(c); /* + */
winsch (win, c);
вставляет символ 'c' в текущие координаты (y,x).Каждый символ в строке после вставленного с перемещается вправо и последний символ строки исчезает.
window *win;
insertln(); /* + */
winsertln (win);
вставляет пустую строку над текущей. Каждая строка ниже текущей смещается вниз и последняя строка исчезает. Текущая строка очищается. Текущие координаты (y,x) не изменятся.
int y,x;
window *win;
move(y,x); /* + */
wmove(win, y, x);
меняет текущие кординаты в окне на (y,x). Функция возвращает ERR, если координаты выходят за границы окна, при этом текущие координаты неизменяются.
window *win1, *win2;
overlay(win1, win2);
производит наложение win1 на win2 в области, где они совпадают. Пробелы на win1 оставляют содержимое win2 под собой неизменным.
window *win1, *win2;
overwrite(win1, win2);
производит запись win1 на win2 в области, где они совпадают.
char *fmt;
window *win;
printw(fmt, arg1, arg2,...);
wprintw(win, fmt, arg1, arg2,...);
printw() выполняет форматное преобразование над своими аргументами и записывает его результат в окно, начиная с текущих координат (y,x). Используется addstr() для добавления строки к окну. printw() возвращает ошибку (ERR), если addstr() возвращает ошибку.
window *win;
refresh(); /* + */
wrefresh(win);
refresh() обновляет указанное окно на экране терминала, приводя изображение окна в соответствие с его содержимым. Считается, что изображение окна на терминале не испорчено со времени последнего вызова refresh(), т.е. не выполнялось отображение какого-либо окна, перекрывающего данное окно.
для перевывода всего окна необходимо перед refresh() вызвать touchwin() для данного окна.
window *win;
standout(); /* + */
wstandout(win);
standend(); /* + */
wstandend(win);
standout() включает альтернативный режим отображения символов,
записываемых в окно (например подчеркивание или режим русских букв,
в зависимости от аппаратных возможностей терминала).
standend() выключает альтернативный режим отображения для добавляемых
символов.
Функции ввода echo(); /* + */
разрешает эхоотображение вводимых символов в окне,
noecho(); /* + */
запрещает.
window *win;
getch(); /* + */
wgetch (win);
вводит один символ с терминала, и, если необходимо, выполняет его
эхоотображение. Возвращает ERR, если после ввода текущие координаты
вынуждены выйти за пределы окна, в противном случае возвращает
введенный символ.
window *win;
char *str;
getstr(str); /* + */
wgetstr(win, str);
вводит (используя getch()) символы и помещает их в строку str пока не
встретит '\n', или пока не произойдет ошибка в getch(). '\n' в конце
строки удаляется, строка завершается символом '\0'. getstr()
возвращает ERR, если getch() возвращает ERR. В этом случае str
содержит символы, введенные до появления ошибки и завершенные
символом '\0'. При нормальном завершении getstr() возвращает OK.
char *fmt;
window *win;
scanw(fmt, arg1, arg2,...);
wscanw(win, fmt, arg1, arg2,...);
осуществляет форматный ввод (см. scanf())с терминала,вводя символы по
getch(). возвращает ERR, если getch() возвращает ЕRR. Необходимо
заметить,что,поскольку ERR определено как 0, то возможна
неоднозначность между значением ERR, и нулевым значением,
возвращаемым scanf().
Различные функции
window *win;
delwin(win);
уничтожает окно, освобождая занятую им память. если данное окно имеет
подокна (subwin), то последние не уничтожаются, но информация в них
нарушается, поэтому они также должны быть уничтожены.
endwin();
прекращает (приостанавливает) работу с окнами: очищает экран
терминала и переводит терминал в режим, который он имел до
выполнения initscr().работу с окнами можно возобновить вызовомами
setterm() для установки необходимого режима терминала и
wrefresh(curscr)) для воосановления информации на экране.
window *win;
int y, x;
getyx(win, y, x); /* + */
помещает текущие координаты (y,x) окна win в перемещеные y и x. Это
возможно без передачи адресов переменных, т.к. getyx() - макрос.
window *win;
inch(); /* + */
winch(win); /* + */
возвращает символ, находящийся в текущих координатах (y,x) окна.
Никаких изменений с окном не происходит. Функция не имеет связанной команды "mv".
initscr();
выполняет начальную инициализацию. Зту функцию необходимо вызывать перед использованием любых процедур пакета за исключением mvcur(), т.е. за иск- лючением случая, когда используется только оптимизация движения курсора.
Выполняет установку необходимого режима терминала (функцией setterm()) и создает окна curscr и stdscr, возвращая ERR, если недостаточно свободной памяти, и stdscr при нормальном завершении.
window *win;
bool boolf;
leaveok(win, boolf); /* + */
управляет логическим флагом, определяющим поведение курсора на экране
после выполнения изменений (функцией refresh()). Если boolf == FALSE
(а именно так по умолчанию), то после обновления окна функцией
refresh() курсор возвращается в позицию, определяемую текущими
координатами в данном окне. Если boolf == TRUE, то после выполнения
изменений курсор остается на месте, а текущие координаты
корректируются на координаты курсора, если курсор в пределах окна,
или устанавливаются в (0,0) если курсор вне окна.
window *win;
int y,x;
mvwin(win, y, x);
перемещает указанное окно, устанавливая его начальные координаты
(координаты левого верхнего угла) в (y,x). Если окно выйдет за
границы крана, перемещение не произ одится и mvwin() возвращает
ERR.
Необходимо отметить, что перемещение окон и их подокон (subwin) независимо, позтому для сохранения взаимного соответствия (на экране) все подокна необходимо перемещать на одинаковое расстояние с основным окном.
int new_lines, new_cols, begin_y, begin_x;
window *
newwin (new_lines, new_cols, begin_y, begin_x);
создает новое окно в new_lines строк и new_cols колонок, с начальными
координатами (координатами левого верхнего угла) (begin_y, begin_x).
Если число строк (new_lines) или (и) число колонок (new_cols) равно 0, то размеры будут установлены соответственно как (LINES-begin_y) или (и) (COLS-begin_x), где LINES - число строк на экране терминала, а COLS - число колонок. Таким образом, для получения нового окна размеров LINES*COLS необходимо использовать newwin(0,0,0,0). При нормальном завершении newwin() возвращает указатель на дескриптор нового окна (память для нового окна отводится динамически).
window *win;
int new_lines, new_cols, beg_y, beg_x;
window *
subwin(win, new_lines,new_cols, beg_y, beg_x);
создает новое окно в new_lines строк и new_cols колонок с началом в(beg_y, beg_x) как подокно окна win. При этом любые изменения, произведенные в любом из окон в области, покрываемой подокном, будет совершаться на обоих окнах. beg_y, beg_x указываются по отношению ко всему экрану, а не к (0,0) win. Если число строк или (и) число колонок равно 0, то по соотв. координатам размер будет установлен в (LINES-begin_y) и (COLS-begin_x).
Если подокно выходит за пределы основного окна, то подокно создано не будет и subwin возвратит ERR, иначе указатель на дескриптор нового подокна.
Еще несколько особенностей работы с подокнами:
Подокно использует строковые массивы основного окна.
При выполнении изменений в подокне выполнение refresh() основного окна (без предварительного touchwin()) не отобразит эти изменения, и намборот.ко текущие координаты не изменятся).
Если boolf == TRUE, то при выводе '\n' в последней строке экрана или выводе символа в последней позиции последней строки иформация в окне переместится на одну строку вверх, верхняя строка пропадет, а курсор будет установлен в начало последней, чистой теперь строки окна. Именно это и называется "скроллинг".
window *win;
touchwin(win);
устанавливает соответствующие переменные для указанного окна таким
образом, что это окно будет полностью перевыведено при вызове
refresh(). Это необходимо, например, если изображение окна затерто
вызовами других окон. Необходимо отметить, что если изменения на
экране были вызваны не вызовами функций данного пакета,то для
восстановления изображения необходимо выполнить wrefresh(curscr).
Внутренние функции
int lasty, lastx, newy, newx;
mvcur(lasty, lastx, newy, newx);
перемещает курсор терминала с(lasty,lastx) в (newy,newx). Можно
использовать данную функцию без функций работы с окнами, однако при
использовании последних она не должна вызываться пользователем и
необходимо использовать move() и refresh() для перемещения курсора.
Если функции mvcur() задано недопустимое начальное положение, то осуществляется абсолютное движение в указанную точку (с использованием прямой адресации, если ее нет - через начало экрана). Если задано недопустимое требуемое положение, то положение по координате (координатам) с недопустимым значением не меняется.
window *win;
scroll(win);
выполняет скроллинг в указанном окне - смещение информации вверх на
одну позицию, при этом верхняя строка пропадает, нижняя становится
пустой.
Для обновления терминала после использования scroll() необходимо вызывать refresh(). Если окно является экраном, то функция scroll выполнит аппаратный scroll, если, конечно, такая возможность присутствует в данном терминале.
setterm();
устанавливает режим терминала, необходимый для работы функций пакета
(спецрежим). Работает и в РАФОС/TS. Вызывается в initscr().
значения для дисплея 15-иэ-013.
int lines = 24, /* число строк на терминале */
cols = 80; /* число колонок на терминале */
bool /* логические, в данной реализации char */
AM = 0, /* автоматически устанавливаемые поля ????*/
AN = 1, /* при выводе последнего символа в строке дисплей выполняет автоматический переход на новую строку.
если AL == 1, а SD == 0, то считается,
что с конца последней строки
курсор перейдет в начало первой */
BS = 1, /* наличие возможности возврата на символ */
CA = 1, /* адресуемый курсор */
GT = 1, /* присутствует незатирающая табуляция */
HL = 0, /* 1 - терминал удерживает курсор в конце строки (а не пропускает его за поле экрана (так может быть, если размер экрана установлен меньше фактического размера экрана терминала.
имеет значение только если AL == 0 */
MS = 1, /* можно выполнять любые действия в режиме standout */
NC = 0, /* не выполняется чистый возврат каретки ('\r'), терминал выполняет только "\r\n" */
NONL = 0, /* терминал не может вып. '\n' без '\r' */
SD = 1; /* возможность аппаратного scroll выполнением '\n' в последней строке */
char
*BC = NULL, /* обратное движение курсора, если не '\b' */
*BT = NULL, /* обратная незатирающая табуляции */
*CE = "\033K", /* очистка до конца строки */
*CL = "\033H\033\J", /* очистка экрана */
*CM = "\033Y ",/* прямое позиционир. курсора, см. tgoto */
*HO = "\033H", /* курсор в исходное */
*LL = NULL, /* переход на последнюЮ сторку, кол. 0 */
*ND = "\033C", /* не стирающее движение на символ вперед */
*SE = "\017", /* выход из режима standout на терминале */
*SO = "\016", /* установка standout на терминале */
*TA = NULL, /* знак нестирающей табуляции
(Eсли не '\t') */
*TE = NULL, /* адрес терминала, разблокирующий
заканчивающую последовательность ??? */
*TI = NULL, /* адрес терминала,
разблокирующий инициализацию ???*/
*UC = NULL, /* подчеркивание для одного символа */
*UE = NULL, /* выключение подчеркивания */
*UP = "\033A", /* на строку вверх */
*US = NULL, /* включение подчеркивания */
*VE = "\033H\033\J", /* визуальная заканчивающая
последовательность */
*VS = "\027\033H\033\J"; /* визуальная начальная
последовательность */
Если в терминале присутствует прямая адресация курсора, то должна быть написана функция tgoto, формирующая по последовательности управления непосредственной адрессации ("cm") строку, приводящую к выполнению перехода в указанную в аргументах позицию. Например, для 15-ИЭ-013 эта функция выглядит так:
char *
tgoto(p, col, lin)
register char *p;
p[2] = ' '+lin;
p[3] = ' '+col;
return(p);
Если прямой адресации в терминале нет, то функция tgoto() должна возвращать строчку "OUT"
tgoto()
б
return("OUT");
8. ГРАФИЧЕСКИЙ РЕДАКТОР ДЛЯ ДВК-3.
Автор Яковлев С.С. 205 КПМ МФТИ
Last correction : Date 10/03/90 Time 00:01:48
Данный графический редактор предоставляет пользователю весьма удобные средства так называемой "паучьей графики" с минимальным набором примитивов, макроопределениями, символами и возможностью вывода на принтеры трех известных типов (EPSON, УВВПЧ-30-004, D-100).
Автор распространяет графический редактор и графическую библиотеку в любом виде - загрузочный модуль CGRED.SAV, библиотеку CGLIB.OBJ, исходные тексты на языке СИ большей части библиотеки и самого редактора.
Автор не считает необходимым требовать соблюдения каких-либо обязательств пользователями редактора, ибо сам грешен переделкой всего того, что попадает ему в руки. Однако он позволяет надеяться на элементарную порядочность тех, кто будет продавать его программный продукт, и просит лишь о рекламе его авторства, фактически передавая все остальные права на программу первому встречному.
Внимание всем хаккерам! В тексте есть переменные: extern char *ident,*author; char *ident="X00.01 ",*author="Яковлев С.С. 205 КПМ МФТИ";
Их изменять не только можно, но и нужно, ибо автор не собирается отвечать за все те извратные версии, которые, очевидно, появятся. Также прошу отмечать все изменения в данном описании. Это облегчит и вашу и мою работу.
Краткий список функциональных клавиш редактора:
+ = увеличение/уменьшение скорости курсоров
; - увеличение/уменьшение шага курсоров
Pgmdefine Создание программы
Jumppgm Запуск программы
Input Ввод файла в окно, ограниченное курсорами
Output Вывод окна, ограниченного курсорами, в файл.
Text Переход в режим символьного ввода
Circle Окружность с центром в ведущем курсоре и радиусом,
равным разности горизонтальных координат курсоров
*
. вкл/выкл красящей точки
Rubber вкл/выкл красящей резинки, натянутой между курсорами.