xref: /csrg-svn/usr.bin/pascal/pxp/pp.c (revision 62191)
148112Sbostic /*-
2*62191Sbostic  * Copyright (c) 1980, 1993
3*62191Sbostic  *	The Regents of the University of California.  All rights reserved.
448112Sbostic  *
548112Sbostic  * %sccs.include.redist.c%
622234Sdist  */
722234Sdist 
822234Sdist #ifndef lint
9*62191Sbostic static char sccsid[] = "@(#)pp.c	8.1 (Berkeley) 06/06/93";
1048112Sbostic #endif /* not lint */
1122234Sdist 
1222234Sdist /*
132861Speter  * pxp - Pascal execution profiler
142861Speter  *
152861Speter  * Bill Joy UCB
162861Speter  * Version 1.2 January 1979
172861Speter  */
182861Speter 
192861Speter #include "0.h"
202861Speter 
212861Speter #define noprint() nopflg
222861Speter 
232861Speter int	pplev[3];	/* STAT, DECL, PRFN */
242861Speter int	nopflg;
252861Speter 
setprint()262861Speter setprint()
272861Speter {
282861Speter 
292861Speter 	if (profile == 0) {
302861Speter 		if (table)
312861Speter 			nopflg = 1;
322861Speter 		else
332861Speter 			nopflg = 0;
342861Speter 		return;
352861Speter 	}
362861Speter 	nopflg = !all && nowcnt() == 0 || !opt('z');
372861Speter }
382861Speter 
printon()392861Speter printon()
402861Speter {
412861Speter 
422861Speter 	if (profile == 0) {
432861Speter 		if (table)
442861Speter 			nopflg = 1;
452861Speter 		return;
462861Speter 	}
472861Speter 	nopflg = 0;
482861Speter }
492861Speter 
printoff()502861Speter printoff()
512861Speter {
522861Speter 
532861Speter 	nopflg = 1;
542861Speter }
552861Speter 
ppkw(s)562861Speter ppkw(s)
572861Speter 	register char *s;
582861Speter {
592861Speter 	register char *cp, i;
602861Speter 
612861Speter 	if (noprint())
622861Speter 		return;
632861Speter 	/*
642861Speter 	 * First real thing printed
652861Speter 	 * is always a keyword
662861Speter 	 * or includes an "id" (if a comment)
672861Speter 	 * (See ppnl below)
682861Speter 	 */
692861Speter 	hadsome = 1;
702861Speter 	if (underline) {
712861Speter 		for (cp = s; *cp; cp++)
722861Speter 			putchar('_');
732861Speter 		for (cp = s; *cp; cp++)
742861Speter 			putchar('\b');
752861Speter 	}
762861Speter 	printf(s);
772861Speter }
782861Speter 
ppid(s)792861Speter ppid(s)
802861Speter 	register char *s;
812861Speter {
822861Speter 
832861Speter 	if (noprint())
842861Speter 		return;
852861Speter 	hadsome = 1;
862861Speter 	if (s == NIL)
872861Speter 		s = "{identifier}";
882861Speter 	printf(s);
892861Speter }
902861Speter 
ppbra(s)912861Speter ppbra(s)
922861Speter 	char *s;
932861Speter {
942861Speter 
952861Speter 	if (noprint())
962861Speter 		return;
972861Speter 	if (s != NIL)
982861Speter 		printf(s);
992861Speter }
1002861Speter 
ppsep(s)1012861Speter ppsep(s)
1022861Speter 	char *s;
1032861Speter {
1042861Speter 
1052861Speter 	if (noprint())
1062861Speter 		return;
1072861Speter 	printf(s);
1082861Speter }
1092861Speter 
ppket(s)1102861Speter ppket(s)
1112861Speter 	char *s;
1122861Speter {
1132861Speter 
1142861Speter 	if (noprint())
1152861Speter 		return;
1162861Speter 	if (s != NIL)
1172861Speter 		printf(s);
1182861Speter }
1192861Speter 
1202861Speter char	killsp;
1212861Speter 
ppunspac()1222861Speter ppunspac()
1232861Speter {
1242861Speter 
1252861Speter 	killsp = 1;
1262861Speter }
1272861Speter 
ppspac()1282861Speter ppspac()
1292861Speter {
1302861Speter 
1312861Speter 	if (killsp) {
1322861Speter 		killsp = 0;
1332861Speter 		return;
1342861Speter 	}
1352861Speter 	if (noprint())
1362861Speter 		return;
1372861Speter 	putchar(' ');
1382861Speter }
1392861Speter 
ppitem()1402861Speter ppitem()
1412861Speter {
1422861Speter 
1432861Speter 	if (noprint())
1442861Speter 		return;
1452861Speter 	ppnl();
1462861Speter 	indent();
1472861Speter }
1482861Speter 
1492861Speter int	owenl, owenlb;
1502861Speter 
ppsnlb()1512861Speter ppsnlb()
1522861Speter {
1532861Speter 
1542861Speter 	if (nopflg)
1552861Speter 		return;
1562861Speter 	owenlb++;
1572861Speter }
1582861Speter 
ppsnl()1592861Speter ppsnl()
1602861Speter {
1612861Speter 
1622861Speter 	if (nopflg)
1632861Speter 		return;
1642861Speter 	owenl++;
1652861Speter }
1662861Speter 
pppay()1672861Speter pppay()
1682861Speter {
1692861Speter 
1702861Speter 	while (owenl || owenlb) {
1712861Speter 		putchar('\n');
1722861Speter 		if (owenlb) {
1732861Speter 			putchar(' ');
1742861Speter 			owenlb--;
1752861Speter 		} else
1762861Speter 			owenl--;
1772861Speter 	}
1782861Speter }
1792861Speter 
ppnl()1802861Speter ppnl()
1812861Speter {
1822861Speter 
1832861Speter 	if (noprint())
1842861Speter 		return;
1852861Speter 	if (hadsome == 0)
1862861Speter 		return;
1872861Speter 	pppay();
1882861Speter 	putchar('\n');
1892861Speter }
1902861Speter 
indent()1912861Speter indent()
1922861Speter {
1932861Speter 	register i;
1942861Speter 
1952861Speter 	if (noprint())
1962861Speter 		return;
1972861Speter 	linopr();
1982861Speter 	if (profile == 0) {
1992861Speter 		indent1(pplev[PRFN] + pplev[DECL] + pplev[STAT]);
2002861Speter 		return;
2012861Speter 	}
2022861Speter 	indent1(pplev[PRFN] + pplev[STAT]);
2032861Speter 	switch (i = shudpcnt()) {
2042861Speter 		case 1:
20510729Smckusick 			printf("%7ld.", nowcnt());
2062861Speter 			dashes('-');
2072861Speter 			putchar('|');
2082861Speter 			break;
2092861Speter 		case 0:
2102861Speter 		case -1:
2112861Speter 			printf("        ");
2122861Speter 			dashes(' ');
2132861Speter 			putchar(i == 0 ? '|' : ' ');
2142861Speter 			break;
2152861Speter 	}
2162861Speter 	indent1(pplev[DECL]);
2172861Speter }
2182861Speter 
dashes(c)2192861Speter dashes(c)
2202861Speter 	char c;
2212861Speter {
2222861Speter 	register i;
2232861Speter 
2242861Speter 	for (i = unit - 1; i != 0; i--)
2252861Speter 		putchar(c);
2262861Speter }
2272861Speter 
indent1(in)2282861Speter indent1(in)
2292861Speter 	int in;
2302861Speter {
2312861Speter 	register i;
2322861Speter 
2332861Speter 	if (noprint())
2342861Speter 		return;
2352861Speter 	i = in;
2362861Speter 	if (profile == 0)
2372861Speter 		while (i >= 8) {
2382861Speter 			putchar('\t');
23932398Sdonn 			i -= 8;
2402861Speter 		}
2412861Speter 	while (i > 0) {
2422861Speter 		putchar(' ');
2432861Speter 		i--;
2442861Speter 	}
2452861Speter }
2462861Speter 
linopr()2472861Speter linopr()
2482861Speter {
2492861Speter 
2502861Speter 	if (noprint())
2512861Speter 		return;
2522861Speter 	if (profile) {
2532861Speter 		if (line < 0)
2542861Speter 			line = -line;
2552861Speter 		printf("%6d  ", line);
2562861Speter 	}
2572861Speter }
2582861Speter 
indentlab()2592861Speter indentlab()
2602861Speter {
2612861Speter 
2622861Speter 	indent1(pplev[PRFN]);
2632861Speter }
2642861Speter 
ppop(s)2652861Speter ppop(s)
2662861Speter 	char *s;
2672861Speter {
2682861Speter 
2692861Speter 	if (noprint())
2702861Speter 		return;
2712861Speter 	printf(s);
2722861Speter }
2732861Speter 
ppnumb(s)2742861Speter ppnumb(s)
2752861Speter 	char *s;
2762861Speter {
2772861Speter 
2782861Speter 	if (noprint())
2792861Speter 		return;
2802861Speter 	if (s == NIL)
2812861Speter 		s = "{number}";
2822861Speter 	printf(s);
2832861Speter }
2842861Speter 
ppgoin(lv)2852861Speter ppgoin(lv)
2862861Speter {
2872861Speter 
28830650Slepreau 	pplev[lv] += unit;
2892861Speter }
2902861Speter 
ppgoout(lv)2912861Speter ppgoout(lv)
2922861Speter {
2932861Speter 
29432398Sdonn 	pplev[lv] -= unit;
2952861Speter 	if (pplev[lv] < 0)
2962861Speter 		panic("pplev");
2972861Speter }
2982861Speter 
ppstr(s)2992861Speter ppstr(s)
3002861Speter 	char *s;
3012861Speter {
3022861Speter 	register char *cp;
3032861Speter 
3042861Speter 	if (noprint())
3052861Speter 		return;
3062861Speter 	if (s == NIL) {
3072861Speter 		printf("{string}");
3082861Speter 		return;
3092861Speter 	}
3102861Speter 	putchar('\'');
3112861Speter 	cp = s;
3122861Speter 	while (*cp) {
3132861Speter 		putchar(*cp);
3142861Speter 		if (*cp == '\'')
3152861Speter 			putchar('\'');
3162861Speter 		cp++;
3172861Speter 	}
3182861Speter 	putchar('\'');
3192861Speter }
3202861Speter 
pplab(s)3212861Speter pplab(s)
3222861Speter 	char *s;
3232861Speter {
3242861Speter 
3252861Speter 	if (noprint())
3262861Speter 		return;
3272861Speter 	if (s == NIL)
3282861Speter 		s = "{integer label}";
3292861Speter 	printf(s);
3302861Speter }
3312861Speter 
3322861Speter int	outcol;
3332861Speter 
3342861Speter 
putchar(c)3352861Speter putchar(c)
3362861Speter 	char c;
3372861Speter {
3382861Speter 
3392861Speter 	putc(c, stdout);
3402861Speter 	if (ferror(stdout))
3412861Speter 		outerr();
3422861Speter 	switch (c) {
3432861Speter 		case '\n':
3442861Speter 			outcol = 0;
3452861Speter 			flush();
3462861Speter 			break;
3472861Speter 		case '\t':
34830650Slepreau 			outcol += 8;
34930650Slepreau 			outcol &= ~07;
3502861Speter 			break;
3512861Speter 		case '\b':
3522861Speter 			if (outcol)
3532861Speter 				outcol--;
3542861Speter 			break;
3552861Speter 		default:
3562861Speter 			outcol++;
3572861Speter 		case '\f':
3582861Speter 			break;
3592861Speter 	}
3602861Speter }
3612861Speter 
flush()3622861Speter flush()
3632861Speter {
3642861Speter 
3652861Speter 	fflush(stdout);
3662861Speter 	if (ferror(stdout))
3672861Speter 		outerr();
3682861Speter }
3692861Speter 
pptab()3702861Speter pptab()
3712861Speter {
3722861Speter 	register int i;
3732861Speter 
3742861Speter 	if (noprint())
3752861Speter 		return;
3762861Speter 	i = pplev[PRFN] + profile ? 44 + unit : 28;
3772861Speter /*
3782861Speter 	if (outcol > i + 8) {
3792861Speter 		ppnl();
38032398Sdonn 		i += 8;
3812861Speter 	}
3822861Speter */
3832861Speter 	do
3842861Speter 		putchar('\t');
3852861Speter 	while (outcol < i);
3862861Speter }
3872861Speter 
outerr()3882861Speter outerr()
3892861Speter {
3902861Speter 
3912861Speter 	perror(stdoutn);
3922861Speter 	pexit(DIED);
3932861Speter }
394