xref: /csrg-svn/usr.bin/pascal/pxp/const.c (revision 22225)
12851Speter /*
2*22225Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22225Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22225Sdist  * specifies the terms and conditions for redistribution.
5*22225Sdist  */
6*22225Sdist 
7*22225Sdist #ifndef lint
8*22225Sdist static char sccsid[] = "@(#)const.c	5.1 (Berkeley) 06/05/85";
9*22225Sdist #endif not lint
10*22225Sdist 
11*22225Sdist /*
122851Speter  * pxp - Pascal execution profiler
132851Speter  *
142851Speter  * Bill Joy UCB
152851Speter  * Version 1.2 January 1979
162851Speter  */
172851Speter 
182851Speter #include "0.h"
192851Speter #include "tree.h"
202851Speter 
213050Smckusic STATIC	int constcnt = -1;
222851Speter 
232851Speter /*
242851Speter  * The const declaration part
252851Speter  */
262851Speter constbeg(l, cline)
272851Speter 	int l, cline;
282851Speter {
292851Speter 
302851Speter 	line = l;
312851Speter 	if (nodecl)
322851Speter 		printoff();
332851Speter 	puthedr();
342851Speter 	putcm();
352851Speter 	ppnl();
362851Speter 	indent();
372851Speter 	ppkw("const");
382851Speter 	ppgoin(DECL);
392851Speter 	constcnt = 0;
402851Speter 	setline(cline);
412851Speter }
422851Speter 
432851Speter const(cline, cid, cdecl)
442851Speter 	int cline;
452851Speter 	char *cid;
462851Speter 	int *cdecl;
472851Speter {
482851Speter 
492851Speter 	if (constcnt)
502851Speter 		putcm();
512851Speter 	setline(cline);
522851Speter 	ppitem();
532851Speter 	ppid(cid);
542851Speter 	ppsep(" = ");
552851Speter 	gconst(cdecl);
562851Speter 	ppsep(";");
572851Speter 	constcnt++;
582851Speter 	setinfo(cline);
592851Speter 	putcml();
602851Speter }
612851Speter 
622851Speter constend()
632851Speter {
642851Speter 
652851Speter 	if (constcnt == -1)
662851Speter 		return;
672851Speter 	if (nodecl)
682851Speter 		return;
692851Speter 	if (constcnt == 0)
702851Speter 		ppid("{const decls}");
712851Speter 	ppgoout(DECL);
722851Speter 	constcnt = -1;
732851Speter }
742851Speter 
752851Speter /*
762851Speter  * A constant in an expression
772851Speter  * or a declaration.
782851Speter  */
792851Speter gconst(r)
802851Speter 	int *r;
812851Speter {
822851Speter 	register *cn;
832851Speter 
842851Speter 	cn = r;
852851Speter loop:
862851Speter 	if (cn == NIL) {
872851Speter 		ppid("{constant}");
882851Speter 		return;
892851Speter 	}
902851Speter 	switch (cn[0]) {
912851Speter 		default:
922851Speter 			panic("gconst");
932851Speter 		case T_PLUSC:
942851Speter 			ppop("+");
952851Speter 			cn = cn[1];
962851Speter 			goto loop;
972851Speter 		case T_MINUSC:
982851Speter 			ppop("-");
992851Speter 			cn = cn[1];
1002851Speter 			goto loop;
1012851Speter 		case T_ID:
1022851Speter 			ppid(cn[1]);
1032851Speter 			return;
1042851Speter 		case T_CBINT:
1052851Speter 		case T_CINT:
1062851Speter 		case T_CFINT:
1072851Speter 			ppnumb(cn[1]);
1082851Speter 			if (cn[0] == T_CBINT)
1092851Speter 				ppsep("b");
1102851Speter 			return;
1112851Speter 		case T_CSTRNG:
1122851Speter 			ppstr(cn[1]);
1132851Speter 			return;
1142851Speter 	}
1152851Speter }
116