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