home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / Applications / Early_C_Compilers / last1120c.tar.gz / last1120c.tar / last1120c / cvopt.c < prev    next >
C/C++ Source or Header  |  1972-07-09  |  4KB  |  358 lines

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