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

  1. #include "tdef.h"
  2. extern
  3. #include "d.h"
  4. extern
  5. #include "v.h"
  6. /*
  7. troff10.c
  8.  
  9. CAT interface
  10. */
  11.  
  12. extern int *olinep;
  13. extern int oline[];
  14. extern int *pslp;
  15. extern int back;
  16. extern int xpts;
  17. extern int mpts;
  18. extern int po;
  19. extern int xflg;
  20. extern int line[];
  21. extern int lss;
  22. extern int xbitf;
  23. extern char obuf[];
  24. extern char *obufp;
  25. extern int esct;
  26. extern int trflg;
  27. extern int cs;
  28. extern int smnt;
  29. extern int mfont;
  30. extern int xfont;
  31. extern int code;
  32. extern int mcase;
  33. extern int esc;
  34. extern int lead;
  35. extern int paper;
  36. extern int cps;
  37. extern int psflg;
  38. extern int ptid;
  39. extern int verm;
  40. extern int escm;
  41. extern char pstab[], psctab[];
  42. extern int dpn;
  43. extern int ascii;
  44. int mrail = 0; /*0=LR,1=UR*/
  45. int mmag = 1; /*0=UM,1=LM*/
  46. extern int nofeed;
  47. extern int gflag;
  48. extern int fontlab[];
  49. int papflg;
  50. extern int pfont;
  51. extern int ppts;
  52. extern int oldbits;
  53. extern int bd;
  54. extern int vflag;
  55. extern int stopmesg;
  56. extern int xxx;
  57.  
  58. ptinit(){
  59.  
  60.     if(ascii || gflag)return;
  61.     oput(T_INIT);
  62.     esc = T_IESC;
  63.     ptesc();
  64.     esct = 0;
  65.     esc = po;
  66.     oput(0140); /*some initial lead*/
  67. }
  68. ptout(i)
  69. int i;
  70. {
  71.     register *k, lw, *j;
  72.     int ds, de, inith, temp, *slp, dv;
  73.     int psl[16];
  74.  
  75.     if((i & CMASK) != '\n'){
  76.         *olinep++ = i;
  77.         return;
  78.     }
  79.     if(olinep == oline){
  80.         lead += lss;
  81.         return;
  82.     }
  83.     pslp = psl;
  84.     *pslp = lw = inith = dv = 0;
  85.     for(k=oline; k<olinep; k++){
  86.         trflg++;
  87.         xbitf = 1;
  88.         lw += width(*k);
  89.         if((*k & (MOT | VMOT)) == (MOT | VMOT)){
  90.             temp = *k & ~MOTV;
  91.             if(*k & NMOT)temp = -temp;
  92.             dv += temp;
  93.         }
  94.         if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){
  95.             if(xpts == *j)break;
  96.             if(j == pslp){
  97.                 *j = xpts;
  98.                 *++pslp = 0;
  99.                 break;
  100.             }
  101.         }
  102.     }
  103.     if(dv){
  104.         vflag++;
  105.         *olinep++ = makem(-dv);
  106.         vflag = 0;
  107.     }
  108.     if(xflg){
  109.     --pslp;
  110.         for(j=psl; j<=pslp; j++){
  111.             if(*j == mpts){
  112.                 temp = *j;
  113.                 *j = *pslp;
  114.                 *pslp = temp;
  115.                 break;
  116.             }
  117.         }
  118.     }
  119.     for(k=oline; k<olinep; k++){
  120.         if(!(*k & MOT) || (*k & VMOT))break;
  121.         *k &= ~MOT;
  122.         if(*k & NMOT){
  123.             *k &= ~NMOT;
  124.             *k = -*k;
  125.         }
  126.         inith += *k;
  127.     }
  128.     lead += dip->blss + lss;
  129.     dip->blss = 0;
  130.     slp = k;
  131. scan:
  132.     temp = esct - po;
  133.     if(mpts & DBL)temp -= 55;
  134.     ds = temp - inith;
  135.     de = lw - temp;
  136.     if(de >= ds){
  137.         back = 0;
  138.         esc = -ds;
  139.         for(k=slp; k<olinep; k++)ptout0(*k);
  140.     }else{
  141.         back = 1;
  142.         esc = de;
  143.         for(k = olinep-1; k>=slp; --k)ptout0(*k);
  144.     }
  145.     if(xflg && (--pslp >= psl))goto scan;
  146.     olinep = oline;
  147.     lead += dip->alss;
  148.     dip->alss = 0;
  149. }
  150. ptout0(i)
  151. int i;
  152. {
  153.     register j, k, w;
  154.     int z;
  155.  
  156.     if(i & MOT){
  157.         j = i & ~MOTV;
  158.         if(i & NMOT)j = -j;
  159.         if(back)j = -j;
  160.         if(i & VMOT)lead += j;
  161.         else esc += j;
  162.         return;
  163.     }
  164.     xbitf = 2;
  165.     if((i>>BYTE) == oldbits){
  166.         xfont = pfont;
  167.         xpts = ppts;
  168.         xbitf = 0;
  169.     }else xbits(i);
  170.     if((k = (i & CMASK)) < 040){
  171.         return;
  172.     }
  173.     w = getcw(k-32);
  174.     if(cs){
  175.         if(bd)w += bd - 1;
  176.         j = (cs-w)/2;
  177.         w = cs - j;
  178.         if(bd)w -= bd - 1;
  179.     }else j = 0;
  180.     if(i & ZBIT){
  181.         if(cs)w = -j; else w = 0;
  182.         z = 1;
  183.     }else z = 0;
  184.     if(back){
  185.         k = j;
  186.         j = -w;
  187.         w = -k;
  188.     }
  189.     esc += j;
  190.     if((!xflg || (xpts == *pslp)) && (code & 077)){
  191.         if(code & 0200){
  192.             if(smnt)xfont = smnt -1;
  193.             else goto p1;
  194.         }
  195.         if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105);
  196.         if(xfont != mfont){
  197.             mfont = xfont;
  198.             if(mrail != (xfont&01))
  199.                 oput(0101 + (mrail=xfont&01));
  200.             if(mmag != (xfont<2))
  201.                 oput(0103 + (mmag=(xfont<2)));
  202.         }
  203.         if(xpts != mpts)ptps();
  204.         if(lead)ptlead();
  205.         if(esc)ptesc();
  206. /*
  207.         oput(code & 077);
  208. */
  209.         *obufp++ = code & 077;
  210.         if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
  211.         if(bd){
  212.             bd -= 1;
  213.             if(back && !z)bd = -bd;
  214.             if(esc += bd)ptesc();
  215.             oput(code & 077);
  216.             if(z)esc -= bd;
  217.         }
  218.     }else if(bd && !z){
  219.         bd -= 1;
  220.         if(back)bd = -bd;
  221.         esc += bd;
  222.     }
  223. p1:
  224.     esc += w;
  225.     return;
  226. }
  227. ptps(){
  228.     register i, j, k;
  229.  
  230.     if(psflg)return;
  231.     if(cps){
  232.         psflg++;
  233.         i = findps(cps);
  234.     }else i = xpts;
  235.     for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
  236.     j = psctab[j];
  237.     oput((j & ~0200) | 0120);
  238.     if((!(mpts & DBL))^(!(j & 0200))){
  239.         if(j & 0200)k = 55;
  240.             else k = -55;
  241.         esc += k;
  242.     }
  243.     mpts = i;
  244. }
  245. ptlead(){
  246.     register i, k;
  247.  
  248.     if(k = lead < 0)lead = -lead;
  249.     if(k^verm)oput(0112 + ((verm=k)<<1));
  250.     if(((k=lead)%3) == 2)k++;
  251.     k /= 3;
  252.     while(k > 0){
  253.         if((i=31) > k)i = k;
  254.         if(verm)paper -= i;
  255.             else paper += i;
  256.         oput(((~i) & 037) | 0140);
  257.         if((paper > (11*144*15)) && !papflg && ptid != 1){
  258.             prstr("Excessive paper use.\n");
  259.             papflg++;
  260.             if(ptid != 1){
  261.                 lead = 0;
  262.                 done2(0200);
  263.             }
  264.         }
  265.         k -= i;
  266.     }
  267.     lead = 0;
  268. }
  269. ptesc(){
  270.     register i, j, k;
  271.  
  272.     if(k = esc < 0)esc = -esc;
  273.     if(k^escm)oput(0107 + (escm=k));
  274.     k = esc;
  275.     while(k > 0){
  276.         if((i=127) > k)i = k;
  277.         if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) ||
  278.            (j < 0))break;
  279. /*
  280.         oput(~i);
  281. */
  282.         *obufp++ = ~i;
  283.         if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
  284.         esct = j;
  285.         k -= i;
  286.     }
  287.     esc = 0;
  288. }
  289. dostop(){
  290.     register i;
  291.  
  292.     if(ascii)return;
  293.     if(!nofeed && !gflag)lead += TRAILER;
  294.     ptlead();
  295.     flusho();
  296.     oput(T_INIT);
  297.     oput(T_STOP);
  298.     if(gflag){
  299.         oput('f');
  300.         for(i=0; i<4; i++){
  301.             oput(fontlab[i] & BMASK);
  302.             oput((fontlab[i]>>BYTE) & BMASK);
  303.         }
  304.     }else for(i=8; i>0; i--)oput(T_PAD);
  305.     flusho();
  306.     if(stopmesg)prstr("Pages finished.\n");
  307.     mcase = mpts = mfont = mrail = verm = escm = 0;
  308.     mmag = 1;
  309.     report();
  310.     paper = 0;
  311.     esc = T_IESC;
  312.     ptesc();
  313.     esct = 0;
  314.     esc = po;
  315. }
  316.