V3/c/c03.c

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

retseq()
{
	printf("jmp	retrn\n");
}

decref(t)
{

	if ((t & 077770) == 0) {
		error("Illegal indirection");
		return(t);
	}
	return((t>>2) & 077770 | t&07);
}

incref(t)
{
	return((t<<2)&077740 | (t&07) | 010);
}

jumpc(tree, lbl, cond)
int tree[];
{
	extern cctab, block, rcexpr;

	rcexpr(block(1,easystmt()+103,tree,lbl,cond),cctab);
}

rcexpr(tree, table)
int tree[], table;
{
	extern space, putwrd, putchar, line;
	int c, sp[];

	if (tree == 0)
		return;
	putchar('#');
	c = space;
	c =/ 2;		/* # addresses per word */
	sp = 0;
	putwrd(c);
	putwrd(tree);
	putwrd(table);
	putwrd(line);
	while(c--)
		putwrd(*sp++);
}

jump(lab) {
	extern printf;

	printf("jmp\tl%d\n", lab);
}

label(l) {
	extern printf;

	printf("L%d:", l);
}

setstk(a) {
	extern printf, stack;
	auto ts;

	ts = a-stack;
	stack = a;
	switch(ts) {

	case 0:
		return;

	case 0177776:	/* -2 */
		printf("tst	-(sp)\n");
		return;

	case 0177774:	/* -4 */
		printf("cmp	-(sp),-(sp)\n");
		return;
	}
	printf("add	$%o,sp\n", ts);
}

plength(p)
int p[];
{
	int t, l;

	if (((t=p[1])&077770) == 0)		/* not a reference */
		return(1);
	p[1] = decref(t);
	l = length(p);
	p[1] = t;
	return(l);
}

length(cs)
int cs[];
{
	extern hshtab[];
	int t;

	t = cs[1];
	if ((t&030) == 030)		/* array */
		t = decref(t);
	if (t>=010)
		return(2);
	switch(t&07) {

	case 0:		/* int */
		return(2);

	case 1:		/* char */
		return(1);

	case 2:		/* float */
		return(4);

	case 3:		/* double */
		return(8);

	case 4:		/* structure */
		if (cs>=hshtab)			/* in namelist */
			return(cs[3]);
		return(getlen(cs));

	case 5:
		error("Bad structure");
		return(0);
	}
	error("Compiler error (length)");
}

getlen(p)
int p[];
{
	int p1[];

	switch(*p) {

	case 20:		/* name */
		return(p[2]);

	case 35:
	case 29:		/* & */
	case 36:		/* * */
	case 100:		/* call */
	case 41:		/* - */
		return(getlen(p[3]));

	case 40:		/* + */
		p1 = p[4];
		if ((p1[1]&07) == 04)
			return(getlen(p1));
		return(getlen(p[3]));
	}
	error("Unimplemented pointer conversion");
	return(0);
}

rlength(cs)
int cs[];
{
	auto l;

	if (((l=length(cs))&01) != 0)
		l++;
	return(l);
}

tlength(cs)
int cs[];
{
	int nel;

	if ((nel = cs[8]) == 0)
		nel = 1;
	return(length(cs)*nel);
}

trlength(cs)
int cs[];
{
	int l;

	if (((l=tlength(cs))&01) != 0)
		l++;
	return(l);
}

printn(n,b) {
	extern putchar;
	auto a;

	if(a=n/b) /* assignment, not test for equality */
		printn(a, b); /* recursive */
	putchar(n%b + '0');
}

printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
char fmt[]; {
	extern printn, putchar, namsiz, ncpw;
	char s[];
	auto adx[], x, c, i[];

	adx = &x1; /* argument pointer */
loop:
	while((c = *fmt++) != '%') {
		if(c == '\0')
			return;
		putchar(c);
	}
	x = *adx++;
	switch (c = *fmt++) {

	case 'd': /* decimal */
	case 'o': /* octal */
		if(x < 0) {
			x = -x;
			if(x<0)  {	/* - infinity */
				if(c=='o')
					printf("100000");
				else
					printf("-32767");
				goto loop;
			}
			putchar('-');
		}
		printn(x, c=='o'?8:10);
		goto loop;

	case 's': /* string */
		s = x;
		while(c = *s++)
			putchar(c);
		goto loop;

	case 'p':
		s = x;
		putchar('_');
		c = namsiz;
		while(c--)
			if (*s)
				putchar((*s++)&0177);
		goto loop;
	}
	putchar('%');
	fmt--;
	adx--;
	goto loop;
}