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