12858Speter /* 222232Sdist * Copyright (c) 1980 Regents of the University of California. 322232Sdist * All rights reserved. The Berkeley software License Agreement 422232Sdist * specifies the terms and conditions for redistribution. 522232Sdist */ 622232Sdist 722232Sdist #ifndef lint 822232Sdist char copyright[] = 922232Sdist "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 1022232Sdist All rights reserved.\n"; 1122232Sdist #endif not lint 1222232Sdist 1322232Sdist #ifndef lint 14*47062Sdonn static char sccsid[] = "@(#)main.c 5.4 (Berkeley) 03/07/91"; 1522232Sdist #endif not lint 1622232Sdist 1722232Sdist /* 182858Speter * pxp - Pascal execution profiler 192858Speter * 202858Speter * Bill Joy UCB 212858Speter * Version 1.2 January 1979 222858Speter */ 232858Speter 242858Speter #include "0.h" 252858Speter 262858Speter /* 272858Speter * This program is described in detail in the "PXP 1.0 Implementation Notes" 282858Speter * 292858Speter * The structure of pxp is very similar to that of the translator pi. 302858Speter * The major new pieces here are a set of profile data maintenance 312858Speter * routines in the file pmon.c and a set of pretty printing utility 322858Speter * routines in the file pp.c. 332858Speter * The semantic routines of pi have been rewritten to do a simple 342858Speter * reformatting tree walk, the parsing and scanning remains 352858Speter * the same. 362858Speter * 372858Speter * This version does not place more than one statement per line and 382858Speter * is not very intelligent about folding long lines, with only 392858Speter * an ad hoc way of folding case label list and enumerated type 402858Speter * declarations being implemented. 412858Speter */ 422858Speter 432858Speter char usagestr[] = 442858Speter "pxp [ -acdefjntuw_ ] [ -23456789 ] [ -z [ name ... ] ] name.p"; 452858Speter char *howfile = "/usr/lib/how_pxp"; 46*47062Sdonn char stdoutn[20] = "Standard output"; 472858Speter 482858Speter int unit = 4; 492858Speter 502858Speter FILE *ibuf; 512858Speter extern char errout; 522858Speter 532858Speter /* 542858Speter * Main program for pxp. 552858Speter * Process options, then call yymain 562858Speter * to do all the real work. 572858Speter */ 582858Speter FILE *ibp; 592858Speter main(argc, argv) 602858Speter int argc; 612858Speter char *argv[]; 622858Speter { 632858Speter register char *cp; 642858Speter register c; 652858Speter 662858Speter if (argv[0][0] == 'a') 6730650Slepreau howfile += 9; 682858Speter argc--, argv++; 692858Speter if (argc == 0) { 702858Speter execl("/bin/cat", "cat", howfile, 0); 712858Speter goto usage; 722858Speter } 732858Speter while (argc > 0) { 742858Speter cp = argv[0]; 752858Speter if (*cp++ != '-') 762858Speter break; 772858Speter while (c = *cp++) switch (c) { 782858Speter #ifdef DEBUG 792858Speter case 'T': 802858Speter typetest++; 812858Speter continue; 822858Speter case 'A': 832858Speter testtrace++; 842858Speter case 'F': 852858Speter fulltrace++; 862858Speter case 'E': 872858Speter errtrace++; 882858Speter continue; 892858Speter case 'C': 902858Speter yycosts(); 912858Speter pexit(NOSTART); 922858Speter case 'U': 932858Speter yyunique++; 942858Speter continue; 952858Speter #endif 962858Speter case 'a': 972858Speter all++; 982858Speter continue; 992858Speter case 'c': 1002858Speter core++; 1012858Speter continue; 1022858Speter case 'd': 1032858Speter nodecl++; 1042858Speter continue; 1052858Speter case 'e': 1062858Speter noinclude = -1; 1072858Speter continue; 1082858Speter case 'f': 1092858Speter full++; 1102858Speter continue; 1112858Speter case 'j': 1122858Speter justify++; 1132858Speter continue; 1142858Speter case 'l': 1152858Speter case 'n': 1162858Speter togopt(c); 1172858Speter continue; 1182858Speter case 'o': 1192858Speter onefile++; 1202858Speter continue; 1212858Speter case 's': 1222858Speter stripcomm++; 1232858Speter continue; 1242858Speter case 't': 1252858Speter table++; 1262858Speter continue; 1272858Speter case 'u': 1282858Speter case 'w': 1292858Speter togopt(c); 1302858Speter continue; 1312858Speter case 'z': 1322858Speter profile++; 1332858Speter pflist = argv + 1; 1342858Speter pflstc = 0; 1352858Speter while (argc > 1) { 1362858Speter if (dotted(argv[1], 'p')) 1372858Speter break; 1382858Speter pflstc++, argc--, argv++; 1392858Speter } 1402858Speter if (pflstc == 0) 1412858Speter togopt(c); 1422858Speter else 1432858Speter nojunk++; 1442858Speter continue; 1452858Speter case '_': 1462858Speter underline++; 1472858Speter continue; 14812411Speter # ifdef RMOTHERS 14912411Speter case 'O': 15012411Speter rmothers++; 15112411Speter continue; 15212411Speter # endif RMOTHERS 1532858Speter default: 1542858Speter if (c >= '2' && c <= '9') { 1552858Speter unit = c - '0'; 1562858Speter continue; 1572858Speter } 1582858Speter usage: 1592858Speter Perror("Usage", usagestr); 1602858Speter exit(1); 1612858Speter } 1622858Speter argc--, argv++; 1632858Speter } 1642858Speter if (core && !profile && !table) 1652858Speter profile++; 1662858Speter if (argc == 0 || argc > 2) 1672858Speter goto usage; 1682858Speter if (profile || table) { 1692858Speter noinclude = 0; 1702858Speter if (argc == 2) { 1712858Speter argc--; 1722858Speter getit(argv[1]); 1732858Speter } else 1742858Speter getit(core ? "core" : "pmon.out"); 1752858Speter } else 1762858Speter noinclude++; 1772858Speter if (argc != 1) 1782858Speter goto usage; 1792858Speter firstname = filename = argv[0]; 1802858Speter if (dotted(filename, 'i')) { 1812858Speter if (profile || table) 1822858Speter goto usage; 1832858Speter noinclude = 1; 1842858Speter bracket++; 1852858Speter } else if (!dotted(filename, 'p')) { 1862858Speter Perror(filename, "Name must end in '.p'"); 1872858Speter exit(1); 1882858Speter } 1892858Speter if ((ibuf = fopen(filename, "r")) == NULL) 1902858Speter perror(filename), pexit(NOSTART); 1912858Speter ibp = ibuf; 1922858Speter if (onefile) { 1932858Speter int onintr(); 1942858Speter 195*47062Sdonn cp = strcpy(stdoutn, "/tmp/pxp00000") + 13; 1962858Speter signal(2, onintr); 19730650Slepreau for (c = getpid(); c; c /= 10) 19830650Slepreau *--cp |= (c % 10); 1992858Speter if (freopen(stdoutn, "w", stdout) == NULL) 2002858Speter bad: 2012858Speter perror(stdoutn), exit(1); 2022858Speter } 2032858Speter if (profile || opt('l')) { 2042858Speter opt('n')++; 2052858Speter yysetfile(filename); 2062858Speter opt('n')--; 2072858Speter } else 2082858Speter lastname = filename; 2092858Speter errout = 2; 2102858Speter yymain(); 2112858Speter /* No return */ 2122858Speter } 2132858Speter 2142858Speter /* 2152858Speter * Put a header on a top of a page 2162858Speter */ 2172858Speter header() 2182858Speter { 2192858Speter extern char version[]; 2202858Speter static char reenter; 2212858Speter extern int outcol; 2222858Speter 22317684Smckusick gettime(filename); 2242858Speter if (reenter) { 2252858Speter if (outcol) 2262858Speter putchar('\n'); 2272858Speter putchar('\f'); 2282858Speter } 2292858Speter reenter++; 2302858Speter if (profile || table) { 2317743Speter printf("Berkeley Pascal PXP -- Version %s\n\n%s %s\n\n", 2327743Speter version, myctime(&tvec), filename); 2332858Speter printf("Profiled %s\n\n", myctime(&ptvec)); 2342858Speter } 2352858Speter } 2362858Speter 2372858Speter char ugh[] = "Fatal error in pxp\n"; 2382858Speter /* 2392858Speter * Exit from the Pascal system. 2402858Speter * We throw in an ungraceful termination 2412858Speter * message if c > 1 indicating a severe 2422858Speter * error such as running out of memory 2432858Speter * or an internal inconsistency. 2442858Speter */ 2452858Speter pexit(c) 2462858Speter int c; 2472858Speter { 2482858Speter register char *cp; 2492858Speter extern int outcol; 2502858Speter 2512858Speter if (stdoutn[0] == '/') 2522858Speter unlink(stdoutn); 2532858Speter if (outcol) 2542858Speter putchar('\n'); 2552858Speter flush(); 2562858Speter if (c == DIED) 2572858Speter write(2, ugh, sizeof ugh); 2582858Speter exit(c); 2592858Speter } 2602858Speter 2612858Speter onintr() 2622858Speter { 2632858Speter 2642858Speter pexit(DIED); 2652858Speter } 2662858Speter 2672858Speter puthedr() 2682858Speter { 2692858Speter 2702858Speter yysetfile(filename); 2712858Speter } 272