home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BDSC / BDSC-2 / LPR.CQ / LPR.C
Text File  |  2000-06-30  |  3KB  |  128 lines

  1. /*
  2.     Line printer formatter 
  3.  
  4.     Written by Leor Zolman
  5.            May 28, 1980
  6.  
  7.     First prints all files named on the command line, and then
  8.     asks for names of more files to print until a null line is typed.
  9.     Control-Q aborts current printing and goes to next file.
  10.  
  11.     Paper should be positioned ready to print on the first page; each
  12.     file is always printed in an even number of pages so that new files
  13.     always start on the same phase of fan-fold paper.
  14.  
  15.     Tabs are expanded into spaces.
  16. */
  17.  
  18. #include "bdscio.h"
  19.  
  20. #define FF 0x0c        /* formfeed character, or zero if not supported */
  21. #define PGLEN 85    /* lines per lineprinter page */
  22.  
  23. int colno, linesleft;
  24.  
  25. main(argc,argv)
  26. char **argv;
  27. {
  28.     int i, pgno, fd;
  29.     char date[30], linebuf[135];    /* date and line buffers */
  30.     char fnbuf[30], *fname;        /* filename buffer & ptr */
  31.     char ibuf[BUFSIZ];        /* buffered input buffer */
  32.     char *gets();
  33.  
  34.     pgno = colno = 0;
  35.     linesleft = PGLEN; 
  36.     printf("What is today's date? ");
  37.       gets(date);
  38.  
  39.     while (1)
  40.     {
  41.         if (argc-1)
  42.          {
  43.             fname = *++argv;
  44.             argc--;
  45.          }
  46.         else
  47.          {
  48.             printf("\nEnter file to print, or CR if done: ");
  49.             if (!*(fname = gets(fnbuf))) break;
  50.          }
  51.  
  52.         if ((fd = fopen(fname,ibuf)) == ERROR)
  53.          {
  54.             printf("Can't open %s\n",fname);
  55.             continue;
  56.          }
  57.         else printf("\nPrinting %-13s",fname);
  58.  
  59.         for (pgno = 1; ; pgno++)
  60.          {
  61.             putchar('*');
  62.             sprintf(linebuf,"\n\n%28s%-13s%5s%-3d%20s\n\n\n",
  63.                 "file: ",fname,"page ",pgno,date);
  64.             linepr(linebuf);
  65.  
  66.         loop:    if (!fgets(linebuf,ibuf)) break;
  67.             if (kbhit() && getchar() == 0x11) break;
  68.             if (linepr(linebuf)) continue;
  69.             if (linesleft > 2) goto loop;
  70.             formfeed();
  71.          }
  72.         formfeed();
  73.         if (pgno % 2) formfeed();
  74.         fabort(fd);
  75.     }
  76. }
  77.  
  78. /*
  79.     Print a line of text out on the list device, and
  80.     return true if a formfeed was encountered in the
  81.     text.
  82. */
  83.  
  84. linepr(string)
  85. char *string;
  86. {
  87.     char c, ffflag;
  88.     ffflag = 0;
  89.     while (c = *string++)
  90.       switch (c) {
  91.         case FF:
  92.         ffflag = 1;
  93.         break;
  94.         case '\n':    
  95.         putlpr('\r');
  96.         putlpr('\n');
  97.         colno = 0;
  98.         linesleft--;
  99.         break;
  100.  
  101.         case '\t':
  102.         do {
  103.           putlpr(' ');
  104.           colno++;
  105.         } while (colno % 8);
  106.         break;
  107.  
  108.         default:                    
  109.         putlpr(c);
  110.         colno++;
  111.     }
  112.     if (ffflag) formfeed();
  113.     return ffflag;
  114. }
  115.  
  116. putlpr(c)
  117. char c;
  118. {
  119.     bios(5,c);
  120. }
  121.  
  122. formfeed()
  123. {
  124.     if (FF) putlpr(FF);
  125.     else while (linesleft--) putlpr('\n');
  126.     linesleft = PGLEN;
  127. }
  128.