xref: /csrg-svn/usr.bin/pascal/pxp/main.c (revision 12411)
1*12411Speter static	char *sccsid = "@(#)main.c	1.3 (Berkeley) 05/12/83";
22858Speter /* Copyright (c) 1979 Regents of the University of California */
32858Speter #
42858Speter /*
52858Speter  * pxp - Pascal execution profiler
62858Speter  *
72858Speter  * Bill Joy UCB
82858Speter  * Version 1.2 January 1979
92858Speter  */
102858Speter 
112858Speter #include "0.h"
122858Speter 
132858Speter /*
142858Speter  * This program is described in detail in the "PXP 1.0 Implementation Notes"
152858Speter  *
162858Speter  * The structure of pxp is very similar to that of the translator pi.
172858Speter  * The major new pieces here are a set of profile data maintenance
182858Speter  * routines in the file pmon.c and a set of pretty printing utility
192858Speter  * routines in the file pp.c.
202858Speter  * The semantic routines of pi have been rewritten to do a simple
212858Speter  * reformatting tree walk, the parsing and scanning remains
222858Speter  * the same.
232858Speter  *
242858Speter  * This version does not place more than one statement per line and
252858Speter  * is not very intelligent about folding long lines, with only
262858Speter  * an ad hoc way of folding case label list and enumerated type
272858Speter  * declarations being implemented.
282858Speter  */
292858Speter 
302858Speter char	usagestr[] =
312858Speter 	"pxp [ -acdefjntuw_ ] [ -23456789 ] [ -z [ name ... ] ] name.p";
322858Speter char	*howfile =	"/usr/lib/how_pxp";
332858Speter char	*stdoutn =	"Standard output";
342858Speter 
352858Speter int	unit =	4;
362858Speter 
372858Speter FILE	*ibuf;
382858Speter extern	char errout;
392858Speter 
402858Speter /*
412858Speter  * Main program for pxp.
422858Speter  * Process options, then call yymain
432858Speter  * to do all the real work.
442858Speter  */
452858Speter FILE *ibp;
462858Speter main(argc, argv)
472858Speter 	int argc;
482858Speter 	char *argv[];
492858Speter {
502858Speter 	register char *cp;
512858Speter 	register c;
522858Speter 
532858Speter 	if (argv[0][0] == 'a')
542858Speter 		howfile =+ 9;
552858Speter 	argc--, argv++;
562858Speter 	if (argc == 0) {
572858Speter 		execl("/bin/cat", "cat", howfile, 0);
582858Speter 		goto usage;
592858Speter 	}
602858Speter 	while (argc > 0) {
612858Speter 		cp = argv[0];
622858Speter 		if (*cp++ != '-')
632858Speter 			break;
642858Speter 		while (c = *cp++) switch (c) {
652858Speter #ifdef DEBUG
662858Speter 			case 'T':
672858Speter 				typetest++;
682858Speter 				continue;
692858Speter 			case 'A':
702858Speter 				testtrace++;
712858Speter 			case 'F':
722858Speter 				fulltrace++;
732858Speter 			case 'E':
742858Speter 				errtrace++;
752858Speter 				continue;
762858Speter 			case 'C':
772858Speter 				yycosts();
782858Speter 				pexit(NOSTART);
792858Speter 			case 'U':
802858Speter 				yyunique++;
812858Speter 				continue;
822858Speter #endif
832858Speter 			case 'a':
842858Speter 				all++;
852858Speter 				continue;
862858Speter 			case 'c':
872858Speter 				core++;
882858Speter 				continue;
892858Speter 			case 'd':
902858Speter 				nodecl++;
912858Speter 				continue;
922858Speter 			case 'e':
932858Speter 				noinclude = -1;
942858Speter 				continue;
952858Speter 			case 'f':
962858Speter 				full++;
972858Speter 				continue;
982858Speter 			case 'j':
992858Speter 				justify++;
1002858Speter 				continue;
1012858Speter 			case 'l':
1022858Speter 			case 'n':
1032858Speter 				togopt(c);
1042858Speter 				continue;
1052858Speter 			case 'o':
1062858Speter 				onefile++;
1072858Speter 				continue;
1082858Speter 			case 's':
1092858Speter 				stripcomm++;
1102858Speter 				continue;
1112858Speter 			case 't':
1122858Speter 				table++;
1132858Speter 				continue;
1142858Speter 			case 'u':
1152858Speter 			case 'w':
1162858Speter 				togopt(c);
1172858Speter 				continue;
1182858Speter 			case 'z':
1192858Speter 				profile++;
1202858Speter 				pflist = argv + 1;
1212858Speter 				pflstc = 0;
1222858Speter 				while (argc > 1) {
1232858Speter 					if (dotted(argv[1], 'p'))
1242858Speter 						break;
1252858Speter 					pflstc++, argc--, argv++;
1262858Speter 				}
1272858Speter 				if (pflstc == 0)
1282858Speter 					togopt(c);
1292858Speter 				else
1302858Speter 					nojunk++;
1312858Speter 				continue;
1322858Speter 			case '_':
1332858Speter 				underline++;
1342858Speter 				continue;
135*12411Speter #			ifdef RMOTHERS
136*12411Speter 			case 'O':
137*12411Speter 				rmothers++;
138*12411Speter 				continue;
139*12411Speter #			endif RMOTHERS
1402858Speter 			default:
1412858Speter 				if (c >= '2' && c <= '9') {
1422858Speter 					unit = c - '0';
1432858Speter 					continue;
1442858Speter 				}
1452858Speter usage:
1462858Speter 				Perror("Usage", usagestr);
1472858Speter 				exit(1);
1482858Speter 		}
1492858Speter 		argc--, argv++;
1502858Speter 	}
1512858Speter 	if (core && !profile && !table)
1522858Speter 		profile++;
1532858Speter 	if (argc == 0 || argc > 2)
1542858Speter 		goto usage;
1552858Speter 	if (profile || table) {
1562858Speter 		noinclude = 0;
1572858Speter 		if (argc == 2) {
1582858Speter 			argc--;
1592858Speter 			getit(argv[1]);
1602858Speter 		} else
1612858Speter 			getit(core ? "core" : "pmon.out");
1622858Speter 	} else
1632858Speter 		noinclude++;
1642858Speter 	if (argc != 1)
1652858Speter 		goto usage;
1662858Speter 	firstname = filename = argv[0];
1672858Speter 	if (dotted(filename, 'i')) {
1682858Speter 		if (profile || table)
1692858Speter 			goto usage;
1702858Speter 		noinclude = 1;
1712858Speter 		bracket++;
1722858Speter 	} else if (!dotted(filename, 'p')) {
1732858Speter 		Perror(filename, "Name must end in '.p'");
1742858Speter 		exit(1);
1752858Speter 	}
1762858Speter 	if ((ibuf = fopen(filename, "r")) == NULL)
1772858Speter 		perror(filename), pexit(NOSTART);
1782858Speter 	ibp = ibuf;
1792858Speter 	if (onefile) {
1802858Speter 		int onintr();
1812858Speter 
1822858Speter 		cp = (stdoutn = "/tmp/pxp00000") + 13;
1832858Speter 		signal(2, onintr);
1842858Speter 		for (c = getpid(); c; c =/ 10)
1852858Speter 			*--cp =| (c % 10);
1862858Speter 		if (freopen(stdoutn, "w", stdout) == NULL)
1872858Speter bad:
1882858Speter 			perror(stdoutn), exit(1);
1892858Speter 	} else {
1902858Speter 		extern char _sobuf[BUFSIZ];
1912858Speter 		setbuf(stdout, _sobuf);
1922858Speter 	}
1932858Speter 	if (profile || opt('l')) {
1942858Speter 		opt('n')++;
1952858Speter 		yysetfile(filename);
1962858Speter 		opt('n')--;
1972858Speter 	} else
1982858Speter 		lastname = filename;
1992858Speter 	errout = 2;
2002858Speter 	yymain();
2012858Speter 	/* No return */
2022858Speter }
2032858Speter 
2042858Speter /*
2052858Speter  * Put a header on a top of a page
2062858Speter  */
2072858Speter header()
2082858Speter {
2092858Speter 	extern char version[];
2102858Speter 	static char reenter;
2112858Speter 	extern int outcol;
2122858Speter 
2132858Speter 	gettime();
2142858Speter 	if (reenter) {
2152858Speter 		if (outcol)
2162858Speter 			putchar('\n');
2172858Speter 		putchar('\f');
2182858Speter 	}
2192858Speter 	reenter++;
2202858Speter 	if (profile || table) {
2217743Speter 		printf("Berkeley Pascal PXP -- Version %s\n\n%s  %s\n\n",
2227743Speter 			version, myctime(&tvec), filename);
2232858Speter 		printf("Profiled %s\n\n", myctime(&ptvec));
2242858Speter 	}
2252858Speter }
2262858Speter 
2272858Speter char	ugh[] =	"Fatal error in pxp\n";
2282858Speter /*
2292858Speter  * Exit from the Pascal system.
2302858Speter  * We throw in an ungraceful termination
2312858Speter  * message if c > 1 indicating a severe
2322858Speter  * error such as running out of memory
2332858Speter  * or an internal inconsistency.
2342858Speter  */
2352858Speter pexit(c)
2362858Speter 	int c;
2372858Speter {
2382858Speter 	register char *cp;
2392858Speter 	extern int outcol;
2402858Speter 
2412858Speter 	if (stdoutn[0] == '/')
2422858Speter 		unlink(stdoutn);
2432858Speter 	if (outcol)
2442858Speter 		putchar('\n');
2452858Speter 	flush();
2462858Speter 	if (c == DIED)
2472858Speter 		write(2, ugh, sizeof ugh);
2482858Speter 	exit(c);
2492858Speter }
2502858Speter 
2512858Speter onintr()
2522858Speter {
2532858Speter 
2542858Speter 	pexit(DIED);
2552858Speter }
2562858Speter 
2572858Speter puthedr()
2582858Speter {
2592858Speter 
2602858Speter 	yysetfile(filename);
2612858Speter }
262