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

  1. #include "tdef.h"
  2. #include <sgtty.h>
  3. extern
  4. #include "d.h"
  5. extern
  6. #include "v.h"
  7. #ifdef NROFF
  8. extern
  9. #include "tw.h"
  10. #endif
  11. #include "s.h"
  12. #include <setjmp.h>
  13. jmp_buf sjbuf;
  14.  
  15. /*
  16. troff2.c
  17.  
  18. output, cleanup
  19. */
  20.  
  21. extern struct s *frame, *stk, *nxf;
  22. extern filep ip;
  23. extern filep offset;
  24. extern char *enda;
  25.  
  26.  
  27. extern char obuf[OBUFSZ];
  28. extern char *obufp;
  29. extern int dilev;
  30. extern int eschar;
  31. extern int tlss;
  32. extern int tflg;
  33. extern int ascii;
  34. extern int print;
  35. extern char trtab[];
  36. extern int waitf;
  37. extern char ptname[];
  38. extern int ptid;
  39. extern int em;
  40. extern int ds;
  41. extern int mflg;
  42. extern filep woff;
  43. extern int nflush;
  44. extern int lgf;
  45. extern int app;
  46. extern int nfo;
  47. extern int donef;
  48. extern int *pendw;
  49. extern int nofeed;
  50. extern int trap;
  51. extern struct sgttyb ttys;
  52. extern int ttysave;
  53. extern int quiet;
  54. extern int pendnf;
  55. extern int ndone;
  56. extern int lead;
  57. extern int ralss;
  58. extern int paper;
  59. extern int gflag;
  60. extern char *unlkp;
  61. extern char nextf[];
  62. extern int pipeflg;
  63. extern int ejf;
  64. extern int no_out;
  65. extern int level;
  66. extern int stopmesg;
  67. extern int xxx;
  68. int toolate;
  69. int error;
  70. #ifndef NROFF
  71. extern int acctf;
  72. #endif
  73.  
  74. pchar(c)
  75. int c;
  76. {
  77.     register i, j;
  78.  
  79.     if((i=c) & MOT){pchar1(i); return;}
  80.     switch(j = i & CMASK){
  81.         case 0:
  82.         case IMP:
  83.         case RIGHT:
  84.         case LEFT:
  85.             return;
  86.         case HX:
  87.             j = (tlss>>9) | ((i&~0777)>>3);
  88.             if(i & 040000){
  89.                 j &= ~(040000>>3);
  90.                 if(j > dip->blss)dip->blss = j;
  91.             }else{
  92.                 if(j > dip->alss)dip->alss = j;
  93.                 ralss = dip->alss;
  94.             }
  95.             tlss = 0;
  96.             return;
  97.         case LX:
  98.             tlss = i;
  99.             return;
  100.         case PRESC:
  101.             if(dip == &d[0])j = eschar;
  102.         default:
  103.             i = (trtab[j] & BMASK) | (i & ~CMASK);
  104.     }
  105.     pchar1(i);
  106. }
  107. pchar1(c)
  108. int c;
  109. {
  110.     register i, j, *k;
  111.     extern int chtab[];
  112.  
  113.     j = (i = c) & CMASK;
  114.     if(dip != &d[0]){
  115.         wbf(i);
  116.         dip->op = offset;
  117.         return;
  118.     }
  119.     if(!tflg && !print){
  120.         if(j == '\n')dip->alss = dip->blss = 0;
  121.         return;
  122.     }
  123.     if(no_out || (j == FILLER))return;
  124. #ifndef NROFF
  125.     if(ascii){
  126.         if(i & MOT){
  127.             oput(' ');
  128.             return;
  129.         }
  130.         if(j < 0177){
  131.             oput(i);
  132.             return;
  133.         }
  134.         switch(j){
  135.             case 0200:
  136.             case 0210:
  137.                 oput('-');
  138.                 break;
  139.             case 0211:
  140.                 oputs("fi");
  141.                 break;
  142.             case 0212:
  143.                 oputs("fl");
  144.                 break;
  145.             case 0213:
  146.                 oputs("ff");
  147.                 break;
  148.             case 0214:
  149.                 oputs("ffi");
  150.                 break;
  151.             case 0215:
  152.                 oputs("ffl");
  153.                 break;
  154.             default:
  155.                 for(k=chtab; *++k != j; k++)
  156.                     if(*k == 0)return;
  157.                 oput('\\');
  158.                 oput('(');
  159.                 oput(*--k & BMASK);
  160.                 oput(*k >> BYTE);
  161.         }
  162.     }else
  163. #endif
  164.     ptout(i);
  165. }
  166. oput(i)
  167. char i;
  168. {
  169.     *obufp++ = i;
  170.     if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
  171. }
  172. oputs(i)
  173. char *i;
  174. {
  175.     while(*i != 0)oput(*i++);
  176. }
  177. flusho(){
  178.     if(!ascii)*obufp++ = 0;
  179.     if(!ptid){
  180.         while((ptid=open(ptname,1)) < 0){
  181.             if(++waitf <=2)prstr("Waiting for Typesetter.\n");
  182.             sleep(15);
  183.         }
  184.     }
  185.     if(no_out == 0){
  186.         if (!toolate) {
  187.             toolate++;
  188. #ifdef NROFF
  189.             if(t.bset || t.breset){
  190.                 if(ttysave == -1) {
  191.                     gtty(1, &ttys);
  192.                     ttysave = ttys.sg_flags;
  193.                 }
  194.                 ttys.sg_flags &= ~t.breset;
  195.                 ttys.sg_flags |= t.bset;
  196.                 stty(1, &ttys);
  197.             }
  198.             {
  199.             char *p = t.twinit;
  200.             while (*p++)
  201.                 ;
  202.             write(ptid, t.twinit, p-t.twinit-1);
  203.             }
  204. #endif
  205.         }
  206.         toolate += write(ptid, obuf, obufp-obuf);
  207.     }
  208.     obufp = obuf;
  209. }
  210. done(x) int x;{
  211.     register i;
  212.  
  213.     error |= x;
  214.     level = 0;
  215.     app = ds = lgf = 0;
  216.     if(i=em){
  217.         donef = -1;
  218.         em = 0;
  219.         if(control(i,0))longjmp(sjbuf,1);
  220.     }
  221.     if(!nfo)done3(0);
  222.     mflg = 0;
  223.     dip = &d[0];
  224.     if(woff)wbt(0);
  225.     if(pendw)getword(1);
  226.     pendnf = 0;
  227.     if(donef == 1)done1(0);
  228.     donef = 1;
  229.     ip = 0;
  230.     frame = stk;
  231.     nxf = frame + 1;
  232.     if(!ejf)tbreak();
  233.     nflush++;
  234.     eject((struct s *)0);
  235.     longjmp(sjbuf,1);
  236. }
  237. done1(x) int x; {
  238.     error |= x;
  239.     if(v.nl){
  240.         trap = 0;
  241.         eject((struct s *)0);
  242.         longjmp(sjbuf,1);
  243.     }
  244.     if(nofeed){
  245.         ptlead();
  246.         flusho();
  247.         done3(0);
  248.     }else{
  249.         if(!gflag)lead += TRAILER;
  250.         done2(0);
  251.     }
  252. }
  253. done2(x) int x; {
  254.     register i;
  255.  
  256.     ptlead();
  257. #ifndef NROFF
  258.     if(!ascii){
  259.         oput(T_INIT);
  260.         oput(T_STOP);
  261.         if(!gflag)for(i=8; i>0; i--)oput(T_PAD);
  262.         if(stopmesg)prstr("Troff finished.\n");
  263.     }
  264. #endif
  265.     flusho();
  266.     done3(x);
  267. }
  268. done3(x) int x;{
  269.     error |= x;
  270.     signal(SIGINT, SIG_IGN);
  271.     signal(SIGTERM, SIG_IGN);
  272.     unlink(unlkp);
  273. #ifdef NROFF
  274.     twdone();
  275. #endif
  276.     if(quiet){
  277.         ttys.sg_flags |= ECHO;
  278.         stty(0, &ttys);
  279.     }
  280.     if(ascii)mesg(1);
  281. #ifndef NROFF
  282.     report();
  283. #endif
  284.     exit(error);
  285. }
  286. edone(x) int x;{
  287.     frame = stk;
  288.     nxf = frame + 1;
  289.     ip = 0;
  290.     done(x);
  291. }
  292. #ifndef NROFF
  293. report(){
  294.     struct {int use; int uid;} a;
  295.  
  296.     if((ptid != 1) && paper ){
  297.         lseek(acctf,0L,2);
  298.         a.use = paper;
  299.         a.uid = getuid();
  300.         write(acctf,(char *)&a,sizeof(a));
  301.     }
  302. }
  303. #endif
  304. #ifdef NROFF
  305. casepi(){
  306.     register i;
  307.     int id[2];
  308.  
  309.     if(toolate || skip() || !getname() || (pipe(id) == -1) ||
  310.        ((i=fork()) == -1)){
  311.         prstr("Pipe not created.\n");
  312.         return;
  313.     }
  314.     ptid = id[1];
  315.     if(i>0){
  316.         close(id[0]);
  317.         toolate++;
  318.         pipeflg++;
  319.         return;
  320.     }
  321.     close(0);
  322.     dup(id[0]);
  323.     close(id[1]);
  324.     execl(nextf,nextf,0);
  325.     prstr("Cannot exec: ");
  326.     prstr(nextf);
  327.     prstr("\n");
  328.     exit(-4);
  329. }
  330. #endif
  331.