[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по принтерам и печати


Пример программы форматирования печати

Ниже приведен пример взаимодействия программы форматирования печати с документированными процедурами форматирования принтеров. Процесс написания программы форматирования печати состоит из четырех этапов:

  1. Создание исходного файла (см. ниже).
  2. Создание файла импорта.
  3. Создание файла экспорта .
  4. Компиляция и компоновка программы форматирования печати .

Создание исходного файла программы форматирования печати

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


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]