1*48112Sbostic /*- 2*48112Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48112Sbostic * All rights reserved. 4*48112Sbostic * 5*48112Sbostic * %sccs.include.redist.c% 622232Sdist */ 722232Sdist 822232Sdist #ifndef lint 922232Sdist char copyright[] = 10*48112Sbostic "@(#) Copyright (c) 1980 The Regents of the University of California.\n\ 1122232Sdist All rights reserved.\n"; 12*48112Sbostic #endif /* not lint */ 1322232Sdist 1422232Sdist #ifndef lint 15*48112Sbostic static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 04/16/91"; 16*48112Sbostic #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; 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 */ 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 */ 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 2622858Speter onintr() 2632858Speter { 2642858Speter 2652858Speter pexit(DIED); 2662858Speter } 2672858Speter 2682858Speter puthedr() 2692858Speter { 2702858Speter 2712858Speter yysetfile(filename); 2722858Speter } 273