Пример форматирования печати
Ниже приведен пример взаимодействия программы форматирования печати с документированными процедурами форматирования принтеров.
Процесс написания программы форматирования печати состоит из четырех этапов:
- Создание исходного файла (см. ниже)
- Создание файла импорта
- Создание файла экспорта
- Компиляция и компоновка программы форматирования печати
Исходный файл форматирования печати
C помощью текстового редактора ASCII создайте исходный файл программы форматирования печати с именем sample.c. Файл должен содержать следующие строки:
#include <stdio.h>
#include <piostruct.h>
/* Строковые константы */
/* Инициализация принтера, восстановление принтера, формирование подачи */
#define INIT_CMD "ci"
#define REST_CMD "cr"
#define FF_CMD "af" /* Переменные INTEGER и STRING */
/* page length, page width, top margin, bottom margin */
#define Pglen (*(_Pglen + piomode))
#define Pgwidth (*(_Pgwidth + piomode))
#define Tmarg (*(_Tmarg + piomode))
#define Bmarg (*(_Bmarg + piomode)) /* indentation, begin page, form feed?, pass-through? */
#define Indent (*(_Indent + piomode))
#define Beginpg (*(_Beginpg + piomode))
#define Do_formfeed (*(_Do_formfeed + piomode))
#define Passthru (*(_Passthru + piomode)) /* initialize printer?, restore printer? */
#define Init_printer (*(_Init_printer + piomode))
#define Restoreprinter (*(_Restoreprinter + piomode)) /* Имена команд: form feed, vertical increment и decrement */
#define Ff_cmd (*(_Ff_cmd + piomode))
#define Vincr_cmd (*(_Vincr_cmd + piomode))
#define Vdecr_cmd (*(_Vdecr_cmd + piomode)) /* Work variables for vertical increment and decrement */
#define Vincr (*(_Vincr + piomode))
#define Vdecr (*(_Vdecr + piomode)) /* Variables referenced by above #defines */
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[] = { /*
name data type lookup address of pointer */
"_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);
} 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