[comp.sources.unix] v10i071: Pascal to C translator, Part07/12

rs@uunet.UU.NET (Rich Salz) (07/28/87)

Submitted-by: Per Bergsten <mcvax!enea!chalmers!holtec!perb>
Posting-number: Volume 10, Issue 71
Archive-name: ptoc/Part07

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 7 (of 12)."
# Contents:  ptc.c.5
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ptc.c.5' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ptc.c.5'\"
else
echo shar: Extracting \"'ptc.c.5'\" \(39665 characters\)
sed "s/^X//" >'ptc.c.5' <<'END_OF_FILE'
X void
Xeexpr(tp)
X	treeptr	tp;
X{
X	treeptr	tq;
X	boolean	flag;
X
X	(*G200_donearr) = false;
X	if (Member((unsigned)(tp->tt), Conset[144])) {
X		tq = typeof(tp->U.V41.texpl);
X		if ((Member((unsigned)(tq->tt), Conset[145])) || (tq == typnods.A[(int)(tset)])) {
X			switch (tp->tt) {
X			  case nplus:
X				(*G196_setused) = true;
X				useunion = true;
X				(void)fprintf(output.fp, "Union"), Putl(output, 0);
X				break ;
X			  case nminus:
X				(*G196_setused) = true;
X				usediff = true;
X				(void)fprintf(output.fp, "Diff"), Putl(output, 0);
X				break ;
X			  case nmul:
X				(*G196_setused) = true;
X				useintr = true;
X				(void)fprintf(output.fp, "Inter"), Putl(output, 0);
X				break ;
X			  case neq:
X				useseq = true;
X				(void)fprintf(output.fp, "Eq"), Putl(output, 0);
X				break ;
X			  case nne:
X				usesne = true;
X				(void)fprintf(output.fp, "Ne"), Putl(output, 0);
X				break ;
X			  case nge:
X				usesge = true;
X				(void)fprintf(output.fp, "Ge"), Putl(output, 0);
X				break ;
X			  case nle:
X				usesle = true;
X				(void)fprintf(output.fp, "Le"), Putl(output, 0);
X				break ;
X			  default:
X				Caseerror(Line);
X			}
X			if (Member((unsigned)(tp->tt), Conset[146]))
X				(*G198_dropset) = false;
X			Putchr('(', output);
X			eexpr(tp->U.V41.texpl);
X			if (tq->tt == nsetof)
X				(void)fprintf(output.fp, ".S"), Putl(output, 0);
X			(void)fprintf(output.fp, ", "), Putl(output, 0);
X			eexpr(tp->U.V41.texpr);
X			tq = typeof(tp->U.V41.texpr);
X			if (tq->tt == nsetof)
X				(void)fprintf(output.fp, ".S"), Putl(output, 0);
X			Putchr(')', output);
X			goto L999;
X		}
X	}
X	if (Member((unsigned)(tp->tt), Conset[147])) {
X		tq = typeof(tp->U.V41.texpl);
X		if (tq->tt == nconfarr)
X			fatal(ecmpconf);
X		if ((Member((unsigned)(tq->tt), Conset[148])) || (tq == typnods.A[(int)(tstring)])) {
X			(void)fprintf(output.fp, "Cmpstr("), Putl(output, 0);
X			eexpr(tp->U.V41.texpl);
X			if (tq->tt == narray)
X				(void)fprintf(output.fp, ".A"), Putl(output, 0);
X			(void)fprintf(output.fp, ", "), Putl(output, 0);
X			tq = typeof(tp->U.V41.texpr);
X			if (tq->tt == nconfarr)
X				fatal(ecmpconf);
X			eexpr(tp->U.V41.texpr);
X			if (tq->tt == narray)
X				(void)fprintf(output.fp, ".A"), Putl(output, 0);
X			Putchr(')', output);
X			switch (tp->tt) {
X			  case neq:
X				(void)fprintf(output.fp, " == "), Putl(output, 0);
X				break ;
X			  case nne:
X				(void)fprintf(output.fp, " != "), Putl(output, 0);
X				break ;
X			  case ngt:
X				(void)fprintf(output.fp, " > "), Putl(output, 0);
X				break ;
X			  case nlt:
X				(void)fprintf(output.fp, " < "), Putl(output, 0);
X				break ;
X			  case nge:
X				(void)fprintf(output.fp, " >= "), Putl(output, 0);
X				break ;
X			  case nle:
X				(void)fprintf(output.fp, " <= "), Putl(output, 0);
X				break ;
X			  default:
X				Caseerror(Line);
X			}
X			Putchr('0', output);
X			goto L999;
X		}
X	}
X	switch (tp->tt) {
X	  case neq:  case nne:  case nlt:  case nle:
X	  case ngt:  case nge:  case nor:  case nand:
X	  case nplus:  case nminus:  case nmul:  case ndiv:
X	  case nmod:  case nquot:
X		flag = (boolean)(cprio.A[(int)(tp->tt) - (int)(nassign)] > cprio.A[(int)(tp->U.V41.texpl->tt) - (int)(nassign)]);
X		if ((Member((unsigned)(tp->tt), Conset[149])) && !arithexpr(tp->U.V41.texpl)) {
X			(void)fprintf(output.fp, "(int)"), Putl(output, 0);
X			flag = true;
X		}
X		if (flag)
X			Putchr('(', output);
X		eexpr(tp->U.V41.texpl);
X		if (flag)
X			Putchr(')', output);
X		switch (tp->tt) {
X		  case neq:
X			(void)fprintf(output.fp, " == "), Putl(output, 0);
X			break ;
X		  case nne:
X			(void)fprintf(output.fp, " != "), Putl(output, 0);
X			break ;
X		  case nlt:
X			(void)fprintf(output.fp, " < "), Putl(output, 0);
X			break ;
X		  case nle:
X			(void)fprintf(output.fp, " <= "), Putl(output, 0);
X			break ;
X		  case ngt:
X			(void)fprintf(output.fp, " > "), Putl(output, 0);
X			break ;
X		  case nge:
X			(void)fprintf(output.fp, " >= "), Putl(output, 0);
X			break ;
X		  case nor:
X			(void)fprintf(output.fp, " || "), Putl(output, 0);
X			break ;
X		  case nand:
X			(void)fprintf(output.fp, " && "), Putl(output, 0);
X			break ;
X		  case nplus:
X			(void)fprintf(output.fp, " + "), Putl(output, 0);
X			break ;
X		  case nminus:
X			(void)fprintf(output.fp, " - "), Putl(output, 0);
X			break ;
X		  case nmul:
X			(void)fprintf(output.fp, " * "), Putl(output, 0);
X			break ;
X		  case ndiv:
X			(void)fprintf(output.fp, " / "), Putl(output, 0);
X			break ;
X		  case nmod:
X			(void)fprintf(output.fp, " %% "), Putl(output, 0);
X			break ;
X		  case nquot:
X			(void)fprintf(output.fp, " / (("), Putl(output, 0);
X			printid(defnams.A[(int)(dreal)]->U.V6.lid);
X			Putchr(')', output);
X			break ;
X		  default:
X			Caseerror(Line);
X		}
X		flag = (boolean)(cprio.A[(int)(tp->tt) - (int)(nassign)] > cprio.A[(int)(tp->U.V41.texpr->tt) - (int)(nassign)]);
X		if ((Member((unsigned)(tp->tt), Conset[150])) && !arithexpr(tp->U.V41.texpr)) {
X			(void)fprintf(output.fp, "(int)"), Putl(output, 0);
X			flag = true;
X		}
X		if (flag)
X			Putchr('(', output);
X		eexpr(tp->U.V41.texpr);
X		if (flag)
X			Putchr(')', output);
X		if (tp->tt == nquot)
X			Putchr(')', output);
X		break ;
X	  case nuplus:  case numinus:  case nnot:
X		switch (tp->tt) {
X		  case numinus:
X			Putchr('-', output);
X			break ;
X		  case nnot:
X			Putchr('!', output);
X			break ;
X		  case nuplus:
X			break ;
X		  default:
X			Caseerror(Line);
X		}
X		flag = (boolean)(cprio.A[(int)(tp->tt) - (int)(nassign)] >= cprio.A[(int)(tp->U.V42.texps->tt) - (int)(nassign)]);
X		if (flag)
X			Putchr('(', output);
X		eexpr(tp->U.V42.texps);
X		if (flag)
X			Putchr(')', output);
X		break ;
X	  case nin:
X		usememb = true;
X		(void)fprintf(output.fp, "Member((unsigned)("), Putl(output, 0);
X		eexpr(tp->U.V41.texpl);
X		(void)fprintf(output.fp, "), "), Putl(output, 0);
X		(*G198_dropset) = true;
X		eexpr(tp->U.V41.texpr);
X		(*G198_dropset) = false;
X		tq = typeof(tp->U.V41.texpr);
X		if (tq->tt == nsetof)
X			(void)fprintf(output.fp, ".S"), Putl(output, 0);
X		Putchr(')', output);
X		break ;
X	  case nassign:
X		tq = typeof(tp->U.V27.trhs);
X		if (tq == typnods.A[(int)(tstring)]) {
X			(void)fprintf(output.fp, "%sstrncpy(", voidcast), Putl(output, 0);
X			eexpr(tp->U.V27.tlhs);
X			(void)fprintf(output.fp, ".A, "), Putl(output, 0);
X			eexpr(tp->U.V27.trhs);
X			(void)fprintf(output.fp, ", sizeof("), Putl(output, 0);
X			eexpr(tp->U.V27.tlhs);
X			(void)fprintf(output.fp, ".A))"), Putl(output, 0);
X		} else
X			if (tq == typnods.A[(int)(tboolean)]) {
X				eexpr(tp->U.V27.tlhs);
X				(void)fprintf(output.fp, " = "), Putl(output, 0);
X				tq = tp->U.V27.trhs;
X				while (tq->tt == nuplus)
X					tq = tq->U.V42.texps;
X				if (Member((unsigned)(tq->tt), Conset[151])) {
X					Putchr('(', output);
X					printid(defnams.A[(int)(dboolean)]->U.V6.lid);
X					(void)fprintf(output.fp, ")("), Putl(output, 0);
X					eexpr(tq);
X					Putchr(')', output);
X				} else
X					eexpr(tq);
X			} else
X				if (tq == typnods.A[(int)(tnil)]) {
X					eexpr(tp->U.V27.tlhs);
X					(void)fprintf(output.fp, " = ("), Putl(output, 0);
X					etypedef(typeof(tp->U.V27.tlhs));
X					(void)fprintf(output.fp, ")NIL"), Putl(output, 0);
X				} else {
X					tq = typeof(tp->U.V27.tlhs);
X					if (tq->tt == nsetof) {
X						usescpy = true;
X						(void)fprintf(output.fp, "Setncpy("), Putl(output, 0);
X						eselect(tp->U.V27.tlhs);
X						(void)fprintf(output.fp, "S, "), Putl(output, 0);
X						(*G198_dropset) = true;
X						tq = typeof(tp->U.V27.trhs);
X						if (tq == typnods.A[(int)(tset)])
X							eexpr(tp->U.V27.trhs);
X						else {
X							eselect(tp->U.V27.trhs);
X							Putchr('S', output);
X						}
X						(*G198_dropset) = false;
X						(void)fprintf(output.fp, ", sizeof("), Putl(output, 0);
X						eselect(tp->U.V27.tlhs);
X						(void)fprintf(output.fp, "S))"), Putl(output, 0);
X					} else {
X						eexpr(tp->U.V27.tlhs);
X						(void)fprintf(output.fp, " = "), Putl(output, 0);
X						eexpr(tp->U.V27.trhs);
X					}
X				}
X		break ;
X	  case ncall:
X		tq = idup(tp->U.V30.tcall);
X		if ((Member((unsigned)(tq->tt), Conset[152])) && (tq->U.V13.tsubstmt != (struct S61 *)NIL))
X			if (tq->U.V13.tsubstmt->tt == npredef)
X				epredef(tq, tp);
X			else
X				ecall(tp);
X		else
X			ecall(tp);
X		break ;
X	  case nselect:
X		eselect(tp->U.V40.trecord);
X		eexpr(tp->U.V40.tfield);
X		break ;
X	  case nindex:
X		eselect(tp->U.V39.tvariable);
X		(void)fprintf(output.fp, "A["), Putl(output, 0);
X		tq = tp->U.V39.toffset;
X		if (arithexpr(tq))
X			eexpr(tq);
X		else {
X			(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X			eexpr(tq);
X			Putchr(')', output);
X		}
X		tq = typeof(tp->U.V39.tvariable);
X		if (tq->tt == narray)
X			if (clower(tq->U.V23.taindx) != 0) {
X				(void)fprintf(output.fp, " - "), Putl(output, 0);
X				tq = typeof(tq->U.V23.taindx);
X				if (tq->tt == nsubrange)
X					if (arithexpr(tq->U.V19.tlo))
X						eexpr(tq->U.V19.tlo);
X					else {
X						(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X						eexpr(tq->U.V19.tlo);
X						Putchr(')', output);
X					}
X				else
X					fatal(etree);
X			}
X		Putchr(']', output);
X		break ;
X	  case nderef:
X		tq = typeof(tp->U.V42.texps);
X		if ((tq->tt == nfileof) || ((tq->tt == npredef) && (tq->U.V12.tdef == dtext))) {
X			eexpr(tp->U.V42.texps);
X			(void)fprintf(output.fp, ".buf"), Putl(output, 0);
X		} else
X			if ((*G202_doarrow) == 0) {
X				Putchr('*', output);
X				eexpr(tp->U.V42.texps);
X			} else {
X				eexpr(tp->U.V42.texps);
X				(void)fprintf(output.fp, "->"), Putl(output, 0);
X				(*G200_donearr) = true;
X			}
X		break ;
X	  case nid:
X		tq = idup(tp);
X		if (tq->tt == nvarpar) {
X			if (((*G202_doarrow) == 0) || (tq->U.V14.tattr == areference)) {
X				(void)fprintf(output.fp, "(*"), Putl(output, 0);
X				printid(tp->U.V43.tsym->U.V6.lid);
X				Putchr(')', output);
X			} else {
X				printid(tp->U.V43.tsym->U.V6.lid);
X				(void)fprintf(output.fp, "->"), Putl(output, 0);
X				(*G200_donearr) = true;
X			}
X		} else
X			if ((tq->tt == nconst) && (*G194_conflag))
X				(void)fprintf(output.fp, "%1d", cvalof(tp)), Putl(output, 0);
X			else
X				if (Member((unsigned)(tq->tt), Conset[153])) {
X					(void)fprintf(output.fp, "(*"), Putl(output, 0);
X					printid(tp->U.V43.tsym->U.V6.lid);
X					Putchr(')', output);
X				} else
X					printid(tp->U.V43.tsym->U.V6.lid);
X		break ;
X	  case nchar:
X		printchr(tp->U.V43.tsym->U.V11.lchar);
X		break ;
X	  case ninteger:
X		(void)fprintf(output.fp, "%1d", tp->U.V43.tsym->U.V10.linum), Putl(output, 0);
X		break ;
X	  case nreal:
X		printtok(tp->U.V43.tsym->U.V8.lfloat);
X		break ;
X	  case nstring:
X		printstr(tp->U.V43.tsym->U.V7.lstr);
X		break ;
X	  case nset:
X		if (constset(tp->U.V42.texps)) {
X			(void)fprintf(output.fp, "Conset[%1d]", setcnt), Putl(output, 0);
X			setcnt = setcnt + 1;
X			tq = mknode(nset);
X			tq->tnext = setlst;
X			setlst = tq;
X			tq->U.V42.texps = tp->U.V42.texps;
X		} else {
X			increment();
X			flag = (*G198_dropset);
X			if ((*G198_dropset))
X				(*G198_dropset) = false;
X			else
X				(void)fprintf(output.fp, "Saveset("), Putl(output, 0);
X			(void)fprintf(output.fp, "(Tmpset = Newset(), "), Putl(output, 0);
X			tq = tp->U.V42.texps;
X			while (tq != (struct S61 *)NIL) {
X				switch (tq->tt) {
X				  case nrange:
X					usemksub = true;
X					(void)fprintf(output.fp, "%sMksubr(", voidcast), Putl(output, 0);
X					(void)fprintf(output.fp, "(unsigned)("), Putl(output, 0);
X					eexpr(tq->U.V41.texpl);
X					(void)fprintf(output.fp, "), "), Putl(output, 0);
X					(void)fprintf(output.fp, "(unsigned)("), Putl(output, 0);
X					eexpr(tq->U.V41.texpr);
X					(void)fprintf(output.fp, "), Tmpset)"), Putl(output, 0);
X					break ;
X				  case nin:  case neq:  case nne:  case nlt:
X				  case nle:  case ngt:  case nge:  case nor:
X				  case nand:  case nmul:  case ndiv:  case nmod:
X				  case nquot:  case nplus:  case nminus:  case nnot:
X				  case numinus:  case nuplus:  case nindex:  case nselect:
X				  case nderef:  case ncall:  case ninteger:  case nchar:
X				  case nid:
X					useins = true;
X					(void)fprintf(output.fp, "%sInsmem(", voidcast), Putl(output, 0);
X					(void)fprintf(output.fp, "(unsigned)("), Putl(output, 0);
X					eexpr(tq);
X					(void)fprintf(output.fp, "), Tmpset)"), Putl(output, 0);
X					break ;
X				  default:
X					Caseerror(Line);
X				}
X				tq = tq->tnext;
X				if (tq != (struct S61 *)NIL) {
X					Putchr(',', output),Putchr('\n', output);
X					indent();
X				}
X			}
X			(void)fprintf(output.fp, ", Tmpset)"), Putl(output, 0);
X			if (!flag) {
X				Putchr(')', output);
X				(*G196_setused) = true;
X			}
X			decrement();
X		}
X		break ;
X	  case nnil:
X		tq = tp;
X		do {
X			tq = tq->tup;
X		} while (!(Member((unsigned)(tq->tt), Conset[154])));
X		if (Member((unsigned)(tq->tt), Conset[155])) {
X			if (typeof(tq->U.V41.texpl) == typnods.A[(int)(tnil)])
X				tq = typeof(tq->U.V41.texpr);
X			else
X				tq = typeof(tq->U.V41.texpl);
X			if (tq->tt == nptr) {
X				Putchr('(', output);
X				etypedef(tq);
X				Putchr(')', output);
X			}
X		}
X		(void)fprintf(output.fp, "NIL"), Putl(output, 0);
X		break ;
X	  default:
X		Caseerror(Line);
X	}
XL999:
X	;
X}
X
X void
Xeconst(tp)
X	treeptr	tp;
X{
X	symptr	sp;
X
X	while (tp != (struct S61 *)NIL) {
X		sp = tp->U.V14.tidl->U.V43.tsym;
X		if (sp->U.V6.lid->inref > 1)
X			sp->U.V6.lid = mkrename('X', sp->U.V6.lid);
X		if (tp->U.V14.tbind->tt == nstring) {
X			indent();
X			(void)fprintf(output.fp, "%s%s%c", C50_static, chartyp, tab1), Putl(output, 0);
X			printid(sp->U.V6.lid);
X			(void)fprintf(output.fp, "[]	= "), Putl(output, 0);
X			eexpr(tp->U.V14.tbind);
X			Putchr(';', output),Putchr('\n', output);
X		} else {
X			(void)fprintf(output.fp, "%s", C4_define), Putl(output, 0);
X			printid(sp->U.V6.lid);
X			Putchr(space, output);
X			eexpr(tp->U.V14.tbind);
X			Putchr('\n', output);
X		}
X		tp = tp->tnext;
X	}
X}
X
Xvoid etypedef();
X
Xvoid etdef();
X
X void
Xetrange(tp)
X	treeptr	tp;
X{
X	integer	lo, hi;
X	register unsigned char	i;
X
X	lo = clower(tp);
X	hi = cupper(tp);
X	{
X		unsigned char	B51 = 1,
X			B52 = nmachdefs;
X
X		if (B51 <= B52)
X			for (i = B51; ; i++) {
X				{
X					register struct S193 *W53 = &machdefs.A[i - 1];
X
X					if ((lo >= W53->lolim) && (hi <= W53->hilim)) {
X						printtok(W53->typstr);
X						goto L999;
X					}
X				}
X				if (i == B52) break;
X			}
X	}
X	fatal(erange);
XL999:
X	;
X}
X
X void
Xprintsuf(ip)
X	idptr	ip;
X{
X	toknbuf	w;
X	toknidx	i, j;
X
X	gettokn(ip->istr, &w);
X	i = 1;
X	j = i;
X	while (w.A[i - 1] != null) {
X		if (w.A[i - 1] == '.')
X			j = i;
X		i = i + 1;
X	}
X	if (w.A[j - 1] == '.')
X		j = j + 1;
X	while (w.A[j - 1] != null) {
X		Putchr(w.A[j - 1], output);
X		j = j + 1;
X	}
X}
X
X void
Xetdef(uid, tp)
X	idptr	uid;
X	treeptr	tp;
X{
X	integer	i;
X	treeptr	tq;
X
X	switch (tp->tt) {
X	  case nid:
X		printid(tp->U.V43.tsym->U.V6.lid);
X		break ;
X	  case nptr:
X		tq = typeof(tp->U.V16.tptrid);
X		if (tq->tt == nrecord) {
X			(void)fprintf(output.fp, "struct "), Putl(output, 0);
X			printid(tq->U.V21.tuid);
X		} else
X			printid(tp->U.V16.tptrid->U.V43.tsym->U.V6.lid);
X		(void)fprintf(output.fp, " *"), Putl(output, 0);
X		break ;
X	  case nscalar:
X		(void)fprintf(output.fp, "enum { "), Putl(output, 0);
X		increment();
X		tp = tp->U.V17.tscalid;
X		if (tp->U.V43.tsym->U.V6.lid->inref > 1)
X			tp->U.V43.tsym->U.V6.lid = mkrename('E', tp->U.V43.tsym->U.V6.lid);
X		printid(tp->U.V43.tsym->U.V6.lid);
X		i = 1;
X		while (tp->tnext != (struct S61 *)NIL) {
X			if (i >= 4) {
X				Putchr(',', output),Putchr('\n', output);
X				indent();
X				i = 1;
X			} else {
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				i = i + 1;
X			}
X			tp = tp->tnext;
X			if (tp->U.V43.tsym->U.V6.lid->inref > 1)
X				tp->U.V43.tsym->U.V6.lid = mkrename('E', tp->U.V43.tsym->U.V6.lid);
X			printid(tp->U.V43.tsym->U.V6.lid);
X		}
X		decrement();
X		(void)fprintf(output.fp, " } "), Putl(output, 0);
X		break ;
X	  case nsubrange:
X		tq = typeof(tp->U.V19.tlo);
X		if (tq == typnods.A[(int)(tinteger)])
X			etrange(tp);
X		else {
X			if (tq->tup->tt == ntype)
X				tq = tq->tup->U.V14.tidl;
X			etdef((idptr)NIL, tq);
X		}
X		break ;
X	  case nfield:
X		etdef((idptr)NIL, tp->U.V14.tbind);
X		Putchr(tab1, output);
X		tp = tp->U.V14.tidl;
X		if (uid != (struct S59 *)NIL)
X			tp->U.V43.tsym->U.V6.lid = mkconc('.', uid, tp->U.V43.tsym->U.V6.lid);
X		printsuf(tp->U.V43.tsym->U.V6.lid);
X		i = 1;
X		while (tp->tnext != (struct S61 *)NIL) {
X			if (i >= 4) {
X				Putchr(',', output),Putchr('\n', output);
X				indent();
X				Putchr(tab1, output);
X				i = 1;
X			} else {
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				i = i + 1;
X			}
X			tp = tp->tnext;
X			if (uid != (struct S59 *)NIL)
X				tp->U.V43.tsym->U.V6.lid = mkconc('.', uid, tp->U.V43.tsym->U.V6.lid);
X			printsuf(tp->U.V43.tsym->U.V6.lid);
X		}
X		Putchr(';', output),Putchr('\n', output);
X		break ;
X	  case nrecord:
X		(void)fprintf(output.fp, "struct "), Putl(output, 0);
X		if (tp->U.V21.tuid == (struct S59 *)NIL)
X			tp->U.V21.tuid = uid;
X		else
X			if (uid == (struct S59 *)NIL)
X				printid(tp->U.V21.tuid);
X		(void)fprintf(output.fp, " {\n"), Putl(output, 1);
X		increment();
X		if ((tp->U.V21.tflist == (struct S61 *)NIL) && (tp->U.V21.tvlist == (struct S61 *)NIL)) {
X			indent();
X			(void)fprintf(output.fp, "%s%cdummy;\n", inttyp, tab1), Putl(output, 1);
X		}
X		tq = tp->U.V21.tflist;
X		while (tq != (struct S61 *)NIL) {
X			indent();
X			etdef(uid, tq);
X			tq = tq->tnext;
X		}
X		if (tp->U.V21.tvlist != (struct S61 *)NIL) {
X			indent();
X			(void)fprintf(output.fp, "union {\n"), Putl(output, 1);
X			increment();
X			tq = tp->U.V21.tvlist;
X			while (tq != (struct S61 *)NIL) {
X				if ((tq->U.V20.tvrnt->U.V21.tflist != (struct S61 *)NIL) || (tq->U.V20.tvrnt->U.V21.tvlist != (struct S61 *)NIL)) {
X					indent();
X					if (uid == (struct S59 *)NIL)
X						etdef(mkvrnt(), tq->U.V20.tvrnt);
X					else
X						etdef(mkconc('.', uid, mkvrnt()), tq->U.V20.tvrnt);
X					Putchr(';', output),Putchr('\n', output);
X				}
X				tq = tq->tnext;
X			}
X			decrement();
X			indent();
X			(void)fprintf(output.fp, "} U;\n"), Putl(output, 1);
X		}
X		decrement();
X		indent();
X		if (tp->tup->tt == nvariant) {
X			(void)fprintf(output.fp, "} "), Putl(output, 0);
X			printsuf(tp->U.V21.tuid);
X		} else
X			Putchr('}', output);
X		break ;
X	  case nconfarr:
X		(void)fprintf(output.fp, "struct "), Putl(output, 0);
X		printid(tp->U.V22.tcuid);
X		(void)fprintf(output.fp, " { "), Putl(output, 0);
X		etdef((idptr)NIL, tp->U.V22.tcelem);
X		(void)fprintf(output.fp, "%cA[]; }", tab1), Putl(output, 0);
X		break ;
X	  case narray:
X		(void)fprintf(output.fp, "struct { "), Putl(output, 0);
X		etdef((idptr)NIL, tp->U.V23.taelem);
X		(void)fprintf(output.fp, "%cA[", tab1), Putl(output, 0);
X		tq = typeof(tp->U.V23.taindx);
X		if (tq->tt == nsubrange) {
X			if (arithexpr(tq->U.V19.thi)) {
X				eexpr(tq->U.V19.thi);
X				if (cvalof(tq->U.V19.tlo) != 0) {
X					(void)fprintf(output.fp, " - "), Putl(output, 0);
X					eexpr(tq->U.V19.tlo);
X				}
X			} else {
X				(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X				eexpr(tq->U.V19.thi);
X				if (cvalof(tq->U.V19.tlo) != 0) {
X					(void)fprintf(output.fp, ") - (int)("), Putl(output, 0);
X					eexpr(tq->U.V19.tlo);
X				}
X				Putchr(')', output);
X			}
X			(void)fprintf(output.fp, " + 1"), Putl(output, 0);
X		} else
X			(void)fprintf(output.fp, "%1d", crange(tp->U.V23.taindx)), Putl(output, 0);
X		(void)fprintf(output.fp, "]; }"), Putl(output, 0);
X		break ;
X	  case nfileof:
X		(void)fprintf(output.fp, "struct {\n"), Putl(output, 1);
X		indent();
X		(void)fprintf(output.fp, "%cFILE%c*fp;\n", tab1, tab1), Putl(output, 1);
X		indent();
X		(void)fprintf(output.fp, "%c%s%ceoln:1,\n", tab1, filebits, tab1), Putl(output, 1);
X		indent();
X		(void)fprintf(output.fp, "%seof:1,\n", tab3), Putl(output, 1);
X		indent();
X		(void)fprintf(output.fp, "%sout:1,\n", tab3), Putl(output, 1);
X		indent();
X		(void)fprintf(output.fp, "%sinit:1,\n", tab3), Putl(output, 1);
X		indent();
X		(void)fprintf(output.fp, "%s:%1d;\n", tab3, filefill), Putl(output, 1);
X		indent();
X		Putchr(tab1, output);
X		etdef((idptr)NIL, tp->U.V18.tof);
X		(void)fprintf(output.fp, "%cbuf;\n", tab1), Putl(output, 1);
X		indent();
X		(void)fprintf(output.fp, "} "), Putl(output, 0);
X		break ;
X	  case nsetof:
X		(void)fprintf(output.fp, "struct { %s%cS[%1d]; }", setwtyp, tab1, csetsize(tp)), Putl(output, 0);
X		break ;
X	  case npredef:
X		switch (tp->U.V12.tobtyp) {
X		  case tboolean:
X			printid(defnams.A[(int)(dboolean)]->U.V6.lid);
X			break ;
X		  case tchar:
X			(void)fprintf(output.fp, "%s", chartyp), Putl(output, 0);
X			break ;
X		  case tinteger:
X			printid(defnams.A[(int)(dinteger)]->U.V6.lid);
X			break ;
X		  case treal:
X			printid(defnams.A[(int)(dreal)]->U.V6.lid);
X			break ;
X		  case tstring:
X			(void)fprintf(output.fp, "%s *", chartyp), Putl(output, 0);
X			break ;
X		  case ttext:
X			(void)fprintf(output.fp, "text"), Putl(output, 0);
X			break ;
X		  case tnil:  case tset:  case terror:
X			fatal(etree);
X			break ;
X		  case tnone:
X			(void)fprintf(output.fp, "%s", voidtyp), Putl(output, 0);
X			break ;
X		  default:
X			Caseerror(Line);
X		}
X		break ;
X	  case nempty:
X		(void)fprintf(output.fp, "%s", voidtyp), Putl(output, 0);
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X}
X
X void
Xetypedef(tp)
X	treeptr	tp;
X{
X	etdef((idptr)NIL, tp);
X}
X
X void
Xetype(tp)
X	treeptr	tp;
X{
X	symptr	sp;
X
X	while (tp != (struct S61 *)NIL) {
X		sp = tp->U.V14.tidl->U.V43.tsym;
X		if (sp->U.V6.lid->inref > 1)
X			sp->U.V6.lid = mkrename('Y', sp->U.V6.lid);
X		indent();
X		(void)fprintf(output.fp, "%s", typdef), Putl(output, 0);
X		etypedef(tp->U.V14.tbind);
X		Putchr(tab1, output);
X		printid(sp->U.V6.lid);
X		Putchr(';', output),Putchr('\n', output);
X		tp = tp->tnext;
X	}
X}
X
X void
Xevar(tp)
X	treeptr	tp;
X{
X	treeptr	tq;
X	integer	i;
X
X	while (tp != (struct S61 *)NIL) {
X		indent();
X		switch (tp->tt) {
X		  case nvar:  case nvalpar:  case nvarpar:
X			if (tp->U.V14.tattr == aregister)
X				(void)fprintf(output.fp, "%s", registr), Putl(output, 0);
X			etypedef(tp->U.V14.tbind);
X			break ;
X		  case nparproc:  case nparfunc:
X			if (tp->tt == nparproc)
X				(void)fprintf(output.fp, "%s", voidtyp), Putl(output, 0);
X			else
X				etypedef(tp->U.V15.tpartyp);
X			tq = tp->U.V15.tparid;
X			(void)fprintf(output.fp, "%c(*", tab1), Putl(output, 0);
X			printid(tq->U.V43.tsym->U.V6.lid);
X			(void)fprintf(output.fp, ")()"), Putl(output, 0);
X			goto L555;
X			break ;
X		  default:
X			Caseerror(Line);
X		}
X		Putchr(tab1, output);
X		tq = tp->U.V14.tidl;
X		i = 1;
X		do {
X			if (tp->tt == nvarpar)
X				Putchr('*', output);
X			printid(tq->U.V43.tsym->U.V6.lid);
X			tq = tq->tnext;
X			if (tq != (struct S61 *)NIL) {
X				if (i >= 6) {
X					i = 1;
X					Putchr(',', output),Putchr('\n', output);
X					indent();
X					Putchr(tab1, output);
X				} else {
X					i = i + 1;
X					(void)fprintf(output.fp, ", "), Putl(output, 0);
X				}
X			}
X		} while (!(tq == (struct S61 *)NIL));
X	L555:
X		Putchr(';', output),Putchr('\n', output);
X		if (tp->tt == nvarpar)
X			if (tp->U.V14.tbind->tt == nconfarr) {
X				indent();
X				etypedef(tp->U.V14.tbind->U.V22.tindtyp);
X				Putchr(tab1, output);
X				tq = tp->U.V14.tbind->U.V22.tcindx->U.V19.thi;
X				printid(tq->U.V43.tsym->U.V6.lid);
X				Putchr(';', output),Putchr('\n', output);
X			}
X		tp = tp->tnext;
X	}
X}
X
X
Xvoid estmt();
X
X void
Xewithtype(tp)
X	treeptr	tp;
X{
X	treeptr	tq;
X
X	tq = typeof(tp);
X	(void)fprintf(output.fp, "struct "), Putl(output, 0);
X	printid(tq->U.V21.tuid);
X}
X
X void
Xechoise(tp)
X	treeptr	tp;
X{
X	treeptr	tq;
X	integer	i;
X
X	while (tp != (struct S61 *)NIL) {
X		tq = tp->U.V36.tchocon;
X		i = 0;
X		indent();
X		while (tq != (struct S61 *)NIL) {
X			(void)fprintf(output.fp, "  case "), Putl(output, 0);
X			(*G194_conflag) = true;
X			eexpr(tq);
X			(*G194_conflag) = false;
X			Putchr(':', output);
X			i = i + 1;
X			tq = tq->tnext;
X			if ((tq == (struct S61 *)NIL) || (i % 4 == 0)) {
X				Putchr('\n', output);
X				if (tq != (struct S61 *)NIL)
X					indent();
X				i = 0;
X			}
X		}
X		increment();
X		if (tp->U.V36.tchostmt->tt == nbegin)
X			estmt(tp->U.V36.tchostmt->U.V24.tbegin);
X		else
X			estmt(tp->U.V36.tchostmt);
X		indent();
X		(void)fprintf(output.fp, "break ;\n"), Putl(output, 1);
X		decrement();
X		tp = tp->tnext;
X		if (tp != (struct S61 *)NIL)
X			if (tp->U.V36.tchocon == (struct S61 *)NIL)
X				tp = (struct S61 *)NIL;
X	}
X}
X
X void
Xcenv(ip, dp)
X	idptr	ip;
X	declptr	dp;
X{
X	treeptr	tp;
X	symptr	sp;
X	idptr	np;
X	register hashtyp	h;
X
X	{
X		register struct S60 *W54 = &*dp;
X
X		{
X			hashtyp	B55 = 0,
X				B56 = hashmax - 1;
X
X			if (B55 <= B56)
X				for (h = B55; ; h++) {
X					sp = W54->ddecl.A[h];
X					while (sp != (struct S62 *)NIL) {
X						if (sp->lt == lfield) {
X							np = sp->U.V6.lid;
X							tp = sp->lsymdecl->tup->tup;
X							if ((tp->tup->tt == nvariant) && (tp->U.V21.tuid != (struct S59 *)NIL))
X								np = mkconc('.', tp->U.V21.tuid, np);
X							np = mkconc('>', ip, np);
X							sp->U.V6.lid = np;
X						}
X						sp = sp->lnext;
X					}
X					if (h == B56) break;
X				}
X		}
X	}
X}
X
X void
Xeglobid(tp)
X	treeptr	tp;
X{
X	toknidx	j;
X	toknbuf	w;
X
X	gettokn(tp->U.V43.tsym->U.V6.lid->istr, &w);
X	j = 1;
X	if (w.A[1 - 1] == '*')
X		j = 2;
X	while (w.A[j - 1] != null) {
X		Putchr(w.A[j - 1], output);
X		j = j + 1;
X	}
X}
X
X void
Xestmt(tp)
X	treeptr	tp;
X{
X	treeptr	tq;
X	idptr	locid1, locid2;
X	boolean	stusd;
X	char	opc1, opc2;
X
X	while (tp != (struct S61 *)NIL) {
X		switch (tp->tt) {
X		  case nbegin:
X			if (Member((unsigned)(tp->tup->tt), Conset[156]))
X				indent();
X			Putchr('{', output),Putchr('\n', output);
X			increment();
X			estmt(tp->U.V24.tbegin);
X			decrement();
X			indent();
X			Putchr('}', output);
X			if (tp->tup->tt != nif)
X				Putchr('\n', output);
X			break ;
X		  case nrepeat:
X			indent();
X			(void)fprintf(output.fp, "do {\n"), Putl(output, 1);
X			increment();
X			estmt(tp->U.V33.treptstmt);
X			decrement();
X			indent();
X			(void)fprintf(output.fp, "} while (!("), Putl(output, 0);
X			eexpr(tp->U.V33.treptxp);
X			(void)fprintf(output.fp, "));\n"), Putl(output, 1);
X			break ;
X		  case nwhile:
X			indent();
X			(void)fprintf(output.fp, "while ("), Putl(output, 0);
X			increment();
X			eexpr(tp->U.V32.twhixp);
X			stusd = (*G196_setused);
X			if (tp->U.V32.twhistmt->tt == nbegin) {
X				decrement();
X				(void)fprintf(output.fp, ") "), Putl(output, 0);
X				estmt(tp->U.V32.twhistmt);
X			} else {
X				Putchr(')', output),Putchr('\n', output);
X				estmt(tp->U.V32.twhistmt);
X				decrement();
X			}
X			(*G196_setused) = (boolean)(stusd || (*G196_setused));
X			break ;
X		  case nfor:
X			indent();
X			if (tp->U.V34.tincr) {
X				opc1 = '+';
X				opc2 = '<';
X			} else {
X				opc1 = '-';
X				opc2 = '>';
X			}
X			if (!lazyfor) {
X				locid1 = mkvariable('B');
X				locid2 = mkvariable('B');
X				Putchr('{', output),Putchr('\n', output);
X				increment();
X				indent();
X				tq = idup(tp->U.V34.tforid);
X				etypedef(tq->U.V14.tbind);
X				tq = typeof(tq->U.V14.tbind);
X				Putchr(tab1, output);
X				printid(locid1);
X				(void)fprintf(output.fp, " = "), Putl(output, 0);
X				eexpr(tp->U.V34.tfrom);
X				Putchr(',', output),Putchr('\n', output);
X				indent();
X				Putchr(tab1, output);
X				printid(locid2);
X				(void)fprintf(output.fp, " = "), Putl(output, 0);
X				eexpr(tp->U.V34.tto);
X				Putchr(';', output),Putchr('\n', output);
X				Putchr('\n', output);
X				indent();
X				(void)fprintf(output.fp, "if ("), Putl(output, 0);
X				if (tq->tt == nscalar) {
X					(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X					printid(locid1);
X					Putchr(')', output);
X				} else
X					printid(locid1);
X				(void)fprintf(output.fp, " %c= ", opc2), Putl(output, 0);
X				if (tq->tt == nscalar) {
X					(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X					printid(locid2);
X					Putchr(')', output);
X				} else
X					printid(locid2);
X				Putchr(')', output),Putchr('\n', output);
X				increment();
X				indent();
X				tp->U.V34.tfrom = newid(locid1);
X				tp->U.V34.tfrom->tup = tp;
X			}
X			(void)fprintf(output.fp, "for ("), Putl(output, 0);
X			increment();
X			eexpr(tp->U.V34.tforid);
X			tq = typeof(tp->U.V34.tforid);
X			(void)fprintf(output.fp, " = "), Putl(output, 0);
X			eexpr(tp->U.V34.tfrom);
X			(void)fprintf(output.fp, "; "), Putl(output, 0);
X			if (lazyfor) {
X				if (tq->tt == nscalar) {
X					(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X					eexpr(tp->U.V34.tforid);
X					Putchr(')', output);
X				} else
X					eexpr(tp->U.V34.tforid);
X				(void)fprintf(output.fp, " %c= ", opc2), Putl(output, 0);
X				if (tq->tt == nscalar) {
X					(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X					eexpr(tp->U.V34.tto);
X					Putchr(')', output);
X				} else
X					eexpr(tp->U.V34.tto);
X			}
X			(void)fprintf(output.fp, "; "), Putl(output, 0);
X			eexpr(tp->U.V34.tforid);
X			if (tq->tt == nscalar) {
X				(void)fprintf(output.fp, " = ("), Putl(output, 0);
X				eexpr(tq->tup->U.V14.tidl);
X				(void)fprintf(output.fp, ")((int)("), Putl(output, 0);
X				eexpr(tp->U.V34.tforid);
X				(void)fprintf(output.fp, ")%c1)", opc1), Putl(output, 0);
X			} else
X				(void)fprintf(output.fp, "%c%c", opc1, opc1), Putl(output, 0);
X			if (!lazyfor) {
X				if (tp->U.V34.tforstmt->tt != nbegin) {
X					tq = mknode(nbegin);
X					tq->U.V24.tbegin = tp->U.V34.tforstmt;
X					tq->U.V24.tbegin->tup = tq;
X					tp->U.V34.tforstmt = tq;
X					tq->tup = tp;
X				}
X				tq = tp->U.V34.tforstmt->U.V24.tbegin;
X				while (tq->tnext != (struct S61 *)NIL)
X					tq = tq->tnext;
X				tq->tnext = mknode(nbreak);
X				tq = tq->tnext;
X				tq->tup = tp->U.V34.tforstmt;
X				tq->U.V29.tbrkid = tp->U.V34.tforid;
X				tq->U.V29.tbrkxp = newid(locid2);
X				tq->U.V29.tbrkxp->tup = tq;
X			}
X			if (tp->U.V34.tforstmt->tt == nbegin) {
X				decrement();
X				(void)fprintf(output.fp, ") "), Putl(output, 0);
X				estmt(tp->U.V34.tforstmt);
X			} else {
X				Putchr(')', output),Putchr('\n', output);
X				estmt(tp->U.V34.tforstmt);
X				decrement();
X			}
X			if (!lazyfor) {
X				decrement();
X				decrement();
X				indent();
X				Putchr('}', output),Putchr('\n', output);
X			}
X			break ;
X		  case nif:
X			indent();
X			(void)fprintf(output.fp, "if ("), Putl(output, 0);
X			increment();
X			eexpr(tp->U.V31.tifxp);
X			stusd = (*G196_setused);
X			(*G196_setused) = false;
X			if (tp->U.V31.tthen->tt == nbegin) {
X				decrement();
X				(void)fprintf(output.fp, ") "), Putl(output, 0);
X				estmt(tp->U.V31.tthen);
X				if (tp->U.V31.telse != (struct S61 *)NIL)
X					Putchr(space, output);
X				else
X					Putchr('\n', output);
X			} else {
X				Putchr(')', output),Putchr('\n', output);
X				estmt(tp->U.V31.tthen);
X				decrement();
X				if (tp->U.V31.telse != (struct S61 *)NIL)
X					indent();
X			}
X			if (tp->U.V31.telse != (struct S61 *)NIL) {
X				(void)fprintf(output.fp, "else"), Putl(output, 0);
X				if (tp->U.V31.telse->tt == nbegin) {
X					Putchr(space, output);
X					estmt(tp->U.V31.telse);
X					Putchr('\n', output);
X				} else {
X					increment();
X					Putchr('\n', output);
X					estmt(tp->U.V31.telse);
X					decrement();
X				}
X			}
X			(*G196_setused) = (boolean)(stusd || (*G196_setused));
X			break ;
X		  case ncase:
X			indent();
X			(void)fprintf(output.fp, "switch ("), Putl(output, 0);
X			increment();
X			eexpr(tp->U.V35.tcasxp);
X			(void)fprintf(output.fp, ") {\n"), Putl(output, 1);
X			decrement();
X			echoise(tp->U.V35.tcaslst);
X			indent();
X			(void)fprintf(output.fp, "  default:\n"), Putl(output, 1);
X			increment();
X			if (tp->U.V35.tcasother == (struct S61 *)NIL) {
X				indent();
X				(void)fprintf(output.fp, "Caseerror(Line);\n"), Putl(output, 1);
X			} else
X				estmt(tp->U.V35.tcasother);
X			decrement();
X			indent();
X			Putchr('}', output),Putchr('\n', output);
X			break ;
X		  case nwith:
X			indent();
X			Putchr('{', output),Putchr('\n', output);
X			increment();
X			tq = tp->U.V37.twithvar;
X			while (tq != (struct S61 *)NIL) {
X				indent();
X				(void)fprintf(output.fp, "%s", registr), Putl(output, 0);
X				ewithtype(tq->U.V38.texpw);
X				(void)fprintf(output.fp, " *"), Putl(output, 0);
X				locid1 = mkvariable('W');
X				printid(locid1);
X				(void)fprintf(output.fp, " = "), Putl(output, 0);
X				eaddr(tq->U.V38.texpw);
X				Putchr(';', output),Putchr('\n', output);
X				cenv(locid1, tq->U.V38.tenv);
X				tq = tq->tnext;
X			}
X			Putchr('\n', output);
X			if (tp->U.V37.twithstmt->tt == nbegin)
X				estmt(tp->U.V37.twithstmt->U.V24.tbegin);
X			else
X				estmt(tp->U.V37.twithstmt);
X			decrement();
X			indent();
X			Putchr('}', output),Putchr('\n', output);
X			break ;
X		  case ngoto:
X			indent();
X			if (islocal(tp->U.V26.tlabel))
X				(void)fprintf(output.fp, "goto L%1d;\n", tp->U.V26.tlabel->U.V43.tsym->U.V9.lno), Putl(output, 1);
X			else {
X				tq = idup(tp->U.V26.tlabel);
X				(void)fprintf(output.fp, "longjmp(J[%1d].jb, %1d);\n", tq->U.V13.tstat, tp->U.V26.tlabel->U.V43.tsym->U.V9.lno), Putl(output, 1);
X			}
X			break ;
X		  case nlabstmt:
X			decrement();
X			indent();
X			(void)fprintf(output.fp, "L%1d:\n", tp->U.V25.tlabno->U.V43.tsym->U.V9.lno), Putl(output, 1);
X			increment();
X			estmt(tp->U.V25.tstmt);
X			break ;
X		  case nassign:
X			indent();
X			eexpr(tp);
X			Putchr(';', output),Putchr('\n', output);
X			break ;
X		  case ncall:
X			indent();
X			tq = idup(tp->U.V30.tcall);
X			if ((Member((unsigned)(tq->tt), Conset[157])) && (tq->U.V13.tsubstmt != (struct S61 *)NIL))
X				if (tq->U.V13.tsubstmt->tt == npredef)
X					epredef(tq, tp);
X				else {
X					ecall(tp);
X					Putchr(';', output),Putchr('\n', output);
X				}
X			else {
X				ecall(tp);
X				Putchr(';', output),Putchr('\n', output);
X			}
X			break ;
X		  case npush:
X			indent();
X			eglobid(tp->U.V28.ttmp);
X			(void)fprintf(output.fp, " = "), Putl(output, 0);
X			eglobid(tp->U.V28.tglob);
X			Putchr(';', output),Putchr('\n', output);
X			indent();
X			eglobid(tp->U.V28.tglob);
X			(void)fprintf(output.fp, " = "), Putl(output, 0);
X			if (tp->U.V28.tloc->tt == nid) {
X				tq = idup(tp->U.V28.tloc);
X				if (Member((unsigned)(tq->tt), Conset[158]))
X					printid(tp->U.V28.tloc->U.V43.tsym->U.V6.lid);
X				else
X					eaddr(tp->U.V28.tloc);
X			} else
X				eaddr(tp->U.V28.tloc);
X			Putchr(';', output),Putchr('\n', output);
X			break ;
X		  case npop:
X			indent();
X			eglobid(tp->U.V28.tglob);
X			(void)fprintf(output.fp, " = "), Putl(output, 0);
X			eglobid(tp->U.V28.ttmp);
X			Putchr(';', output),Putchr('\n', output);
X			break ;
X		  case nbreak:
X			indent();
X			(void)fprintf(output.fp, "if ("), Putl(output, 0);
X			eexpr(tp->U.V29.tbrkid);
X			(void)fprintf(output.fp, " == "), Putl(output, 0);
X			eexpr(tp->U.V29.tbrkxp);
X			(void)fprintf(output.fp, ") break;\n"), Putl(output, 1);
X			break ;
X		  case nempty:
X			if (!(Member((unsigned)(tp->tup->tt), Conset[159]))) {
X				indent();
X				Putchr(';', output),Putchr('\n', output);
X			}
X			break ;
X		  default:
X			Caseerror(Line);
X		}
X		if ((*G196_setused) && (Member((unsigned)(tp->tup->tt), Conset[160]))) {
X			indent();
X			(void)fprintf(output.fp, "Claimset();\n"), Putl(output, 1);
X			(*G196_setused) = false;
X		}
X		tp = tp->tnext;
X	}
X}
X
X void
Xelabel(tp)
X	treeptr	tp;
X{
X	treeptr	tq;
X	integer	i;
X
X	i = 0;
X	tq = tp->U.V13.tsublab;
X	while (tq != (struct S61 *)NIL) {
X		if (tq->U.V43.tsym->U.V9.lgo)
X			i = i + 1;
X		tq = tq->tnext;
X	}
X	if (i == 1) {
X		tq = tp->U.V13.tsublab;
X		while (!tq->U.V43.tsym->U.V9.lgo)
X			tq = tq->tnext;
X		indent();
X		(void)fprintf(output.fp, "if (setjmp(J[%1d].jb))\n", tp->U.V13.tstat), Putl(output, 1);
X		(void)fprintf(output.fp, "%cgoto L%1d;\n", tab1, tq->U.V43.tsym->U.V9.lno), Putl(output, 1);
X	} else
X		if (i > 1) {
X			indent();
X			(void)fprintf(output.fp, "switch (setjmp(J[%1d].jb)) {\n", tp->U.V13.tstat), Putl(output, 1);
X			indent();
X			(void)fprintf(output.fp, "  case 0:\n"), Putl(output, 1);
X			indent();
X			(void)fprintf(output.fp, "%cbreak\n", tab1), Putl(output, 1);
X			tq = tp->U.V13.tsublab;
X			while (tq != (struct S61 *)NIL) {
X				if (tq->U.V43.tsym->U.V9.lgo) {
X					indent();
X					(void)fprintf(output.fp, "  case %1d:\n", tq->U.V43.tsym->U.V9.lno), Putl(output, 1);
X					indent();
X					(void)fprintf(output.fp, "%cgoto L%1d;\n", tab1, tq->U.V43.tsym->U.V9.lno), Putl(output, 1);
X				}
X				tq = tq->tnext;
X			}
X			indent();
X			(void)fprintf(output.fp, "  default:\n"), Putl(output, 1);
X			indent();
X			(void)fprintf(output.fp, "%cCaseerror(Line)\n", tab1), Putl(output, 1);
X			indent();
X			Putchr('}', output),Putchr('\n', output);
X		}
X}
X
X void
Xeconf(tp)
X	treeptr	tp;
X{
X	treeptr	tq;
X
X	while (tp != (struct S61 *)NIL) {
X		if (tp->tt == nvarpar)
X			if (tp->U.V14.tbind->tt == nconfarr) {
X				indent();
X				etypedef(tp->U.V14.tbind->U.V22.tindtyp);
X				Putchr(tab1, output);
X				tq = tp->U.V14.tbind->U.V22.tcindx->U.V19.tlo;
X				printid(tq->U.V43.tsym->U.V6.lid);
X				(void)fprintf(output.fp, " = ("), Putl(output, 0);
X				etypedef(tp->U.V14.tbind->U.V22.tindtyp);
X				(void)fprintf(output.fp, ")0;\n"), Putl(output, 1);
X			}
X		tp = tp->tnext;
X	}
X}
X
X void
Xesubr(tp)
X	treeptr	tp;
X{
X	treeptr	tq, ti;
X
X	while (tp != (struct S61 *)NIL) {
X		if (tp->U.V13.tsubsub != (struct S61 *)NIL) {
X			etypedef(tp->U.V13.tfuntyp);
X			Putchr(space, output);
X			printid(tp->U.V13.tsubid->U.V43.tsym->U.V6.lid);
X			(void)fprintf(output.fp, "();\n"), Putl(output, 1);
X			Putchr('\n', output);
X			esubr(tp->U.V13.tsubsub);
X		}
X		if (tp->U.V13.tsubstmt == (struct S61 *)NIL) {
X			if (tp->U.V13.tsubid->U.V43.tsym->lsymdecl->tup == tp)
X				(void)fprintf(output.fp, "%s", xtern), Putl(output, 0);
X			etypedef(tp->U.V13.tfuntyp);
X			Putchr(space, output);
X			printid(tp->U.V13.tsubid->U.V43.tsym->U.V6.lid);
X			(void)fprintf(output.fp, "();\n"), Putl(output, 1);
X			goto L999;
X		}
X		Putchr(space, output);
X		etypedef(tp->U.V13.tfuntyp);
X		Putchr('\n', output);
X		printid(tp->U.V13.tsubid->U.V43.tsym->U.V6.lid);
X		Putchr('(', output);
X		tq = tp->U.V13.tsubpar;
X		while (tq != (struct S61 *)NIL) {
X			switch (tq->tt) {
X			  case nvarpar:  case nvalpar:
X				ti = tq->U.V14.tidl;
X				while (ti != (struct S61 *)NIL) {
X					printid(ti->U.V43.tsym->U.V6.lid);
X					ti = ti->tnext;
X					if (ti != (struct S61 *)NIL)
X						(void)fprintf(output.fp, ", "), Putl(output, 0);
X				}
X				if (tq->U.V14.tbind->tt == nconfarr) {
X					ti = tq->U.V14.tbind->U.V22.tcindx->U.V19.thi;
X					(void)fprintf(output.fp, ", "), Putl(output, 0);
X					printid(ti->U.V43.tsym->U.V6.lid);
X				}
X				break ;
X			  case nparproc:  case nparfunc:
X				ti = tq->U.V15.tparid;
X				printid(ti->U.V43.tsym->U.V6.lid);
X				break ;
X			  default:
X				Caseerror(Line);
X			}
X			tq = tq->tnext;
X			if (tq != (struct S61 *)NIL)
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X		}
X		Putchr(')', output),Putchr('\n', output);
X		increment();
X		evar(tp->U.V13.tsubpar);
X		Putchr('{', output),Putchr('\n', output);
X		econf(tp->U.V13.tsubpar);
X		econst(tp->U.V13.tsubconst);
X		etype(tp->U.V13.tsubtype);
X		evar(tp->U.V13.tsubvar);
X		if ((tp->U.V13.tsubconst != (struct S61 *)NIL) || (tp->U.V13.tsubtype != (struct S61 *)NIL) || (tp->U.V13.tsubvar != (struct S61 *)NIL))
X			Putchr('\n', output);
X		elabel(tp);
X		estmt(tp->U.V13.tsubstmt);
X		if (tp->tt == nfunc) {
X			indent();
X			(void)fprintf(output.fp, "return "), Putl(output, 0);
X			printid(tp->U.V13.tsubvar->U.V14.tidl->U.V43.tsym->U.V6.lid);
X			Putchr(';', output),Putchr('\n', output);
X		}
X		decrement();
X		Putchr('}', output),Putchr('\n', output);
X	L999:
X		Putchr('\n', output);
X		tp = tp->tnext;
X	}
X}
X
X boolean
Xuse(d)
X	predefs	d;
X{
X	register boolean	R174;
X
X	R174 = defnams.A[(int)(d)]->U.V6.lused;
X	return R174;
X}
X
Xvoid eprogram();
X
X void
Xcapital(sp)
X	symptr	sp;
X{
X	toknbuf	tb;
X
X	if (sp->U.V6.lid->inref > 1) {
X		gettokn(sp->U.V6.lid->istr, &tb);
X		tb.A[1 - 1] = uppercase(tb.A[1 - 1]);
X		sp->U.V6.lid = saveid(&tb);
X	}
X}
X
X void
Xetextdef()
X{
X	treeptr	tq;
X
X	(void)fprintf(output.fp, "typedef "), Putl(output, 0);
X	tq = mknode(nfileof);
X	tq->U.V18.tof = typnods.A[(int)(tchar)];
X	etypedef(tq);
X	(void)fprintf(output.fp, "%ctext;\n", tab1), Putl(output, 1);
X}
X
X void
Xeprogram(tp)
X	treeptr	tp;
X{
X	if (tp->U.V13.tsubid != (struct S61 *)NIL) {
X		(void)fprintf(output.fp, "/*\n"), Putl(output, 1);
X		(void)fprintf(output.fp, "**	Code derived from program "), Putl(output, 0);
X		printid(tp->U.V13.tsubid->U.V43.tsym->U.V6.lid);
X		Putchr('\n', output);
X		(void)fprintf(output.fp, "*/\n"), Putl(output, 1);
X		(void)fprintf(output.fp, "%s%s%cexit();\n", xtern, voidtyp, tab1), Putl(output, 1);
X	}
X	if (usecase || usesets || use(dinput) || use(doutput) || use(dwrite) || use(dwriteln) || use(dmessage) || use(deof) || use(deoln) || use(dflush) || use(dpage) || use(dread) || use(dreadln) || use(dclose) || use(dreset) || use(drewrite) || use(dget) || us
X
END_OF_FILE
if test 39665 -ne `wc -c <'ptc.c.5'`; then
    echo shar: \"'ptc.c.5'\" unpacked with wrong size!
fi
# end of 'ptc.c.5'
fi
echo shar: End of archive 7 \(of 12\).
cp /dev/null ark7isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 12 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 

Rich $alz			"Anger is an energy"
Cronus Project, BBN Labs	rsalz@bbn.com
Moderator, comp.sources.unix	sources@uunet*)lse
X