|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)0.h 5.1 (Berkeley) 6/5/85 ! 7: */ ! 8: ! 9: /* #define DEBUG */ ! 10: #define CHAR ! 11: #define STATIC ! 12: /* ! 13: * pxp - Pascal execution profiler ! 14: * ! 15: * Bill Joy ! 16: * University of California, Berkeley (UCB) ! 17: * Version 1.1 February 1978 ! 18: */ ! 19: ! 20: /* ! 21: * Option flags ! 22: * ! 23: * The following options are recognized on the command line by pxp. ! 24: * Only the u, w, and z options here have effect in comments in the ! 25: * program; the others are command line only, and unrelated ! 26: * to the options with the same designations in comments. ! 27: * ! 28: * a Print all routines in a profile; normally, routines ! 29: * which have never been executed have their bodies suppressed. ! 30: * ! 31: * c Extract profile data from the file core, or the file ! 32: * named after the last argument rather than the file 'pmon.out'. ! 33: * Must be used with z to have an effect. ! 34: * ! 35: * d Suppress declarations ! 36: * ! 37: * f Fully parenthesize expressions. ! 38: * ! 39: * j Left justify all procedures and functions rather than ! 40: * indenting them. ! 41: * ! 42: * n Eject a new page in the listing as each 'include' file ! 43: * is incorporated into the profile. ! 44: * ! 45: * o Put output prettyprint in first argument file ! 46: * ! 47: * p Pretty print a main program without processing ! 48: * the include statements. ! 49: * ! 50: * t Print a table summarizing procedure and function call counts. ! 51: * ! 52: * u Card image mode; only the first 72 chars on a line count. ! 53: * ! 54: * w Suppress certain warning diagnostics. ! 55: * ! 56: * z Generate an execution profile of the program. ! 57: * May also be followed by a list of procedure and function ! 58: * names mixed, if desired, with include file names. ! 59: * Only these procedures and functions, and the contents ! 60: * of the specified include files will then be profiled. ! 61: * ! 62: * [23456789] Use the specified number of spaces for the basic ! 63: * indenting unit in the program. ! 64: * ! 65: * _ Underline keywords in the output. ! 66: * ! 67: * O remove `others'. if an `others' label is found in a ! 68: * case statement the case statement (minus the others case) ! 69: * is printed as a guarded case statement, and the others case ! 70: * is the else branch of the guard. this transformation ! 71: * causes the case selector to be evaluated twice, a lose ! 72: * if the selector has side-effects. this option is only ! 73: * available if pxp is compiled with RMOTHERS defined. ! 74: */ ! 75: ! 76: char all, core, nodecl, full, justify, pmain, stripcomm, table, underline; ! 77: char profile, onefile; ! 78: #ifdef RMOTHERS ! 79: char rmothers; ! 80: #endif RMOTHERS ! 81: char *firstname, *stdoutn; ! 82: #ifdef DEBUG ! 83: char fulltrace, errtrace, testtrace, yyunique, typetest; ! 84: #endif ! 85: int unit; ! 86: ! 87: /* ! 88: * The flag nojunk means that header lines ! 89: * of procedures and functions are to be suppressed ! 90: * when the z option is off. ! 91: * It is the default when command line z option ! 92: * control is specified. ! 93: * ! 94: * The flag noinclude indicates that include statements are not ! 95: * to be processed since we are pretty-printing the contents ! 96: * of a single file. ! 97: * ! 98: * The flag bracket indicates that the source code should be ! 99: * bracketed with lines of the form ! 100: * program x(output); ! 101: * and ! 102: * begin end. ! 103: * so that an include will pretty print without syntax errors. ! 104: */ ! 105: char nojunk, noinclude, bracket; ! 106: ! 107: /* ! 108: * IMPORTANT NOTE ! 109: * ! 110: * Many of the following globals are shared by pi and pxp. ! 111: * For more discussion of these see the available documentation ! 112: * on the structure of pi. ! 113: */ ! 114: ! 115: /* ! 116: * Each option has a stack of 17 option values, with opts giving ! 117: * the current, top value, and optstk the value beneath it. ! 118: * One refers to option `l' as, e.g., opt('l') in the text for clarity. ! 119: */ ! 120: char opts[26]; ! 121: int optstk[26]; ! 122: ! 123: #define opt(c) opts[c-'a'] ! 124: ! 125: /* ! 126: * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES ! 127: * ! 128: * Pxp uses expandable tables for its string table ! 129: * hash table, and parse tree space. The following ! 130: * definitions specify the size of the increments ! 131: * for these items in fundamental units so that ! 132: * each uses approximately 1024 bytes. ! 133: */ ! 134: ! 135: #define STRINC 1024 /* string space increment */ ! 136: #define TRINC 1024 /* tree space increment */ ! 137: #define HASHINC 509 /* hash table size in words, each increment */ ! 138: ! 139: /* ! 140: * The initial sizes of the structures. ! 141: * These should be large enough to profile ! 142: * an "average" sized program so as to minimize ! 143: * storage requests. ! 144: * On a small system or and 11/34 or 11/40 ! 145: * these numbers can be trimmed to make the ! 146: * profiler smaller. ! 147: */ ! 148: #define ITREE 2000 ! 149: #define IHASH 509 ! 150: ! 151: /* ! 152: * The following limits on hash and tree tables currently ! 153: * allow approximately 1200 symbols and 20k words of tree ! 154: * space. The fundamental limit of 64k total data space ! 155: * should be exceeded well before these are full. ! 156: */ ! 157: /* ! 158: * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables ! 159: */ ! 160: #ifdef ADDR32 ! 161: #define TABLE_MULTIPLIER 8 ! 162: #endif ADDR32 ! 163: #ifdef ADDR16 ! 164: #define TABLE_MULTIPLIER 1 ! 165: #endif ADDR16 ! 166: #define MAXHASH (4 * TABLE_MULTIPLIER) ! 167: #define MAXTREE (40 * TABLE_MULTIPLIER) ! 168: /* ! 169: * MAXDEPTH is the depth of the parse stack. ! 170: * STACK_MULTIPLIER is for increasing its size. ! 171: */ ! 172: #ifdef ADDR32 ! 173: #define STACK_MULTIPLIER 8 ! 174: #endif ADDR32 ! 175: #ifdef ADDR16 ! 176: #define STACK_MULTIPLIER 1 ! 177: #endif ADDR16 ! 178: #define MAXDEPTH ( 150 * STACK_MULTIPLIER ) ! 179: ! 180: /* ! 181: * ERROR RELATED DEFINITIONS ! 182: */ ! 183: ! 184: /* ! 185: * Exit statuses to pexit ! 186: * ! 187: * AOK ! 188: * ERRS Compilation errors inhibit obj productin ! 189: * NOSTART Errors before we ever got started ! 190: * DIED We ran out of memory or some such ! 191: */ ! 192: #define AOK 0 ! 193: #define ERRS 1 ! 194: #define NOSTART 2 ! 195: #define DIED 3 ! 196: ! 197: char Recovery; ! 198: /* ! 199: * The flag eflg is set whenever we have a hard error. ! 200: * The character in errpfx will precede the next error message. ! 201: */ ! 202: int eflg; ! 203: char errpfx; ! 204: ! 205: #define setpfx(x) errpfx = x ! 206: ! 207: #define standard() setpfx('s') ! 208: #define warning() setpfx('w') ! 209: #define recovered() setpfx('e') ! 210: #define quit() setpfx('Q') ! 211: #define continuation() setpfx(' ') ! 212: ! 213: /* ! 214: * SEMANTIC DEFINITIONS ! 215: */ ! 216: ! 217: #define NIL 0 ! 218: ! 219: /* ! 220: * NOCON and SAWCON are flags in the tree telling whether ! 221: * a constant set is part of an expression. ! 222: */ ! 223: #define NOCON 0 ! 224: #define SAWCON 1 ! 225: ! 226: /* ! 227: * The variable cbn gives the current block number. ! 228: * The variable lastbn gives the block number before ! 229: * it last changed and is used to know that we were ! 230: * in a nested procedure so that we can print ! 231: * begin { solve } ! 232: * when solve has nested procedures or functions in it. ! 233: */ ! 234: int cbn, lastbn; ! 235: ! 236: /* ! 237: * The variable line is the current semantic ! 238: * line and is set in stat.c from the numbers ! 239: * embedded in statement type tree nodes. ! 240: */ ! 241: int line; ! 242: ! 243: /* ! 244: * The size of the display ! 245: * which defines the maximum nesting ! 246: * of procedures and functions allowed. ! 247: */ ! 248: #define DSPLYSZ 20 ! 249: ! 250: /* ! 251: * Routines which need types ! 252: * other than "integer" to be ! 253: * assumed by the compiler. ! 254: */ ! 255: struct tnode *tree(); ! 256: char *skipbl(); ! 257: int *hash(); ! 258: char *alloc(); ! 259: long cntof(); ! 260: long nowcnt(); ! 261: ! 262: /* ! 263: * type cast nils to keep lint happy. ! 264: */ ! 265: #define TR_NIL ((struct tnode *) NIL) ! 266: ! 267: /* ! 268: * Funny structures to use ! 269: * pointers in wild and wooly ways ! 270: */ ! 271: struct cstruct { ! 272: char pchar; ! 273: }; ! 274: struct { ! 275: int pint; ! 276: int pint2; ! 277: }; ! 278: struct { ! 279: long plong; ! 280: }; ! 281: struct { ! 282: double pdouble; ! 283: }; ! 284: ! 285: #define OCT 1 ! 286: #define HEX 2 ! 287: ! 288: /* ! 289: * MAIN PROGRAM GLOBALS, MISCELLANY ! 290: */ ! 291: ! 292: /* ! 293: * Variables forming a data base referencing ! 294: * the command line arguments with the "z" option. ! 295: */ ! 296: char **pflist; ! 297: int pflstc; ! 298: int pfcnt; ! 299: ! 300: char *filename; /* current source file name */ ! 301: char *lastname; /* last file name printed */ ! 302: long tvec; /* mod time of the source file */ ! 303: long ptvec; /* time profiled */ ! 304: char printed; /* current file has been printed */ ! 305: char hadsome; /* had some output */ ! 306: ! 307: /* ! 308: * PROFILING AND FORMATTING DEFINITIONS ! 309: */ ! 310: ! 311: /* ! 312: * The basic counter information recording structure. ! 313: * This is global only because people outside ! 314: * the cluster in pmon.c need to know its size. ! 315: */ ! 316: struct pxcnt { ! 317: long ntimes; /* the count this structure is all about */ ! 318: int counter; /* a unique counter number for us */ ! 319: int gos; /* global goto count when we hatched */ ! 320: int printed; /* are we considered to have been printed? */ ! 321: } pfcnts[DSPLYSZ]; ! 322: ! 323: /* ! 324: * The pieces we divide the output line indents into: ! 325: * line# PRFN label: STAT 999.---| DECL text ! 326: */ ! 327: #define STAT 0 ! 328: #define DECL 1 ! 329: #define PRFN 2 ! 330: ! 331: /* ! 332: * Gocnt records the total number of goto's and ! 333: * cnts records the current counter for generating ! 334: * COUNT operators. ! 335: */ ! 336: int gocnt; ! 337: int cnts; ! 338: ! 339: #include <stdio.h> ! 340: #include <sys/types.h> ! 341: ! 342: typedef enum {FALSE, TRUE} bool; ! 343: ! 344: #undef putchar
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.