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 7 #ifndef lint 8 static char sccsid[] = "@(#)pp.c 5.3 (Berkeley) 10/16/87"; 9 #endif not lint 10 11 /* 12 * pxp - Pascal execution profiler 13 * 14 * Bill Joy UCB 15 * Version 1.2 January 1979 16 */ 17 18 #include "0.h" 19 20 #define noprint() nopflg 21 22 int pplev[3]; /* STAT, DECL, PRFN */ 23 int nopflg; 24 25 setprint() 26 { 27 28 if (profile == 0) { 29 if (table) 30 nopflg = 1; 31 else 32 nopflg = 0; 33 return; 34 } 35 nopflg = !all && nowcnt() == 0 || !opt('z'); 36 } 37 38 printon() 39 { 40 41 if (profile == 0) { 42 if (table) 43 nopflg = 1; 44 return; 45 } 46 nopflg = 0; 47 } 48 49 printoff() 50 { 51 52 nopflg = 1; 53 } 54 55 ppkw(s) 56 register char *s; 57 { 58 register char *cp, i; 59 60 if (noprint()) 61 return; 62 /* 63 * First real thing printed 64 * is always a keyword 65 * or includes an "id" (if a comment) 66 * (See ppnl below) 67 */ 68 hadsome = 1; 69 if (underline) { 70 for (cp = s; *cp; cp++) 71 putchar('_'); 72 for (cp = s; *cp; cp++) 73 putchar('\b'); 74 } 75 printf(s); 76 } 77 78 ppid(s) 79 register char *s; 80 { 81 82 if (noprint()) 83 return; 84 hadsome = 1; 85 if (s == NIL) 86 s = "{identifier}"; 87 printf(s); 88 } 89 90 ppbra(s) 91 char *s; 92 { 93 94 if (noprint()) 95 return; 96 if (s != NIL) 97 printf(s); 98 } 99 100 ppsep(s) 101 char *s; 102 { 103 104 if (noprint()) 105 return; 106 printf(s); 107 } 108 109 ppket(s) 110 char *s; 111 { 112 113 if (noprint()) 114 return; 115 if (s != NIL) 116 printf(s); 117 } 118 119 char killsp; 120 121 ppunspac() 122 { 123 124 killsp = 1; 125 } 126 127 ppspac() 128 { 129 130 if (killsp) { 131 killsp = 0; 132 return; 133 } 134 if (noprint()) 135 return; 136 putchar(' '); 137 } 138 139 ppitem() 140 { 141 142 if (noprint()) 143 return; 144 ppnl(); 145 indent(); 146 } 147 148 int owenl, owenlb; 149 150 ppsnlb() 151 { 152 153 if (nopflg) 154 return; 155 owenlb++; 156 } 157 158 ppsnl() 159 { 160 161 if (nopflg) 162 return; 163 owenl++; 164 } 165 166 pppay() 167 { 168 169 while (owenl || owenlb) { 170 putchar('\n'); 171 if (owenlb) { 172 putchar(' '); 173 owenlb--; 174 } else 175 owenl--; 176 } 177 } 178 179 ppnl() 180 { 181 182 if (noprint()) 183 return; 184 if (hadsome == 0) 185 return; 186 pppay(); 187 putchar('\n'); 188 } 189 190 indent() 191 { 192 register i; 193 194 if (noprint()) 195 return; 196 linopr(); 197 if (profile == 0) { 198 indent1(pplev[PRFN] + pplev[DECL] + pplev[STAT]); 199 return; 200 } 201 indent1(pplev[PRFN] + pplev[STAT]); 202 switch (i = shudpcnt()) { 203 case 1: 204 printf("%7ld.", nowcnt()); 205 dashes('-'); 206 putchar('|'); 207 break; 208 case 0: 209 case -1: 210 printf(" "); 211 dashes(' '); 212 putchar(i == 0 ? '|' : ' '); 213 break; 214 } 215 indent1(pplev[DECL]); 216 } 217 218 dashes(c) 219 char c; 220 { 221 register i; 222 223 for (i = unit - 1; i != 0; i--) 224 putchar(c); 225 } 226 227 indent1(in) 228 int in; 229 { 230 register i; 231 232 if (noprint()) 233 return; 234 i = in; 235 if (profile == 0) 236 while (i >= 8) { 237 putchar('\t'); 238 i -= 8; 239 } 240 while (i > 0) { 241 putchar(' '); 242 i--; 243 } 244 } 245 246 linopr() 247 { 248 249 if (noprint()) 250 return; 251 if (profile) { 252 if (line < 0) 253 line = -line; 254 printf("%6d ", line); 255 } 256 } 257 258 indentlab() 259 { 260 261 indent1(pplev[PRFN]); 262 } 263 264 ppop(s) 265 char *s; 266 { 267 268 if (noprint()) 269 return; 270 printf(s); 271 } 272 273 ppnumb(s) 274 char *s; 275 { 276 277 if (noprint()) 278 return; 279 if (s == NIL) 280 s = "{number}"; 281 printf(s); 282 } 283 284 ppgoin(lv) 285 { 286 287 pplev[lv] += unit; 288 } 289 290 ppgoout(lv) 291 { 292 293 pplev[lv] -= unit; 294 if (pplev[lv] < 0) 295 panic("pplev"); 296 } 297 298 ppstr(s) 299 char *s; 300 { 301 register char *cp; 302 303 if (noprint()) 304 return; 305 if (s == NIL) { 306 printf("{string}"); 307 return; 308 } 309 putchar('\''); 310 cp = s; 311 while (*cp) { 312 putchar(*cp); 313 if (*cp == '\'') 314 putchar('\''); 315 cp++; 316 } 317 putchar('\''); 318 } 319 320 pplab(s) 321 char *s; 322 { 323 324 if (noprint()) 325 return; 326 if (s == NIL) 327 s = "{integer label}"; 328 printf(s); 329 } 330 331 int outcol; 332 333 334 putchar(c) 335 char c; 336 { 337 338 putc(c, stdout); 339 if (ferror(stdout)) 340 outerr(); 341 switch (c) { 342 case '\n': 343 outcol = 0; 344 flush(); 345 break; 346 case '\t': 347 outcol += 8; 348 outcol &= ~07; 349 break; 350 case '\b': 351 if (outcol) 352 outcol--; 353 break; 354 default: 355 outcol++; 356 case '\f': 357 break; 358 } 359 } 360 361 flush() 362 { 363 364 fflush(stdout); 365 if (ferror(stdout)) 366 outerr(); 367 } 368 369 pptab() 370 { 371 register int i; 372 373 if (noprint()) 374 return; 375 i = pplev[PRFN] + profile ? 44 + unit : 28; 376 /* 377 if (outcol > i + 8) { 378 ppnl(); 379 i += 8; 380 } 381 */ 382 do 383 putchar('\t'); 384 while (outcol < i); 385 } 386 387 outerr() 388 { 389 390 perror(stdoutn); 391 pexit(DIED); 392 } 393