home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / c / cvopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-07-18  |  4.2 KB  |  371 lines

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