V2/c/cvopt.c

Compare this file to the similar file:
Show the results in this format:

main() {
/*
	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
*/

	extern putchar,getc,peekc,printf,flag,flush;

	auto c,snlflg,nlflg,t,smode,m,ssmode;

	smode = nlflg = snlflg = ssmode = 0;
loop:
	c = getc();
	if (c!='\n' & c!='\t') nlflg = 0;
	if (ssmode!=0 & c!='%') {
		ssmode = 0;
		printf(".data\n1:<");
	}
	switch(c) {

	case '\0':
		printf(".text; 0\n");
		flush();
		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 'M':
		putchar('N');
		snlflg++;
		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;
		}
		peekc = c;
		putchar(t);
		goto loop;

	case '#':
		if(getc()=='1')
			putchar('#'); else
			putchar('"');
		goto loop;

	case '%':
		if (smode)
			printf(".text;");
loop1:
		switch (c=getc()) {

		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 = 0;
			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 '\n':
			printf(";1f\n");
			ssmode = 1;
			nlflg = 1;
			smode = 1;
			goto loop;
		}
		putchar(c);
		goto loop1;

	case '\t':
		if (nlflg) {
			nlflg = 0;
			goto loop;
		}
		putchar('\t');
		goto loop;

	case '\n':
		if (!smode)  {
			putchar('\n');
			goto loop;
		}
		if (nlflg) {
			nlflg = 0;
			printf("\\0>\n.text\n");
			smode = 0;
			goto loop;
		}
		if (!snlflg)
			printf("\\n");
		snlflg = 0;
		printf(">\n<");
		nlflg = 1;
		goto loop;
	}
	putchar(c);
	goto loop;
}

getc() {
	extern getchar, peekc, nofloat;
	auto t, ifcnt;

	ifcnt = 0;
gc:
	if (peekc) {
		t = peekc;
		peekc = 0;
	} else
		t = getchar();
	if (t==0)
		return(0);
	if (t=='{') {
		ifcnt++;
		t = getchar();
	}
	if (t=='}') {
		t = getc();
		if (--ifcnt==0)
			if (t=='\n')
				t = getc();
	}
	if (ifcnt & nofloat)
		goto gc;
	return(t);
}

flag() {
	extern getc, peekc;
	auto 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 'p':
		f =+ 16;
		goto l1;
	}
	peekc = c;
	return(f);
}

peekc 0;

putchar(c) {
	extern flush, oubuf, ouptr;
	char ouptr[], oubuf[];
	auto c1;

	goto init;
init:
	ouptr = oubuf;
	init = init1;
init1:
	if(c1 = c>>8) {
		*ouptr++ = c1;
		if(ouptr >= oubuf+512)
			flush();
	}
	if(c =& 0377) {
			*ouptr++ = c;
		if(ouptr >= oubuf+512)
			flush();
	}
}

flush() {
	extern ouptr, oubuf, fout, write;
	char ouptr[], oubuf[];

	write(fout, oubuf, ouptr-oubuf);
	ouptr = oubuf;
}

getcha() {
	extern read, incnt, fin, inbuf, inptr;
	char inbuf[], inptr[];

	goto init;
init:
	inptr = inbuf;
	init = init1;
init1:
	if(inptr >= inbuf+incnt) {
		inptr = inbuf;
		incnt = read(fin, inbuf, 512);
		if(!incnt)
			return('\0');
	}
	return(*inptr++);
}

inbuf[256];
oubuf[256];
inptr 0;
incnt 0;
ouptr 0;
fin 0;
fout 1;
nofloat 0;