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

  1. #include <stdio.h>
  2.  
  3. int    tabflg;
  4. int    labno    = 1;
  5. FILE    *curbuf;
  6. FILE    *obuf;
  7.  
  8. main(argc, argv)
  9. char **argv;
  10. {
  11. /*
  12.     A1 -> A
  13.     A2    B
  14.     A     O
  15.     B1    C
  16.     B2    D
  17.     BE    L
  18.     BF    P
  19.     C1    E
  20.     C2    F
  21.     F     G
  22.     H     H
  23.     R     I
  24.     R1    J
  25.     S     K
  26.     I     M
  27.     M     N
  28.  
  29.         *    +1
  30.         S    +2
  31.         C    +4
  32.         1    +8
  33.  
  34.     z  -> 4
  35.     c     10
  36.     a     14
  37.     e     20
  38.     n     63
  39.     *    +0100
  40. */
  41.  
  42.     int c, snlflg, nlflg, t, smode, m, ssmode, peekc;
  43.  
  44.     smode = nlflg = snlflg = ssmode = 0;
  45.     if (argc>1)
  46.         if (freopen(argv[1], "r", stdin) == NULL) {
  47.             fprintf(stderr, "%s?\n", argv[1]);
  48.             return(1);
  49.         }
  50.     if (argc>2) 
  51.         if (freopen(argv[2], "w", stdout) == NULL) {
  52.             fprintf(stderr, "%s?\n", argv[2]);
  53.             return(1);
  54.         }
  55.     if ((obuf = fopen("cvopt.tmp", "w")) == NULL) {
  56.         fprintf(stderr, "cvopt.tmp?\n");
  57.         exit(1);
  58.     }
  59.     curbuf = obuf;
  60. loop:
  61.     c = getchar();
  62.     if (c!='\n' && c!='\t')
  63.         nlflg = 0;
  64.     if (ssmode!=0 && c!='%') {
  65.         ssmode = 0;
  66.         curbuf = stdout;
  67.         fprintf(curbuf, "L%d:<", labno++);
  68.     }
  69.     switch(c) {
  70.  
  71.     case EOF:
  72.         fprintf(obuf, "0\n");
  73.         fclose(obuf);
  74.         fprintf(stdout, ".even\n");
  75.         if (freopen("cvopt.tmp", "r", stdin) == NULL) {
  76.             fprintf(stderr, "tmp?\n");
  77.             exit(1);
  78.         }
  79.         while ((c = getchar()) != EOF)
  80.             putchar(c);
  81.         unlink("cvopt.tmp");
  82.         return(0);
  83.  
  84.     case ':':
  85.         if (!smode)
  86.             fprintf(curbuf, "=.+2; 0"); else
  87.             put(':');
  88.         goto loop;
  89.  
  90.     case 'A':
  91.         if ((c=getchar())=='1' || c=='2') {
  92.             put(c+'A'-'1');
  93.             goto loop;
  94.         }
  95.         put('O');
  96.         ungetc(c, stdin);
  97.         goto loop;
  98.  
  99.     case 'B':
  100.         switch (getchar()) {
  101.  
  102.         case '1':
  103.             put('C');
  104.             goto loop;
  105.  
  106.         case '2':
  107.             put('D');
  108.             goto loop;
  109.  
  110.         case 'E':
  111.             put('L');
  112.             goto loop;
  113.  
  114.         case 'F':
  115.             put('P');
  116.             goto loop;
  117.         }
  118.         put('?');
  119.         goto loop;
  120.  
  121.     case 'C':
  122.         put(getchar()+'E'-'1');
  123.         goto loop;
  124.  
  125.     case 'F':
  126.         put('G');
  127.         goto subtre;
  128.  
  129.     case 'R':
  130.         if ((c=getchar()) == '1')
  131.         put('J'); else {
  132.             put('I');
  133.             ungetc(c, stdin);
  134.         }
  135.         goto loop;
  136.  
  137.     case 'H':
  138.         put('H');
  139.         goto subtre;
  140.  
  141.     case 'I':
  142.         put('M');
  143.         goto loop;
  144.  
  145.     case 'S':
  146.         put('K');
  147. subtre:
  148.         snlflg = 1;
  149.         t = 'A';
  150. l1:
  151.         switch (c=getchar()) {
  152.  
  153.         case '*':
  154.             t++;
  155.             goto l1;
  156.  
  157.         case 'S':
  158.             t =+ 2;
  159.             goto l1;
  160.  
  161.         case 'C':
  162.             t =+ 4;
  163.             goto l1;
  164.  
  165.         case '1':
  166.             t =+ 8;
  167.             goto l1;
  168.  
  169.         case '2':
  170.             t =+ 16;
  171.             goto l1;
  172.         }
  173.         ungetc(c, stdin);
  174.         put(t);
  175.         goto loop;
  176.  
  177.     case '#':
  178.         if(getchar()=='1')
  179.             put('#'); else
  180.             put('"');
  181.         goto loop;
  182.  
  183.     case '%':
  184.         if (smode)
  185.             curbuf = obuf;
  186.         if (ssmode==0) {
  187.             if ((peekc=getchar())=='[') {
  188.                 curbuf = stdout;
  189.                 while((c=getchar())!=']')
  190.                     put(c);
  191.                 getchar();
  192.                 fprintf(curbuf, ";");
  193.                 curbuf = obuf;
  194.                 goto loop;
  195.             }
  196.             ungetc(peekc, stdin);
  197.         }
  198. loop1:
  199.         switch (c=getchar()) {
  200.  
  201.         case ' ':
  202.         case '\t':
  203.             goto loop1;
  204.         case 'a':
  205.             m = 16;
  206.             t = flag();
  207.             goto pf;
  208.  
  209.         case ',':
  210.             put(';');
  211.             goto loop1;
  212.  
  213.         case 'i':
  214.             m = 12;
  215.             t = flag();
  216.             goto pf;
  217.         case 'z':
  218.             m = 4;
  219.             t = flag();
  220.             goto pf;
  221.  
  222.         case 'r':
  223.             m = 9;
  224.             t = flag();
  225.             goto pf;
  226.  
  227.         case '1':
  228.             m = 5;
  229.             t = flag();
  230.             goto pf;
  231.  
  232.         case 'c':
  233.             t = 0;
  234.             m = 8;
  235.             goto pf;
  236.  
  237.         case 'e':
  238.             t = flag();
  239.             m = 20;
  240.             goto pf;
  241.  
  242.         case 'n':
  243.             t = flag();
  244.             m = 63;
  245. pf:
  246.             if ((c=getchar())=='*')
  247.                 m =+ 0100; else
  248.                 ungetc(c, stdin);
  249.             fprintf(curbuf, ".byte %o,%o", m, t);
  250.             goto loop1;
  251.         case '[':
  252.             fprintf(curbuf, "L%d=", labno++);
  253.             while ((c=getchar())!=']')
  254.                 put(c);
  255.             ssmode = 0;
  256.             smode = 0;
  257.             goto loop;
  258.  
  259.         case '\n':
  260.             fprintf(curbuf, "\nL%d\n", labno);
  261.             ssmode = 1;
  262.             nlflg = 1;
  263.             smode = 1;
  264.             goto loop;
  265.         }
  266.         put(c);
  267.         goto loop1;
  268.  
  269.     case '\t':
  270.         if (nlflg) {
  271.             nlflg = 0;
  272.             goto loop;
  273.         }
  274.         if (smode) {
  275.             tabflg++;
  276.             goto loop;
  277.         }
  278.         put('\t');
  279.         goto loop;
  280.  
  281.     case '\n':
  282.         if (!smode)  {
  283.             put('\n');
  284.             goto loop;
  285.         }
  286.         if (nlflg) {
  287.             nlflg = 0;
  288.             fprintf(curbuf, "\\0>\n");
  289.             curbuf = obuf;
  290.             smode = 0;
  291.             goto loop;
  292.         }
  293.         if (!snlflg)
  294.             fprintf(curbuf, "\\n");
  295.         snlflg = 0;
  296.         fprintf(curbuf, ">\n<");
  297.         nlflg = 1;
  298.         goto loop;
  299.  
  300.     case 'X':
  301.     case 'Y':
  302.     case 'T':
  303.         snlflg++;
  304.     }
  305.     put(c);
  306.     goto loop;
  307. }
  308.  
  309. flag() {
  310.     register c, f;
  311.  
  312.     f = 0;
  313. l1:
  314.     switch(c=getchar()) {
  315.  
  316.     case 'w':
  317.         f = 1;
  318.         goto l1;
  319.  
  320.     case 'i':
  321.         f = 2;
  322.         goto l1;
  323.  
  324.     case 'b':
  325.         f = 3;
  326.         goto l1;
  327.  
  328.     case 'f':
  329.         f = 4;
  330.         goto l1;
  331.  
  332.     case 'd':
  333.         f = 5;
  334.         goto l1;
  335.  
  336.     case 'u':
  337.         f = 9;
  338.         goto l1;
  339.  
  340.     case 's':
  341.         f = 6;
  342.         goto l1;
  343.  
  344.     case 'l':
  345.         f = 8;
  346.         goto l1;
  347.  
  348.     case 'p':
  349.         f =+ 16;
  350.         goto l1;
  351.     }
  352.     ungetc(c, stdin);
  353.     return(f);
  354. }
  355.  
  356. put(c)
  357. {
  358.     if (tabflg) {
  359.         tabflg = 0;
  360.         fprintf(curbuf, ">;.byte %o;<", c+0200);
  361.     } else
  362.         putc(c, curbuf);
  363. }
  364.