devel/debug/1/src/gen.procheads

Raw file
Back to index

(**********************************************************************)
(*                                                                    *)
(* This program generates/updates a dataspace "procheads" from the    *)
(* file "bulletin", including the module numbers. "procheads" will    *)
(* be used by 'trace" and 'disasm" to show the name and the formal    *)
(* param list of a called procedure.                                  *)
(*                                                                    *)
(*                                      GMD-Z2.P/G.Szalay/86-04-06    *)
(*                                                                    *)
(**********************************************************************)

LET digits = "1234567890", outname = "procheads",
    maxno of procs = 3071, first compiled module no = 256;
FILE VAR infile := sequential file (input, old ("bulletin"));
TEXT VAR buf, linebuf, entry, answer;
INT VAR i, j, module no, posit, max module no := 0;
BOUND ROW maxno of procs TEXT VAR proc heads;

putline ("generating """ + outname + """ ...");
BOOL VAR oldfile := exists (outname);
IF oldfile
THEN ask for action to be taken;
     IF answer = "r"
     THEN forget (outname); oldfile := FALSE;
          proc heads := new (outname)
     ELSE proc heads := old (outname)
     FI
ELSE proc heads := new (outname)
FI;

IF NOT oldfile THEN init heads FI;
getline (infile, linebuf);
FOR i FROM 1 UPTO 1000 REP
  process line;
  cout (i);
  getline (infile, linebuf)
UNTIL eof (infile) PER;
process missing heads.

ask for action to be taken:
  out ("replace or append to old file """+outname+""" (r/a) ? ");
  REP inchar (answer);
      IF answer <> "r" AND answer <> "a" THEN out(""7"") FI
  UNTIL answer = "r" OR answer = "a" PER;
  putline (answer).

init heads:
  proc heads (1) := "+>1";
  FOR i FROM 2 UPTO maxno of procs REP proc heads (i) := "" PER.

process line:
  fetch module no and entry;
  IF module no >= first compiled module no
  THEN IF module no < 10000
       THEN proc heads (module no) := entry
       ELSE proc heads (module no - 10000) := entry
       FI
  FI.

fetch module no and entry:
  posit := LENGTH linebuf - 1;
  WHILE pos (digits, linebuf SUB posit) <> 0
  REP posit DECR 1 PER;
  module no := int (subtext (linebuf, posit+1));
  IF module no < 10000 AND module no > max module no
  THEN max module no := module no
  FI;
  WHILE (linebuf SUB posit) = " " REP posit DECR 1 PER;
  entry := subtext (linebuf, 1, posit).

process missing heads:
  putline ("max module no=" + text(max module no));
  FOR i FROM 1 UPTO max module no REP
    cout(i);
    IF proc heads (i) = "" THEN put in offset to last head FI
  PER.

put in offset to last head:
  FOR j FROM i-1 DOWNTO 1 REP
    IF proc heads (j) <> ""
    THEN IF subtext (proc heads (j), 1, 2) = "+>"
         THEN proc heads (i) := "+>" + text (i - j
                                        + int (subtext (proc heads (j), 3)))
         ELSE proc heads (i) := "+>" + text (i - j)
         FI;
         LEAVE put in offset to last head
    FI
  PER.