1*7743Speter static char *sccsid = "@(#)main.c 1.2 (Berkeley) 08/13/82"; 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; 1352858Speter default: 1362858Speter if (c >= '2' && c <= '9') { 1372858Speter unit = c - '0'; 1382858Speter continue; 1392858Speter } 1402858Speter usage: 1412858Speter Perror("Usage", usagestr); 1422858Speter exit(1); 1432858Speter } 1442858Speter argc--, argv++; 1452858Speter } 1462858Speter if (core && !profile && !table) 1472858Speter profile++; 1482858Speter if (argc == 0 || argc > 2) 1492858Speter goto usage; 1502858Speter if (profile || table) { 1512858Speter noinclude = 0; 1522858Speter if (argc == 2) { 1532858Speter argc--; 1542858Speter getit(argv[1]); 1552858Speter } else 1562858Speter getit(core ? "core" : "pmon.out"); 1572858Speter } else 1582858Speter noinclude++; 1592858Speter if (argc != 1) 1602858Speter goto usage; 1612858Speter firstname = filename = argv[0]; 1622858Speter if (dotted(filename, 'i')) { 1632858Speter if (profile || table) 1642858Speter goto usage; 1652858Speter noinclude = 1; 1662858Speter bracket++; 1672858Speter } else if (!dotted(filename, 'p')) { 1682858Speter Perror(filename, "Name must end in '.p'"); 1692858Speter exit(1); 1702858Speter } 1712858Speter if ((ibuf = fopen(filename, "r")) == NULL) 1722858Speter perror(filename), pexit(NOSTART); 1732858Speter ibp = ibuf; 1742858Speter if (onefile) { 1752858Speter int onintr(); 1762858Speter 1772858Speter cp = (stdoutn = "/tmp/pxp00000") + 13; 1782858Speter signal(2, onintr); 1792858Speter for (c = getpid(); c; c =/ 10) 1802858Speter *--cp =| (c % 10); 1812858Speter if (freopen(stdoutn, "w", stdout) == NULL) 1822858Speter bad: 1832858Speter perror(stdoutn), exit(1); 1842858Speter } else { 1852858Speter extern char _sobuf[BUFSIZ]; 1862858Speter setbuf(stdout, _sobuf); 1872858Speter } 1882858Speter if (profile || opt('l')) { 1892858Speter opt('n')++; 1902858Speter yysetfile(filename); 1912858Speter opt('n')--; 1922858Speter } else 1932858Speter lastname = filename; 1942858Speter errout = 2; 1952858Speter yymain(); 1962858Speter /* No return */ 1972858Speter } 1982858Speter 1992858Speter /* 2002858Speter * Put a header on a top of a page 2012858Speter */ 2022858Speter header() 2032858Speter { 2042858Speter extern char version[]; 2052858Speter static char reenter; 2062858Speter extern int outcol; 2072858Speter 2082858Speter gettime(); 2092858Speter if (reenter) { 2102858Speter if (outcol) 2112858Speter putchar('\n'); 2122858Speter putchar('\f'); 2132858Speter } 2142858Speter reenter++; 2152858Speter if (profile || table) { 216*7743Speter printf("Berkeley Pascal PXP -- Version %s\n\n%s %s\n\n", 217*7743Speter version, myctime(&tvec), filename); 2182858Speter printf("Profiled %s\n\n", myctime(&ptvec)); 2192858Speter } 2202858Speter } 2212858Speter 2222858Speter char ugh[] = "Fatal error in pxp\n"; 2232858Speter /* 2242858Speter * Exit from the Pascal system. 2252858Speter * We throw in an ungraceful termination 2262858Speter * message if c > 1 indicating a severe 2272858Speter * error such as running out of memory 2282858Speter * or an internal inconsistency. 2292858Speter */ 2302858Speter pexit(c) 2312858Speter int c; 2322858Speter { 2332858Speter register char *cp; 2342858Speter extern int outcol; 2352858Speter 2362858Speter if (stdoutn[0] == '/') 2372858Speter unlink(stdoutn); 2382858Speter if (outcol) 2392858Speter putchar('\n'); 2402858Speter flush(); 2412858Speter if (c == DIED) 2422858Speter write(2, ugh, sizeof ugh); 2432858Speter exit(c); 2442858Speter } 2452858Speter 2462858Speter onintr() 2472858Speter { 2482858Speter 2492858Speter pexit(DIED); 2502858Speter } 2512858Speter 2522858Speter puthedr() 2532858Speter { 2542858Speter 2552858Speter yysetfile(filename); 2562858Speter } 257