12854Speter /* Copyright (c) 1979 Regents of the University of California */ 22854Speter # 3*7718Smckusick static char *sccsid = "@(#)fdec.c 1.3 (Berkeley) 08/12/82"; 42854Speter /* 52854Speter * pxp - Pascal execution profiler 62854Speter * 72854Speter * Bill Joy UCB 82854Speter * Version 1.2 January 1979 92854Speter */ 102854Speter 112854Speter #include "0.h" 122854Speter #include "tree.h" 132854Speter 142854Speter /* 152854Speter * Program, procedure or function "header", i.e.: 162854Speter * 172854Speter * function sin: real; 182854Speter */ 192854Speter funchdr(r) 202854Speter int *r; 212854Speter { 222854Speter register **rl, *il; 232854Speter 242854Speter if (inpflist(r[2])) { 252854Speter optstk['z'-'a'] =<< 1; 262854Speter optstk['z'-'a'] =| opts['z'-'a']; 272854Speter opts['z'-'a'] = 1; 282854Speter } 292854Speter cbn++; 302854Speter lastbn = cbn; 312854Speter getcnt(); 322854Speter if (nojunk && !inpflist(r[2])) 332854Speter setprint(); 342854Speter else 352854Speter printon(); 362854Speter if (r[0] == T_PROG && noinclude && bracket) 372854Speter printoff(); 382854Speter if (cbn > 1 && !justify) 392854Speter ppgoin(PRFN); 402854Speter puthedr(); 412854Speter if (noblank(setline(r[1]))) 422854Speter ppnl(); 432854Speter cnttab(r[2], pfcnt++); 442854Speter ppnl(); 452854Speter indent(); 462854Speter switch (r[0]) { 472854Speter case T_PROG: 482854Speter ppkw("program"); 492854Speter break; 502854Speter case T_PDEC: 512854Speter ppkw("procedure"); 522854Speter break; 532854Speter case T_FDEC: 542854Speter ppkw("function"); 552854Speter break; 562854Speter default: 572854Speter panic("funchdr"); 582854Speter } 592854Speter ppspac(); 602854Speter ppid(r[2]); 612854Speter if (r[0] != T_PROG) { 622854Speter rl = r[3]; 632854Speter if (rl != NIL) { 642854Speter ppbra("("); 652854Speter for (;;) { 662854Speter if (rl[1] == NIL) { 672854Speter rl = rl[2]; 682854Speter continue; 692854Speter } 702854Speter switch (rl[1][0]) { 712854Speter case T_PVAR: 722854Speter ppkw("var"); 732854Speter ppspac(); 742854Speter break; 752854Speter case T_PPROC: 762854Speter ppkw("procedure"); 772854Speter ppspac(); 782854Speter break; 792854Speter case T_PFUNC: 802854Speter ppkw("function"); 812854Speter ppspac(); 822854Speter break; 832854Speter } 842854Speter il = rl[1][1]; 852854Speter if (il != NIL) 862854Speter for (;;) { 872854Speter ppid(il[1]); 882854Speter il = il[2]; 892854Speter if (il == NIL) 902854Speter break; 912854Speter ppsep(", "); 922854Speter } 932854Speter else 942854Speter ppid("{identifier list}"); 952854Speter if (rl[1][0] != T_PPROC) { 962854Speter ppsep(":"); 972854Speter gtype(rl[1][2]); 982854Speter } 992854Speter rl = rl[2]; 1002854Speter if (rl == NIL) 1012854Speter break; 1022854Speter ppsep(";"); 1032854Speter ppspac(); 1042854Speter } 1052854Speter ppket(")"); 1062854Speter } 1072854Speter if (r[0] == T_FDEC && r[4] != NIL) { 1082854Speter ppsep(":"); 1092854Speter gtype(r[4]); 1102854Speter } 1112854Speter ppsep(";"); 1122854Speter } else { 1132854Speter rl = r[3]; 1142854Speter if (rl != NIL) { 1152854Speter ppbra("("); 1162854Speter for (;;) { 1172854Speter ppid(rl[1]); 1182854Speter rl = rl[2]; 1192854Speter if (rl == NIL) 1202854Speter break; 1212854Speter ppsep(", "); 1222854Speter } 1232854Speter ppket(")"); 1242854Speter } 1252854Speter ppsep(";"); 1262854Speter } 1272854Speter fhout: 1282854Speter setline(r[1]); 1292854Speter putcml(); 1302854Speter savecnt(&pfcnts[cbn]); 1312854Speter setprint(); 1322854Speter --cbn; 1332854Speter if (cbn && !justify) 1342854Speter ppgoout(PRFN); 1352854Speter return (r[2]); 1362854Speter } 1372854Speter 1382854Speter /* 1392854Speter * Forward declaration i.e. the second line of 1402854Speter * 1412854Speter * procedure fum(var i: integer); 1422854Speter * forward; 1432854Speter */ 1442854Speter funcfwd(fp) 1452854Speter char *fp; 1462854Speter { 1472854Speter 1482854Speter baroff(); 1492854Speter ppgoin(DECL); 1502854Speter ppnl(); 1512854Speter indent(); 1522854Speter ppkw("forward"); 1532854Speter ppsep(";"); 1542854Speter ppgoout(DECL); 1552854Speter baron(); 1562854Speter return (fp); 1572854Speter } 1582854Speter 1592854Speter /* 1602854Speter * The "body" of a procedure, function, or program declaration, 1612854Speter * i.e. a non-forward definition encounter. 1622854Speter */ 1632854Speter funcbody(fp) 1642854Speter char *fp; 1652854Speter { 1662854Speter 1672854Speter if (cbn && !justify) 1682854Speter ppgoin(PRFN); 1692854Speter cbn++; 1702854Speter lastbn = cbn; 1712854Speter return (fp); 1722854Speter } 1732854Speter 1742854Speter /* 1752854Speter * The guts of the procedure, function or program, i.e. 1762854Speter * the part between the begin and the end. 1772854Speter */ 1782854Speter funcend(fp, bundle, binfo) 1792854Speter char *fp; 1802854Speter int *bundle, *binfo; 1812854Speter { 1822854Speter int *blk; 1832854Speter extern int cntstat; 1842854Speter 1852854Speter cntstat = 0; 1862854Speter blk = bundle[2]; 1872854Speter rescnt(&pfcnts[cbn]); 1882854Speter setprint(); 1892854Speter if (cbn == 1 && noinclude && bracket) 1902854Speter printoff(); 1912854Speter if (lastbn > cbn) 1922854Speter unprint(); 1932854Speter if (cbn == 1) 1942854Speter puthedr(); 1952854Speter if (noblank(setline(bundle[1])) && lastbn > cbn) 1962854Speter ppnl(); 1972854Speter ppnl(); 1982854Speter indent(); 1992854Speter ppkw("begin"); 2002854Speter setline(bundle[1]); 2012854Speter if (putcml() == 0 && lastbn > cbn) 2022854Speter ppsname(fp); 2032854Speter ppgoin(DECL); 2042854Speter statlist(blk); 2052854Speter setinfo(bundle[1]); 2062854Speter putcmp(); 2072854Speter ppgoout(DECL); 2082854Speter ppnl(); 2092854Speter indent(); 2102854Speter ppkw("end"); 2112854Speter ppsep(cbn == 1 ? "." : ";"); 2122854Speter setinfo(binfo); 2132854Speter if (putcml() == 0) 2142854Speter ppsname(fp); 2152854Speter cbn--; 2162854Speter if (cbn && !justify) 2172854Speter ppgoout(PRFN); 2182854Speter if (inpflist(fp)) { 2192854Speter opts['z'-'a'] = optstk['z'-'a'] & 1; 2202854Speter optstk['z'-'a'] =>> 1; 2212854Speter } 2222854Speter if (cbn == 0) { 2232854Speter flushcm(); 2242854Speter printon(); 2252854Speter ppnl(); 2262854Speter } 2272854Speter } 2282854Speter 2292854Speter ppsname(fp) 2302854Speter char *fp; 2312854Speter { 2322854Speter if (fp == NIL) 2332854Speter return; 2342854Speter ppsep(" { "); 2352854Speter ppid(fp); 2362854Speter ppsep(" }"); 2372854Speter } 2387717Smckusick 2397717Smckusick /* 2407717Smckusick * Segend is called at the end of a routine segment (a separately 2417717Smckusick * compiled segment that is not the main program). Since pxp only works 2427717Smckusick * with a single pascal file, this routine should never be called. 2437717Smckusick */ 2447717Smckusick segend() 2457717Smckusick { 2467717Smckusick 247*7718Smckusick if ( profile ) { 248*7718Smckusick error("Missing program statement and program body"); 249*7718Smckusick } 2507717Smckusick } 2517717Smckusick 2527717Smckusick /* 2537717Smckusick * External declaration i.e. the second line of 2547717Smckusick * 2557717Smckusick * procedure fum(var i: integer); 2567717Smckusick * external; 2577717Smckusick */ 2587717Smckusick struct nl * 2597717Smckusick funcext(fp) 2607717Smckusick struct nl *fp; 2617717Smckusick { 2627717Smckusick 2637717Smckusick baroff(); 2647717Smckusick ppgoin(DECL); 2657717Smckusick ppnl(); 2667717Smckusick indent(); 2677717Smckusick ppkw("external"); 2687717Smckusick ppsep(";"); 2697717Smckusick ppgoout(DECL); 2707717Smckusick baron(); 2717717Smckusick return (fp); 2727717Smckusick } 273