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: build the 'showdef' command
browsercmd: configuration 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; 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); PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR);
VAR i, j: INTEGER; VAR i, j: INTEGER;
BEGIN BEGIN
@ -51,6 +44,10 @@ MODULE Modules; (* jt 6.1.96 *)
a[i] := 0X a[i] := 0X
END Append; END Append;
PROCEDURE -modules(): Module "(Modules_Module)Heap_modules";
PROCEDURE -setmodules(m: Module) "Heap_modules = m";
PROCEDURE ThisMod* (name: ARRAY OF CHAR): Module; PROCEDURE ThisMod* (name: ARRAY OF CHAR): Module;
VAR m: Module; bodyname: ARRAY 64 OF CHAR; body: Command; VAR m: Module; bodyname: ARRAY 64 OF CHAR; body: Command;
BEGIN m := modules(); BEGIN m := modules();
@ -101,17 +98,18 @@ MODULE Modules; (* jt 6.1.96 *)
BEGIN e := Platform.Write(1, SYSTEM.ADR(c), 1) BEGIN e := Platform.Write(1, SYSTEM.ADR(c), 1)
END errch; END errch;
PROCEDURE errstring*(s: ARRAY OF CHAR); PROCEDURE errstring(s: ARRAY OF CHAR);
VAR i: LONGINT; VAR i: LONGINT;
BEGIN i := 0; BEGIN
WHILE (i<LEN(s)) & (s[i] # 0X) DO errch(s[i]); INC(i) END i := 0; WHILE (i<LEN(s)) & (s[i] # 0X) DO errch(s[i]); INC(i) END
END errstring; END errstring;
PROCEDURE errposint(l: SYSTEM.INT32); PROCEDURE errint(l: SYSTEM.INT32);
BEGIN IF l>10 THEN errposint(l DIV 10) END; errch(CHR(ORD('0') + (l MOD 10))) END errposint; BEGIN
IF l < 0 THEN errch('-'); l := -l END;
PROCEDURE errint*(l: SYSTEM.INT32); IF l >= 10 THEN errint(l DIV 10) END;
BEGIN IF l<0 THEN errch('-'); l := -l END; errposint(l) END errint; errch(CHR(l MOD 10 + 30H))
END errint;
PROCEDURE DisplayHaltCode(code: SYSTEM.INT32); PROCEDURE DisplayHaltCode(code: SYSTEM.INT32);
BEGIN 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 *) MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line version jt 4.4.95 *)
IMPORT IMPORT
OPM, OPS, OPT, OPV, Texts, Out, Platform, SYSTEM; OPM, OPS, OPT, OPV, Texts, Out, Oberon, Platform, SYSTEM;
CONST CONST
@ -12,12 +12,20 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
option: CHAR; option: CHAR;
PROCEDURE Ws(s: ARRAY OF CHAR); BEGIN Texts.WriteString(W, s) END Ws; 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 Wi(i: SYSTEM.INT64); BEGIN Texts.WriteInt(W, i, 0) END Wi;
PROCEDURE Wln; BEGIN Texts.WriteLn(W) END Wln; 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); 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; END Indent;
PROCEDURE ^Wtype(typ: OPT.Struct); 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; BEGIN first := TRUE;
res := (result # NIL) (* hidden mthd *) & (result # OPT.notyp); res := (result # NIL) (* hidden mthd *) & (result # OPT.notyp);
paren := res OR (par # NIL); paren := res OR (par # NIL);
IF paren THEN Wch("(") END ; IF paren THEN Wc("(") END;
WHILE par # NIL DO WHILE par # NIL DO
IF ~first THEN Ws("; ") ELSE first := FALSE END; 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; IF par^.mode = OPT.VarPar THEN Ws("VAR ") END;
Ws(par^.name); Ws(": "); Wtype(par^.typ); Ws(par^.name); Ws(": "); Wtype(par^.typ);
par := par^.link par := par^.link
END; END;
IF paren THEN Wch(")") END ; IF paren THEN Wc(")") END;
IF res THEN Ws(": "); Wtype(result) END IF res THEN Ws(": "); Wtype(result) END
END Wsign; 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); PROCEDURE Objects(obj: OPT.Object; mode: SET);
VAR i: SYSTEM.INT64; m: INTEGER; s: SYSTEM.SET64; ext: OPT.ConstExt; VAR i: SYSTEM.INT64; m: INTEGER; s: SYSTEM.SET64; ext: OPT.ConstExt;
BEGIN BEGIN
@ -51,55 +67,55 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
CASE obj^.typ^.form OF CASE obj^.typ^.form OF
|OPT.Bool: IF obj^.conval^.intval = 1 THEN Ws("TRUE") ELSE Ws("FALSE") END |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 |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 ELSE
i := obj^.conval^.intval DIV 16; 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; i := obj^.conval^.intval MOD 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;
Wch("X") Wc("X")
END END
|OPT.Int: Wi(obj^.conval^.intval) |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 WHILE i <= MAX(SYSTEM.SET64) DO
IF i IN s THEN Wi(i); EXCL(s, i); IF i IN s THEN Wi(i); EXCL(s, i);
IF s # {} THEN Ws(", ") END IF s # {} THEN Ws(", ") END
END; END;
INC(i) INC(i)
END; END;
Wch("}") Wc("}")
|OPT.Real: Texts.WriteReal(W, SHORT(obj^.conval^.realval), 16) |OPT.Real: Texts.WriteReal(W, SHORT(obj^.conval^.realval), 16)
|OPT.LReal: Texts.WriteLongReal(W, obj^.conval^.realval, 23) |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") |OPT.NilTyp: Ws("NIL")
ELSE (* Ignore other forms *) ELSE (* Ignore other forms *)
END; END;
Wch(";"); Wln Wc(";"); Wln
|OPT.Typ: IF obj^.name # "" THEN Indent(2); |OPT.Typ: IF obj^.name # "" THEN Indent(2);
IF obj^.typ^.strobj = obj THEN (* canonical name *) IF obj^.typ^.strobj = obj THEN (* canonical name *)
Wtype(obj^.typ); Ws(" = "); Wstruct(obj^.typ) Wtype(obj^.typ); Ws(" = "); Wstruct(obj^.typ)
ELSE (* alias *) ELSE (* alias *)
Ws(obj^.name); Ws(" = "); Wtype(obj^.typ) Ws(obj^.name); Ws(" = "); Wtype(obj^.typ)
END; END;
Wch(";"); Wln Wc(";"); Wln
END END
|OPT.Var: Indent(2); Ws(obj^.name); |OPT.Var: Indent(2); Ws(obj^.name);
IF obj^.vis = OPT.externalR THEN Ws("-: ") ELSE Ws(": ") END; IF obj^.vis = OPT.externalR THEN Ws("-: ") ELSE Ws(": ") END;
Wtype(obj^.typ); Wch(";"); Wln Wtype(obj^.typ); Wc(";"); Wln
|OPT.XProc, |OPT.XProc,
OPT.CProc, OPT.CProc,
OPT.IProc: Indent(1); Ws("PROCEDURE "); OPT.IProc: Indent(1); Ws("PROCEDURE ");
IF obj^.mode = OPT.IProc THEN Wch("+") IF obj^.mode = OPT.IProc THEN Wc("+")
ELSIF obj^.mode = OPT.CProc THEN Wch("-") ELSIF obj^.mode = OPT.CProc THEN Wc("-")
END; END;
Ws(obj^.name); Ws(obj^.name);
Wsign(obj^.typ, obj^.link); Wsign(obj^.typ, obj^.link);
IF obj^.mode = OPT.CProc THEN IF obj^.mode = OPT.CProc THEN
ext := obj^.conval^.ext; m := ORD(ext^[0]); i := 1; Ws(' "'); ext := obj^.conval^.ext; m := ORD(ext^[0]); i := 1; Ws(' "');
WHILE i <= m DO Wch(ext^[i]); INC(i) END ; WHILE i <= m DO Wc(ext^[i]); INC(i) END;
Wch('"'); Wc('"');
END; END;
Wch(";"); Wln Wc(";"); Wln
ELSE (* Ignore other modes *) ELSE (* Ignore other modes *)
END END
END; END;
@ -120,7 +136,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
END; END;
Ws(") "); Ws(obj^.name); Ws(") "); Ws(obj^.name);
Wsign(obj^.typ, obj^.link^.link); Wsign(obj^.typ, obj^.link^.link);
Wch(";"); Wc(";");
IF option = "x" THEN Indent(1); IF option = "x" THEN Indent(1);
Ws("(* methno: "); Wi(obj^.adr DIV 10000H); Ws(" *)") Ws("(* methno: "); Wi(obj^.adr DIV 10000H); Ws(" *)")
END; END;
@ -134,10 +150,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
VAR fld: OPT.Object; VAR fld: OPT.Object;
PROCEDURE SysFlag; PROCEDURE SysFlag;
BEGIN BEGIN IF typ^.sysflag # 0 THEN Wc("["); Wh(typ^.sysflag); Ws("H] ") END
IF typ^.sysflag # 0 THEN
Wch("["); Wi(typ^.sysflag); Ws("] ")
END
END SysFlag; END SysFlag;
BEGIN 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.Array: Ws("ARRAY "); SysFlag; Wi(typ^.n); Ws(" OF "); Wtype(typ^.BaseTyp)
|OPT.DynArr: Ws("ARRAY "); SysFlag; Ws("OF "); Wtype(typ^.BaseTyp) |OPT.DynArr: Ws("ARRAY "); SysFlag; Ws("OF "); Wtype(typ^.BaseTyp)
|OPT.Record: Ws("RECORD ");SysFlag; |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; Wln; fld := typ^.link;
WHILE (fld # NIL) & (fld^.mode = OPT.Fld) DO WHILE (fld # NIL) & (fld^.mode = OPT.Fld) DO
IF (option = "x") OR (fld^.name[0] # "@") THEN Indent(3); 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); Ws(fld^.name);
IF fld^.vis = OPT.externalR THEN Wch("-") END ; IF fld^.vis = OPT.externalR THEN Wc("-") END;
Ws(": "); Wtype(fld^.typ); Wch(";"); Ws(": "); Wtype(fld^.typ); Wc(";");
Wln Wln
END; END;
fld := fld^.link fld := fld^.link
@ -178,20 +191,23 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
BEGIN BEGIN
obj := typ^.strobj; obj := typ^.strobj;
IF obj^.name # "" THEN 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 (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; END;
Ws(obj^.name) Ws(obj^.name)
ELSE 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) Wstruct(typ)
END END
END Wtype; END Wtype;
PROCEDURE WModule(name: OPS.Name; T: Texts.Text); PROCEDURE WModule(name: OPS.Name; T: Texts.Text);
VAR i: INTEGER; VAR
beg, end: LONGINT; first, done: BOOLEAN; i: INTEGER;
beg, end: LONGINT;
first, done: BOOLEAN;
obj: OPT.Object;
PROCEDURE Header(s: ARRAY OF CHAR); PROCEDURE Header(s: ARRAY OF CHAR);
BEGIN BEGIN
@ -210,21 +226,24 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
BEGIN BEGIN
OPT.Import("@notself", name, done); OPT.Import("@notself", name, done);
IF done THEN 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; Header("IMPORT"); i := 1; first := TRUE;
WHILE i < OPT.nofGmod DO WHILE i < OPT.nofGmod DO
IF first THEN first := FALSE; Indent(2) ELSE Ws(", ") END; IF first THEN first := FALSE; Indent(2) ELSE Ws(", ") END;
Ws(OPT.GlbMod[i].name); Ws(OPT.GlbMod[i].name);
INC(i) INC(i)
END; END;
IF ~first THEN Wch(";"); Wln END ; IF ~first THEN Wc(";"); Wln END
END;
CheckHeader; CheckHeader;
Header("CONST"); Objects(OPT.GlbMod[0].right, {OPT.Con}); CheckHeader; obj := OPT.GlbMod[0].right;
Header("TYPE"); Objects(OPT.GlbMod[0].right, {OPT.Typ}); CheckHeader; IF HasForm(obj, {OPT.Con}) THEN Header("CONST"); Objects(obj, {OPT.Con}); CheckHeader END;
Header("VAR"); Objects(OPT.GlbMod[0].right, {OPT.Var}); CheckHeader; IF HasForm(obj, {OPT.Typ}) THEN Header("TYPE"); Objects(obj, {OPT.Typ}); CheckHeader END;
Objects(OPT.GlbMod[0].right, {OPT.XProc, OPT.IProc, OPT.CProc}); IF HasForm(obj, {OPT.Var}) THEN Header("VAR"); Objects(obj, {OPT.Var}); CheckHeader END;
Wln; Objects(obj, {OPT.XProc, OPT.IProc, OPT.CProc}); Wln;
Ws("END "); Ws(name); Wch("."); Wln; Texts.Append(T, W.buf) Ws("END "); Ws(name); Wc("."); Wln; Texts.Append(T, W.buf)
ELSE ELSE
Texts.WriteString(W, name); Texts.WriteString(W, " -- symbol file not found"); Texts.WriteString(W, name); Texts.WriteString(W, " -- symbol file not found");
Texts.WriteLn(W); Texts.Append(T, W.buf) 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; END Ident;
PROCEDURE ShowDef*; PROCEDURE ShowDef*;
VAR T, dummyT: Texts.Text; S, vname, name: OPS.Name; R: Texts.Reader; ch: CHAR; VAR S, vname, name: OPS.Name;
s: ARRAY 1024 OF CHAR; i: INTEGER;
BEGIN BEGIN
option := 0X; Platform.GetArg(1, S); option := 0X; Platform.GetArg(1, S);
IF Platform.ArgCount > 2 THEN IF Platform.ArgCount > 2 THEN
@ -253,16 +271,14 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
END; END;
IF Platform.ArgCount >= 2 THEN IF Platform.ArgCount >= 2 THEN
Ident(S, name); Ident(S, name);
NEW(T); Texts.Open(T, ""); OPT.Init(name, {}); OPT.SelfName := "AvoidErr154";
OPT.Init(name, {}); OPT.SelfName := "AvoidErr154"; WModule(name, T); OPT.Close; WModule(name, Oberon.Log);
Texts.OpenReader(R, T, 0); Texts.Read(R, ch); i := 0; OPT.Close;
WHILE ~R.eot DO ELSE
IF ch = 0DX THEN s[i] := 0X; i := 0; Out.String(s); Out.Ln Texts.WriteString(W, "showdef - Display module's public interface."); Texts.WriteLn(W);
ELSE s[i] := ch; INC(i) Texts.WriteString(W, "Usage: showdef module"); Texts.WriteLn(W);
END ; Texts.WriteString(W, "Note: module.sym must be in the current directory."); Texts.WriteLn(W);
Texts.Read(R, ch) Texts.Append(Oberon.Log, W.buf)
END ;
s[i] := 0X; Out.String(s)
END END
END ShowDef; END ShowDef;

View file

@ -130,8 +130,9 @@ translate:
browsercmd: browsercmd:
@printf "\nMaking symbol browser\n" @printf "\nMaking symbol browser\n"
@cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -fSm -O$(MODEL) ../../src/tools/browser/BrowserCmd.Mod @cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -Ssf -O$(MODEL) ../../src/runtime/Oberon.Mod
@cd $(BUILDDIR); $(COMPILE) BrowserCmd.c -o showdef \ @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 \ 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 \ Files.o Reals.o Modules.o VT100.o errors.o Configuration.o Strings.o \
OPC.o OPC.o