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