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 / MBUG / MBUG115.ARC / LPR.C < prev    next >
Text File  |  1979-12-31  |  8KB  |  347 lines

  1. /*
  2.     Line printer formatter 
  3.  
  4.     Written by Leor Zolman
  5.            May 28, 1980
  6.  
  7.     -------------------------------------------------------------------
  8.     Modifications by John Hastwell-Batten   16th January 1983
  9.  
  10.     1)    Includes line-printer configuration commands.  These are
  11.         specific to Epson MX100 (& MX80) but could serve as an
  12.         example for other printers.
  13.  
  14.     2)    Reads date from QT systems calendar/clock board.
  15.  
  16.     3)    WILDEXP and DIO added.
  17.  
  18.  
  19.     PRINTER CONFIGURATION COMMANDS:
  20.  
  21.     A command-line or interactive entry prefixed with a hyphen (-) is
  22.     treated as a set of printer configuration commands.  Each command
  23.     is a single letter which may be followed by a number (must be non-
  24.     zero to be effective).
  25.  
  26.     The commands implemented are:
  27.  
  28.         Bn    Set automatic skip-over-perforations (n lines),
  29.         B    Cancel perforation skip,
  30.         Cn    Select character set n
  31.         F    Skip to new page on first file
  32.         Hn    Enable page heading
  33.         H    Suppress page heading
  34.         In    Indent each data line n columns
  35.         Ln    Set form length to n inches
  36.         Nn    Turn on line numbering
  37.         N    Suppress line numbers
  38.  
  39.     Examples:
  40.         -b6fn1    specifies perforation skip of 6 lines, starts listing
  41.             with a page throw and turns on line numbering.
  42.  
  43.         -i15h1    indents each line in the body of the listing by 15
  44.             columns and prints a heading on each page.
  45.  
  46.     Defaults:
  47.         A call on the printer configuration procedure is done by this
  48.         program before any parameters are scanned.  The configuration
  49.         is set to NH1I15C0, i.e. line-numbering off, page headings on,
  50.         15-column indenting and character set 0 (USA) is selected.
  51.  
  52.         The defaults are easily modified by altering the parameter to
  53.         the configuration procedure.
  54.  
  55.     ---------------------------------------------------------------------
  56.  
  57.     First prints all files named on the command line, and then
  58.     asks for names of more files to print until a null line is typed.
  59.     Control-Q aborts current printing and goes to next file.
  60.  
  61.     Paper should be positioned ready to print on the first page.
  62.  
  63.     Tabs are expanded into spaces.    (NO! Tab stops are set on the MX100
  64.                      and tabs in the text are NOT expanded.
  65.                      John H-B.)
  66.  
  67. */
  68.  
  69. #include "bdscio.h"
  70. #include "dio.h"
  71.  
  72. #define FF 0x0C        /* formfeed character, or zero if not supported */
  73. #define PGLEN 66    /* lines per lineprinter page */
  74.  
  75. char colno, linesleft;
  76. char indenting, headings, numbering;
  77. unsigned linenumber, charcount;
  78.  
  79. #include <clock.h>
  80.  
  81. main(argc,argv)
  82. char **argv;
  83. {
  84.     int i, pgno, fd;
  85.     char date[30], linebuf[135];    /* date and line buffers */
  86.     char fnbuf[30], *fname;        /* filename buffer & ptr */
  87.     char numbuf[8];            /* place to build line number */
  88.     char ibuf[BUFSIZ];        /* buffered input buffer */
  89.     char *gets();
  90.  
  91.     wildexp(&argc,&argv);
  92.     dioinit(&argc,argv);
  93.     pgno = colno = 0;
  94.     linesleft = PGLEN; 
  95.     clock(date);
  96.     printf("Today's date is %s\n",date);
  97.     setmem(numbuf,8,0);
  98.     lpoption("NHI12C0");
  99.     while (1)
  100.     {
  101.         if (argc-1) {
  102.           fname = *++argv;
  103.           argc--; }
  104.         else {
  105.           printf("\nEnter file to print, or CR if done: ");
  106.           if (!*(fname = gets(fnbuf)))
  107.             break; }
  108.  
  109.         if (*fname == '-') {
  110.           lpoption(++fname);
  111.           continue; }
  112.         else
  113.            if ((fd = fopen(fname,ibuf)) == ERROR) {
  114.              printf("\n<<< Can't open %s >>>\n",fname);
  115.              continue; }
  116.            else {
  117.              l_to_u(fname);
  118.              linenumber = charcount = 0;
  119.              printf("\n+++ Printing %s +++\n",fname); }
  120.  
  121.         for (pgno = 1; ; pgno++) {
  122.           putchar((pgno % 10) ? '-' : '+');
  123.           if (headings) {
  124.             sprintf(linebuf,
  125.                 "\016%-20s%5s%-3d%36s\023\n\n",
  126.                 fname,"Page ",pgno,date);
  127.             linepr(linebuf); }
  128.  
  129.     loop:      if (!fgets(linebuf,ibuf)) {
  130.             Printf("\n+++ End of %s +++\n",fname);
  131.             printf("\t%d lines, %d characters\n",linenumber,charcount);
  132.             break; }
  133.           if (kbhit() && getchar() == 0x11) {
  134.             printf("\n+++ Skipping to next file +++\n");
  135.             break; }
  136.           if (indenting) putlpr('\t');
  137.           linenumber++;
  138.           if (numbering) {
  139.             sprintf(numbuf,"%5d:\t",linenumber);
  140.             if (linepr(numbuf)) continue; }
  141.           if (linepr(linebuf)) continue;
  142.           if (linesleft > 6)
  143.             goto loop;
  144.           formfeed(); }
  145.         formfeed();
  146. /*        if (pgno % 2) formfeed();    */
  147.         fabort(fd);
  148.     }
  149.     dioflush();
  150. }
  151.  
  152. /*
  153.     Print a line of text out on the list device, and
  154.     return true if a formfeed was encountered in the
  155.     text.
  156. */
  157.  
  158. linepr(string)
  159. char *string;
  160. {
  161.     char c, ffflag;
  162.     ffflag = 0;
  163.     while (c = *string++) {
  164.       charcount++;
  165.       switch (c) {
  166.         case FF:
  167.         ffflag = 1;
  168.         break;
  169.         case '\n':    
  170.         putlpr('\r');
  171.         putlpr('\n');
  172.         colno = 0;
  173.         linesleft--;
  174.         break;
  175. /*
  176.         case '\t':
  177.         do {
  178.           putlpr(' ');
  179.           colno++;
  180.         } while (colno % 8);
  181.         break;
  182. */
  183.         default:                    
  184.         putlpr(c);
  185.         colno++;
  186.     } }
  187.     if (ffflag) formfeed();
  188.     return ffflag;
  189. }
  190.  
  191. putlpr(c)
  192. char c;
  193. {
  194.     bios(5,c);
  195. }
  196.  
  197. formfeed()
  198. {
  199.     if (FF) putlpr(FF);
  200.     else while (linesleft--) putlpr('\n');
  201.     linesleft = PGLEN;
  202. }
  203.  
  204. /* LPOPTION:    This routine interprets a string as a series of commands
  205.         to set up an Epson MX100 for subsequent printing.
  206.  
  207.         The commands implemented are:
  208.  
  209.             Bn    Set automatic skip-over-perforations,
  210.             Cn    Select character set n
  211.             F    Skip to new page on first file
  212.             Hn    Enable page heading
  213.             H    Suppress page heading
  214.             I    Indent each data line n columns
  215.             Ln    Set form length to n inches
  216.             Nn    Turn on line numbering
  217.             N    Suppress line numbers
  218.                                     */
  219. lpoption(opts)        char *opts;
  220. {
  221.     char    c, v, stops;
  222.  
  223.     while (c=*opts++)
  224.         {
  225.         switch (toupper(c))
  226.             {
  227. case 'B':
  228.             v = atoi(*opts);
  229.             while (isdigit(*opts++));
  230.             --opts;
  231.             putlpr('\033');
  232.             putlpr('N');
  233.             putlpr(v);
  234.             printf("- End-of-page skip set to %d lines\n",v);
  235.             break;
  236. case 'C':
  237.             putlpr('\033');
  238.             putlpr('R');
  239.             if (isdigit(*opts))
  240.                 putlpr(v=*opts++ & 7);
  241.             printf("- Character set %d selected\n",v);
  242.             break;
  243. case 'F':
  244.             v = formfeed();
  245.             printf("- Advancing to new page\n");
  246.             break;
  247. case 'H':
  248.             if (headings = atoi(opts))
  249.                 printf("- Page headings enabled\n");
  250.             else
  251.                 printf("- Page headings suppressed\n");
  252.             while (isdigit(*opts++));
  253.             --opts;
  254.             break;
  255. case 'I':
  256.             indenting = atoi(opts);
  257.             while (isdigit(*opts++));
  258.             --opts;
  259.             putlpr('\033');
  260.             putlpr('D');
  261.             stops = 12;
  262.             printf("- Indenting set to %d columns\n",indenting);
  263.             for (v=(indenting ? (indenting+1) : 9); stops--; v=v+8)
  264.                 putlpr(v);
  265.             putlpr(0);
  266.             break;
  267. case 'L':
  268.             if (!(v=atoi(opts)))
  269.               v = 11;
  270.             while (isdigit(*opts++));
  271.             --opts;
  272.             putlpr('\033');
  273.             putlpr('C');
  274.             putlpr('\0');
  275.             putlpr(v);
  276.             printf("- Page length set to %d inches\n",v);
  277.             break;
  278. case 'N':
  279.             if (numbering = atoi(opts))
  280.                 printf("- Line numbering enabled\n");
  281.             else
  282.                 Printf("- Line numbering suppressed\n");
  283.             while (isdigit(*opts++));
  284.             --opts;
  285.             break;
  286. default:
  287.             printf("- Invalid format specifier: %c\n",*opts);
  288.             }
  289.      }
  290. }
  291.  
  292. l_to_u(string)    char *string;
  293. {    while (toupper(*string++)) ; }
  294.  
  295. clock(date)
  296.  
  297.     char *date;
  298. {
  299.     struct _time tick ;
  300.     struct _date tock ;
  301.     char *days[7], *months[12] ;
  302.     char   *suffix[3];
  303.     int    dd;    
  304.     suffix[0] = "th";        suffix[1] = "st";
  305.     suffix[2] = "nd";        suffix[3] = "rd";
  306.     months[0] = "January";        months[1] = "February";
  307.     months[2] = "March";        months[3] = "April";
  308.     months[4] = "May";        months[5] = "June";
  309.     months[6] = "July";        months[7] = "August";
  310.     months[8] = "September";    months[9] = "October";
  311.     months[10] = "November";    months[11] = "December";
  312.     days[0] = "Sun";        days[1] = "Mon";
  313.     days[2] = "Tues";        days[3] = "Wednes";
  314.     days[4] = "Thurs";        days[5] = "Fri";
  315.     days[6] = "Satur";
  316.  
  317.         getdate(&tock) ;
  318.         if ((tock.day / 10 == 1) | (tock.day % 10 > 4))
  319.             dd = 0;
  320.         else
  321.             dd = tock.day % 10;
  322.         sprintf(date,"%sday %2d%s %s 19%02d\0",
  323.             days[tock . weekday], tock.day, suffix[dd],
  324.             months[tock.month], tock.year) ;
  325.     }
  326.  
  327. getdate(now) struct _date *now; {
  328.     char i, time[7] ;
  329.  
  330.     outp(CLDATA, CLHOLD) ;
  331.     for (i = 0; i < 7; i++)
  332.         time[i] = getclock(i + 6) ;
  333.     outp(CLDATA, CLREL) ;
  334.     now -> day = time[1] + 10 * (time[2] & CLOMASK) ;
  335.     now -> month = time[3] + 10 * time[4] - 1 ;
  336.     now -> year = time[5] + 10 * time[6] ;
  337.     now -> weekday = *time ;
  338.     }
  339.  
  340. char getclock(reg) char *reg; {
  341.     char x ;
  342.  
  343.     outp(CLADDR, reg + CLOFF) ;
  344.     x = inp(CLADDR) & CLMASK ;
  345.     return x ;
  346.     }
  347.