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

  1. #include "tdef.h"
  2. #include <sgtty.h>
  3. extern
  4. #include "d.h"
  5. extern
  6. #include "v.h"
  7. #include "s.h"
  8.  
  9. /*
  10. troff5.c
  11.  
  12. misc processing requests
  13. */
  14.  
  15. extern struct s *frame;
  16. extern struct s *litlev;
  17. extern filep ip;
  18. extern filep offset;
  19.  
  20. extern int ascii;
  21. extern int nonumb;
  22. extern int admod;
  23. extern int ad;
  24. extern int fi;
  25. extern int cc;
  26. extern int c2;
  27. extern int ohc;
  28. extern int tabc;
  29. extern int dotc;
  30. extern int pendnf;
  31. extern int hyf;
  32. extern int ce;
  33. extern int po;
  34. extern int po1;
  35. extern int nc;
  36. extern int in;
  37. extern int un;
  38. extern int un1;
  39. extern int in1;
  40. extern int ll;
  41. extern int ll1;
  42. extern int lt;
  43. extern int lt1;
  44. extern int nlist[NTRAP];
  45. extern int mlist[NTRAP];
  46. extern int lgf;
  47. extern int pl;
  48. extern int npn;
  49. extern int npnflg;
  50. extern int copyf;
  51. extern char nextf[];
  52. extern int trap;
  53. extern int lss;
  54. extern int em;
  55. extern int evlist[EVLSZ];
  56. extern int evi;
  57. extern int ibf;
  58. extern int ev;
  59. extern int ch;
  60. extern int nflush;
  61. extern int tty;
  62. extern struct sgttyb ttys;
  63. extern int quiet;
  64. extern int iflg;
  65. extern int eschar;
  66. extern int lit;
  67. extern int ls;
  68. extern int ls1;
  69. extern int tabtab[];
  70. extern char trtab[];
  71. extern int ul;
  72. extern int cu;
  73. extern int sfont;
  74. extern int font;
  75. extern int fontlab[];
  76. extern int it;
  77. extern int itmac;
  78. extern int noscale;
  79. extern int ic;
  80. extern int icf;
  81. extern int ics;
  82. extern int *vlist;
  83. extern int sv;
  84. extern int esc;
  85. extern int nn;
  86. extern int nms;
  87. extern int ndf;
  88. extern int lnmod;
  89. extern int ni;
  90. extern int lnsize;
  91. extern int nb;
  92. extern int nlflg;
  93. extern int apts, apts1, pts, pts1, font, font1;
  94. extern int ulfont;
  95. extern int ulbit;
  96. extern int error;
  97. extern int nmbits;
  98. extern int chbits;
  99. extern int tdelim;
  100. extern int xxx;
  101. int iflist[NIF];
  102. int ifx;
  103.  
  104. casead(){
  105.     register i;
  106.  
  107.     ad = 1;
  108.     /*leave admod alone*/
  109.     if(skip())return;
  110.     switch(i = getch() & CMASK){
  111.         case 'r':    /*right adj, left ragged*/
  112.             admod = 2;
  113.             break;
  114.         case 'l':    /*left adj, right ragged*/
  115.             admod = ad = 0;    /*same as casena*/
  116.             break;
  117.         case 'c':    /*centered adj*/
  118.             admod = 1;
  119.             break;
  120.         case 'b': case 'n':
  121.             admod = 0;
  122.             break;
  123.         case '0': case '2': case '4':
  124.             ad = 0;
  125.         case '1': case '3': case '5':
  126.             admod = (i - '0')/2;
  127.     }
  128. }
  129. casena(){
  130.     ad = 0;
  131. }
  132. casefi(){
  133.     tbreak();
  134.     fi++;
  135.     pendnf = 0;
  136.     lnsize = LNSIZE;
  137. }
  138. casenf(){
  139.     tbreak();
  140.     fi = 0;
  141. /* can't do while oline is only LNSIZE
  142.     lnsize = LNSIZE + WDSIZE;
  143. */
  144. }
  145. casers(){
  146.     dip->nls = 0;
  147. }
  148. casens(){
  149.     dip->nls++;
  150. }
  151. chget(c)
  152. int c;
  153. {
  154.     register i;
  155.  
  156.     if(skip() ||
  157.       ((i = getch()) & MOT) ||
  158.       ((i&CMASK) == ' ') ||
  159.       ((i&CMASK) == '\n')){
  160.         ch = i;
  161.         return(c);
  162.     }else return(i & BMASK);
  163. }
  164. casecc(){
  165.     cc = chget('.');
  166. }
  167. casec2(){
  168.     c2 = chget('\'');
  169. }
  170. casehc(){
  171.     ohc = chget(OHC);
  172. }
  173. casetc(){
  174.     tabc = chget(0);
  175. }
  176. caselc(){
  177.     dotc = chget(0);
  178. }
  179. casehy(){
  180.     register i;
  181.  
  182.     hyf = 1;
  183.     if(skip())return;
  184.     noscale++;
  185.     i = atoi();
  186.     noscale = 0;
  187.     if(nonumb)return;
  188.     hyf = max(i,0);
  189. }
  190. casenh(){
  191.     hyf = 0;
  192. }
  193. max(aa,bb)
  194. int aa,bb;
  195. {
  196.     if(aa>bb)return(aa);
  197.     else return(bb);
  198. }
  199. casece(){
  200.     register i;
  201.  
  202.     noscale++;
  203.     skip();
  204.     i = max(atoi(),0);
  205.     if(nonumb)i = 1;
  206.     tbreak();
  207.     ce = i;
  208.     noscale = 0;
  209. }
  210. casein(){
  211.     register i;
  212.  
  213.     if(skip())i = in1;
  214.     else i = max(hnumb(&in),0);
  215.     tbreak();
  216.     in1 = in;
  217.     in = i;
  218.     if(!nc){
  219.         un = in;
  220.         setnel();
  221.     }
  222. }
  223. casell(){
  224.     register i;
  225.  
  226.     if(skip())i = ll1;
  227.     else i = max(hnumb(&ll),INCH/10);
  228.     ll1 = ll;
  229.     ll = i;
  230.     setnel();
  231. }
  232. caselt(){
  233.     register i;
  234.  
  235.     if(skip())i = lt1;
  236.     else i = max(hnumb(<),0);
  237.     lt1 = lt;
  238.     lt = i;
  239. }
  240. caseti(){
  241.     register i;
  242.  
  243.     if(skip())return;
  244.     i = max(hnumb(&in),0);
  245.     tbreak();
  246.     un1 = i;
  247.     setnel();
  248. }
  249. casels(){
  250.     register i;
  251.  
  252.     noscale++;
  253.     if(skip())i = ls1;
  254.     else i = max(inumb(&ls),1);
  255.     ls1 = ls;
  256.     ls = i;
  257.     noscale = 0;
  258. }
  259. casepo(){
  260.     register i;
  261.  
  262.     if(skip())i = po1;
  263.     else i = max(hnumb(&po),0);
  264.     po1 = po;
  265.     po = i;
  266. #ifndef NROFF
  267.     if(!ascii)esc += po - po1;
  268. #endif
  269. }
  270. casepl(){
  271.     register i;
  272.  
  273.     skip();
  274.     if((i = vnumb(&pl)) == 0)pl = 11 * INCH; /*11in*/
  275.         else pl = i;
  276.     if(v.nl > pl)v.nl = pl;
  277. }
  278. casewh(){
  279.     register i, j, k;
  280.  
  281.     lgf++;
  282.     skip();
  283.     i = vnumb((int *)0);
  284.     if(nonumb)return;
  285.     skip();
  286.     j = getrq();
  287.     if((k=findn(i)) != NTRAP){
  288.         mlist[k] = j;
  289.         return;
  290.     }
  291.     for(k=0; k<NTRAP; k++)if(mlist[k] == 0)break;
  292.     if(k == NTRAP){
  293.         prstrfl("Cannot plant trap.\n");
  294.         return;
  295.     }
  296.     mlist[k] = j;
  297.     nlist[k] = i;
  298. }
  299. casech(){
  300.     register i, j, k;
  301.  
  302.     lgf++;
  303.     skip();
  304.     if(!(j=getrq()))return;
  305.         else for(k=0; k<NTRAP; k++)if(mlist[k] == j)break;
  306.     if(k == NTRAP)return;
  307.     skip();
  308.     i = vnumb((int *)0);
  309.     if(nonumb)mlist[k] = 0;
  310.     nlist[k] = i;
  311. }
  312. findn(i)
  313. int i;
  314. {
  315.     register k;
  316.  
  317.     for(k=0; k<NTRAP; k++)
  318.         if((nlist[k] == i) && (mlist[k] != 0))break;
  319.     return(k);
  320. }
  321. casepn(){
  322.     register i;
  323.  
  324.     skip();
  325.     noscale++;
  326.     i = max(inumb(&v.pn),0);
  327.     noscale = 0;
  328.     if(!nonumb){
  329.         npn = i;
  330.         npnflg++;
  331.     }
  332. }
  333. casebp(){
  334.     register i;
  335.     register struct s *savframe;
  336.  
  337.     if(dip != d)return;
  338.     savframe = frame;
  339.     skip();
  340.     if((i = inumb(&v.pn)) < 0)i = 0;
  341.     tbreak();
  342.     if(!nonumb){
  343.         npn = i;
  344.         npnflg++;
  345.     }else if(dip->nls)return;
  346.     eject(savframe);
  347. }
  348. casetm(x) int x;{
  349.     register i;
  350.     char tmbuf[NTM];
  351.  
  352.     lgf++;
  353.     copyf++;
  354.     if(skip() && x)prstrfl("User Abort.");
  355.     for(i=0; i<NTM-2;)if((tmbuf[i++]=getch()) == '\n')break;
  356.     if(i == NTM-2)tmbuf[i++] = '\n';
  357.     tmbuf[i] = 0;
  358.     prstrfl(tmbuf);
  359.     copyf--;
  360. }
  361. casesp(a)
  362. int a;
  363. {
  364.     register i, j, savlss;
  365.  
  366.     tbreak();
  367.     if(dip->nls || trap)return;
  368.     i = findt1();
  369.     if(!a){
  370.         skip();
  371.         j = vnumb((int *)0);
  372.         if(nonumb)j = lss;
  373.     }else j = a;
  374.     if(j == 0)return;
  375.     if(i < j)j = i;
  376.     savlss = lss;
  377.     if(dip != d)i = dip->dnl; else i = v.nl;
  378.     if((i + j) < 0)j = -i;
  379.     lss = j;
  380.     newline(0);
  381.     lss = savlss;
  382. }
  383. casert(){
  384.     register a, *p;
  385.  
  386.     skip();
  387.     if(dip != d)p = &dip->dnl; else p = &v.nl;
  388.     a = vnumb(p);
  389.     if(nonumb)a = dip->mkline;
  390.     if((a < 0) || (a >= *p))return;
  391.     nb++;
  392.     casesp(a - *p);
  393. }
  394. caseem(){
  395.     lgf++;
  396.     skip();
  397.     em = getrq();
  398. }
  399. casefl(){
  400.     tbreak();
  401.     flusho();
  402. }
  403. caseev(){
  404.     register nxev;
  405.     extern int block;
  406.  
  407.     if(skip()){
  408. e0:
  409.         if(evi == 0)return;
  410.         nxev =  evlist[--evi];
  411.         goto e1;
  412.     }
  413.     noscale++;
  414.     nxev = atoi();
  415.     noscale = 0;
  416.     if(nonumb)goto e0;
  417.     flushi();
  418.     if((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)){
  419.         prstrfl("Cannot do ev.\n");
  420.         if(error)done2(040);else edone(040);
  421.         return;
  422.     }
  423.     evlist[evi++] = ev;
  424. e1:
  425.     if(ev == nxev)return;
  426.     lseek(ibf, (long)(ev*EVS*sizeof(int)), 0);
  427.     write(ibf,(char *)&block, EVS*sizeof(int));
  428.     lseek(ibf, (long)(nxev*EVS*sizeof(int)), 0);
  429.     read(ibf,(char *)&block, EVS*sizeof(int));
  430.     ev = nxev;
  431. }
  432. caseel(){
  433.     if(--ifx < 0){
  434.         ifx = 0;
  435.         iflist[0] = 0;
  436.     }
  437.     caseif(2);
  438. }
  439. caseie(){
  440.     if(ifx >= NIF){
  441.         prstr("if-else overflow.\n");
  442.         ifx = 0;
  443.         edone(040);
  444.     }
  445.     caseif(1);
  446.     ifx++;
  447. }
  448. caseif(x)
  449. int x;
  450. {
  451.     register i, notflag, true;
  452.  
  453.     if(x == 2){
  454.         notflag = 0;
  455.         true = iflist[ifx];
  456.         goto i1;
  457.     }
  458.     true = 0;
  459.     skip();
  460.     if(((i = getch()) & CMASK) == '!'){
  461.         notflag = 1;
  462.     }else{
  463.         notflag = 0;
  464.         ch = i;
  465.     }
  466.     i = atoi();
  467.     if(!nonumb){
  468.         if(i > 0)true++;
  469.         goto i1;
  470.     }
  471.     switch((i = getch()) & CMASK){
  472.         case 'e':
  473.             if(!(v.pn & 01))true++;
  474.             break;
  475.         case 'o':
  476.             if(v.pn & 01)true++;
  477.             break;
  478. #ifdef NROFF
  479.         case 'n':
  480.             true++;
  481.         case 't':
  482. #endif
  483. #ifndef NROFF
  484.         case 't':
  485.             true++;
  486.         case 'n':
  487. #endif
  488.         case ' ':
  489.             break;
  490.         default:
  491.             true = cmpstr(i);
  492.     }
  493. i1:
  494.     true ^= notflag;
  495.     if(x == 1)iflist[ifx] = !true;
  496.     if(true){
  497.     i2:
  498.         do{
  499.         v.hp = 0;
  500.         }
  501.         while(((i = getch()) & CMASK) == ' ');
  502.         if((i & CMASK) == LEFT)goto i2;
  503.         ch = i;
  504.         nflush++;
  505.     }else{
  506.         copyf++;
  507.         if(eat(LEFT) == LEFT){
  508.             while(eatblk(RIGHT,LEFT) != RIGHT)nlflg = 0;
  509.         }
  510.         copyf--;
  511.     }
  512. }
  513. eatblk(right,left)
  514. int right,left;
  515. {
  516.     register i;
  517.  
  518. e0:
  519.     while(((i = getch() & CMASK) != right) &&
  520.         (i != left) &&
  521.         (i != '\n'));
  522.     if(i == left){
  523.         while((i=eatblk(right,left)) != right)nlflg = 0;
  524.         goto e0;
  525.     }
  526.     return(i);
  527. }
  528. cmpstr(delim)
  529. int delim;
  530. {
  531.     register i, j;
  532.     register filep p;
  533.     extern filep alloc();
  534.     extern filep incoff();
  535.     filep begin;
  536.     int cnt, k;
  537.     int savapts, savapts1, savfont, savfont1,
  538.         savpts, savpts1;
  539.  
  540.     if(delim & MOT)return(0);
  541.     delim &= CMASK;
  542.     if(dip != d)wbfl();
  543.     if((offset = begin = alloc()) == (filep)0)return(0);
  544.     cnt = 0;
  545.     v.hp = 0;
  546.     savapts = apts;
  547.     savapts1 = apts1;
  548.     savfont = font;
  549.     savfont1 = font1;
  550.     savpts = pts;
  551.     savpts1 = pts1;
  552.     while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
  553.         wbf(i);
  554.         cnt++;
  555.     }
  556.     wbt(0);
  557.     k = !cnt;
  558.     if(nlflg)goto rtn;
  559.     p = begin;
  560.     apts = savapts;
  561.     apts1 = savapts1;
  562.     font = savfont;
  563.     font1 = savfont1;
  564.     pts = savpts;
  565.     pts1 = savpts1;
  566.     mchbits();
  567.     v.hp = 0;
  568.     while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
  569.         if(rbf0(p) != i){
  570.             eat(delim);
  571.             k = 0;
  572.             break;
  573.         }
  574.         p = incoff(p);
  575.         k = !(--cnt);
  576.     }
  577. rtn:
  578.     apts = savapts;
  579.     apts1 = savapts1;
  580.     font = savfont;
  581.     font1 = savfont1;
  582.     pts = savpts;
  583.     pts1 = savpts1;
  584.     mchbits();
  585.     offset = dip->op;
  586.     ffree(begin);
  587.     return(k);
  588. }
  589. caserd(){
  590.  
  591.     lgf++;
  592.     skip();
  593.     getname();
  594.     if(!iflg){
  595.         if(quiet){
  596.             ttys.sg_flags &= ~ECHO;
  597.             stty(0, &ttys);
  598.             prstrfl(""); /*bell*/
  599.         }else{
  600.             if(nextf[0]){
  601.                 prstr(nextf);
  602.                 prstr(":");
  603.             }else{
  604.                 prstr(""); /*bell*/
  605.             }
  606.         }
  607.     }
  608.     collect();
  609.     tty++;
  610.     pushi((filep)-1);
  611. }
  612. rdtty(){
  613.     char onechar;
  614.  
  615.     onechar = 0;
  616.     if(read(0, &onechar, 1) == 1){
  617.         if(onechar == '\n')tty++;
  618.             else tty = 1;
  619.         if(tty != 3)return(onechar);
  620.     }
  621.     popi();
  622.     tty = 0;
  623.     if(quiet){
  624.         ttys.sg_flags |= ECHO;
  625.         stty(0, &ttys);
  626.     }
  627.     return(0);
  628. }
  629. caseec(){
  630.     eschar = chget('\\');
  631. }
  632. caseeo(){
  633.     eschar = 0;
  634. }
  635. caseli(){
  636.  
  637.     skip();
  638.     lit = max(inumb((int *)0),1);
  639.     litlev = frame;
  640.     if((dip == d) && (v.nl == -1))newline(1);
  641. }
  642. caseta(){
  643.     register i;
  644.  
  645.     tabtab[0] = nonumb = 0;
  646.     for(i=0; ((i < (NTAB-1)) && !nonumb); i++){
  647.         if(skip())break;
  648.         tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]),0) & TMASK;
  649.         if(!nonumb) switch(ch & CMASK){
  650.             case 'C':
  651.                 tabtab[i] |= CTAB;
  652.                 break;
  653.             case 'R':
  654.                 tabtab[i] |= RTAB;
  655.                 break;
  656.             default: /*includes L*/
  657.                 break;
  658.             }
  659.         nonumb = ch = 0;
  660.     }
  661.     tabtab[i] = 0;
  662. }
  663. casene(){
  664.     register i, j;
  665.  
  666.     skip();
  667.     i = vnumb((int *)0);
  668.     if(nonumb)i = lss;
  669.     if(i > (j = findt1())){
  670.         i = lss;
  671.         lss = j;
  672.         dip->nls = 0;
  673.         newline(0);
  674.         lss = i;
  675.     }
  676. }
  677. casetr(){
  678.     register i, j;
  679.  
  680.     lgf++;
  681.     skip();
  682.     while((i = getch() & CMASK) != '\n'){
  683.         if((i & MOT) || ((j = getch()) & MOT))return;
  684.         if((j &= CMASK) == '\n')j = ' ';
  685.         trtab[i] = j;
  686.     }
  687. }
  688. casecu(){
  689.     cu++;
  690.     caseul();
  691. }
  692. caseul(){
  693.     register i;
  694.  
  695.     noscale++;
  696.     if(skip())i = 1;
  697.     else i = atoi();
  698.     if(ul && (i == 0)){
  699.         font = sfont;
  700.         ul = cu = 0;
  701.     }
  702.     if(i){
  703.         if(!ul){
  704.             sfont = font;
  705.             font = ulfont;
  706.         }
  707.         ul = i;
  708.     }
  709.     noscale = 0;
  710.     mchbits();
  711. }
  712. caseuf(){
  713.     register i, j;
  714.  
  715.     if(skip() || !(i = getrq()) || (i == 'S') ||
  716.         ((j = find(i,fontlab))  == -1))
  717.             ulfont = 1; /*default position 2*/
  718.     else ulfont = j;
  719. #ifdef NROFF
  720.     if(ulfont == 0)ulfont = 1;
  721. #endif
  722.     ulbit = ulfont<<9;
  723. }
  724. caseit(){
  725.     register i;
  726.  
  727.     lgf++;
  728.     it = itmac = 0;
  729.     noscale++;
  730.     skip();
  731.     i = atoi();
  732.     skip();
  733.     if(!nonumb && (itmac = getrq()))it = i;
  734.     noscale = 0;
  735. }
  736. casemc(){
  737.     register i;
  738.  
  739.     if(icf > 1)ic = 0;
  740.     icf = 0;
  741.     if(skip())return;
  742.     ic = getch();
  743.     icf = 1;
  744.     skip();
  745.     i = max(hnumb((int *)0),0);
  746.     if(!nonumb)ics = i;
  747. }
  748. casemk(){
  749.     register i, j;
  750.  
  751.     if(dip != d)j = dip->dnl; else j = v.nl;
  752.     if(skip()){
  753.         dip->mkline = j;
  754.         return;
  755.     }
  756.     if((i = getrq()) == 0)return;
  757.     vlist[findr(i)] = j;
  758. }
  759. casesv(){
  760.     register i;
  761.  
  762.     skip();
  763.     if((i = vnumb((int *)0)) < 0)return;
  764.     if(nonumb)i = 1;
  765.     sv += i;
  766.     caseos();
  767. }
  768. caseos(){
  769.     register savlss;
  770.  
  771.     if(sv <= findt1()){
  772.         savlss = lss;
  773.         lss = sv;
  774.         newline(0);
  775.         lss = savlss;
  776.         sv = 0;
  777.     }
  778. }
  779. casenm(){
  780.     register i;
  781.  
  782.     lnmod = nn = 0;
  783.     if(skip())return;
  784.     lnmod++;
  785.     noscale++;
  786.     i = inumb(&v.ln);
  787.     if(!nonumb)v.ln = max(i,0);
  788.     getnm(&ndf,1);
  789.     getnm(&nms,0);
  790.     getnm(&ni,0);
  791.     noscale = 0;
  792.     nmbits = chbits;
  793. }
  794. getnm(p,min)
  795. int *p, min;
  796. {
  797.     register i;
  798.  
  799.     eat(' ');
  800.     if(skip())return;
  801.     i = atoi();
  802.     if(nonumb)return;
  803.     *p = max(i,min);
  804. }
  805. casenn(){
  806.     noscale++;
  807.     skip();
  808.     nn = max(atoi(),1);
  809.     noscale = 0;
  810. }
  811. caseab(){
  812.     dummy();
  813.     casetm(1);
  814.     done2(0);
  815. }
  816.