Tidy browsercmd aka showdef.

This commit is contained in:
David Brown 2016-11-14 18:19:56 +00:00
parent bb143a6162
commit f7feea0ad1
4 changed files with 118 additions and 103 deletions

View file

@ -184,7 +184,7 @@ sourcechanges:
# browsercmd: build the 'showdef' command
browsercmd: configuration
@make -f src/tools/make/oberon.mk -s browsercmd
@make -f src/tools/make/oberon.mk -s browsercmd MODEL=2

View file

@ -36,13 +36,6 @@ MODULE Modules; (* jt 6.1.96 *)
imported*, importing*: ModuleName;
PROCEDURE -modules*(): Module
"(Modules_Module)Heap_modules";
PROCEDURE -setmodules*(m: Module)
"Heap_modules = m";
PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR);
VAR i, j: INTEGER;
BEGIN
@ -51,6 +44,10 @@ MODULE Modules; (* jt 6.1.96 *)
a[i] := 0X
END Append;
PROCEDURE -modules(): Module "(Modules_Module)Heap_modules";
PROCEDURE -setmodules(m: Module) "Heap_modules = m";
PROCEDURE ThisMod* (name: ARRAY OF CHAR): Module;
VAR m: Module; bodyname: ARRAY 64 OF CHAR; body: Command;
BEGIN m := modules();
@ -101,17 +98,18 @@ MODULE Modules; (* jt 6.1.96 *)
BEGIN e := Platform.Write(1, SYSTEM.ADR(c), 1)
END errch;
PROCEDURE errstring*(s: ARRAY OF CHAR);
PROCEDURE errstring(s: ARRAY OF CHAR);
VAR i: LONGINT;
BEGIN i := 0;
WHILE (i<LEN(s)) & (s[i] # 0X) DO errch(s[i]); INC(i) END
BEGIN
i := 0; WHILE (i<LEN(s)) & (s[i] # 0X) DO errch(s[i]); INC(i) END
END errstring;
PROCEDURE errposint(l: SYSTEM.INT32);
BEGIN IF l>10 THEN errposint(l DIV 10) END; errch(CHR(ORD('0') + (l MOD 10))) END errposint;
PROCEDURE errint*(l: SYSTEM.INT32);
BEGIN IF l<0 THEN errch('-'); l := -l END; errposint(l) END errint;
PROCEDURE errint(l: SYSTEM.INT32);
BEGIN
IF l < 0 THEN errch('-'); l := -l END;
IF l >= 10 THEN errint(l DIV 10) END;
errch(CHR(l MOD 10 + 30H))
END errint;
PROCEDURE DisplayHaltCode(code: SYSTEM.INT32);
BEGIN

View file

@ -1,7 +1,7 @@
MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line version jt 4.4.95 *)
IMPORT
OPM, OPS, OPT, OPV, Texts, Out, Platform, SYSTEM;
OPM, OPS, OPT, OPV, Texts, Out, Oberon, Platform, SYSTEM;
CONST
@ -12,12 +12,20 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
option: CHAR;
PROCEDURE Ws(s: ARRAY OF CHAR); BEGIN Texts.WriteString(W, s) END Ws;
PROCEDURE Wch(ch: CHAR); BEGIN Texts.Write(W, ch) END Wch;
PROCEDURE Wc(ch: CHAR); BEGIN Texts.Write(W, ch) END Wc;
PROCEDURE Wi(i: SYSTEM.INT64); BEGIN Texts.WriteInt(W, i, 0) END Wi;
PROCEDURE Wln; BEGIN Texts.WriteLn(W) END Wln;
PROCEDURE Wh(i: SYSTEM.INT64);
BEGIN
IF i >= 16 THEN Wh(i DIV 10H)
ELSIF i >= 10 THEN Wc("0") END;
i := i MOD 16;
IF i < 10 THEN Wc(CHR(i+30H)) ELSE Wc(CHR(i+37H)) END
END Wh;
PROCEDURE Indent(i: INTEGER);
BEGIN WHILE i > 0 DO Wch(" "); Wch(" "); DEC(i) END
BEGIN WHILE i > 0 DO Wc(" "); Wc(" "); DEC(i) END
END Indent;
PROCEDURE ^Wtype(typ: OPT.Struct);
@ -28,18 +36,26 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
BEGIN first := TRUE;
res := (result # NIL) (* hidden mthd *) & (result # OPT.notyp);
paren := res OR (par # NIL);
IF paren THEN Wch("(") END ;
IF paren THEN Wc("(") END;
WHILE par # NIL DO
IF ~first THEN Ws("; ") ELSE first := FALSE END;
IF option = "x" THEN Wi(par^.adr); Wch(" ") END ;
IF option = "x" THEN Wi(par^.adr); Wc(" ") END;
IF par^.mode = OPT.VarPar THEN Ws("VAR ") END;
Ws(par^.name); Ws(": "); Wtype(par^.typ);
par := par^.link
END;
IF paren THEN Wch(")") END ;
IF paren THEN Wc(")") END;
IF res THEN Ws(": "); Wtype(result) END
END Wsign;
PROCEDURE HasForm(obj: OPT.Object; mode: SET): BOOLEAN;
BEGIN
RETURN (obj # NIL)
& ( ((obj.mode IN mode) & (obj.name # ""))
OR HasForm(obj.left, mode)
OR HasForm(obj.right, mode));
END HasForm;
PROCEDURE Objects(obj: OPT.Object; mode: SET);
VAR i: SYSTEM.INT64; m: INTEGER; s: SYSTEM.SET64; ext: OPT.ConstExt;
BEGIN
@ -51,55 +67,55 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
CASE obj^.typ^.form OF
|OPT.Bool: IF obj^.conval^.intval = 1 THEN Ws("TRUE") ELSE Ws("FALSE") END
|OPT.Char: IF (obj^.conval^.intval >= 32) & (obj^.conval^.intval <= 126) THEN
Wch(22X); Wch(CHR(obj^.conval^.intval)); Wch(22X)
Wc(22X); Wc(CHR(obj^.conval^.intval)); Wc(22X)
ELSE
i := obj^.conval^.intval DIV 16;
IF i > 9 THEN Wch(CHR(55 + i)) ELSE Wch(CHR(48 + i)) END ;
IF i > 9 THEN Wc(CHR(55 + i)) ELSE Wc(CHR(48 + i)) END;
i := obj^.conval^.intval MOD 16;
IF i > 9 THEN Wch(CHR(55 + i)) ELSE Wch(CHR(48 + i)) END ;
Wch("X")
IF i > 9 THEN Wc(CHR(55 + i)) ELSE Wc(CHR(48 + i)) END;
Wc("X")
END
|OPT.Int: Wi(obj^.conval^.intval)
|OPT.Set: Wch("{"); i := 0; s := obj^.conval^.setval;
|OPT.Set: Wc("{"); i := 0; s := obj^.conval^.setval;
WHILE i <= MAX(SYSTEM.SET64) DO
IF i IN s THEN Wi(i); EXCL(s, i);
IF s # {} THEN Ws(", ") END
END;
INC(i)
END;
Wch("}")
Wc("}")
|OPT.Real: Texts.WriteReal(W, SHORT(obj^.conval^.realval), 16)
|OPT.LReal: Texts.WriteLongReal(W, obj^.conval^.realval, 23)
|OPT.String: Ws(obj^.conval^.ext^)
|OPT.String: Wc('"'); Ws(obj^.conval^.ext^); Wc('"')
|OPT.NilTyp: Ws("NIL")
ELSE (* Ignore other forms *)
END;
Wch(";"); Wln
Wc(";"); Wln
|OPT.Typ: IF obj^.name # "" THEN Indent(2);
IF obj^.typ^.strobj = obj THEN (* canonical name *)
Wtype(obj^.typ); Ws(" = "); Wstruct(obj^.typ)
ELSE (* alias *)
Ws(obj^.name); Ws(" = "); Wtype(obj^.typ)
END;
Wch(";"); Wln
Wc(";"); Wln
END
|OPT.Var: Indent(2); Ws(obj^.name);
IF obj^.vis = OPT.externalR THEN Ws("-: ") ELSE Ws(": ") END;
Wtype(obj^.typ); Wch(";"); Wln
Wtype(obj^.typ); Wc(";"); Wln
|OPT.XProc,
OPT.CProc,
OPT.IProc: Indent(1); Ws("PROCEDURE ");
IF obj^.mode = OPT.IProc THEN Wch("+")
ELSIF obj^.mode = OPT.CProc THEN Wch("-")
IF obj^.mode = OPT.IProc THEN Wc("+")
ELSIF obj^.mode = OPT.CProc THEN Wc("-")
END;
Ws(obj^.name);
Wsign(obj^.typ, obj^.link);
IF obj^.mode = OPT.CProc THEN
ext := obj^.conval^.ext; m := ORD(ext^[0]); i := 1; Ws(' "');
WHILE i <= m DO Wch(ext^[i]); INC(i) END ;
Wch('"');
WHILE i <= m DO Wc(ext^[i]); INC(i) END;
Wc('"');
END;
Wch(";"); Wln
Wc(";"); Wln
ELSE (* Ignore other modes *)
END
END;
@ -120,7 +136,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
END;
Ws(") "); Ws(obj^.name);
Wsign(obj^.typ, obj^.link^.link);
Wch(";");
Wc(";");
IF option = "x" THEN Indent(1);
Ws("(* methno: "); Wi(obj^.adr DIV 10000H); Ws(" *)")
END;
@ -134,10 +150,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
VAR fld: OPT.Object;
PROCEDURE SysFlag;
BEGIN
IF typ^.sysflag # 0 THEN
Wch("["); Wi(typ^.sysflag); Ws("] ")
END
BEGIN IF typ^.sysflag # 0 THEN Wc("["); Wh(typ^.sysflag); Ws("H] ") END
END SysFlag;
BEGIN
@ -149,14 +162,14 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
|OPT.Array: Ws("ARRAY "); SysFlag; Wi(typ^.n); Ws(" OF "); Wtype(typ^.BaseTyp)
|OPT.DynArr: Ws("ARRAY "); SysFlag; Ws("OF "); Wtype(typ^.BaseTyp)
|OPT.Record: Ws("RECORD ");SysFlag;
IF typ^.BaseTyp # NIL THEN Wch("("); Wtype(typ^.BaseTyp); Wch(")") END ;
IF typ^.BaseTyp # NIL THEN Wc("("); Wtype(typ^.BaseTyp); Wc(")") END;
Wln; fld := typ^.link;
WHILE (fld # NIL) & (fld^.mode = OPT.Fld) DO
IF (option = "x") OR (fld^.name[0] # "@") THEN Indent(3);
IF option = "x" THEN Wi(fld^.adr); Wch(" ") END ;
IF option = "x" THEN Wi(fld^.adr); Wc(" ") END;
Ws(fld^.name);
IF fld^.vis = OPT.externalR THEN Wch("-") END ;
Ws(": "); Wtype(fld^.typ); Wch(";");
IF fld^.vis = OPT.externalR THEN Wc("-") END;
Ws(": "); Wtype(fld^.typ); Wc(";");
Wln
END;
fld := fld^.link
@ -178,20 +191,23 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
BEGIN
obj := typ^.strobj;
IF obj^.name # "" THEN
IF typ^.mno # 0 THEN Ws(OPT.GlbMod[typ^.mno].name); Wch(".")
IF typ^.mno # 0 THEN Ws(OPT.GlbMod[typ^.mno].name); Wc(".")
ELSIF (typ = OPT.bytetyp) OR (typ = OPT.sysptrtyp) THEN Ws("SYSTEM.")
ELSIF obj^.vis = OPT.internal THEN Wch("#")
ELSIF obj^.vis = OPT.internal THEN Wc("#")
END;
Ws(obj^.name)
ELSE
IF (option = "x") & (typ^.ref > OPM.MaxStruct) THEN Wch("#"); Wi(typ^.ref - OPM.MaxStruct); Wch(" ") END ;
IF (option = "x") & (typ^.ref > OPM.MaxStruct) THEN Wc("#"); Wi(typ^.ref - OPM.MaxStruct); Wc(" ") END;
Wstruct(typ)
END
END Wtype;
PROCEDURE WModule(name: OPS.Name; T: Texts.Text);
VAR i: INTEGER;
beg, end: LONGINT; first, done: BOOLEAN;
VAR
i: INTEGER;
beg, end: LONGINT;
first, done: BOOLEAN;
obj: OPT.Object;
PROCEDURE Header(s: ARRAY OF CHAR);
BEGIN
@ -210,21 +226,24 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
BEGIN
OPT.Import("@notself", name, done);
IF done THEN
Ws("DEFINITION "); Ws(name); Wch(";"); Wln; Wln;
Ws("DEFINITION "); Ws(name); Wc(";"); Wln;
IF OPT.nofGmod > 1 THEN
Header("IMPORT"); i := 1; first := TRUE;
WHILE i < OPT.nofGmod DO
IF first THEN first := FALSE; Indent(2) ELSE Ws(", ") END;
Ws(OPT.GlbMod[i].name);
INC(i)
END;
IF ~first THEN Wch(";"); Wln END ;
IF ~first THEN Wc(";"); Wln END
END;
CheckHeader;
Header("CONST"); Objects(OPT.GlbMod[0].right, {OPT.Con}); CheckHeader;
Header("TYPE"); Objects(OPT.GlbMod[0].right, {OPT.Typ}); CheckHeader;
Header("VAR"); Objects(OPT.GlbMod[0].right, {OPT.Var}); CheckHeader;
Objects(OPT.GlbMod[0].right, {OPT.XProc, OPT.IProc, OPT.CProc});
Wln;
Ws("END "); Ws(name); Wch("."); Wln; Texts.Append(T, W.buf)
obj := OPT.GlbMod[0].right;
IF HasForm(obj, {OPT.Con}) THEN Header("CONST"); Objects(obj, {OPT.Con}); CheckHeader END;
IF HasForm(obj, {OPT.Typ}) THEN Header("TYPE"); Objects(obj, {OPT.Typ}); CheckHeader END;
IF HasForm(obj, {OPT.Var}) THEN Header("VAR"); Objects(obj, {OPT.Var}); CheckHeader END;
Objects(obj, {OPT.XProc, OPT.IProc, OPT.CProc}); Wln;
Ws("END "); Ws(name); Wc("."); Wln; Texts.Append(T, W.buf)
ELSE
Texts.WriteString(W, name); Texts.WriteString(W, " -- symbol file not found");
Texts.WriteLn(W); Texts.Append(T, W.buf)
@ -242,8 +261,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
END Ident;
PROCEDURE ShowDef*;
VAR T, dummyT: Texts.Text; S, vname, name: OPS.Name; R: Texts.Reader; ch: CHAR;
s: ARRAY 1024 OF CHAR; i: INTEGER;
VAR S, vname, name: OPS.Name;
BEGIN
option := 0X; Platform.GetArg(1, S);
IF Platform.ArgCount > 2 THEN
@ -253,16 +271,14 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
END;
IF Platform.ArgCount >= 2 THEN
Ident(S, name);
NEW(T); Texts.Open(T, "");
OPT.Init(name, {}); OPT.SelfName := "AvoidErr154"; WModule(name, T); OPT.Close;
Texts.OpenReader(R, T, 0); Texts.Read(R, ch); i := 0;
WHILE ~R.eot DO
IF ch = 0DX THEN s[i] := 0X; i := 0; Out.String(s); Out.Ln
ELSE s[i] := ch; INC(i)
END ;
Texts.Read(R, ch)
END ;
s[i] := 0X; Out.String(s)
OPT.Init(name, {}); OPT.SelfName := "AvoidErr154";
WModule(name, Oberon.Log);
OPT.Close;
ELSE
Texts.WriteString(W, "showdef - Display module's public interface."); Texts.WriteLn(W);
Texts.WriteString(W, "Usage: showdef module"); Texts.WriteLn(W);
Texts.WriteString(W, "Note: module.sym must be in the current directory."); Texts.WriteLn(W);
Texts.Append(Oberon.Log, W.buf)
END
END ShowDef;

View file

@ -130,8 +130,9 @@ translate:
browsercmd:
@printf "\nMaking symbol browser\n"
@cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -fSm -O$(MODEL) ../../src/tools/browser/BrowserCmd.Mod
@cd $(BUILDDIR); $(COMPILE) BrowserCmd.c -o showdef \
@cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -Ssf -O$(MODEL) ../../src/runtime/Oberon.Mod
@cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -Smf -O$(MODEL) ../../src/tools/browser/BrowserCmd.Mod
@cd $(BUILDDIR); $(COMPILE) BrowserCmd.c Oberon.c -o showdef \
Platform.o Texts.o OPT.o Heap.o Out.o SYSTEM.o OPM.o OPS.o OPV.o \
Files.o Reals.o Modules.o VT100.o errors.o Configuration.o Strings.o \
OPC.o