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