[comp.sources.unix] v10i070: Pascal to C translator, Part06/12

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

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


#! /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 6 (of 12)."
# Contents:  ptc.c.4
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ptc.c.4' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ptc.c.4'\"
else
echo shar: Extracting \"'ptc.c.4'\" \(37883 characters\)
sed "s/^X//" >'ptc.c.4' <<'END_OF_FILE'
X		renamp(tp->U.V13.tsubsub, true);
X		if (on && (tp->U.V13.tsubstmt != (struct S61 *)NIL)) {
X			sp = tp->U.V13.tsubid->U.V43.tsym;
X			if (sp->U.V6.lid->inref > 1) {
X				sp->U.V6.lid = mkrename('P', sp->U.V6.lid);
X				sp->U.V6.lid->inref = sp->U.V6.lid->inref - 1;
X			}
X		}
X		tp = tp->tnext;
X	}
X}
X
Xvoid initcode();
X
X boolean
Xfilevar(tp)
X	treeptr	tp;
X{
X	register boolean	R168;
X	boolean	fv;
X	treeptr	tq;
X
X	switch (tp->tt) {
X	  case npredef:
X		fv = (boolean)(tp == typnods.A[(int)(ttext)]);
X		break ;
X	  case nfileof:
X		fv = true;
X		break ;
X	  case nconfarr:
X		fv = filevar(typeof(tp->U.V22.tcelem));
X		break ;
X	  case narray:
X		fv = filevar(typeof(tp->U.V23.taelem));
X		break ;
X	  case nrecord:
X		fv = false;
X		tq = tp->U.V21.tvlist;
X		while (tq != (struct S61 *)NIL) {
X			if (filevar(tq->U.V20.tvrnt))
X				error(evrntfile);
X			tq = tq->tnext;
X		}
X		tq = tp->U.V21.tflist;
X		while (tq != (struct S61 *)NIL) {
X			if (filevar(typeof(tq->U.V14.tbind))) {
X				fv = true;
X				tq = (struct S61 *)NIL;
X			} else
X				tq = tq->tnext;
X		}
X		break ;
X	  case nptr:
X		fv = false;
X		if (!tp->U.V16.tptrflag) {
X			tp->U.V16.tptrflag = true;
X			if (filevar(typeof(tp->U.V16.tptrid)))
X				error(evarfile);
X			tp->U.V16.tptrflag = false;
X		}
X		break ;
X	  case nsubrange:  case nscalar:  case nsetof:
X		fv = false;
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X	R168 = fv;
X	return R168;
X}
X
X treeptr
Xfileinit(ti, tq, opn)
X	treeptr	ti, tq;
X	boolean	opn;
X{
X	register treeptr	R169;
X	treeptr	tx, ty, tz;
X
X	switch (tq->tt) {
X	  case narray:
X		tz = newid(mkvariable('I'));
X		ty = mknode(nvar);
X		ty->U.V14.tattr = aregister;
X		ty->U.V14.tidl = tz;
X		ty->U.V14.tbind = typeof(tq->U.V23.taindx);
X		tz = tq;
X		while (!(Member((unsigned)(tz->tt), Conset[137])))
X			tz = tz->tup;
X		linkup(tz, ty);
X		if (tz->U.V13.tsubvar == (struct S61 *)NIL)
X			tz->U.V13.tsubvar = ty;
X		else {
X			tz = tz->U.V13.tsubvar;
X			while (tz->tnext != (struct S61 *)NIL)
X				tz = tz->tnext;
X			tz->tnext = ty;
X		}
X		ty = ty->U.V14.tidl;
X		tz = mknode(nindex);
X		tz->U.V39.tvariable = ti;
X		tz->U.V39.toffset = ty;
X		tz = fileinit(tz, tq->U.V23.taelem, opn);
X		tx = mknode(nfor);
X		tx->U.V34.tforid = ty;
X		ty = typeof(tq->U.V23.taindx);
X		if (ty->tt == nsubrange) {
X			tx->U.V34.tfrom = ty->U.V19.tlo;
X			tx->U.V34.tto = ty->U.V19.thi;
X		} else
X			if (ty->tt == nscalar) {
X				ty = ty->U.V17.tscalid;
X				tx->U.V34.tfrom = ty;
X				while (ty->tnext != (struct S61 *)NIL)
X					ty = ty->tnext;
X				tx->U.V34.tto = ty;
X			} else
X				if (ty == typnods.A[(int)(tchar)]) {
X					currsym.st = schar;
X					currsym.U.V2.vchr = minchar;
X					tx->U.V34.tfrom = mklit();
X					currsym.st = schar;
X					currsym.U.V2.vchr = maxchar;
X					tx->U.V34.tto = mklit();
X				} else
X					if (ty == typnods.A[(int)(tinteger)]) {
X						currsym.st = sinteger;
X						currsym.U.V3.vint = -maxint;
X						tx->U.V34.tfrom = mklit();
X						currsym.st = sinteger;
X						currsym.U.V3.vint = maxint;
X						tx->U.V34.tto = mklit();
X					} else
X						fatal(etree);
X		tx->U.V34.tforstmt = tz;
X		tx->U.V34.tincr = true;
X		break ;
X	  case npredef:  case nfileof:
X		if (opn) {
X			ty = mknode(nselect);
X			ty->U.V40.trecord = ti;
X			ty->U.V40.tfield = oldid(defnams.A[(int)(dzinit)]->U.V6.lid, lforward);
X			tx = mknode(nassign);
X			tx->U.V27.tlhs = ty;
X			currsym.st = sinteger;
X			currsym.U.V3.vint = 0;
X			tx->U.V27.trhs = mklit();
X		} else {
X			tx = mknode(ncall);
X			tx->U.V30.tcall = oldid(defnams.A[(int)(dclose)]->U.V6.lid, lidentifier);
X			tx->U.V30.taparm = ti;
X		}
X		break ;
X	  case nrecord:
X		ty = (struct S61 *)NIL;
X		tq = tq->U.V21.tflist;
X		while (tq != (struct S61 *)NIL) {
X			if (filevar(typeof(tq->U.V14.tbind))) {
X				tz = tq->U.V14.tidl;
X				while (tz != (struct S61 *)NIL) {
X					tx = mknode(nselect);
X					tx->U.V40.trecord = ti;
X					tx->U.V40.tfield = tz;
X					tx = fileinit(tx, typeof(tq->U.V14.tbind), opn);
X					tx->tnext = ty;
X					ty = tx;
X					tz = tz->tnext;
X				}
X			}
X			tq = tq->tnext;
X		}
X		tx = mknode(nbegin);
X		tx->U.V24.tbegin = ty;
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X	R169 = tx;
X	return R169;
X}
X
X void
Xinitcode(tp)
X	treeptr	tp;
X{
X	treeptr	ti, tq, tu, tv;
X
X	while (tp != (struct S61 *)NIL) {
X		initcode(tp->U.V13.tsubsub);
X		tv = tp->U.V13.tsubvar;
X		while (tv != (struct S61 *)NIL) {
X			tq = typeof(tv->U.V14.tbind);
X			if (filevar(tq)) {
X				ti = tv->U.V14.tidl;
X				while (ti != (struct S61 *)NIL) {
X					tu = fileinit(ti, tq, true);
X					linkup(tp, tu);
X					tu->tnext = tp->U.V13.tsubstmt;
X					tp->U.V13.tsubstmt = tu;
X					while (tu->tnext != (struct S61 *)NIL)
X						tu = tu->tnext;
X					tu->tnext = fileinit(ti, tq, false);
X					linkup(tp, tu->tnext);
X					ti = ti->tnext;
X				}
X			}
X			tv = tv->tnext;
X		}
X		tp = tp->tnext;
X	}
X}
X
X void
Xtransform()
X{
X	renamc();
X	renamp(top->U.V13.tsubsub, false);
X	extract(top);
X	renamf(top);
X	initcode(top->U.V13.tsubsub);
X	global(top, top, false);
X}
X
Xvoid emit();
X
X void
Xincrement()
X{
X	(*G204_indnt) = (*G204_indnt) + indstep;
X}
X
X void
Xdecrement()
X{
X	(*G204_indnt) = (*G204_indnt) - indstep;
X}
X
X void
Xindent()
X{
X	integer	i;
X
X	i = (*G204_indnt);
X	if (i > 60)
X		i = i / tabwidth * tabwidth;
X	while (i >= tabwidth) {
X		Putchr(tab1, output);
X		i = i - tabwidth;
X	}
X	while (i > 0) {
X		Putchr(space, output);
X		i = i - 1;
X	}
X}
X
X boolean
Xarithexpr(tp)
X	treeptr	tp;
X{
X	register boolean	R170;
X
X	tp = typeof(tp);
X	if (tp->tt == nsubrange)
X		if (tp->tup->tt == nconfarr)
X			tp = typeof(tp->tup->U.V22.tindtyp);
X		else
X			tp = typeof(tp->U.V19.tlo);
X	R170 = (boolean)((tp == typnods.A[(int)(tinteger)]) || (tp == typnods.A[(int)(tchar)]) || (tp == typnods.A[(int)(treal)]));
X	return R170;
X}
X
Xvoid eexpr();
X
Xvoid etypedef();
X
X void
Xeselect(tp)
X	treeptr	tp;
X{
X	(*G202_doarrow) = (*G202_doarrow) + 1;
X	eexpr(tp);
X	(*G202_doarrow) = (*G202_doarrow) - 1;
X	if ((*G200_donearr))
X		(*G200_donearr) = false;
X	else
X		Putchr('.', output);
X}
X
Xvoid epredef();
X
X char
Xtypeletter(tp)
X	treeptr	tp;
X{
X	register char	R171;
X	treeptr	tq;
X
X	tq = tp;
X	if (tq->tt == nformat) {
X		if (tq->U.V41.texpl->tt == nformat) {
X			R171 = 'f';
X			goto L999;
X		}
X		tq = tp->U.V41.texpl;
X	}
X	tq = typeof(tq);
X	if (tq->tt == nsubrange)
X		tq = typeof(tq->U.V19.tlo);
X	if (tq == typnods.A[(int)(tstring)])
X		R171 = 's';
X	else
X		if (tq == typnods.A[(int)(tinteger)])
X			R171 = 'd';
X		else
X			if (tq == typnods.A[(int)(tchar)])
X				R171 = 'c';
X			else
X				if (tq == typnods.A[(int)(treal)])
X					if (tp->tt == nformat)
X						R171 = 'e';
X					else
X						R171 = 'g';
X				else
X					if (tq == typnods.A[(int)(tboolean)]) {
X						R171 = 'b';
X						(*G191_nelems) = 6;
X					} else
X						if (tq->tt == narray) {
X							R171 = 'a';
X							(*G191_nelems) = crange(tq->U.V23.taindx);
X						} else
X							if (tq->tt == nconfarr) {
X								R171 = 'v';
X								(*G191_nelems) = 0;
X							} else
X								fatal(etree);
XL999:
X	;
X	return R171;
X}
X
X void
Xetxt(tp)
X	treeptr	tp;
X{
X	toknbuf	w;
X	char	c;
X	toknidx	i;
X
X	switch (tp->tt) {
X	  case nid:
X		tp = idup(tp);
X		if (tp->tt == nconst)
X			etxt(tp->U.V14.tbind);
X		else
X			fatal(etree);
X		break ;
X	  case nstring:
X		gettokn(tp->U.V43.tsym->U.V7.lstr, &w);
X		i = 1;
X		while (w.A[i - 1] != null) {
X			c = w.A[i - 1];
X			if ((c == cite) || (c == bslash))
X				Putchr(bslash, output);
X			else
X				if (c == percent)
X					Putchr(percent, output);
X			Putchr(c, output);
X			i = i + 1;
X		}
X		break ;
X	  case nchar:
X		c = tp->U.V43.tsym->U.V11.lchar;
X		if ((c == cite) || (c == bslash))
X			Putchr(bslash, output);
X		else
X			if (c == percent)
X				Putchr(percent, output);
X		Putchr(c, output);
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X}
X
X void
Xeformat(tq)
X	treeptr	tq;
X{
X	treeptr	tx;
X	integer	i;
X
X	switch (typeletter(tq)) {
X	  case 'a':
X		Putchr(percent, output);
X		if (tq->tt == nformat)
X			if (tq->U.V41.texpr->tt == ninteger)
X				eexpr(tq->U.V41.texpr);
X			else
X				Putchr('*', output);
X		(void)fprintf(output.fp, ".%1ds", (*G191_nelems)), Putl(output, 0);
X		break ;
X	  case 'b':
X		Putchr(percent, output);
X		if (tq->tt == nformat) {
X			if (tq->U.V41.texpr->tt == ninteger)
X				eexpr(tq->U.V41.texpr);
X			else
X				Putchr('*', output);
X		}
X		Putchr('s', output);
X		break ;
X	  case 'c':
X		if (tq->tt == nchar)
X			etxt(tq);
X		else {
X			Putchr(percent, output);
X			if (tq->tt == nformat)
X				if (tq->U.V41.texpr->tt == ninteger)
X					eexpr(tq->U.V41.texpr);
X				else
X					Putchr('*', output);
X			Putchr('c', output);
X		}
X		break ;
X	  case 'd':
X		Putchr(percent, output);
X		if (tq->tt == nformat) {
X			if (tq->U.V41.texpr->tt == ninteger)
X				eexpr(tq->U.V41.texpr);
X			else
X				Putchr('*', output);
X		} else
X			(void)fprintf(output.fp, "%1d", intlen), Putl(output, 0);
X		Putchr('d', output);
X		break ;
X	  case 'e':
X		(void)fprintf(output.fp, "%c%c", percent, space), Putl(output, 0);
X		tx = tq->U.V41.texpr;
X		if (tx->tt == ninteger) {
X			i = cvalof(tx);
X			(void)fprintf(output.fp, "%1d.", i), Putl(output, 0);
X			i = i - 7;
X			if (i < 1)
X				Putchr('1', output);
X			else
X				(void)fprintf(output.fp, "%1d", i), Putl(output, 0);
X		} else
X			(void)fprintf(output.fp, "*.*"), Putl(output, 0);
X		Putchr('e', output);
X		break ;
X	  case 'f':
X		Putchr(percent, output);
X		tx = tq->U.V41.texpl;
X		if (tx->U.V41.texpr->tt == ninteger) {
X			eexpr(tx->U.V41.texpr);
X			Putchr('.', output);
X			tx = tq->U.V41.texpr;
X			if (tx->tt == ninteger) {
X				i = cvalof(tx);
X				tx = tq->U.V41.texpl->U.V41.texpr;
X				if (i > cvalof(tx) - 1)
X					Putchr('1', output);
X				else
X					(void)fprintf(output.fp, "%1d", i), Putl(output, 0);
X			} else
X				Putchr('*', output);
X		} else
X			(void)fprintf(output.fp, "*.*"), Putl(output, 0);
X		Putchr('f', output);
X		break ;
X	  case 'g':
X		(void)fprintf(output.fp, "%c%1de", percent, fixlen), Putl(output, 0);
X		break ;
X	  case 's':
X		if (tq->tt == nstring)
X			etxt(tq);
X		else {
X			Putchr(percent, output);
X			if (tq->tt == nformat)
X				if (tq->U.V41.texpr->tt == ninteger)
X					eexpr(tq->U.V41.texpr);
X				else
X					(void)fprintf(output.fp, "*.*"), Putl(output, 0);
X			Putchr('s', output);
X		}
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X}
X
X void
Xewrite(tq)
X	treeptr	tq;
X{
X	treeptr	tx;
X
X	switch (typeletter(tq)) {
X	  case 'a':
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		tx = tq;
X		if (tq->tt == nformat) {
X			if (tq->U.V41.texpr->tt != ninteger) {
X				eexpr(tq->U.V41.texpr);
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X			}
X			tx = tq->U.V41.texpl;
X		}
X		eexpr(tx);
X		(void)fprintf(output.fp, ".A"), Putl(output, 0);
X		break ;
X	  case 'b':
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		tx = tq;
X		if (tq->tt == nformat) {
X			if (tq->U.V41.texpr->tt != ninteger) {
X				eexpr(tq->U.V41.texpr);
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X			}
X			tx = tq->U.V41.texpl;
X		}
X		usebool = true;
X		(void)fprintf(output.fp, "Bools[(int)("), Putl(output, 0);
X		eexpr(tx);
X		(void)fprintf(output.fp, ")]"), Putl(output, 0);
X		break ;
X	  case 'c':
X		if (tq->tt == nformat) {
X			if (tq->U.V41.texpr->tt != ninteger) {
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				eexpr(tq->U.V41.texpr);
X			}
X			(void)fprintf(output.fp, ", "), Putl(output, 0);
X			eexpr(tq->U.V41.texpl);
X		} else
X			if (tq->tt != nchar) {
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				eexpr(tq);
X			}
X		break ;
X	  case 'd':
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		tx = tq;
X		if (tq->tt == nformat) {
X			if (tq->U.V41.texpr->tt != ninteger) {
X				eexpr(tq->U.V41.texpr);
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X			}
X			tx = tq->U.V41.texpl;
X		}
X		eexpr(tx);
X		break ;
X	  case 'e':
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		tx = tq->U.V41.texpr;
X		if (tx->tt != ninteger) {
X			usemax = true;
X			eexpr(tx);
X			(void)fprintf(output.fp, ", Max("), Putl(output, 0);
X			eexpr(tx);
X			(void)fprintf(output.fp, " - 7, 1), "), Putl(output, 0);
X		}
X		eexpr(tq->U.V41.texpl);
X		break ;
X	  case 'f':
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		tx = tq->U.V41.texpl;
X		if (tx->U.V41.texpr->tt != ninteger) {
X			eexpr(tx->U.V41.texpr);
X			(void)fprintf(output.fp, ", "), Putl(output, 0);
X		}
X		if ((tx->U.V41.texpr->tt != ninteger) || (tq->U.V41.texpr->tt != ninteger)) {
X			usemax = true;
X			(void)fprintf(output.fp, "Max(("), Putl(output, 0);
X			eexpr(tx->U.V41.texpr);
X			(void)fprintf(output.fp, ") - ("), Putl(output, 0);
X			eexpr(tq->U.V41.texpr);
X			(void)fprintf(output.fp, ") - 1, 1), "), Putl(output, 0);
X		}
X		eexpr(tq->U.V41.texpl->U.V41.texpl);
X		break ;
X	  case 'g':
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		eexpr(tq);
X		break ;
X	  case 's':
X		if (tq->tt == nformat) {
X			if (tq->U.V41.texpr->tt != ninteger) {
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				eexpr(tq->U.V41.texpr);
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				eexpr(tq->U.V41.texpr);
X			}
X			(void)fprintf(output.fp, ", "), Putl(output, 0);
X			eexpr(tq->U.V41.texpl);
X		} else
X			if (tq->tt != nstring) {
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				eexpr(tq);
X			}
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X}
X
Xvoid enewsize();
X
X void
Xesubsize(tp, tq)
X	treeptr	tp, tq;
X{
X	treeptr	tx, ty;
X	boolean	addsize;
X
X	tx = tq->U.V20.tvrnt;
X	ty = tx->U.V21.tflist;
X	if (ty == (struct S61 *)NIL) {
X		ty = tx->U.V21.tvlist;
X		while (ty != (struct S61 *)NIL) {
X			if (ty->U.V20.tvrnt->U.V21.tflist != (struct S61 *)NIL) {
X				ty = ty->U.V20.tvrnt->U.V21.tflist;
X				goto L555;
X			}
X			ty = ty->tnext;
X		}
X	L555:
X		;
X	}
X	addsize = true;
X	if (ty == (struct S61 *)NIL) {
X		addsize = false;
X		ty = tx->tup->tup->U.V21.tvlist;
X		while (ty != (struct S61 *)NIL) {
X			if (ty->U.V20.tvrnt->U.V21.tflist != (struct S61 *)NIL) {
X				ty = ty->U.V20.tvrnt->U.V21.tflist;
X				goto L666;
X			}
X			ty = ty->tnext;
X		}
X	L666:
X		;
X	}
X	if (ty == (struct S61 *)NIL) {
X		(void)fprintf(output.fp, "sizeof(*"), Putl(output, 0);
X		eexpr(tp);
X		Putchr(')', output);
X	} else {
X		(void)fprintf(output.fp, "Unionoffs("), Putl(output, 0);
X		eexpr(tp);
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		printid(ty->U.V14.tidl->U.V43.tsym->U.V6.lid);
X		if (addsize) {
X			(void)fprintf(output.fp, ") + sizeof("), Putl(output, 0);
X			eexpr(tp);
X			(void)fprintf(output.fp, "->"), Putl(output, 0);
X			printid(tx->U.V21.tuid);
X		}
X		Putchr(')', output);
X	}
X}
X
X void
Xenewsize(tp)
X	treeptr	tp;
X{
X	treeptr	tq, tx, ty;
X	integer	v;
X
X	if ((tp->tnext != (struct S61 *)NIL) && unionnew) {
X		v = cvalof(tp->tnext);
X		tq = typeof(tp);
X		tq = typeof(tq->U.V16.tptrid);
X		if (tq->tt != nrecord)
X			fatal(etree);
X		tx = tq->U.V21.tvlist;
X		while (tx != (struct S61 *)NIL) {
X			ty = tx->U.V20.tselct;
X			while (ty != (struct S61 *)NIL) {
X				if (v == cvalof(ty))
X					goto L555;
X				ty = ty->tnext;
X			}
X			tx = tx->tnext;
X		}
X		fatal(etag);
X	L555:
X		esubsize(tp, tx);
X	} else {
X		(void)fprintf(output.fp, "sizeof(*"), Putl(output, 0);
X		eexpr(tp);
X		Putchr(')', output);
X	}
X}
X
X void
Xepredef(ts, tp)
X	treeptr	ts, tp;
X{
X	treeptr	tq, tv, tx;
X	predefs	td;
X	integer	nelems;
X	char	ch;
X	boolean	txtfile;
X	integer	*F192;
X
X	F192 = G191_nelems;
X	G191_nelems = &nelems;
X	td = ts->U.V13.tsubstmt->U.V12.tdef;
X	switch (td) {
X	  case dabs:
X		tq = typeof(tp->U.V30.taparm);
X		if ((tq == typnods.A[(int)(tinteger)]) || (tq->tt == nsubrange))
X			(void)fprintf(output.fp, "abs("), Putl(output, 0);
X		else
X			(void)fprintf(output.fp, "fabs("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dargv:
X		(void)fprintf(output.fp, "Argvgt("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		eexpr(tp->U.V30.taparm->tnext);
X		(void)fprintf(output.fp, ".A, sizeof("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm->tnext);
X		(void)fprintf(output.fp, ".A));\n"), Putl(output, 1);
X		break ;
X	  case dchr:
X		tq = typeof(tp->U.V30.taparm);
X		if (tq->tt == nsubrange)
X			if (tq->tup->tt == nconfarr)
X				tq = typeof(tq->tup->U.V22.tindtyp);
X			else
X				tq = typeof(tq->U.V19.tlo);
X		if ((tq == typnods.A[(int)(tinteger)]) || (tq == typnods.A[(int)(tchar)]))
X			eexpr(tp->U.V30.taparm);
X		else {
X			(void)fprintf(output.fp, "(char)("), Putl(output, 0);
X			eexpr(tp->U.V30.taparm);
X			Putchr(')', output);
X		}
X		break ;
X	  case ddispose:
X		(void)fprintf(output.fp, "free("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ");\n"), Putl(output, 1);
X		break ;
X	  case deof:
X		(void)fprintf(output.fp, "Eof("), Putl(output, 0);
X		if (tp->U.V30.taparm == (struct S61 *)NIL) {
X			defnams.A[(int)(dinput)]->U.V6.lused = true;
X			printid(defnams.A[(int)(dinput)]->U.V6.lid);
X		} else
X			eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case deoln:
X		(void)fprintf(output.fp, "Eoln("), Putl(output, 0);
X		if (tp->U.V30.taparm == (struct S61 *)NIL) {
X			defnams.A[(int)(dinput)]->U.V6.lused = true;
X			printid(defnams.A[(int)(dinput)]->U.V6.lid);
X		} else
X			eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dexit:
X		(void)fprintf(output.fp, "exit("), Putl(output, 0);
X		if (tp->U.V30.taparm == (struct S61 *)NIL)
X			Putchr('0', output);
X		else
X			eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ");\n"), Putl(output, 1);
X		break ;
X	  case dflush:
X		(void)fprintf(output.fp, "fflush("), Putl(output, 0);
X		if (tp->U.V30.taparm == (struct S61 *)NIL) {
X			defnams.A[(int)(doutput)]->U.V6.lused = true;
X			printid(defnams.A[(int)(doutput)]->U.V6.lid);
X		} else
X			eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ".fp);\n"), Putl(output, 1);
X		break ;
X	  case dpage:
X		(void)fprintf(output.fp, "Putchr(%s, ", ffchr), Putl(output, 0);
X		if (tp->U.V30.taparm == (struct S61 *)NIL) {
X			defnams.A[(int)(doutput)]->U.V6.lused = true;
X			printid(defnams.A[(int)(doutput)]->U.V6.lid);
X		} else
X			eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ");\n"), Putl(output, 1);
X		break ;
X	  case dput:  case dget:
X		if (typeof(tp->U.V30.taparm) == typnods.A[(int)(ttext)])
X			if (td == dget)
X				(void)fprintf(output.fp, "Getx"), Putl(output, 0);
X			else
X				(void)fprintf(output.fp, "Putx"), Putl(output, 0);
X		else {
X			(void)fprintf(output.fp, "%s", voidcast), Putl(output, 0);
X			if (td == dget)
X				(void)fprintf(output.fp, "Get"), Putl(output, 0);
X			else
X				(void)fprintf(output.fp, "Put"), Putl(output, 0);
X		}
X		Putchr('(', output);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ");\n"), Putl(output, 1);
X		break ;
X	  case dhalt:
X		(void)fprintf(output.fp, "abort();\n"), Putl(output, 1);
X		break ;
X	  case dnew:
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, " = ("), Putl(output, 0);
X		etypedef(typeof(tp->U.V30.taparm));
X		(void)fprintf(output.fp, ")malloc((unsigned)("), Putl(output, 0);
X		enewsize(tp->U.V30.taparm);
X		(void)fprintf(output.fp, "));\n"), Putl(output, 1);
X		break ;
X	  case dord:
X		(void)fprintf(output.fp, "(unsigned)("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dread:  case dreadln:
X		txtfile = false;
X		tq = tp->U.V30.taparm;
X		if (tq != (struct S61 *)NIL) {
X			tv = typeof(tq);
X			if (tv == typnods.A[(int)(ttext)]) {
X				txtfile = true;
X				tv = tq;
X				tq = tq->tnext;
X			} else
X				if (tv->tt == nfileof) {
X					txtfile = (boolean)(typeof(tv->U.V18.tof) == typnods.A[(int)(tchar)]);
X					tv = tq;
X					tq = tq->tnext;
X				} else {
X					txtfile = true;
X					tv = (struct S61 *)NIL;
X				}
X		} else {
X			tv = (struct S61 *)NIL;
X			txtfile = true;
X		}
X		if (txtfile) {
X			if (tq == (struct S61 *)NIL)
X				goto L444;
X			if ((tq->tt != nformat) && (tq->tnext == (struct S61 *)NIL) && (typeletter(tq) == 'c')) {
X				eexpr(tq);
X				(void)fprintf(output.fp, " = "), Putl(output, 0);
X				(void)fprintf(output.fp, "Getchr("), Putl(output, 0);
X				if (tv == (struct S61 *)NIL)
X					printid(defnams.A[(int)(dinput)]->U.V6.lid);
X				else
X					eexpr(tv);
X				Putchr(')', output);
X				if (td == dreadln)
X					Putchr(',', output);
X				goto L444;
X			}
X			usescan = true;
X			(void)fprintf(output.fp, "Fscan("), Putl(output, 0);
X			if (tv == (struct S61 *)NIL)
X				printid(defnams.A[(int)(dinput)]->U.V6.lid);
X			else
X				eexpr(tv);
X			(void)fprintf(output.fp, "), "), Putl(output, 0);
X			while (tq != (struct S61 *)NIL) {
X				(void)fprintf(output.fp, "Scan(%c", cite), Putl(output, 0);
X				ch = typeletter(tq);
X				switch (ch) {
X				  case 'a':
X					(void)fprintf(output.fp, "%cs", percent), Putl(output, 0);
X					break ;
X				  case 'c':
X					(void)fprintf(output.fp, "%cc", percent), Putl(output, 0);
X					break ;
X				  case 'd':
X					(void)fprintf(output.fp, "%cld", percent), Putl(output, 0);
X					break ;
X				  case 'g':
X					(void)fprintf(output.fp, "%cle", percent), Putl(output, 0);
X					break ;
X				  default:
X					Caseerror(Line);
X				}
X				(void)fprintf(output.fp, "%c, ", cite), Putl(output, 0);
X				switch (ch) {
X				  case 'a':
X					eexpr(tq);
X					(void)fprintf(output.fp, ".A"), Putl(output, 0);
X					break ;
X				  case 'c':
X					Putchr('&', output);
X					eexpr(tq);
X					break ;
X				  case 'd':
X					(void)fprintf(output.fp, "&Tmplng"), Putl(output, 0);
X					break ;
X				  case 'g':
X					(void)fprintf(output.fp, "&Tmpdbl"), Putl(output, 0);
X					break ;
X				  default:
X					Caseerror(Line);
X				}
X				Putchr(')', output);
X				switch (ch) {
X				  case 'd':
X					(void)fprintf(output.fp, ", "), Putl(output, 0);
X					eexpr(tq);
X					(void)fprintf(output.fp, " = Tmplng"), Putl(output, 0);
X					break ;
X				  case 'g':
X					(void)fprintf(output.fp, ", "), Putl(output, 0);
X					eexpr(tq);
X					(void)fprintf(output.fp, " = Tmpdbl"), Putl(output, 0);
X					break ;
X				  case 'a':  case 'c':
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					Putchr(tab1, output);
X				}
X			}
X			(void)fprintf(output.fp, ", Getx("), Putl(output, 0);
X			if (tv == (struct S61 *)NIL)
X				printid(defnams.A[(int)(dinput)]->U.V6.lid);
X			else
X				eexpr(tv);
X			Putchr(')', output);
X			if (td == dreadln)
X				Putchr(',', output);
X		L444:
X			if (td == dreadln) {
X				usegetl = true;
X				(void)fprintf(output.fp, "Getl(&"), Putl(output, 0);
X				if (tv == (struct S61 *)NIL)
X					printid(defnams.A[(int)(dinput)]->U.V6.lid);
X				else
X					eexpr(tv);
X				Putchr(')', output);
X			}
X		} else {
X			increment();
X			while (tq != (struct S61 *)NIL) {
X				(void)fprintf(output.fp, "%sFread(", voidcast), Putl(output, 0);
X				eexpr(tq);
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				eexpr(tv);
X				(void)fprintf(output.fp, ".fp)"), Putl(output, 0);
X				tq = tq->tnext;
X				if (tq != (struct S61 *)NIL) {
X					Putchr(',', output),Putchr('\n', output);
X					indent();
X				}
X			}
X			decrement();
X		}
X		Putchr(';', output),Putchr('\n', output);
X		break ;
X	  case dwrite:  case dwriteln:  case dmessage:
X		txtfile = false;
X		tq = tp->U.V30.taparm;
X		if (tq != (struct S61 *)NIL) {
X			tv = typeof(tq);
X			if (tv == typnods.A[(int)(ttext)]) {
X				txtfile = true;
X				tv = tq;
X				tq = tq->tnext;
X			} else
X				if (tv->tt == nfileof) {
X					txtfile = (boolean)(typeof(tv->U.V18.tof) == typnods.A[(int)(tchar)]);
X					tv = tq;
X					tq = tq->tnext;
X				} else {
X					txtfile = true;
X					tv = (struct S61 *)NIL;
X				}
X		} else {
X			tv = (struct S61 *)NIL;
X			txtfile = true;
X		}
X		if (txtfile) {
X			if (tq == (struct S61 *)NIL) {
X				if (Member((unsigned)(td), Conset[138])) {
X					(void)fprintf(output.fp, "Putchr(%s, ", nlchr), Putl(output, 0);
X					if (tv == (struct S61 *)NIL)
X						printid(defnams.A[(int)(doutput)]->U.V6.lid);
X					else
X						eexpr(tv);
X					Putchr(')', output);
X				}
X				Putchr(';', output),Putchr('\n', output);
X				goto L555;
X			} else
X				if ((tq->tt != nformat) && (tq->tnext == (struct S61 *)NIL))
X					if (typeletter(tq) == 'c') {
X						(void)fprintf(output.fp, "Putchr("), Putl(output, 0);
X						eexpr(tq);
X						(void)fprintf(output.fp, ", "), Putl(output, 0);
X						if (tv == (struct S61 *)NIL)
X							printid(defnams.A[(int)(doutput)]->U.V6.lid);
X						else
X							eexpr(tv);
X						Putchr(')', output);
X						if (td == dwriteln) {
X							(void)fprintf(output.fp, ",Putchr(%s, ", nlchr), Putl(output, 0);
X							if (tv == (struct S61 *)NIL)
X								printid(defnams.A[(int)(doutput)]->U.V6.lid);
X							else
X								eexpr(tv);
X							Putchr(')', output);
X						}
X						Putchr(';', output),Putchr('\n', output);
X						goto L555;
X					}
X			tx = (struct S61 *)NIL;
X			(void)fprintf(output.fp, "%sfprintf(", voidcast), Putl(output, 0);
X			if (td == dmessage)
X				(void)fprintf(output.fp, "stderr, "), Putl(output, 0);
X			else {
X				if (tv == (struct S61 *)NIL)
X					printid(defnams.A[(int)(doutput)]->U.V6.lid);
X				else
X					eexpr(tv);
X				(void)fprintf(output.fp, ".fp, "), Putl(output, 0);
X			}
X			Putchr(cite, output);
X			tx = tq;
X			while (tq != (struct S61 *)NIL) {
X				eformat(tq);
X				tq = tq->tnext;
X			}
X			if ((td == dmessage) || (td == dwriteln))
X				(void)fprintf(output.fp, "\\n"), Putl(output, 0);
X			Putchr(cite, output);
X			tq = tx;
X			while (tq != (struct S61 *)NIL) {
X				ewrite(tq);
X				tq = tq->tnext;
X			}
X			(void)fprintf(output.fp, "), Putl("), Putl(output, 0);
X			if (tv == (struct S61 *)NIL)
X				printid(defnams.A[(int)(doutput)]->U.V6.lid);
X			else
X				eexpr(tv);
X			if (td == dwrite)
X				(void)fprintf(output.fp, ", 0)"), Putl(output, 0);
X			else
X				(void)fprintf(output.fp, ", 1)"), Putl(output, 0);
X		} else {
X			increment();
X			tx = typeof(tv);
X			if (tx == typnods.A[(int)(ttext)])
X				tx = typnods.A[(int)(tchar)];
X			else
X				if (tx->tt == nfileof)
X					tx = typeof(tx->U.V18.tof);
X				else
X					fatal(etree);
X			while (tq != (struct S61 *)NIL) {
X				if ((Member((unsigned)(tq->tt), Conset[139])) && (tx == typeof(tq))) {
X					(void)fprintf(output.fp, "%sFwrite(", voidcast), Putl(output, 0);
X					eexpr(tq);
X				} else {
X					if (tx->tt == nsetof) {
X						usescpy = true;
X						(void)fprintf(output.fp, "Setncpy("), Putl(output, 0);
X						eselect(tv);
X						(void)fprintf(output.fp, "buf.S, "), Putl(output, 0);
X						eexpr(tq);
X						if (typeof(tp->U.V27.trhs) == typnods.A[(int)(tset)])
X							eexpr(tq);
X						else {
X							eselect(tq);
X							Putchr('S', output);
X						}
X						(void)fprintf(output.fp, ", sizeof("), Putl(output, 0);
X						eexpr(tv);
X						(void)fprintf(output.fp, ".buf))"), Putl(output, 0);
X					} else {
X						eexpr(tv);
X						(void)fprintf(output.fp, ".buf = "), Putl(output, 0);
X						eexpr(tq);
X					}
X					(void)fprintf(output.fp, ", Fwrite("), Putl(output, 0);
X					eexpr(tv);
X					(void)fprintf(output.fp, ".buf"), Putl(output, 0);
X				}
X				(void)fprintf(output.fp, ", "), Putl(output, 0);
X				eexpr(tv);
X				(void)fprintf(output.fp, ".fp)"), Putl(output, 0);
X				tq = tq->tnext;
X				if (tq != (struct S61 *)NIL) {
X					Putchr(',', output),Putchr('\n', output);
X					indent();
X				}
X			}
X			decrement();
X		}
X		Putchr(';', output),Putchr('\n', output);
X	L555:
X		;
X		break ;
X	  case dclose:
X		tq = typeof(tp->U.V30.taparm);
X		txtfile = (boolean)(tq == typnods.A[(int)(ttext)]);
X		if ((!txtfile) && (tq->tt == nfileof))
X			if (typeof(tq->U.V18.tof) == typnods.A[(int)(tchar)])
X				txtfile = true;
X		if (txtfile)
X			(void)fprintf(output.fp, "Closex("), Putl(output, 0);
X		else
X			(void)fprintf(output.fp, "Close("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ");\n"), Putl(output, 1);
X		break ;
X	  case dreset:  case drewrite:
X		tq = typeof(tp->U.V30.taparm);
X		txtfile = (boolean)(tq == typnods.A[(int)(ttext)]);
X		if ((!txtfile) && (tq->tt == nfileof))
X			if (typeof(tq->U.V18.tof) == typnods.A[(int)(tchar)])
X				txtfile = true;
X		if (txtfile)
X			if (td == dreset)
X				(void)fprintf(output.fp, "Resetx("), Putl(output, 0);
X			else
X				(void)fprintf(output.fp, "Rewritex("), Putl(output, 0);
X		else
X			if (td == dreset)
X				(void)fprintf(output.fp, "Reset("), Putl(output, 0);
X			else
X				(void)fprintf(output.fp, "Rewrite("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ", "), Putl(output, 0);
X		tq = tp->U.V30.taparm->tnext;
X		if (tq == (struct S61 *)NIL)
X			(void)fprintf(output.fp, "NULL"), Putl(output, 0);
X		else {
X			tq = typeof(tq);
X			if (tq == typnods.A[(int)(tchar)]) {
X				Putchr(cite, output);
X				ch = cvalof(tp->U.V30.taparm->tnext);
X				if ((ch == bslash) || (ch == cite))
X					Putchr(bslash, output);
X				(void)fprintf(output.fp, "%c%c", ch, cite), Putl(output, 0);
X			} else
X				if (tq == typnods.A[(int)(tstring)])
X					eexpr(tp->U.V30.taparm->tnext);
X				else
X					if (Member((unsigned)(tq->tt), Conset[140])) {
X						eexpr(tp->U.V30.taparm->tnext);
X						(void)fprintf(output.fp, ".A"), Putl(output, 0);
X					} else
X						fatal(etree);
X		}
X		(void)fprintf(output.fp, ");\n"), Putl(output, 1);
X		break ;
X	  case darctan:
X		(void)fprintf(output.fp, "atan("), Putl(output, 0);
X		if (typeof(tp->U.V30.taparm) != typnods.A[(int)(treal)])
X			(void)fprintf(output.fp, "%s", dblcast), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dln:
X		(void)fprintf(output.fp, "log("), Putl(output, 0);
X		if (typeof(tp->U.V30.taparm) != typnods.A[(int)(treal)])
X			(void)fprintf(output.fp, "%s", dblcast), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dexp:
X		(void)fprintf(output.fp, "exp("), Putl(output, 0);
X		if (typeof(tp->U.V30.taparm) != typnods.A[(int)(treal)])
X			(void)fprintf(output.fp, "%s", dblcast), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dcos:  case dsin:  case dsqrt:
X		eexpr(tp->U.V30.tcall);
X		Putchr('(', output);
X		if (typeof(tp->U.V30.taparm) != typnods.A[(int)(treal)])
X			(void)fprintf(output.fp, "%s", dblcast), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dtan:
X		(void)fprintf(output.fp, "atan("), Putl(output, 0);
X		if (typeof(tp->U.V30.taparm) != typnods.A[(int)(treal)])
X			(void)fprintf(output.fp, "%s", dblcast), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dsucc:  case dpred:
X		tq = typeof(tp->U.V30.taparm);
X		if (tq->tt == nsubrange)
X			if (tq->tup->tt == nconfarr)
X				tq = typeof(tq->tup->U.V22.tindtyp);
X			else
X				tq = typeof(tq->U.V19.tlo);
X		if ((tq == typnods.A[(int)(tinteger)]) || (tq == typnods.A[(int)(tchar)])) {
X			(void)fprintf(output.fp, "(("), Putl(output, 0);
X			eexpr(tp->U.V30.taparm);
X			if (td == dpred)
X				(void)fprintf(output.fp, ")-1)"), Putl(output, 0);
X			else
X				(void)fprintf(output.fp, ")+1)"), Putl(output, 0);
X		} else {
X			Putchr('(', output);
X			tq = tq->tup;
X			if (tq->tt == ntype) {
X				Putchr('(', output);
X				printid(tq->U.V14.tidl->U.V43.tsym->U.V6.lid);
X				Putchr(')', output);
X			}
X			(void)fprintf(output.fp, "((int)("), Putl(output, 0);
X			eexpr(tp->U.V30.taparm);
X			if (td == dpred)
X				(void)fprintf(output.fp, ")-1))"), Putl(output, 0);
X			else
X				(void)fprintf(output.fp, ")+1))"), Putl(output, 0);
X		}
X		break ;
X	  case dodd:
X		Putchr('(', output);
X		printid(defnams.A[(int)(dboolean)]->U.V6.lid);
X		(void)fprintf(output.fp, ")(("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ") & 1)"), Putl(output, 0);
X		break ;
X	  case dsqr:
X		tq = typeof(tp->U.V30.taparm);
X		if ((tq == typnods.A[(int)(tinteger)]) || (tq->tt == nsubrange)) {
X			(void)fprintf(output.fp, "(("), Putl(output, 0);
X			eexpr(tp->U.V30.taparm);
X			(void)fprintf(output.fp, ") * ("), Putl(output, 0);
X			eexpr(tp->U.V30.taparm);
X			(void)fprintf(output.fp, "))"), Putl(output, 0);
X		} else {
X			(void)fprintf(output.fp, "pow("), Putl(output, 0);
X			if (typeof(tp->U.V30.taparm) != typnods.A[(int)(treal)])
X				(void)fprintf(output.fp, "%s", dblcast), Putl(output, 0);
X			eexpr(tp->U.V30.taparm);
X			(void)fprintf(output.fp, ", 2.0)"), Putl(output, 0);
X		}
X		break ;
X	  case dround:
X		(void)fprintf(output.fp, "Round("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dtrunc:
X		(void)fprintf(output.fp, "Trunc("), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		Putchr(')', output);
X		break ;
X	  case dpack:
X		tq = typeof(tp->U.V30.taparm);
X		tx = typeof(tp->U.V30.taparm->tnext->tnext);
X		(void)fprintf(output.fp, "{    %s%s%c_j, _i = ", registr, inttyp, tab1), Putl(output, 0);
X		if (!arithexpr(tp->U.V30.taparm->tnext))
X			(void)fprintf(output.fp, "(int)"), Putl(output, 0);
X		eexpr(tp->U.V30.taparm->tnext);
X		if (tx->tt == narray)
X			(void)fprintf(output.fp, " - %1d", clower(tq->U.V23.taindx)), Putl(output, 0);
X		Putchr(';', output),Putchr('\n', output);
X		indent();
X		(void)fprintf(output.fp, "    for (_j = 0; _j < "), Putl(output, 0);
X		if (tq->tt == nconfarr) {
X			(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X			printid(tx->U.V22.tcindx->U.V19.thi->U.V43.tsym->U.V6.lid);
X			Putchr(')', output);
X		} else
X			(void)fprintf(output.fp, "%1d", crange(tx->U.V23.taindx)), Putl(output, 0);
X		(void)fprintf(output.fp, "; )\n"), Putl(output, 1);
X		indent();
X		Putchr(tab1, output);
X		eexpr(tp->U.V30.taparm->tnext->tnext);
X		(void)fprintf(output.fp, ".A[_j++] = "), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ".A[_i++];\n"), Putl(output, 1);
X		indent();
X		Putchr('}', output),Putchr('\n', output);
X		break ;
X	  case dunpack:
X		tq = typeof(tp->U.V30.taparm);
X		tx = typeof(tp->U.V30.taparm->tnext);
X		(void)fprintf(output.fp, "{   %s%s%c_j, _i = ", registr, inttyp, tab1), Putl(output, 0);
X		if (!arithexpr(tp->U.V30.taparm->tnext->tnext))
X			(void)fprintf(output.fp, "(int)"), Putl(output, 0);
X		eexpr(tp->U.V30.taparm->tnext->tnext);
X		if (tx->tt != nconfarr)
X			(void)fprintf(output.fp, " - %1d", clower(tx->U.V23.taindx)), Putl(output, 0);
X		Putchr(';', output),Putchr('\n', output);
X		indent();
X		(void)fprintf(output.fp, "    for (_j = 0; _j < "), Putl(output, 0);
X		if (tq->tt == nconfarr) {
X			(void)fprintf(output.fp, "(int)("), Putl(output, 0);
X			printid(tq->U.V22.tcindx->U.V19.thi->U.V43.tsym->U.V6.lid);
X			Putchr(')', output);
X		} else
X			(void)fprintf(output.fp, "%1d", crange(tq->U.V23.taindx)), Putl(output, 0);
X		(void)fprintf(output.fp, "; )\n"), Putl(output, 1);
X		indent();
X		Putchr(tab1, output);
X		eexpr(tp->U.V30.taparm->tnext);
X		(void)fprintf(output.fp, ".A[_i++] = "), Putl(output, 0);
X		eexpr(tp->U.V30.taparm);
X		(void)fprintf(output.fp, ".A[_j++];\n"), Putl(output, 1);
X		indent();
X		Putchr('}', output),Putchr('\n', output);
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X	G191_nelems = F192;
X}
X
X void
Xeaddr(tp)
X	treeptr	tp;
X{
X	Putchr('&', output);
X	if (!(Member((unsigned)(tp->tt), Conset[141])))
X		error(evarpar);
X	eexpr(tp);
X}
X
X void
Xecall(tp)
X	treeptr	tp;
X{
X	treeptr	tf, tq, tx;
X
X	tf = idup(tp->U.V30.tcall);
X	switch (tf->tt) {
X	  case nproc:  case nfunc:
X		tf = tf->U.V13.tsubpar;
X		break ;
X	  case nparproc:  case nparfunc:
X		tf = tf->U.V15.tparparm;
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X	if (tf != (struct S61 *)NIL) {
X		switch (tf->tt) {
X		  case nvalpar:  case nvarpar:
X			tf = tf->U.V14.tidl;
X			break ;
X		  case nparproc:  case nparfunc:
X			tf = tf->U.V15.tparid;
X			break ;
X		  default:
X			Caseerror(Line);
X		}
X	}
X	eexpr(tp->U.V30.tcall);
X	Putchr('(', output);
X	tq = tp->U.V30.taparm;
X	while (tq != (struct S61 *)NIL) {
X		if (Member((unsigned)(tf->tup->tt), Conset[142])) {
X			if (tq->tt == ncall)
X				printid(tq->U.V30.tcall->U.V43.tsym->U.V6.lid);
X			else
X				printid(tq->U.V43.tsym->U.V6.lid);
X		} else {
X			tx = typeof(tq);
X			if (tx == typnods.A[(int)(tboolean)]) {
X				tx = tq;
X				while (tx->tt == nuplus)
X					tx = tx->U.V42.texps;
X				if (Member((unsigned)(tx->tt), Conset[143])) {
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 ((tx == typnods.A[(int)(tstring)]) || (tx == typnods.A[(int)(tset)])) {
X					(void)fprintf(output.fp, "*(("), Putl(output, 0);
X					etypedef(tf->tup->U.V14.tbind);
X					(void)fprintf(output.fp, " *)"), Putl(output, 0);
X					if (tx == typnods.A[(int)(tset)]) {
X						(*G198_dropset) = true;
X						eexpr(tq);
X						(*G198_dropset) = false;
X					} else
X						eexpr(tq);
X					Putchr(')', output);
X				} else
X					if (tx == typnods.A[(int)(tnil)]) {
X						Putchr('(', output);
X						etypedef(tf->tup->U.V14.tbind);
X						(void)fprintf(output.fp, ")NIL"), Putl(output, 0);
X					} else
X						if (tf->tup->U.V14.tbind->tt == nconfarr) {
X							(void)fprintf(output.fp, "(struct "), Putl(output, 0);
X							printid(tf->tup->U.V14.tbind->U.V22.tcuid);
X							(void)fprintf(output.fp, " *)&"), Putl(output, 0);
X							eexpr(tq);
X							if (tq->tnext == (struct S61 *)NIL)
X								(void)fprintf(output.fp, ", %1d", crange(tx->U.V23.taindx)), Putl(output, 0);
X						} else {
X							if (tf->tup->tt == nvarpar)
X								eaddr(tq);
X							else
X								eexpr(tq);
X						}
X		}
X		tq = tq->tnext;
X		if (tq != (struct S61 *)NIL) {
X			(void)fprintf(output.fp, ", "), Putl(output, 0);
X			if (tf->tnext == (struct S61 *)NIL) {
X				tf = tf->tup->tnext;
X				switch (tf->tt) {
X				  case nvalpar:  case nvarpar:
X					tf = tf->U.V14.tidl;
X					break ;
X				  case nparproc:  case nparfunc:
X					tf = tf->U.V15.tparid;
X					break ;
X				  default:
X					Caseerror(Line);
X				}
X			} else
X				tf = tf->tnext;
X		}
X	}
X	Putchr(')', output);
X}
X
Xvoid eexpr();
X
Xboolean constset();
X
X boolean
Xconstxps(tp)
X	treeptr	tp;
X{
X	register boolean	R173;
X
X	switch (tp->tt) {
X	  case nrange:
X		if (constxps(tp->U.V41.texpr))
X			R173 = constxps(tp->U.V41.texpl);
X		else
X			R173 = false;
X		break ;
X	  case nempty:  case ninteger:  case nchar:
X		R173 = true;
X		break ;
X	  case nid:
X		tp = idup(tp);
X		R173 = (boolean)((tp->tt == nconst) || (tp->tt == nscalar));
X		break ;
X	  case nin:  case neq:  case nne:  case nlt:
X	  case nle:  case ngt:  case nge:  case nor:
X	  case nplus:  case nminus:  case nand:  case nmul:
X	  case ndiv:  case nmod:  case nquot:  case nnot:
X	  case numinus:  case nuplus:  case nset:  case nindex:
X	  case nselect:  case nderef:  case ncall:  case nreal:
X	  case nstring:  case nnil:
X		R173 = false;
X		break ;
X	  default:
X		Caseerror(Line);
X	}
X	return R173;
X}
X
X boolean
Xconstset(tp)
X	treeptr	tp;
X{
X	register boolean	R172;
X
X	R172 = true;
X	while (tp != (struct S61 *)NIL)
X		if (constxps(tp))
X			tp = tp->tnext;
X		else {
X			R172 = false;
X			tp = (struct S61 *)NIL;
X		}
X	return R172;
X}
X
END_OF_FILE
if test 37883 -ne `wc -c <'ptc.c.4'`; then
    echo shar: \"'ptc.c.4'\" unpacked with wrong size!
fi
# end of 'ptc.c.4'
fi
echo shar: End of archive 6 \(of 12\).
cp /dev/null ark6isdone
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.uu.net