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