int peekc; int obuf[259]; int sbuf[259]; int *curbuf {&obuf[0]}; int tabflg; int labno 1; main(argc, argv) char **argv; { /* A1 -> A A2 B A O B1 C B2 D BE L BF P C1 E C2 F F G H H R I R1 J S K I M M N * +1 S +2 C +4 1 +8 z -> 4 c 10 a 14 e 20 n 63 * +0100 */ auto c,snlflg,nlflg,t,smode,m,ssmode; extern fin; smode = nlflg = snlflg = ssmode = 0; if (argc>1) if ((fin = open(argv[1], 0)) < 0) { putchar('?\n'); return; } sbuf[0] = 1; if (argc>2) if ((sbuf[0] = creat(argv[2], 0666)) < 0) { putchar('?\n'); return; } fcreat("cvopt.tmp", obuf); loop: c = getc(); if (c!='\n' && c!='\t') nlflg = 0; if (ssmode!=0 && c!='%') { ssmode = 0; curbuf = sbuf; printf("L%d:<", labno++); } switch(c) { case '\0': curbuf = obuf; printf("0\n"); fflush(obuf); curbuf = sbuf; printf(".even\n"); fin = open("cvopt.tmp", 0); while ((c = getchar()) > 0) putc(c, sbuf); fflush(sbuf); unlink("cvopt.tmp"); return; case ':': if (!smode) printf("=.+2; 0"); else putchar(':'); goto loop; case 'A': if ((c=getc())=='1' || c=='2') { putchar(c+'A'-'1'); goto loop; } putchar('O'); peekc = c; goto loop; case 'B': switch (getc()) { case '1': putchar('C'); goto loop; case '2': putchar('D'); goto loop; case 'E': putchar('L'); goto loop; case 'F': putchar('P'); goto loop; } putchar('?'); goto loop; case 'C': putchar(getc()+'E'-'1'); goto loop; case 'F': putchar('G'); goto subtre; case 'R': if ((c=getc()) == '1') putchar('J'); else { putchar('I'); peekc = c; } goto loop; case 'H': putchar('H'); goto subtre; case 'I': putchar('M'); goto loop; case 'S': putchar('K'); subtre: snlflg = 1; t = 'A'; l1: switch (c=getc()) { case '*': t++; goto l1; case 'S': t =+ 2; goto l1; case 'C': t =+ 4; goto l1; case '1': t =+ 8; goto l1; case '2': t =+ 16; goto l1; } peekc = c; putchar(t); goto loop; case '#': if(getc()=='1') putchar('#'); else putchar('"'); goto loop; case '%': if (smode) curbuf = obuf; if (ssmode==0) { if ((peekc=getc())=='[') { peekc = 0; curbuf = sbuf; while((c=getc())!=']') putchar(c); getc(); printf(";"); curbuf = obuf; goto loop; } } loop1: switch (c=getc()) { case ' ': case '\t': goto loop1; case 'a': m = 16; t = flag(); goto pf; case ',': putchar(';'); goto loop1; case 'i': m = 12; t = flag(); goto pf; case 'z': m = 4; t = flag(); goto pf; case 'r': m = 9; t = flag(); goto pf; case '1': m = 5; t = flag(); goto pf; case 'c': t = 0; m = 8; goto pf; case 'e': t = flag(); m = 20; goto pf; case 'n': t = flag(); m = 63; pf: if ((c=getc())=='*') m =+ 0100; else peekc = c; printf(".byte %o,%o", m, t); goto loop1; case '[': printf("L%d=", labno++); while ((c=getc())!=']') putchar(c); ssmode = 0; smode = 0; goto loop; case '\n': printf("\nL%d\n", labno); ssmode = 1; nlflg = 1; smode = 1; goto loop; } putchar(c); goto loop1; case '\t': if (nlflg) { nlflg = 0; goto loop; } if (smode) { tabflg++; goto loop; } putchar('\t'); goto loop; case '\n': if (!smode) { putchar('\n'); goto loop; } if (nlflg) { nlflg = 0; printf("\\0>\n"); curbuf = obuf; smode = 0; goto loop; } if (!snlflg) printf("\\n"); snlflg = 0; printf(">\n<"); nlflg = 1; goto loop; case 'X': case 'Y': case 'T': snlflg++; } putchar(c); goto loop; } getc() { register t; if (peekc) { t = peekc; peekc = 0; return(t); } return(getchar()); } flag() { register c, f; f = 0; l1: switch(c=getc()) { case 'w': f = 1; goto l1; case 'i': f = 2; goto l1; case 'b': f = 3; goto l1; case 'f': f = 4; goto l1; case 'd': f = 5; goto l1; case 'u': f = 9; goto l1; case 's': f = 6; goto l1; case 'l': f = 8; goto l1; case 'p': f =+ 16; goto l1; } peekc = c; return(f); } putchar(c) { if (tabflg) { tabflg = 0; printf(">;.byte %o;<", c+0200); } else putc(c, curbuf); }