[Oberon] SystemV - Directory
Andreas Pirklbauer
andreas_pirklbauer at yahoo.com
Sun Jan 6 12:55:35 CET 2019
> `System.Directory' on files w/o dot extension gives TRAP 1 around this line.
Don’t know what code you use, but try the code below - it does not trap (on my system..)
PS: I suspect you miss the statement "WHILE i < LEN(pre) DO pre[i] := 0X; INC(i) END" in Directory.
-ap
PROCEDURE List(name: FileDir.FileName; adr: LONGINT; VAR cont: BOOLEAN);
VAR i0, i, j0, j: INTEGER; hp: FileDir.FileHeader;
BEGIN i := 0;
WHILE (pat[i] > "*") & (pat[i] = name[i]) DO INC(i) END ;
IF (pat[i] = 0X) & (name[i] = 0X) THEN i0 := i; j0 := i
ELSIF pat[i] = "*" THEN
i0 := i; j0 := i+1;
WHILE name[i0] # 0X DO
i := i0; j := j0;
WHILE (name[i] # 0X) & (name[i] = pat[j]) DO INC(i); INC(j) END ;
IF pat[j] = 0X THEN
IF name[i] = 0X THEN (*match*) j0 := j ELSE INC(i0) END
ELSIF pat[j] = "*" THEN i0 := i; j0 := j+1
ELSE INC(i0)
END
END
END ;
IF (name[i0] = 0X) & (pat[j0] = 0X) THEN (*found*)
Texts.WriteString(W, name);
IF pat[j0+1] = "!" THEN (*option*)
Kernel.GetSector(adr, hp);
Texts.Write(W, 9X); Texts.WriteClock(W, hp.date);
Texts.WriteInt(W, hp.aleng*FileDir.SectorSize + hp.bleng - FileDir.HeaderSize, 8); (*length*)
Texts.WriteHex(W, adr)
END ;
Texts.WriteLn(W)
END
END List;
PROCEDURE Directory*;
VAR X, Y, i: INTEGER; ch: CHAR;
R: Texts.Reader;
T, t: Texts.Text;
V: Viewers.Viewer;
beg, end, time: LONGINT;
pre: ARRAY 32 OF CHAR;
BEGIN Texts.OpenReader(R, Oberon.Par.text, Oberon.Par.pos); Texts.Read(R, ch);
WHILE ch = " " DO Texts.Read(R, ch) END ;
IF (ch = "^") OR (ch = 0DX) THEN
Oberon.GetSelection(T, beg, end, time);
IF time >= 0 THEN
Texts.OpenReader(R, T, beg); Texts.Read(R, ch);
WHILE ch <= " " DO Texts.Read(R, ch) END
END
END ;
i := 0;
WHILE ch > " " DO (*pattern*)
IF ch = "!" THEN pat[i] := 0X; INC(i) END ; (*directory option*)
pat[i] := ch; INC(i);
Texts.Read(R, ch)
END ;
WHILE i < LEN(pat) DO pat[i] := 0X; INC(i) END ;
i := 0;
WHILE pat[i] > "*" DO pre[i] := pat[i]; INC(i) END ; (*prefix*)
WHILE i < LEN(pre) DO pre[i] := 0X; INC(i) END ;
Oberon.AllocateSystemViewer(Oberon.Par.vwr.X, X, Y); t := TextFrames.Text("");
V := MenuViewers.New(
TextFrames.NewMenu("System.Directory", StandardMenu),
TextFrames.NewText(t, 0), TextFrames.menuH, X, Y);
FileDir.Enumerate(pre, List); Texts.Append(t, W.buf)
END Directory;
More information about the Oberon
mailing list