home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- int tabflg;
- int labno = 1;
- FILE *curbuf;
- FILE *obuf;
-
- 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
- */
-
- int c, snlflg, nlflg, t, smode, m, ssmode, peekc;
-
- smode = nlflg = snlflg = ssmode = 0;
- if (argc>1)
- if (freopen(argv[1], "r", stdin) == NULL) {
- fprintf(stderr, "%s?\n", argv[1]);
- return(1);
- }
- if (argc>2)
- if (freopen(argv[2], "w", stdout) == NULL) {
- fprintf(stderr, "%s?\n", argv[2]);
- return(1);
- }
- if ((obuf = fopen("cvopt.tmp", "w")) == NULL) {
- fprintf(stderr, "cvopt.tmp?\n");
- exit(1);
- }
- curbuf = obuf;
- loop:
- c = getchar();
- if (c!='\n' && c!='\t')
- nlflg = 0;
- if (ssmode!=0 && c!='%') {
- ssmode = 0;
- curbuf = stdout;
- fprintf(curbuf, "L%d:<", labno++);
- }
- switch(c) {
-
- case EOF:
- fprintf(obuf, "0\n");
- fclose(obuf);
- fprintf(stdout, ".even\n");
- if (freopen("cvopt.tmp", "r", stdin) == NULL) {
- fprintf(stderr, "tmp?\n");
- exit(1);
- }
- while ((c = getchar()) != EOF)
- putchar(c);
- unlink("cvopt.tmp");
- return(0);
-
- case ':':
- if (!smode)
- fprintf(curbuf, "=.+2; 0"); else
- put(':');
- goto loop;
-
- case 'A':
- if ((c=getchar())=='1' || c=='2') {
- put(c+'A'-'1');
- goto loop;
- }
- put('O');
- ungetc(c, stdin);
- goto loop;
-
- case 'B':
- switch (getchar()) {
-
- case '1':
- put('C');
- goto loop;
-
- case '2':
- put('D');
- goto loop;
-
- case 'E':
- put('L');
- goto loop;
-
- case 'F':
- put('P');
- goto loop;
- }
- put('?');
- goto loop;
-
- case 'C':
- put(getchar()+'E'-'1');
- goto loop;
-
- case 'F':
- put('G');
- goto subtre;
-
- case 'R':
- if ((c=getchar()) == '1')
- put('J'); else {
- put('I');
- ungetc(c, stdin);
- }
- goto loop;
-
- case 'H':
- put('H');
- goto subtre;
-
- case 'I':
- put('M');
- goto loop;
-
- case 'S':
- put('K');
- subtre:
- snlflg = 1;
- t = 'A';
- l1:
- switch (c=getchar()) {
-
- 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;
- }
- ungetc(c, stdin);
- put(t);
- goto loop;
-
- case '#':
- if(getchar()=='1')
- put('#'); else
- put('"');
- goto loop;
-
- case '%':
- if (smode)
- curbuf = obuf;
- if (ssmode==0) {
- if ((peekc=getchar())=='[') {
- curbuf = stdout;
- while((c=getchar())!=']')
- put(c);
- getchar();
- fprintf(curbuf, ";");
- curbuf = obuf;
- goto loop;
- }
- ungetc(peekc, stdin);
- }
- loop1:
- switch (c=getchar()) {
-
- case ' ':
- case '\t':
- goto loop1;
- case 'a':
- m = 16;
- t = flag();
- goto pf;
-
- case ',':
- put(';');
- 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=getchar())=='*')
- m =+ 0100; else
- ungetc(c, stdin);
- fprintf(curbuf, ".byte %o,%o", m, t);
- goto loop1;
- case '[':
- fprintf(curbuf, "L%d=", labno++);
- while ((c=getchar())!=']')
- put(c);
- ssmode = 0;
- smode = 0;
- goto loop;
-
- case '\n':
- fprintf(curbuf, "\nL%d\n", labno);
- ssmode = 1;
- nlflg = 1;
- smode = 1;
- goto loop;
- }
- put(c);
- goto loop1;
-
- case '\t':
- if (nlflg) {
- nlflg = 0;
- goto loop;
- }
- if (smode) {
- tabflg++;
- goto loop;
- }
- put('\t');
- goto loop;
-
- case '\n':
- if (!smode) {
- put('\n');
- goto loop;
- }
- if (nlflg) {
- nlflg = 0;
- fprintf(curbuf, "\\0>\n");
- curbuf = obuf;
- smode = 0;
- goto loop;
- }
- if (!snlflg)
- fprintf(curbuf, "\\n");
- snlflg = 0;
- fprintf(curbuf, ">\n<");
- nlflg = 1;
- goto loop;
-
- case 'X':
- case 'Y':
- case 'T':
- snlflg++;
- }
- put(c);
- goto loop;
- }
-
- flag() {
- register c, f;
-
- f = 0;
- l1:
- switch(c=getchar()) {
-
- 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;
- }
- ungetc(c, stdin);
- return(f);
- }
-
- put(c)
- {
- if (tabflg) {
- tabflg = 0;
- fprintf(curbuf, ">;.byte %o;<", c+0200);
- } else
- putc(c, curbuf);
- }
-