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