148112Sbostic /*-
2*62189Sbostic * Copyright (c) 1980, 1993
3*62189Sbostic * The Regents of the University of California. All rights reserved.
448112Sbostic *
548112Sbostic * %sccs.include.redist.c%
622228Sdist */
722228Sdist
822228Sdist #ifndef lint
9*62189Sbostic static char sccsid[] = "@(#)fdec.c 8.1 (Berkeley) 06/06/93";
1048112Sbostic #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 */
funchdr(r)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 */
funcfwd(fp)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 */
funcbody(fp)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 */
funcend(fp,bundle,binfo)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
ppsname(fp)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 */
segend()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 *
funcext(fp)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