Ниже приведен пример взаимодействия программы форматирования печати с документированными процедурами форматирования принтеров. Процесс написания программы форматирования печати состоит из четырех этапов:
C помощью текстового редактора ASCII создайте исходный файл программы форматирования печати с именем sample.c. Файл должен содержать следующие строки:
#include <stdio.h> #include <piostruct.h> /* КОНСТАНТЫ */ /* Инициализация принтера, Восстановление принтера, Подача бумаги */ #define INIT_CMD "ci" #define REST_CMD "cr" #define FF_CMD "af"
/* ЦЕЛЫЕ и СТРОКОВЫЕ ПЕРЕМЕННЫЕ */ /* длина страницы ширина страницы верхнее поле нижнее поле */ #define Pglen (*(_Pglen + piomode)) #define Pgwidth (*(_Pgwidth + piomode)) #define Tmarg (*(_Tmarg + piomode)) #define Bmarg (*(_Bmarg + piomode))
/* отступы начальная страница перевод страницы?, сквозная печать? */ #define Indent (*(_Indent + piomode)) #define Beginpg (*(_Beginpg + piomode)) #define Do_formfeed (*(_Do_formfeed + piomode)) #define Passthru (*(_Passthru + piomode))
/* инициализировать принтер?, восстановить принтер? */ #define Init_printer (*(_Init_printer + piomode)) #define Restoreprinter (*(_Restoreprinter + piomode))
/* Имена команд: перевод страницы, вертикальное приращение и сокращение */ #define Ff_cmd (*(_Ff_cmd + piomode)) #define Vincr_cmd (*(_Vincr_cmd + piomode)) #define Vdecr_cmd (*(_Vdecr_cmd + piomode))
/* Рабочие переменные вертикального приращения и сокращения */ #define Vincr (*(_Vincr + piomode)) #define Vdecr (*(_Vdecr + piomode))
/* Переменные, упомянутые в вышеприведенных операторах #define */ int *_Pglen, *_Pgwidth, *_Tmarg, *_Bmarg, *_Indent, *_Beginpg, *_Do_ formfeed, *_Passthru, *_Init_printer, *_Restoreprinter, *_Vincr, *_V decr; struct str_info *_Ff_cmd, *_Vincr_cmd, *_Vdecr_cmd;
/* ТАБЛИЦА ЗНАЧЕНИЙ АТРИБУТОВ */
struct attrparms attrtable[] = { /*
имя тип данных lookup адрес указателя */
"_b", VAR_INT, NULL, (union dtypes *) &_Bmarg,
"_g", VAR_INT, NULL, (union dtypes *) &_Beginpg,
"_i", VAR_INT, NULL, (union dtypes *) &_Indent,
"_j", VAR_INT, NULL, (union dtypes *) &_Init_printer,
"_l", VAR_INT, NULL, (union dtypes *) &_Pglen,
"_t", VAR_INT, NULL, (union dtypes *) &_Tmarg,
"_w", VAR_INT, NULL, (union dtypes *) &_Pgwidth,
"_J", VAR_INT, NULL, (union dtypes *) &_Restoreprinter,
"_Z", VAR_INT, NULL, (union dtypes *) &_Do_formfeed,
"wp", VAR_INT, NULL, (union dtypes *) &_Passthru,
"wf", VAR_STR, NULL, (union dtypes *) &_Ff_cmd,
"wi", VAR_STR, NULL, (union dtypes *) &_Vincr_cmd,
"wy", VAR_STR, NULL, (union dtypes *) &_Vdecr_cmd,
"wV", VAR_INT, NULL, (union dtypes *) &_Vincr,
"wD", VAR_INT, NULL, (union dtypes *) &_Vdecr,
NULL, 0 , NULL, NULL };
int pglen, tmarg, bmarg, vpos, vtab_base;
struct shar_vars sharevars;
struct shar_vars * /*** Выполнение настройки ***/
setup(argc, argv, passthru)
unsigned argc;
char *argv[];
int passthru:
{
/* Инициализация переменных и значений командной строки */ (void) piogetvals(attrtable, NULL); (void) piogetopt(argc, argv, NULL, NULL); /* (необходимо проверить введенные пользователем данные) */
/* Инициализация рабочих переменных */ pglen = Pglen * Vincr; tmarg = Tmarg * Vincr; bmarg = Bmarg * Vincr; piopgskip = Beginpg - 1;
/* Проверка опций сквозной печати */ if (Passthru = passthru) return(NULL);
/* Инициализация указателей на переменные межстрочного интервала, */ /* общие с драйвером программы форматирования */ /* (См. файл /usr/include/piostruct.h) */ sharevars._pl = &pglen; sharevars._tmarg = &tmarg; sharevars._bmarg = &bmarg; sharevars._vpos = &vpos; sharevars._vtab_base = &vtab_base; sharevars._vincr = &Vincr; sharevars._vincr_cmd = (&Vincr_cmd)->ptr; sharevars._vdecr = &Vdecr; sharevars._vdecr_cmd = (&Vdecr_cmd)->ptr; sharevars._ff_cmd = (&Ff_cmd)->ptr; sharevars._ff_at_eof = &Do_formfeed; return(&sharevars); }
initialize() /*** Инициализация принтера ***/
{
if (Init_printer)
(void) piocmdout(INIT_CMD, NULL, 0, NULL);
return(0);
}
lineout(fileptr) /*** Форматирование строки ***/
FILE *fileptr;
{
int ch, charcount = 0;
for (ch = 0; ch < Indent; ch++)
pioputchar(' ');
while ((ch=piogetc(fileptr)) != '\n' && ch != EOF
&& charcount < Pgwidth) {
charcount++;
pioputchar(c);
}
vpos += Vincr;
return(charcount);
}
NAME="A38F11dd">passthru() /*** Опция сквозной печати ***/
{
int ch;
while ((ch = piogetc(stdin)) != EOF)
pioputchar(ch);
if (piodatasent && Do_formfeed)
(void) piocmdout(FF_CMD, NULL, 0, NULL);
return(0);
}
restore() /*** Восстановление принтера ***/
{
if (Restoreprinter)
(void) piocmdout(REST_CMD, NULL, 0, NULL);
return(0);
}
С помощью текстового редактора создайте файл импорта с именем sample.imp. Файл должен содержать следующие строки:
#! main piogetvals piogetopt piomsgout pioexit piomode piodatasent piopgskip statusfile piocmdout piogetstr
С помощью текстового редактора создайте файл экспорта с именем sample.exp. Файл должен содержать следующие строки:
#! setup initialize passthru restore lineout
Откомпилируйте и скомпонуйте программу форматирования, введя следующую команду:
cc -o sample -bI:sample.imp -bE:sample.exp sample.c