2.11BSD/src/lib/ccom/cvopt.c
#include <stdio.h>
int tabflg;
int labno = 1;
int opno;
FILE *curbuf;
FILE *obuf;
FILE *oobuf;
char oname[]="/tmp/cvoptaXXXXXX";
char ooname[]="/tmp/cvoptbXXXXXX";
char lbuf[BUFSIZ];
char *lbufp = lbuf;
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, side;
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);
}
mktemp(oname);
if ((obuf = fopen(oname, "w")) == NULL) {
fprintf(stderr, "%s?\n", oname);
exit(1);
}
mktemp(ooname);
if ((oobuf = fopen(ooname, "w")) == NULL) {
fprintf(stderr, "%s?\n", ooname);
exit(1);
}
printf("#include \"c1.h\"");
curbuf = obuf;
loop:
c = getchar();
if (c!='\n' && c!='\t')
nlflg = 0;
if (ssmode!=0 && c!='%') {
ssmode = 0;
curbuf = stdout;
fprintf(curbuf, "\nstatic char L%d[]=\"", labno++);
}
switch(c) {
case EOF:
fprintf(obuf, "\t{0},\n};\n");
fclose(obuf);
if (freopen(oname, "r", stdin) == NULL) {
fprintf(stderr, "%s?\n",oname);
exit(1);
}
while ((c = getchar()) != EOF)
putchar(c);
unlink(oname);
fclose(oobuf);
if (freopen(ooname, "r", stdin) == NULL) {
fprintf(stderr, "%s?\n",ooname);
exit(1);
}
while ((c = getchar()) != EOF)
putchar(c);
unlink(ooname);
return(0);
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())=='[') {
printf("\n#define ");
while((c=getchar())!=']' && c!=':')
putchar(c);
printf(" L%d\n",labno);
if (c==':') getchar();
getchar();
curbuf = obuf;
goto loop;
}
ungetc(peekc, stdin);
}
side=0;
loop1:
switch (c=getchar()) {
case ' ':
case '\t':
goto loop1;
case 'a':
m = 16;
t = flag();
goto pf;
case ',':
side=1;
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);
if (side==0) {
if (opno==0) fprintf(curbuf,"\nstruct optab optab[]={\n");
fprintf(curbuf,"\t{");
}
fprintf(curbuf, "%d,%d,", m, t);
goto loop1;
case '[':
printf("\n#define L%d ", labno++);
while ((c=getchar())!=']')
putchar(c);
printf("\n");
ssmode = 0;
smode = 0;
goto loop;
case '{':
for(;;) {
while ((c=getchar())!='%') putc(c,oobuf);
if ((c=getchar())=='}') goto loop;
else {putc('%',oobuf); putc(c,oobuf);}
}
case '\n':
fprintf(curbuf, "L%d}, /* %d */\n", labno,opno);
++opno;
ssmode = 1;
nlflg = 1;
smode = 1;
goto loop;
case '/':
comment(c); goto loop1;
}
put(c);
goto loop1;
case '\t':
if (nlflg) {
nlflg = 0;
goto loop;
}
if (smode) {
tabflg++;
goto loop;
}
put('\t');
goto loop;
case '\n':
lbufp=lbuf;
if (!smode) {
put('\n');
goto loop;
}
if (nlflg) {
nlflg = 0;
fprintf(curbuf, "\";");
curbuf = obuf;
smode = 0;
goto loop;
}
if (!snlflg)
fprintf(curbuf, "\\n");
snlflg = 0;
nlflg = 1;
goto loop;
case '/':
comment(c); goto loop;
case 'X':
case 'Y':
case 'T':
snlflg++;
break;
case ':':
fseek(curbuf,(long)(lbuf-lbufp),2);
*lbufp='\0';
if (opno!=0) {fprintf(curbuf,"\t{0},\n"); ++opno;}
printf("\n#define %s &optab[%d]\n",lbuf,opno);
fprintf(curbuf,"/* %s */",lbuf);
lbufp=lbuf;
goto loop;
}
*lbufp++=c;
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':
if (f==9) /* unsigned word/int seen yet? */
f = 10; /* yes - it is unsigned byte */
else
f = 3; /* no - it is regular (signed) byte */
goto l1;
case 'f':
f = 4;
goto l1;
case 'd':
f = 5;
goto l1;
case 'u':
if (f==3) /* regular (signed) byte seen ? */
f = 10; /* yes - unsigned byte now */
else if (f == 8) /* regular (signed) long seen? */
f = 11; /* yes - it is unsigned long now */
else
f = 9; /* otherwise we have unsigned word */
goto l1;
case 's':
f = 6;
goto l1;
case 'l':
if (f == 9) /* seen unsigned yet? */
f = 11; /* yes - it is unsigned long now */
else
f = 8; /* no - it is unsigned word now */
goto l1;
case 'p':
f += 16;
goto l1;
}
ungetc(c, stdin);
return(f);
}
put(c)
{
if (tabflg) {
tabflg = 0;
fprintf(curbuf, "\\%o", c+0200);
} else {
if (c=='"') putc('\\',curbuf);
putc(c, curbuf);
}
}
comment(c)
register char c;
{
putc(c,curbuf);
if ((c=getchar())=='*') for (;;) {
do putc(c,curbuf); while ((c=getchar())!='*');
putc(c,curbuf);
if ((c=getchar())=='/') {putc(c,curbuf); break;}
} else ungetc(c,stdin);
}