1*2858Speter static char *sccsid = "@(#)main.c 1.1 (Berkeley) 03/02/81"; 2*2858Speter /* Copyright (c) 1979 Regents of the University of California */ 3*2858Speter # 4*2858Speter /* 5*2858Speter * pxp - Pascal execution profiler 6*2858Speter * 7*2858Speter * Bill Joy UCB 8*2858Speter * Version 1.2 January 1979 9*2858Speter */ 10*2858Speter 11*2858Speter #include "0.h" 12*2858Speter 13*2858Speter /* 14*2858Speter * This program is described in detail in the "PXP 1.0 Implementation Notes" 15*2858Speter * 16*2858Speter * The structure of pxp is very similar to that of the translator pi. 17*2858Speter * The major new pieces here are a set of profile data maintenance 18*2858Speter * routines in the file pmon.c and a set of pretty printing utility 19*2858Speter * routines in the file pp.c. 20*2858Speter * The semantic routines of pi have been rewritten to do a simple 21*2858Speter * reformatting tree walk, the parsing and scanning remains 22*2858Speter * the same. 23*2858Speter * 24*2858Speter * This version does not place more than one statement per line and 25*2858Speter * is not very intelligent about folding long lines, with only 26*2858Speter * an ad hoc way of folding case label list and enumerated type 27*2858Speter * declarations being implemented. 28*2858Speter */ 29*2858Speter 30*2858Speter char usagestr[] = 31*2858Speter "pxp [ -acdefjntuw_ ] [ -23456789 ] [ -z [ name ... ] ] name.p"; 32*2858Speter char *howfile = "/usr/lib/how_pxp"; 33*2858Speter char *stdoutn = "Standard output"; 34*2858Speter 35*2858Speter int unit = 4; 36*2858Speter 37*2858Speter FILE *ibuf; 38*2858Speter extern char errout; 39*2858Speter 40*2858Speter /* 41*2858Speter * Main program for pxp. 42*2858Speter * Process options, then call yymain 43*2858Speter * to do all the real work. 44*2858Speter */ 45*2858Speter FILE *ibp; 46*2858Speter main(argc, argv) 47*2858Speter int argc; 48*2858Speter char *argv[]; 49*2858Speter { 50*2858Speter register char *cp; 51*2858Speter register c; 52*2858Speter 53*2858Speter if (argv[0][0] == 'a') 54*2858Speter howfile =+ 9; 55*2858Speter argc--, argv++; 56*2858Speter if (argc == 0) { 57*2858Speter execl("/bin/cat", "cat", howfile, 0); 58*2858Speter goto usage; 59*2858Speter } 60*2858Speter while (argc > 0) { 61*2858Speter cp = argv[0]; 62*2858Speter if (*cp++ != '-') 63*2858Speter break; 64*2858Speter while (c = *cp++) switch (c) { 65*2858Speter #ifdef DEBUG 66*2858Speter case 'T': 67*2858Speter typetest++; 68*2858Speter continue; 69*2858Speter case 'A': 70*2858Speter testtrace++; 71*2858Speter case 'F': 72*2858Speter fulltrace++; 73*2858Speter case 'E': 74*2858Speter errtrace++; 75*2858Speter continue; 76*2858Speter case 'C': 77*2858Speter yycosts(); 78*2858Speter pexit(NOSTART); 79*2858Speter case 'U': 80*2858Speter yyunique++; 81*2858Speter continue; 82*2858Speter #endif 83*2858Speter case 'a': 84*2858Speter all++; 85*2858Speter continue; 86*2858Speter case 'c': 87*2858Speter core++; 88*2858Speter continue; 89*2858Speter case 'd': 90*2858Speter nodecl++; 91*2858Speter continue; 92*2858Speter case 'e': 93*2858Speter noinclude = -1; 94*2858Speter continue; 95*2858Speter case 'f': 96*2858Speter full++; 97*2858Speter continue; 98*2858Speter case 'j': 99*2858Speter justify++; 100*2858Speter continue; 101*2858Speter case 'l': 102*2858Speter case 'n': 103*2858Speter togopt(c); 104*2858Speter continue; 105*2858Speter case 'o': 106*2858Speter onefile++; 107*2858Speter continue; 108*2858Speter case 's': 109*2858Speter stripcomm++; 110*2858Speter continue; 111*2858Speter case 't': 112*2858Speter table++; 113*2858Speter continue; 114*2858Speter case 'u': 115*2858Speter case 'w': 116*2858Speter togopt(c); 117*2858Speter continue; 118*2858Speter case 'z': 119*2858Speter profile++; 120*2858Speter pflist = argv + 1; 121*2858Speter pflstc = 0; 122*2858Speter while (argc > 1) { 123*2858Speter if (dotted(argv[1], 'p')) 124*2858Speter break; 125*2858Speter pflstc++, argc--, argv++; 126*2858Speter } 127*2858Speter if (pflstc == 0) 128*2858Speter togopt(c); 129*2858Speter else 130*2858Speter nojunk++; 131*2858Speter continue; 132*2858Speter case '_': 133*2858Speter underline++; 134*2858Speter continue; 135*2858Speter default: 136*2858Speter if (c >= '2' && c <= '9') { 137*2858Speter unit = c - '0'; 138*2858Speter continue; 139*2858Speter } 140*2858Speter usage: 141*2858Speter Perror("Usage", usagestr); 142*2858Speter exit(1); 143*2858Speter } 144*2858Speter argc--, argv++; 145*2858Speter } 146*2858Speter if (core && !profile && !table) 147*2858Speter profile++; 148*2858Speter if (argc == 0 || argc > 2) 149*2858Speter goto usage; 150*2858Speter if (profile || table) { 151*2858Speter noinclude = 0; 152*2858Speter if (argc == 2) { 153*2858Speter argc--; 154*2858Speter getit(argv[1]); 155*2858Speter } else 156*2858Speter getit(core ? "core" : "pmon.out"); 157*2858Speter } else 158*2858Speter noinclude++; 159*2858Speter if (argc != 1) 160*2858Speter goto usage; 161*2858Speter firstname = filename = argv[0]; 162*2858Speter if (dotted(filename, 'i')) { 163*2858Speter if (profile || table) 164*2858Speter goto usage; 165*2858Speter noinclude = 1; 166*2858Speter bracket++; 167*2858Speter } else if (!dotted(filename, 'p')) { 168*2858Speter Perror(filename, "Name must end in '.p'"); 169*2858Speter exit(1); 170*2858Speter } 171*2858Speter if ((ibuf = fopen(filename, "r")) == NULL) 172*2858Speter perror(filename), pexit(NOSTART); 173*2858Speter ibp = ibuf; 174*2858Speter if (onefile) { 175*2858Speter int onintr(); 176*2858Speter 177*2858Speter cp = (stdoutn = "/tmp/pxp00000") + 13; 178*2858Speter signal(2, onintr); 179*2858Speter for (c = getpid(); c; c =/ 10) 180*2858Speter *--cp =| (c % 10); 181*2858Speter if (freopen(stdoutn, "w", stdout) == NULL) 182*2858Speter bad: 183*2858Speter perror(stdoutn), exit(1); 184*2858Speter } else { 185*2858Speter extern char _sobuf[BUFSIZ]; 186*2858Speter setbuf(stdout, _sobuf); 187*2858Speter } 188*2858Speter if (profile || opt('l')) { 189*2858Speter opt('n')++; 190*2858Speter yysetfile(filename); 191*2858Speter opt('n')--; 192*2858Speter } else 193*2858Speter lastname = filename; 194*2858Speter errout = 2; 195*2858Speter yymain(); 196*2858Speter /* No return */ 197*2858Speter } 198*2858Speter 199*2858Speter /* 200*2858Speter * Put a header on a top of a page 201*2858Speter */ 202*2858Speter header() 203*2858Speter { 204*2858Speter extern char version[]; 205*2858Speter static char reenter; 206*2858Speter extern int outcol; 207*2858Speter 208*2858Speter gettime(); 209*2858Speter if (reenter) { 210*2858Speter if (outcol) 211*2858Speter putchar('\n'); 212*2858Speter putchar('\f'); 213*2858Speter } 214*2858Speter reenter++; 215*2858Speter if (profile || table) { 216*2858Speter printf("Berkeley Pascal PXP -- Version 1.1 (%s)\n\n%s %s\n\n", version, myctime(&tvec), filename); 217*2858Speter printf("Profiled %s\n\n", myctime(&ptvec)); 218*2858Speter } 219*2858Speter } 220*2858Speter 221*2858Speter char ugh[] = "Fatal error in pxp\n"; 222*2858Speter /* 223*2858Speter * Exit from the Pascal system. 224*2858Speter * We throw in an ungraceful termination 225*2858Speter * message if c > 1 indicating a severe 226*2858Speter * error such as running out of memory 227*2858Speter * or an internal inconsistency. 228*2858Speter */ 229*2858Speter pexit(c) 230*2858Speter int c; 231*2858Speter { 232*2858Speter register char *cp; 233*2858Speter extern int outcol; 234*2858Speter 235*2858Speter if (stdoutn[0] == '/') 236*2858Speter unlink(stdoutn); 237*2858Speter if (outcol) 238*2858Speter putchar('\n'); 239*2858Speter flush(); 240*2858Speter if (c == DIED) 241*2858Speter write(2, ugh, sizeof ugh); 242*2858Speter exit(c); 243*2858Speter } 244*2858Speter 245*2858Speter onintr() 246*2858Speter { 247*2858Speter 248*2858Speter pexit(DIED); 249*2858Speter } 250*2858Speter 251*2858Speter puthedr() 252*2858Speter { 253*2858Speter 254*2858Speter yysetfile(filename); 255*2858Speter } 256