home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / pi0 / send.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  4KB  |  296 lines

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #include "0.h"
  3. #include "tree.h"
  4. /*
  5.  * pi - Pascal interpreter code translator
  6.  * Bill Joy UCB
  7.  * February 5, 1978
  8.  */
  9.  
  10. int    pipbuf[259];
  11. int    pv[2], pv2[2];
  12. int    pid -1;
  13.  
  14. char    *PI1        "/usr/lib/pi1";
  15.  
  16. #define    ETXTBSY    26
  17.  
  18. char    printed, hadsome;
  19. #ifdef PC0
  20. char    fileout;
  21. #endif
  22.  
  23. send(i, a1, a2, a3, a4)
  24.     register int i;
  25. {
  26.     register int *ap;
  27.     register char *cp;
  28.     int x;
  29.     extern errno;
  30.     extern char *lastname, *obj;
  31.  
  32.     switch (i) {
  33.  
  34.     case RINIT:
  35. #ifdef PC0
  36.         if (opt('f')) {
  37.             fileout++;
  38.             if (fcreat(pipbuf, "tree") < 0) {
  39.                 perror( "tree");
  40.                 pexit(NOSTART);
  41.             }
  42.         } else {
  43. #endif
  44.             if (pipe(pv) || pipe(pv2)) {
  45.                 perror( "pipe");
  46.                 pexit(NOSTART);
  47.             }
  48.             pid = fork();
  49.             if (pid == -1) {
  50.                 perror(0);
  51.                 pexit(NOSTART);
  52.             }
  53.             if (pid == 0) {
  54.                 close(0);
  55.                 dup(pv[0]);
  56.                 close(pv[0]);
  57.                 close(pv[1]);
  58.                 close(pv2[0]);
  59.                 for (;;) {
  60. #ifdef DEBUG
  61.                     execl(PI1, "pi1", hp21mx ? "" : 0, 0);
  62. #else
  63.                     execl(PI1, "pi1", 0);
  64. #endif
  65.                     if (errno != ETXTBSY)
  66.                         break;
  67.                     sleep(2);
  68.                 }
  69.                 perror(PI1);
  70.                 exit(1);
  71.             }
  72.             pipbuf[0] = pv[1];
  73.             close(pv[0]);
  74.             pv[0] = pv2[0];
  75.             close(pv2[1]);
  76. #ifdef PC0
  77.         }
  78. #endif
  79.         filename = lastname = savestr(filename);
  80.         obj = savestr(obj);
  81.         errfile = savestr(errfile);
  82.         putac(i);
  83.         putaw(soffset(lastname));
  84.         putaw(soffset(obj));
  85.         putac(pv2[1]);
  86.         for (i = 0; i < 26; i++)
  87.             putac(opts[i]);
  88.         putac(efil);
  89.         putaw(soffset(errfile));
  90.         putac(ofil);
  91.         break;
  92.  
  93.     case RENQ:
  94. ackit:
  95.         if (opt('l'))
  96.             yyoutline();
  97.         putac(RENQ);
  98.         ack();
  99.         break;
  100.  
  101.     case RTREE:
  102.         ap = a1;
  103.         putac(i);
  104.         i = *ap++;
  105.         if (i < 0 || i > T_LAST)
  106.             panic("send RTREE");
  107.         putac(i);
  108.         cp = trdesc[i];
  109.         while (*cp) switch (*cp++) {
  110.  
  111.         case 's':
  112.             cp = ap;
  113.             while (*cp)
  114.                 putac(*cp++);
  115.             putac(0);
  116.             ap = (((unsigned) cp) + 2) &~ 1;
  117.             return (ap);
  118.  
  119.         case 'd':
  120.             putac(*ap++);
  121.             continue;
  122.  
  123.         case 'n':
  124.             putaw(*ap++);
  125.             continue;
  126.  
  127.         case '"':
  128.             putaw(soffset(*ap++));
  129.             continue;
  130.  
  131.         case 'p':
  132.             putaw(toffset(*ap++));
  133.             continue;
  134.  
  135.         default:
  136.             panic("send RTREE case");
  137.         }
  138. #ifdef DEBUG
  139.         if (*ap < 0 || *ap > T_LAST)
  140.             printf("trdesc[%d] flunks\n", i);
  141. #endif
  142.         return (ap);
  143.  
  144. #ifdef DEBUG
  145.     case RTRCHK:
  146.         putac(i);
  147.         putaw(a1);
  148.         break;
  149. #endif
  150.  
  151.     case RTRFREE:
  152.         tsend();
  153.     case REVTBEG:
  154.     case REVVBEG:
  155.     case REVTEND:
  156.     case REVVEND:
  157.     case REVENIT:
  158.         putac(i);
  159.         break;
  160.  
  161.     case RSTRING:
  162.         putac(RSTRING);
  163.         for (cp = a1; *cp; cp)
  164.             putac(*cp++);
  165.         putac(0);
  166.         break;
  167.  
  168.     case REVLAB:
  169.         tsend();
  170.         putac(i);
  171.         putaw(toffset(a1));
  172.         break;
  173.  
  174.     case REVCNST:
  175.         tsend();
  176.         putac(i);
  177.         putaw(a1);
  178.         putaw(soffset(a2));
  179.         putaw(toffset(a3));
  180.         break;
  181.  
  182.     case REVTYPE:
  183.         tsend();
  184.         putac(i);
  185.         putaw(a1);
  186.         putaw(soffset(a2));
  187.         putaw(toffset(a3));
  188.         break;
  189.  
  190.     case REVVAR:
  191.         tsend();
  192.         putac(i);
  193.         putaw(a1);
  194.         putaw(toffset(a2));
  195.         putaw(toffset(a3));
  196.         break;
  197.  
  198.     case REVFHDR:
  199.         tsend();
  200.         putac(i);
  201.         putaw(toffset(a1));
  202.         break;
  203.  
  204.     case REVFBDY:
  205.         putac(i);
  206.         break;
  207.  
  208.     case REVFEND:
  209.         tsend();
  210.         putac(i);
  211.         putaw(toffset(a1));
  212.         putaw(a2);
  213.         putaw(a3);
  214.         putaw(soffset(lastname));
  215.         putaw(soffset(filename));
  216.         putac(printed);
  217.         putac(hadsome);
  218.         goto ackit;
  219.  
  220.     case ROPUSH:
  221.     case ROPOP:
  222.         putac(i);
  223.         putac(a1);
  224.         break;
  225.  
  226.     case ROSET:
  227.         putac(i);
  228.         putac(a1);
  229.         putaw(a2);
  230.         break;
  231.  
  232.     case RKILL:
  233.         kill(pid, 1);
  234.          /* wait(&status); */
  235.         break;
  236.  
  237.     case RFINISH:
  238.         putac(i);
  239.         fflush(pipbuf);
  240. #ifdef PC0
  241.         if (!fileout) {
  242. #endif
  243.             if (read(pv[0], &x, 2) != 2)
  244.                 panic("RFINISH");
  245.             eflg =| x;
  246. #ifdef PC0
  247.         } else
  248.             pexit(NOSTART);
  249. #endif
  250.         return;
  251.  
  252.     default:
  253.         panic("send");
  254.     }
  255. }
  256.  
  257. putaw(i)
  258.     int i;
  259. {
  260.  
  261.     putw(i, pipbuf);
  262. }
  263.  
  264. putac(i)
  265.     int i;
  266. {
  267.  
  268.     putc(i, pipbuf);
  269. }
  270.  
  271. extern    struct nl *Fp;
  272.  
  273. ack()
  274. {
  275.     int i[3], j;
  276.  
  277. #ifdef PC0
  278.     if (!fileout) {
  279. #endif
  280.         fflush(pipbuf);
  281.         j = read(pv[0], &i, 6);
  282.         if (j != 6) {
  283.             error("Fatal error in pass 2");
  284.             pexit(DIED);
  285.         }
  286.         if (soffset(lastname) != i[0])
  287.             lastname = filename;
  288.         Fp = i[1];
  289.         printed = i[2] & 0377;
  290.         hadsome = (i[2] >> 8) & 0377;
  291. #ifdef PC0
  292.     } else
  293.         Fp = NIL;
  294. #endif
  295. }
  296.