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