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

  1. #include "tdef.h"
  2. extern
  3. #include "d.h"
  4. extern
  5. #include "v.h"
  6.  
  7. /*
  8. troff6.c
  9.  
  10. width functions, sizes and fonts
  11. */
  12.  
  13. extern int eschar;
  14. extern int widthp;
  15. extern int ohc;
  16. extern int xpts;
  17. extern int xfont;
  18. extern int code;
  19. extern int smnt;
  20. extern int setwdf;
  21. extern int cs;
  22. extern int ccs;
  23. extern int spacesz;
  24. extern char trtab[];
  25. extern int xbitf;
  26. extern int mfont;
  27. extern int mpts;
  28. extern int pfont;
  29. extern int ppts;
  30. extern int oldbits;
  31. extern int chbits;
  32. extern int spbits;
  33. extern int nonumb;
  34. extern int noscale;
  35. extern int font;
  36. extern int font1;
  37. extern int pts;
  38. extern int pts1;
  39. extern int apts;
  40. extern int apts1;
  41. extern int sps;
  42. extern int nlflg;
  43. extern int nform;
  44. extern int dfact;
  45. extern int lss;
  46. extern int lss1;
  47. extern int vflag;
  48. extern int ch0;
  49. extern int lg;
  50. char fontfile[] = "/usr/lib/font/ftXX";
  51. int ffi = 16;
  52. extern int bd;
  53. extern int level;
  54. extern int ch;
  55. extern int res;
  56. extern int ptid;
  57. extern char W1[],W2[],W3[],W4[];
  58. extern int xxx;
  59. int trflg;
  60. char *fontab[] = {W1,W2,W3,W4};
  61. int fontlab[] = {'R','I','B','S',0};
  62. char pstab[] = {6,7,8,9,10,11,12,14,16,18,20,22,24,28,36,0};
  63. char psctab[] = {010,000,001,007,002,003,004,005,0211,006,
  64.         0212,0213,0214,0215,0216,0};
  65. int cstab[4], ccstab[4];
  66. int bdtab[4];
  67. int sbold = 0;
  68. int spsz = 0;
  69. struct fz {
  70.     char sign;
  71.     char size;
  72.     int inc;
  73.     } fz[4];
  74.  
  75. width(c)
  76. int c;
  77. {
  78.     register i,j,k;
  79.  
  80.     j = c;
  81.     k = 0;
  82.     if(j & MOT){
  83.         if(j & VMOT)goto rtn;
  84.         k = j & ~MOTV;
  85.         if(j & NMOT)k = -k;
  86.         goto rtn;
  87.     }
  88.     if((i = (j & CMASK)) == 010){
  89.         k = -widthp;
  90.         goto rtn;
  91.     }
  92.     if(i == PRESC)i = eschar;
  93.     if((i == ohc) ||
  94.        (i >= 0370))goto rtn;
  95.     if((j>>BYTE) == oldbits){
  96.         xfont = pfont;
  97.         xpts = ppts;
  98.     }else xbits(j);
  99.     if(j & ZBIT)goto rtn;
  100.     if(!trflg)i = trtab[i] & BMASK;
  101.     if((i -= 32) < 0)goto rtn;
  102.     k = getcw(i);
  103.     if(bd)k += bd - 1;
  104.     if(cs)k = cs;
  105.     widthp = k;
  106. rtn:
  107.     xbitf = trflg = 0;
  108.     return(k);
  109. }
  110. getcw(i)
  111. int i;
  112. {
  113.     register j,k;
  114.     register char *p;
  115.     int x;
  116.     extern char codetab[];
  117.  
  118.     bd = 0;
  119.     if((code = codetab[i])  & 0200){
  120.         if(smnt){
  121.             p = fontab[smnt-1];
  122.             if(xfont == (sbold-1))bd = bdtab[smnt-1];
  123.             goto g0;
  124.         }
  125.         code = 0;
  126.         k = 36;
  127.         goto g1;
  128.     }
  129.     p = fontab[xfont];
  130. g0:
  131.     if(!i)k = spacesz;
  132.     else k = *(p + i) & BMASK;
  133.     if(setwdf)v.ct |= ((k>>6) & 3);
  134. g1:
  135.     k = (j = (k&077)*(xpts&077))/6;
  136.     if((j%6) >= 3)k++;
  137.     if(cs = cstab[xfont]){
  138.         if(ccs = ccstab[xfont])x = ccs; else x = xpts;
  139.         cs = (j = (cs&077)*(x&077))/6;
  140.         if((j%6) >= 3)cs++;
  141.     }
  142.     if(!bd)bd = bdtab[xfont];
  143.     return(k);
  144. }
  145. xbits(i)
  146. int i;
  147. {
  148.     register j, k;
  149.  
  150. /*
  151.     if((j = i >> BYTE) == oldbits){
  152.         xfont = pfont;
  153.         xpts = ppts;
  154.         goto rtn;
  155.     }
  156. */
  157.     j = i >> BYTE;
  158.     xfont = (j>>1) & 03;
  159.     if(k = (j>>3) & 017){
  160.         xpts = pstab[--k];
  161.         if(psctab[k] < 0)xpts |= DBL;
  162.         oldbits = j;
  163.         pfont = xfont;
  164.         ppts = xpts;
  165.         goto rtn;
  166.     }
  167.     switch(xbitf){
  168.         case 0:
  169.             xfont = font;
  170.             xpts = pts;
  171.             break;
  172.         case 1:
  173.             xfont = pfont;
  174.             xpts = ppts;
  175.             break;
  176.         case 2:
  177.             xfont = mfont;
  178.             xpts = mpts;
  179.     }
  180. rtn:
  181.     xbitf = 0;
  182. }
  183. setch(){
  184.     register i,*j,k;
  185.     extern int chtab[];
  186.  
  187.     if((i = getrq()) == 0)return(0);
  188.     for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
  189.     k = *(++j) | chbits;
  190. /*
  191.     if((i & CMASK) == '*'){
  192.         if(((i = find('R',fontlab)) < 0) &&
  193.            ((i = find('G',fontlab)) < 0))
  194.             return(k);
  195.         else return((k & ~(03<<(BYTE+1))) | (i<<(BYTE+1)));
  196.     }
  197. */
  198.     return(k);
  199. }
  200. find(i,j)
  201. int i,j[];
  202. {
  203.     register k;
  204.  
  205.     if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
  206.     for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
  207.     return(k);
  208. }
  209. casefz(){
  210.     register i, j, k;
  211.     int savinc;
  212.  
  213.     k = 0;
  214. fz0:
  215.     if(skip() || !(i = getrq()) ||
  216.       ((j = find(i,fontlab))  == -1)){
  217.         if(k)goto fz1;
  218.         else return;
  219.     }
  220.     if(j == (smnt-1)){
  221.         k = smnt;
  222.         goto fz0;
  223.     }
  224.     if(k){
  225.         spsz = j + 1;
  226.         j = k -1;
  227.     }
  228. fz1:
  229.     if((j==font) && fz[j].inc)savinc = fz[j].inc;
  230.     else savinc = 0;
  231.     fz[j].inc = fz[j].sign = fz[j].size = 0;
  232.     if(skip()){
  233.         if(k)spsz = 0;
  234.         goto fz2;
  235.     }
  236.     if(((i=((k=getch()) & CMASK)) == '+') || (i == '-'))fz[j].sign = i;
  237.     else{
  238.         fz[j].sign = 0;
  239.         ch = k;
  240.     }
  241.     noscale++;
  242.     fz[j].size = atoi();
  243.     noscale = 0;
  244. fz2:
  245.     if(j==font)casps1(apts + savinc);
  246.     else if(j == smnt-1)mchbits();
  247. }
  248. caseps(){
  249.     register i;
  250.  
  251.     if(skip())i = apts1;
  252.     else{
  253.         noscale++;
  254.         i = inumb(&apts);
  255.         noscale = 0;
  256.         if(nonumb)return;
  257.     }
  258.     casps1(i);
  259. }
  260. casps1(i)
  261. int i;
  262. {
  263.     if(i <= 0)return;
  264.     if(fz[font].size){
  265.         i = getfz(font, i);
  266.     }
  267.     apts1 = apts;
  268.     apts = i;
  269.     pts1 = pts;
  270.     pts = findps(i & 077);
  271.     mchbits();
  272. }
  273. findps(i)
  274. int i;
  275. {
  276.     register j, k;
  277.  
  278.     for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
  279.     if(psctab[j] < 0)k |= DBL;
  280.     return(k);
  281. }
  282. mchbits(){
  283.     register i, j, k;
  284.  
  285.     spbits = 0;
  286.     i = pts & 077;
  287.     for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
  288.     chbits = (((++j)<<2) | font) << (BYTE + 1);
  289.     sps = width(' ' | chbits);
  290.     if(font == (spsz-1)){
  291.         i = findps(getfz(smnt-1, apts + fz[font].inc));
  292.         for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
  293.         spbits = (((++j)<<2) | font) << (BYTE + 1);
  294.     }
  295. }
  296. getfz(x,y)
  297. int x, y;
  298. {
  299.     register i, j, k;
  300.  
  301.     i = fz[x].size;
  302.     j = fz[x].sign;
  303.     if(i || j){
  304.         if(j == '+')i += y;
  305.         else if(j == '-')i = y - i;
  306.     }
  307.     fz[x].inc = y - i;
  308.     return(i);
  309. }
  310. setps(){
  311.     register i,j;
  312.  
  313.     if((((i=getch() & CMASK) == '+')  || (i == '-')) &&
  314.       (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
  315.         if(i == '-')j = -j;
  316.         ch = 0;
  317.         casps1(apts+j);
  318.         return;
  319.     }
  320.     if((i -= '0') == 0){
  321.         casps1(apts1);
  322.         return;
  323.     }
  324.     if((i > 0) && (i <= 9)){
  325.         if((i <= 3) &&
  326.           ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
  327.             i = 10*i +j;
  328.             ch = 0;
  329.         }
  330.         casps1(i);
  331.     }
  332. }
  333. caseft(){
  334.     skip();
  335.     setfont(1);
  336. }
  337. setfont(a)
  338. int a;
  339. {
  340.     register i,j;
  341.  
  342.     if(a)i = getrq();
  343.         else i = getsn();
  344.     if(!i || (i == 'P')){
  345.         j = font1;
  346.         goto s0;
  347.     }
  348.     if(i == 'S')return;
  349.     if((j = find(i,fontlab))  == -1)return;
  350. s0:
  351.     font1 = font;
  352.     font = j;
  353.     i = 0;
  354.     if(fz[font1].size){
  355.         i++;
  356.         casps1(apts + fz[font1].inc);
  357.     }else if(fz[font].size){
  358.         i++;
  359.         casps1(apts);
  360.     }
  361.     if(!i)mchbits();
  362. }
  363. setwd(){
  364.     register i, base, wid;
  365.     int delim, em, k;
  366.     int savlevel, savhp, savapts, savapts1, savfont, savfont1,
  367.         savpts, savpts1;
  368.  
  369.     base = v.st = v.sb = wid = v.ct = 0;
  370.     if((delim = getch() & CMASK) & MOT)return;
  371.     savhp = v.hp;
  372.     savlevel = level;
  373.     v.hp = level = 0;
  374.     savapts = apts;
  375.     savapts1 = apts1;
  376.     savfont = font;
  377.     savfont1 = font1;
  378.     savpts = pts;
  379.     savpts1 = pts1;
  380.     setwdf++;
  381.     while((((i = getch()) & CMASK) != delim) && !nlflg){
  382.         wid += width(i);
  383.         if(!(i & MOT)){
  384.             em = (xpts & 077)*6;
  385.         }else if(i & VMOT){
  386.             k = i & ~MOTV;
  387.             if(i & NMOT)k = -k;
  388.             base -= k;
  389.             em = 0;
  390.         }else continue;
  391.         if(base < v.sb)v.sb = base;
  392.         if((k=base + em) > v.st)v.st = k;
  393.     }
  394.     nform = 0;
  395.     setn1(wid);
  396.     v.hp = savhp;
  397.     level = savlevel;
  398.     apts = savapts;
  399.     apts1 = savapts1;
  400.     font = savfont;
  401.     font1 = savfont1;
  402.     pts = savpts;
  403.     pts1 = savpts1;
  404.     mchbits();
  405.     setwdf = 0;
  406. }
  407. vmot(){
  408.     dfact = lss;
  409.     vflag++;
  410.     return(mot());
  411. }
  412. hmot(){
  413.     dfact = 6 * (pts & 077);
  414.     return(mot());
  415. }
  416. mot(){
  417.     register i, j;
  418.  
  419.     j = HOR;
  420.     getch(); /*eat delim*/
  421.     if(i = atoi()){
  422.         if(vflag)j = VERT;
  423.         i = makem(quant(i,j));
  424.     }
  425.     getch();
  426.     vflag = 0;
  427.     dfact = 1;
  428.     return(i);
  429. }
  430. sethl(k)
  431. int k;
  432. {
  433.     register i;
  434.  
  435.     i = 3 * (pts & 077);
  436.     if(k == 'u')i = -i;
  437.     else if(k == 'r')i = -2*i;
  438.     vflag++;
  439.     i = makem(i);
  440.     vflag = 0;
  441.     return(i);
  442. }
  443. makem(i)
  444. int i;
  445. {
  446.     register j;
  447.  
  448.     if((j = i) < 0)j = -j;
  449.     j = (j & ~MOTV) | MOT;
  450.     if(i < 0)j |= NMOT;
  451.     if(vflag)j |= VMOT;
  452.     return(j);
  453. }
  454. getlg(i)
  455. int i;
  456. {
  457.     register j, k;
  458.  
  459.     switch((j = getch0()) & CMASK){
  460.         case 'f':
  461.             if(lg!=2){switch((k =getch0()) & CMASK){
  462.                     case 'i':
  463.                         j = 0214;
  464.                         break;
  465.                     case 'l':
  466.                         j = 0215;
  467.                         break;
  468.                     default:
  469.                         ch0 = k;
  470.                         j = 0213;
  471.                 }
  472.             }else j = 0213;
  473.             break;
  474.         case 'l':
  475.             j = 0212;
  476.             break;
  477.         case 'i':
  478.             j = 0211;
  479.             break;
  480.         default:
  481.             ch0 = j;
  482.             j = i;
  483.     }
  484.     return((i & ~CMASK) | j);
  485. }
  486. caselg(){
  487.  
  488.     lg = 1;
  489.     if(skip())return;
  490.     lg = atoi();
  491. }
  492. casefp(){
  493.     register i, j, k;
  494.     int x;
  495.  
  496.     skip();
  497.     if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;}
  498.     if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;}
  499.     fontfile[ffi] = j & BMASK;
  500.     fontfile[ffi+1] = j>>BYTE;
  501.     if((k = open(fontfile,0)) < 0){
  502.         prstr("Cannot open ");
  503.     c0:
  504.         prstr(fontfile);
  505.         prstr("\n");
  506.         done(-1);
  507.     }
  508.     if(lseek(k,8L * sizeof(int),0) < 0)goto c1;
  509.     if(read(k,fontab[i],256-32) != 256-32){
  510.     c1:
  511.         prstr("Cannot read ");
  512.         goto c0;
  513.     }
  514.     close(k);
  515.     if(i == (smnt-1)){smnt = 0; sbold = 0; spsz = 0;}
  516.     if((fontlab[i] = j) == 'S')smnt = i + 1;
  517.     bdtab[i] = cstab[i] = ccstab[i] = 0;
  518.     fz[i].inc = fz[i].sign = fz[i].size = 0;
  519.     if(ptid != 1){
  520.         prstr("Mount font ");
  521.         prstr(&fontfile[ffi]);
  522.         prstr(" on ");
  523.         x = PAIR((i + '1'),0);
  524.         prstr((char *)&x);
  525.         prstr("\n");
  526.     }
  527. }
  528. casecs(){
  529.     register i, j;
  530.  
  531.     noscale++;
  532.     skip();
  533.     if(!(i=getrq()) ||
  534.       ((i = find(i,fontlab)) < 0))goto rtn;
  535.     skip();
  536.     cstab[i] = atoi();
  537.     skip();
  538.     j = atoi();
  539.     if(!nonumb)ccstab[i] = findps(j);
  540. rtn:
  541.     noscale = 0;
  542. }
  543. casebd(){
  544.     register i, j, k;
  545.  
  546.     k = 0;
  547. bd0:
  548.     if(skip() || !(i = getrq()) ||
  549.       ((j = find(i,fontlab))  == -1)){
  550.         if(k)goto bd1;
  551.         else return;
  552.     }
  553.     if(j == (smnt-1)){
  554.         k = smnt;
  555.         goto bd0;
  556.     }
  557.     if(k){
  558.         sbold = j + 1;
  559.         j = k -1;
  560.     }
  561. bd1:
  562.     skip();
  563.     noscale++;
  564.     bdtab[j] = atoi();
  565.     noscale = 0;
  566. }
  567. casevs(){
  568.     register i;
  569.  
  570.     skip();
  571.     vflag++;
  572.     dfact = 6; /*default scaling is points!*/
  573.     res = VERT;
  574.     i = inumb(&lss);
  575.     if(nonumb)i = lss1;
  576.     if(i < VERT)i = VERT;
  577.     lss1 = lss;
  578.     lss = i;
  579. }
  580. casess(){
  581.     register i;
  582.  
  583.     noscale++;
  584.     skip();
  585.     if(i = atoi()){
  586.         spacesz = i& 0177;
  587.         sps = width(' ' | chbits);
  588.     }
  589.     noscale = 0;
  590. }
  591. xlss(){
  592.     register i, j;
  593.  
  594.     getch();
  595.     dfact = lss;
  596.     i = quant(atoi(),VERT);
  597.     dfact = 1;
  598.     getch();
  599.     if((j = i) < 0)j = -j;
  600.     ch0 = ((j & 03700)<<3) | HX;
  601.     if(i < 0)ch0 |= 040000;
  602.     return(((j & 077)<<9) | LX);
  603. }
  604.