1*2854Speter static char *sccsid = "@(#)fdec.c 1.1 (Berkeley) 03/02/81"; 2*2854Speter /* Copyright (c) 1979 Regents of the University of California */ 3*2854Speter # 4*2854Speter /* 5*2854Speter * pxp - Pascal execution profiler 6*2854Speter * 7*2854Speter * Bill Joy UCB 8*2854Speter * Version 1.2 January 1979 9*2854Speter */ 10*2854Speter 11*2854Speter #include "0.h" 12*2854Speter #include "tree.h" 13*2854Speter 14*2854Speter /* 15*2854Speter * Program, procedure or function "header", i.e.: 16*2854Speter * 17*2854Speter * function sin: real; 18*2854Speter */ 19*2854Speter funchdr(r) 20*2854Speter int *r; 21*2854Speter { 22*2854Speter register **rl, *il; 23*2854Speter 24*2854Speter if (inpflist(r[2])) { 25*2854Speter optstk['z'-'a'] =<< 1; 26*2854Speter optstk['z'-'a'] =| opts['z'-'a']; 27*2854Speter opts['z'-'a'] = 1; 28*2854Speter } 29*2854Speter cbn++; 30*2854Speter lastbn = cbn; 31*2854Speter getcnt(); 32*2854Speter if (nojunk && !inpflist(r[2])) 33*2854Speter setprint(); 34*2854Speter else 35*2854Speter printon(); 36*2854Speter if (r[0] == T_PROG && noinclude && bracket) 37*2854Speter printoff(); 38*2854Speter if (cbn > 1 && !justify) 39*2854Speter ppgoin(PRFN); 40*2854Speter puthedr(); 41*2854Speter if (noblank(setline(r[1]))) 42*2854Speter ppnl(); 43*2854Speter cnttab(r[2], pfcnt++); 44*2854Speter ppnl(); 45*2854Speter indent(); 46*2854Speter switch (r[0]) { 47*2854Speter case T_PROG: 48*2854Speter ppkw("program"); 49*2854Speter break; 50*2854Speter case T_PDEC: 51*2854Speter ppkw("procedure"); 52*2854Speter break; 53*2854Speter case T_FDEC: 54*2854Speter ppkw("function"); 55*2854Speter break; 56*2854Speter default: 57*2854Speter panic("funchdr"); 58*2854Speter } 59*2854Speter ppspac(); 60*2854Speter ppid(r[2]); 61*2854Speter if (r[0] != T_PROG) { 62*2854Speter rl = r[3]; 63*2854Speter if (rl != NIL) { 64*2854Speter ppbra("("); 65*2854Speter for (;;) { 66*2854Speter if (rl[1] == NIL) { 67*2854Speter rl = rl[2]; 68*2854Speter continue; 69*2854Speter } 70*2854Speter switch (rl[1][0]) { 71*2854Speter case T_PVAR: 72*2854Speter ppkw("var"); 73*2854Speter ppspac(); 74*2854Speter break; 75*2854Speter case T_PPROC: 76*2854Speter ppkw("procedure"); 77*2854Speter ppspac(); 78*2854Speter break; 79*2854Speter case T_PFUNC: 80*2854Speter ppkw("function"); 81*2854Speter ppspac(); 82*2854Speter break; 83*2854Speter } 84*2854Speter il = rl[1][1]; 85*2854Speter if (il != NIL) 86*2854Speter for (;;) { 87*2854Speter ppid(il[1]); 88*2854Speter il = il[2]; 89*2854Speter if (il == NIL) 90*2854Speter break; 91*2854Speter ppsep(", "); 92*2854Speter } 93*2854Speter else 94*2854Speter ppid("{identifier list}"); 95*2854Speter if (rl[1][0] != T_PPROC) { 96*2854Speter ppsep(":"); 97*2854Speter gtype(rl[1][2]); 98*2854Speter } 99*2854Speter rl = rl[2]; 100*2854Speter if (rl == NIL) 101*2854Speter break; 102*2854Speter ppsep(";"); 103*2854Speter ppspac(); 104*2854Speter } 105*2854Speter ppket(")"); 106*2854Speter } 107*2854Speter if (r[0] == T_FDEC && r[4] != NIL) { 108*2854Speter ppsep(":"); 109*2854Speter gtype(r[4]); 110*2854Speter } 111*2854Speter ppsep(";"); 112*2854Speter } else { 113*2854Speter rl = r[3]; 114*2854Speter if (rl != NIL) { 115*2854Speter ppbra("("); 116*2854Speter for (;;) { 117*2854Speter ppid(rl[1]); 118*2854Speter rl = rl[2]; 119*2854Speter if (rl == NIL) 120*2854Speter break; 121*2854Speter ppsep(", "); 122*2854Speter } 123*2854Speter ppket(")"); 124*2854Speter } 125*2854Speter ppsep(";"); 126*2854Speter } 127*2854Speter fhout: 128*2854Speter setline(r[1]); 129*2854Speter putcml(); 130*2854Speter savecnt(&pfcnts[cbn]); 131*2854Speter setprint(); 132*2854Speter --cbn; 133*2854Speter if (cbn && !justify) 134*2854Speter ppgoout(PRFN); 135*2854Speter return (r[2]); 136*2854Speter } 137*2854Speter 138*2854Speter /* 139*2854Speter * Forward declaration i.e. the second line of 140*2854Speter * 141*2854Speter * procedure fum(var i: integer); 142*2854Speter * forward; 143*2854Speter */ 144*2854Speter funcfwd(fp) 145*2854Speter char *fp; 146*2854Speter { 147*2854Speter 148*2854Speter baroff(); 149*2854Speter ppgoin(DECL); 150*2854Speter ppnl(); 151*2854Speter indent(); 152*2854Speter ppkw("forward"); 153*2854Speter ppsep(";"); 154*2854Speter ppgoout(DECL); 155*2854Speter baron(); 156*2854Speter return (fp); 157*2854Speter } 158*2854Speter 159*2854Speter /* 160*2854Speter * The "body" of a procedure, function, or program declaration, 161*2854Speter * i.e. a non-forward definition encounter. 162*2854Speter */ 163*2854Speter funcbody(fp) 164*2854Speter char *fp; 165*2854Speter { 166*2854Speter 167*2854Speter if (cbn && !justify) 168*2854Speter ppgoin(PRFN); 169*2854Speter cbn++; 170*2854Speter lastbn = cbn; 171*2854Speter return (fp); 172*2854Speter } 173*2854Speter 174*2854Speter /* 175*2854Speter * The guts of the procedure, function or program, i.e. 176*2854Speter * the part between the begin and the end. 177*2854Speter */ 178*2854Speter funcend(fp, bundle, binfo) 179*2854Speter char *fp; 180*2854Speter int *bundle, *binfo; 181*2854Speter { 182*2854Speter int *blk; 183*2854Speter extern int cntstat; 184*2854Speter 185*2854Speter cntstat = 0; 186*2854Speter blk = bundle[2]; 187*2854Speter rescnt(&pfcnts[cbn]); 188*2854Speter setprint(); 189*2854Speter if (cbn == 1 && noinclude && bracket) 190*2854Speter printoff(); 191*2854Speter if (lastbn > cbn) 192*2854Speter unprint(); 193*2854Speter if (cbn == 1) 194*2854Speter puthedr(); 195*2854Speter if (noblank(setline(bundle[1])) && lastbn > cbn) 196*2854Speter ppnl(); 197*2854Speter ppnl(); 198*2854Speter indent(); 199*2854Speter ppkw("begin"); 200*2854Speter setline(bundle[1]); 201*2854Speter if (putcml() == 0 && lastbn > cbn) 202*2854Speter ppsname(fp); 203*2854Speter ppgoin(DECL); 204*2854Speter statlist(blk); 205*2854Speter setinfo(bundle[1]); 206*2854Speter putcmp(); 207*2854Speter ppgoout(DECL); 208*2854Speter ppnl(); 209*2854Speter indent(); 210*2854Speter ppkw("end"); 211*2854Speter ppsep(cbn == 1 ? "." : ";"); 212*2854Speter setinfo(binfo); 213*2854Speter if (putcml() == 0) 214*2854Speter ppsname(fp); 215*2854Speter cbn--; 216*2854Speter if (cbn && !justify) 217*2854Speter ppgoout(PRFN); 218*2854Speter if (inpflist(fp)) { 219*2854Speter opts['z'-'a'] = optstk['z'-'a'] & 1; 220*2854Speter optstk['z'-'a'] =>> 1; 221*2854Speter } 222*2854Speter if (cbn == 0) { 223*2854Speter flushcm(); 224*2854Speter printon(); 225*2854Speter ppnl(); 226*2854Speter } 227*2854Speter } 228*2854Speter 229*2854Speter ppsname(fp) 230*2854Speter char *fp; 231*2854Speter { 232*2854Speter if (fp == NIL) 233*2854Speter return; 234*2854Speter ppsep(" { "); 235*2854Speter ppid(fp); 236*2854Speter ppsep(" }"); 237*2854Speter } 238