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