home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / 2014.11.minnie.tuhs.org.tar / minnie.tuhs.org / UnixArchive / PDP-11 / Trees / V6 / usr / sys / dmr / lp.c < prev    next >
C/C++ Source or Header  |  1975-07-17  |  2KB  |  185 lines

  1. #
  2. /*
  3.  */
  4.  
  5. /*
  6.  * LP-11 Line printer driver
  7.  */
  8.  
  9. #include "../param.h"
  10. #include "../conf.h"
  11. #include "../user.h"
  12.  
  13. #define    LPADDR    0177514
  14.  
  15. #define    IENABLE    0100
  16. #define    DONE    0200
  17.  
  18. #define    LPPRI    10
  19. #define    LPLWAT    50
  20. #define    LPHWAT    100
  21. #define    EJLINE    60
  22. #define    MAXCOL    80
  23.  
  24. struct {
  25.     int lpsr;
  26.     int lpbuf;
  27. };
  28.  
  29. struct  {
  30.     int    cc;
  31.     int    cf;
  32.     int    cl;
  33.     int    flag;
  34.     int    mcc;
  35.     int    ccc;
  36.     int    mlc;
  37. } lp11;
  38.  
  39. #define    CAP    01        /* Set to 0 for 96-char printer, else to 01 */
  40. #define    EJECT    02
  41. #define    OPEN    04
  42. #define IND    010        /* Set to 0 for no indent, else to 010 */
  43.  
  44. #define    FORM    014
  45.  
  46. lpopen(dev, flag)
  47. {
  48.  
  49.     if(lp11.flag & OPEN || LPADDR->lpsr < 0) {
  50.         u.u_error = EIO;
  51.         return;
  52.     }
  53.     lp11.flag =| (IND|EJECT|OPEN);
  54.     LPADDR->lpsr =| IENABLE;
  55.     lpcanon(FORM);
  56. }
  57.  
  58. lpclose(dev, flag)
  59. {
  60.     lpcanon(FORM);
  61.     lp11.flag = 0;
  62. }
  63.  
  64. lpwrite()
  65. {
  66.     register int c;
  67.  
  68.     while ((c=cpass())>=0)
  69.         lpcanon(c);
  70. }
  71.  
  72. lpcanon(c)
  73. {
  74.     register c1, c2;
  75.  
  76.     c1 = c;
  77.     if(lp11.flag&CAP) {
  78.         if(c1>='a' && c1<='z')
  79.             c1 =+ 'A'-'a'; else
  80.         switch(c1) {
  81.  
  82.         case '{':
  83.             c2 = '(';
  84.             goto esc;
  85.  
  86.         case '}':
  87.             c2 = ')';
  88.             goto esc;
  89.  
  90.         case '`':
  91.             c2 = '\'';
  92.             goto esc;
  93.  
  94.         case '|':
  95.             c2 = '!';
  96.             goto esc;
  97.  
  98.         case '~':
  99.             c2 = '^';
  100.  
  101.         esc:
  102.             lpcanon(c2);
  103.             lp11.ccc--;
  104.             c1 = '-';
  105.         }
  106.     }
  107.  
  108.     switch(c1) {
  109.  
  110.     case '\t':
  111.         lp11.ccc = (lp11.ccc+8) & ~7;
  112.         return;
  113.  
  114.     case FORM:
  115.     case '\n':
  116.         if((lp11.flag&EJECT) == 0 ||
  117.            lp11.mcc!=0 || lp11.mlc!=0) {
  118.             lp11.mcc = 0;
  119.             lp11.mlc++;
  120.             if(lp11.mlc >= EJLINE && lp11.flag&EJECT)
  121.                 c1 = FORM;
  122.             lpoutput(c1);
  123.             if(c1 == FORM)
  124.                 lp11.mlc = 0;
  125.         }
  126.  
  127.     case '\r':
  128.         lp11.ccc = 0;
  129.         if(lp11.flag&IND)
  130.             lp11.ccc = 8;
  131.         return;
  132.  
  133.     case 010:
  134.         if(lp11.ccc > 0)
  135.             lp11.ccc--;
  136.         return;
  137.  
  138.     case ' ':
  139.         lp11.ccc++;
  140.         return;
  141.  
  142.     default:
  143.         if(lp11.ccc < lp11.mcc) {
  144.             lpoutput('\r');
  145.             lp11.mcc = 0;
  146.         }
  147.         if(lp11.ccc < MAXCOL) {
  148.             while(lp11.ccc > lp11.mcc) {
  149.                 lpoutput(' ');
  150.                 lp11.mcc++;
  151.             }
  152.             lpoutput(c1);
  153.             lp11.mcc++;
  154.         }
  155.         lp11.ccc++;
  156.     }
  157. }
  158.  
  159. lpstart()
  160. {
  161.     register int c;
  162.  
  163.     while (LPADDR->lpsr&DONE && (c = getc(&lp11)) >= 0)
  164.         LPADDR->lpbuf = c;
  165. }
  166.  
  167. lpint()
  168. {
  169.     register int c;
  170.  
  171.     lpstart();
  172.     if (lp11.cc == LPLWAT || lp11.cc == 0)
  173.         wakeup(&lp11);
  174. }
  175.  
  176. lpoutput(c)
  177. {
  178.     if (lp11.cc >= LPHWAT)
  179.         sleep(&lp11, LPPRI);
  180.     putc(c, &lp11);
  181.     spl4();
  182.     lpstart();
  183.     spl0();
  184. }
  185.