home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / troff / n10.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.3 KB  |  259 lines

  1. #include "tdef.h"
  2. #include <sgtty.h>
  3. extern
  4. #include "d.h"
  5. extern
  6. #include "v.h"
  7. extern
  8. #include "tw.h"
  9. /*
  10. nroff10.c
  11.  
  12. Device interfaces
  13. */
  14.  
  15. extern int lss;
  16. extern char obuf[];
  17. extern char *obufp;
  18. extern int xfont;
  19. extern int esc;
  20. extern int lead;
  21. extern int oline[];
  22. extern int *olinep;
  23. extern int ulfont;
  24. extern int esct;
  25. extern int sps;
  26. extern int ics;
  27. extern int ttysave;
  28. extern struct sgttyb ttys;
  29. extern char termtab[];
  30. extern int ptid;
  31. extern int waitf;
  32. extern int pipeflg;
  33. extern int eqflg;
  34. extern int hflg;
  35. extern int tabtab[];
  36. extern int ascii;
  37. extern int xxx;
  38. int dtab;
  39. int bdmode;
  40. int plotmode;
  41.  
  42. ptinit(){
  43.     register i, j;
  44.     register char **p;
  45.     char *q;
  46.     int x[8];
  47.     extern char *setbrk();
  48.  
  49.     if((i = open(termtab,0)) < 0){
  50.         prstr("Cannot open ");
  51.         prstr(termtab);
  52.         prstr("\n");
  53.         exit(-1);
  54.     }
  55.     read(i,(char *)x,8*sizeof(int));
  56.     read(i,(char *)&t.bset,j = sizeof(int)*((int *)&t.zzz - &t.bset));
  57.     x[2] -= j;
  58.     q = setbrk(x[2]);
  59.     lseek(i,(long)t.twinit+8*sizeof(int),0);
  60.     i = read(i,q,x[2]);
  61.     j = q - t.twinit;
  62.     for(p = &t.twinit; p < &t.zzz; p++){
  63.         if(*p)*p += j;else *p = "";
  64.     }
  65.     sps = EM;
  66.     ics = EM*2;
  67.     dtab = 8 * t.Em;
  68.     for(i=0; i<16; i++)tabtab[i] = dtab * (i+1);
  69.     if(eqflg)t.Adj = t.Hor;
  70. }
  71. twdone(){
  72.     obufp = obuf;
  73.     oputs(t.twrest);
  74.     flusho();
  75.     if(pipeflg){
  76.         close(ptid);
  77.         wait(&waitf);
  78.     }
  79.     if(ttysave != -1) {
  80.         ttys.sg_flags = ttysave;
  81.         stty(1, &ttys);
  82.     }
  83. }
  84. ptout(i)
  85. int i;
  86. {
  87.     *olinep++ = i;
  88.     if(olinep >= &oline[LNSIZE])olinep--;
  89.     if((i&CMASK) != '\n')return;
  90.     olinep--;
  91.     lead += dip->blss + lss - t.Newline;
  92.     dip->blss = 0;
  93.     esct = esc = 0;
  94.     if(olinep>oline){
  95.         move();
  96.         ptout1();
  97.         oputs(t.twnl);
  98.     }else{
  99.         lead += t.Newline;
  100.         move();
  101.     }
  102.     lead += dip->alss;
  103.     dip->alss = 0;
  104.     olinep = oline;
  105. }
  106. ptout1()
  107. {
  108.     register i, k;
  109.     register char *codep;
  110.     extern char *plot();
  111.     int *q, w, j, phyw;
  112.  
  113.     for(q=oline; q<olinep; q++){
  114.     if((i = *q) & MOT){
  115.         j = i & ~MOTV;
  116.         if(i & NMOT)j = -j;
  117.         if(i & VMOT)lead += j;
  118.         else esc += j;
  119.         continue;
  120.     }
  121.     if((k = (i & CMASK)) <= 040){
  122.         switch(k){
  123.             case ' ': /*space*/
  124.                 esc += t.Char;
  125.                 break;
  126.         }
  127.         continue;
  128.     }
  129.     codep = t.codetab[k-32];
  130.     w = t.Char * (*codep++ & 0177);
  131.     phyw = w;
  132.     if(i&ZBIT)w = 0;
  133.     if(*codep && (esc || lead))move();
  134.     esct += w;
  135.     if(i&074000)xfont = (i>>9) & 03;
  136.     if(*t.bdon & 0377){
  137.         if(!bdmode && (xfont == 2)){
  138.             oputs(t.bdon);
  139.             bdmode++;
  140.         }
  141.         if(bdmode && (xfont != 2)){
  142.             oputs(t.bdoff);
  143.             bdmode = 0;
  144.         }
  145.     }
  146.     if(xfont == ulfont){
  147.         for(k=w/t.Char;k>0;k--)oput('_');
  148.         for(k=w/t.Char;k>0;k--)oput('\b');
  149.     }
  150.     while(*codep != 0){
  151.         if(*codep & 0200){
  152.             codep = plot(codep);
  153.             oputs(t.plotoff);
  154.             oput(' ');
  155.         }else{
  156.             if(plotmode)oputs(t.plotoff);
  157.             *obufp++ = *codep++;
  158.             if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
  159. /*            oput(*codep++);*/
  160.         }
  161.     }
  162.     if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b');
  163.     }
  164. }
  165. char *plot(x)
  166. char *x;
  167. {
  168.     register int i;
  169.     register char *j, *k;
  170.  
  171.     if(!plotmode)oputs(t.ploton);
  172.     k = x;
  173.     if((*k & 0377) == 0200)k++;
  174.     for(; *k; k++){
  175.         if(*k & 0200){
  176.             if(*k & 0100){
  177.                 if(*k & 040)j = t.up; else j = t.down;
  178.             }else{
  179.                 if(*k & 040)j = t.left; else j = t.right;
  180.             }
  181.             if(!(i = *k & 037))return(++k);
  182.             while(i--)oputs(j);
  183.         }else oput(*k);
  184.     }
  185.     return(k);
  186. }
  187. move(){
  188.     register k;
  189.     register char *i, *j;
  190.     char *p, *q;
  191.     int iesct, dt;
  192.  
  193.     iesct = esct;
  194.     if(esct += esc)i = "\0"; else i = "\n\0";
  195.     j = t.hlf;
  196.     p = t.right;
  197.     q = t.down;
  198.     if(lead){
  199.         if(lead < 0){
  200.             lead = -lead;
  201.             i = t.flr;
  202.         /*    if(!esct)i = t.flr; else i = "\0";*/
  203.             j = t.hlr;
  204.             q = t.up;
  205.         }
  206.         if(*i & 0377){
  207.             k = lead/t.Newline;
  208.             lead = lead%t.Newline;
  209.             while(k--)oputs(i);
  210.         }
  211.         if(*j & 0377){
  212.             k = lead/t.Halfline;
  213.             lead = lead%t.Halfline;
  214.             while(k--)oputs(j);
  215.         }
  216.         else { /* no half-line forward, not at line begining */
  217.             k = lead/t.Newline;
  218.             lead = lead%t.Newline;
  219.             if (k>0) esc=esct;
  220.             i = "\n";
  221.             while (k--) oputs(i);
  222.         }
  223.     }
  224.     if(esc){
  225.         if(esc < 0){
  226.             esc = -esc;
  227.             j = "\b";
  228.             p = t.left;
  229.         }else{
  230.             j = " ";
  231.             if(hflg)while((dt = dtab - (iesct%dtab)) <= esc){
  232.                 if(dt%t.Em)break;
  233.                 oput(TAB);
  234.                 esc -= dt;
  235.                 iesct += dt;
  236.             }
  237.         }
  238.         k = esc/t.Em;
  239.         esc = esc%t.Em;
  240.         while(k--)oputs(j);
  241.     }
  242.     if((*t.ploton & 0377) && (esc || lead)){
  243.         if(!plotmode)oputs(t.ploton);
  244.         esc /= t.Hor;
  245.         lead /= t.Vert;
  246.         while(esc--)oputs(p);
  247.         while(lead--)oputs(q);
  248.         oputs(t.plotoff);
  249.     }
  250.     esc = lead = 0;
  251. }
  252. ptlead(){move();}
  253. dostop(){
  254.     char junk;
  255.  
  256.     flusho();
  257.     read(2,&junk,1);
  258. }
  259.