1bc19982fSbostic /*-
2*4c4f737fSbostic * Copyright (c) 1980, 1993
3*4c4f737fSbostic * The Regents of the University of California. All rights reserved.
4bc19982fSbostic *
5bc19982fSbostic * %sccs.include.redist.c%
6062a16d5Sdist */
7062a16d5Sdist
8062a16d5Sdist #ifndef lint
9*4c4f737fSbostic static char copyright[] =
10*4c4f737fSbostic "@(#) Copyright (c) 1980, 1993\n\
11*4c4f737fSbostic The Regents of the University of California. All rights reserved.\n";
12bc19982fSbostic #endif /* not lint */
13062a16d5Sdist
14062a16d5Sdist #ifndef lint
15*4c4f737fSbostic static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 06/06/93";
16bc19982fSbostic #endif /* not lint */
17062a16d5Sdist
181f23bf53Speter /*
191f23bf53Speter * pxp - Pascal execution profiler
201f23bf53Speter *
211f23bf53Speter * Bill Joy UCB
221f23bf53Speter * Version 1.2 January 1979
231f23bf53Speter */
241f23bf53Speter
251f23bf53Speter #include "0.h"
261f23bf53Speter
271f23bf53Speter /*
281f23bf53Speter * This program is described in detail in the "PXP 1.0 Implementation Notes"
291f23bf53Speter *
301f23bf53Speter * The structure of pxp is very similar to that of the translator pi.
311f23bf53Speter * The major new pieces here are a set of profile data maintenance
321f23bf53Speter * routines in the file pmon.c and a set of pretty printing utility
331f23bf53Speter * routines in the file pp.c.
341f23bf53Speter * The semantic routines of pi have been rewritten to do a simple
351f23bf53Speter * reformatting tree walk, the parsing and scanning remains
361f23bf53Speter * the same.
371f23bf53Speter *
381f23bf53Speter * This version does not place more than one statement per line and
391f23bf53Speter * is not very intelligent about folding long lines, with only
401f23bf53Speter * an ad hoc way of folding case label list and enumerated type
411f23bf53Speter * declarations being implemented.
421f23bf53Speter */
431f23bf53Speter
441f23bf53Speter char usagestr[] =
451f23bf53Speter "pxp [ -acdefjntuw_ ] [ -23456789 ] [ -z [ name ... ] ] name.p";
461f23bf53Speter char *howfile = "/usr/lib/how_pxp";
4776c7d847Sdonn char stdoutn[20] = "Standard output";
481f23bf53Speter
491f23bf53Speter int unit = 4;
501f23bf53Speter
511f23bf53Speter FILE *ibuf;
521f23bf53Speter extern char errout;
531f23bf53Speter
541f23bf53Speter /*
551f23bf53Speter * Main program for pxp.
561f23bf53Speter * Process options, then call yymain
571f23bf53Speter * to do all the real work.
581f23bf53Speter */
591f23bf53Speter FILE *ibp;
main(argc,argv)601f23bf53Speter main(argc, argv)
611f23bf53Speter int argc;
621f23bf53Speter char *argv[];
631f23bf53Speter {
641f23bf53Speter register char *cp;
651f23bf53Speter register c;
661f23bf53Speter
671f23bf53Speter if (argv[0][0] == 'a')
68175ce5f6Slepreau howfile += 9;
691f23bf53Speter argc--, argv++;
701f23bf53Speter if (argc == 0) {
711f23bf53Speter execl("/bin/cat", "cat", howfile, 0);
721f23bf53Speter goto usage;
731f23bf53Speter }
741f23bf53Speter while (argc > 0) {
751f23bf53Speter cp = argv[0];
761f23bf53Speter if (*cp++ != '-')
771f23bf53Speter break;
781f23bf53Speter while (c = *cp++) switch (c) {
791f23bf53Speter #ifdef DEBUG
801f23bf53Speter case 'T':
811f23bf53Speter typetest++;
821f23bf53Speter continue;
831f23bf53Speter case 'A':
841f23bf53Speter testtrace++;
851f23bf53Speter case 'F':
861f23bf53Speter fulltrace++;
871f23bf53Speter case 'E':
881f23bf53Speter errtrace++;
891f23bf53Speter continue;
901f23bf53Speter case 'C':
911f23bf53Speter yycosts();
921f23bf53Speter pexit(NOSTART);
931f23bf53Speter case 'U':
941f23bf53Speter yyunique++;
951f23bf53Speter continue;
961f23bf53Speter #endif
971f23bf53Speter case 'a':
981f23bf53Speter all++;
991f23bf53Speter continue;
1001f23bf53Speter case 'c':
1011f23bf53Speter core++;
1021f23bf53Speter continue;
1031f23bf53Speter case 'd':
1041f23bf53Speter nodecl++;
1051f23bf53Speter continue;
1061f23bf53Speter case 'e':
1071f23bf53Speter noinclude = -1;
1081f23bf53Speter continue;
1091f23bf53Speter case 'f':
1101f23bf53Speter full++;
1111f23bf53Speter continue;
1121f23bf53Speter case 'j':
1131f23bf53Speter justify++;
1141f23bf53Speter continue;
1151f23bf53Speter case 'l':
1161f23bf53Speter case 'n':
1171f23bf53Speter togopt(c);
1181f23bf53Speter continue;
1191f23bf53Speter case 'o':
1201f23bf53Speter onefile++;
1211f23bf53Speter continue;
1221f23bf53Speter case 's':
1231f23bf53Speter stripcomm++;
1241f23bf53Speter continue;
1251f23bf53Speter case 't':
1261f23bf53Speter table++;
1271f23bf53Speter continue;
1281f23bf53Speter case 'u':
1291f23bf53Speter case 'w':
1301f23bf53Speter togopt(c);
1311f23bf53Speter continue;
1321f23bf53Speter case 'z':
1331f23bf53Speter profile++;
1341f23bf53Speter pflist = argv + 1;
1351f23bf53Speter pflstc = 0;
1361f23bf53Speter while (argc > 1) {
1371f23bf53Speter if (dotted(argv[1], 'p'))
1381f23bf53Speter break;
1391f23bf53Speter pflstc++, argc--, argv++;
1401f23bf53Speter }
1411f23bf53Speter if (pflstc == 0)
1421f23bf53Speter togopt(c);
1431f23bf53Speter else
1441f23bf53Speter nojunk++;
1451f23bf53Speter continue;
1461f23bf53Speter case '_':
1471f23bf53Speter underline++;
1481f23bf53Speter continue;
149ea828454Speter # ifdef RMOTHERS
150ea828454Speter case 'O':
151ea828454Speter rmothers++;
152ea828454Speter continue;
153ea828454Speter # endif RMOTHERS
1541f23bf53Speter default:
1551f23bf53Speter if (c >= '2' && c <= '9') {
1561f23bf53Speter unit = c - '0';
1571f23bf53Speter continue;
1581f23bf53Speter }
1591f23bf53Speter usage:
1601f23bf53Speter Perror("Usage", usagestr);
1611f23bf53Speter exit(1);
1621f23bf53Speter }
1631f23bf53Speter argc--, argv++;
1641f23bf53Speter }
1651f23bf53Speter if (core && !profile && !table)
1661f23bf53Speter profile++;
1671f23bf53Speter if (argc == 0 || argc > 2)
1681f23bf53Speter goto usage;
1691f23bf53Speter if (profile || table) {
1701f23bf53Speter noinclude = 0;
1711f23bf53Speter if (argc == 2) {
1721f23bf53Speter argc--;
1731f23bf53Speter getit(argv[1]);
1741f23bf53Speter } else
1751f23bf53Speter getit(core ? "core" : "pmon.out");
1761f23bf53Speter } else
1771f23bf53Speter noinclude++;
1781f23bf53Speter if (argc != 1)
1791f23bf53Speter goto usage;
1801f23bf53Speter firstname = filename = argv[0];
1811f23bf53Speter if (dotted(filename, 'i')) {
1821f23bf53Speter if (profile || table)
1831f23bf53Speter goto usage;
1841f23bf53Speter noinclude = 1;
1851f23bf53Speter bracket++;
1861f23bf53Speter } else if (!dotted(filename, 'p')) {
1871f23bf53Speter Perror(filename, "Name must end in '.p'");
1881f23bf53Speter exit(1);
1891f23bf53Speter }
1901f23bf53Speter if ((ibuf = fopen(filename, "r")) == NULL)
1911f23bf53Speter perror(filename), pexit(NOSTART);
1921f23bf53Speter ibp = ibuf;
1931f23bf53Speter if (onefile) {
1941f23bf53Speter int onintr();
1951f23bf53Speter
19676c7d847Sdonn cp = strcpy(stdoutn, "/tmp/pxp00000") + 13;
1971f23bf53Speter signal(2, onintr);
198175ce5f6Slepreau for (c = getpid(); c; c /= 10)
199175ce5f6Slepreau *--cp |= (c % 10);
2001f23bf53Speter if (freopen(stdoutn, "w", stdout) == NULL)
2011f23bf53Speter bad:
2021f23bf53Speter perror(stdoutn), exit(1);
2031f23bf53Speter }
2041f23bf53Speter if (profile || opt('l')) {
2051f23bf53Speter opt('n')++;
2061f23bf53Speter yysetfile(filename);
2071f23bf53Speter opt('n')--;
2081f23bf53Speter } else
2091f23bf53Speter lastname = filename;
2101f23bf53Speter errout = 2;
2111f23bf53Speter yymain();
2121f23bf53Speter /* No return */
2131f23bf53Speter }
2141f23bf53Speter
2151f23bf53Speter /*
2161f23bf53Speter * Put a header on a top of a page
2171f23bf53Speter */
header()2181f23bf53Speter header()
2191f23bf53Speter {
2201f23bf53Speter extern char version[];
2211f23bf53Speter static char reenter;
2221f23bf53Speter extern int outcol;
2231f23bf53Speter
224b1959515Smckusick gettime(filename);
2251f23bf53Speter if (reenter) {
2261f23bf53Speter if (outcol)
2271f23bf53Speter putchar('\n');
2281f23bf53Speter putchar('\f');
2291f23bf53Speter }
2301f23bf53Speter reenter++;
2311f23bf53Speter if (profile || table) {
23248908710Speter printf("Berkeley Pascal PXP -- Version %s\n\n%s %s\n\n",
23348908710Speter version, myctime(&tvec), filename);
2341f23bf53Speter printf("Profiled %s\n\n", myctime(&ptvec));
2351f23bf53Speter }
2361f23bf53Speter }
2371f23bf53Speter
2381f23bf53Speter char ugh[] = "Fatal error in pxp\n";
2391f23bf53Speter /*
2401f23bf53Speter * Exit from the Pascal system.
2411f23bf53Speter * We throw in an ungraceful termination
2421f23bf53Speter * message if c > 1 indicating a severe
2431f23bf53Speter * error such as running out of memory
2441f23bf53Speter * or an internal inconsistency.
2451f23bf53Speter */
pexit(c)2461f23bf53Speter pexit(c)
2471f23bf53Speter int c;
2481f23bf53Speter {
2491f23bf53Speter register char *cp;
2501f23bf53Speter extern int outcol;
2511f23bf53Speter
2521f23bf53Speter if (stdoutn[0] == '/')
2531f23bf53Speter unlink(stdoutn);
2541f23bf53Speter if (outcol)
2551f23bf53Speter putchar('\n');
2561f23bf53Speter flush();
2571f23bf53Speter if (c == DIED)
2581f23bf53Speter write(2, ugh, sizeof ugh);
2591f23bf53Speter exit(c);
2601f23bf53Speter }
2611f23bf53Speter
onintr()2621f23bf53Speter onintr()
2631f23bf53Speter {
2641f23bf53Speter
2651f23bf53Speter pexit(DIED);
2661f23bf53Speter }
2671f23bf53Speter
puthedr()2681f23bf53Speter puthedr()
2691f23bf53Speter {
2701f23bf53Speter
2711f23bf53Speter yysetfile(filename);
2721f23bf53Speter }
273