ðÅSyntax10.Scn.FntWSyntax10b.Scn.FntSyntax10i.Scn.Fnt¸ ~53ŽÊMODULE Catalogs; (** CAS 11-Sep-90, CS 10 Aug 94 **) IMPORT Oberon, Viewers, Texts, TextFrames, MenuViewers; CONST Menu = "System.Close System.Copy System.Grow Edit.Search Edit.Store"; TYPE LineBuf = ARRAY 128 OF CHAR; LineExt = ARRAY 32 OF CHAR; Line = POINTER TO LineDesc; LineDesc = RECORD l, r: Line; ext: LineExt; buf: LineBuf END ; VAR T: Texts.Text; W: Texts.Writer; PROCEDURE Str(s: ARRAY OF CHAR); BEGIN Texts.WriteString(W, s) END Str; PROCEDURE Int(i: LONGINT); BEGIN Texts.WriteInt(W, i, 0) END Int; PROCEDURE Ln; BEGIN Texts.WriteLn(W) END Ln; PROCEDURE OpenViewer(cmd: ARRAY OF CHAR); VAR V: MenuViewers.Viewer; x, y: INTEGER; t, d: LONGINT; BEGIN Oberon.AllocateUserViewer(Oberon.Mouse.X, x, y); T := TextFrames.Text(""); Texts.OpenBuf(W.buf); Str(cmd); Str(" "); Oberon.GetClock(t, d); Texts.WriteDate(W, t, d); Ln; Ln; V := MenuViewers.New(TextFrames.NewMenu(cmd, Menu), TextFrames.NewText(T, 0), TextFrames.menuH, x, y) END OpenViewer; PROCEDURE SortIn(VAR u: Line; v: Line); BEGIN IF u = NIL THEN u := v ELSIF v.ext < u.ext THEN SortIn(u.l, v) ELSE SortIn(u.r, v) END END SortIn; PROCEDURE OutLines(u: Line); VAR ext: LineExt; cnt: INTEGER; PROCEDURE Out(u: Line); BEGIN IF u # NIL THEN Out(u.l); IF ext # u.ext THEN IF cnt > 0 THEN Int(cnt); Str(" files"); Ln; Ln; cnt := 0 END ; ext := u.ext; Str(ext); Ln END ; Str(" "); Str(u.buf); Ln; INC(cnt); Out(u.r) END END Out; BEGIN ext[0] := 0X; cnt := 0; Out(u); IF cnt > 0 THEN Int(cnt); Str(" files"); Ln; Ln END END OutLines; PROCEDURE Stat*; (**marked directory viewer**) VAR V: Viewers.Viewer; dir: Texts.Text; R: Texts.Reader; S: Texts.Scanner; i, j, cnt: INTEGER; s, n: LONGINT; lines, line: Line; buf: LineBuf; ext: ARRAY 10 OF LineExt; BEGIN V := Oberon.MarkedViewer(); dir := V.dsc.next(TextFrames.Frame).text; OpenViewer("Catalogs.Stat"); cnt := 0; lines := NIL; ext[0] := "< 1K"; ext[1] := "< 2K"; ext[2] := "< 4K"; ext[3] := "< 8K"; ext[4] := "< 16K"; ext[5] := "< 32K"; ext[6] := "< 64K"; ext[7] := "< 128K"; ext[8] := "< 256K"; ext[9] := ">= 256K"; Texts.OpenReader(R, dir, 0); Texts.Read(R, buf[0]); WHILE ~R.eot DO i := 0; WHILE ~R.eot & (buf[i] # 0DX) DO INC(i); Texts.Read(R, buf[i]) END ; buf[i] := 0X; IF ~R.eot THEN INC(cnt); Texts.OpenScanner(S, dir, Texts.Pos(R) - 7); Texts.Scan(S); IF S.class = Texts.Int THEN s := S.i; j := 9; n := 40000H; LOOP IF s >= n THEN NEW(line); line.ext := ext[j]; line.buf := buf; SortIn(lines, line); EXIT END ; n := n DIV 2; DEC(j); IF j < 0 THEN EXIT END END END ; Texts.Read(R, buf[0]) END END ; OutLines(lines); Str("total of "); Int(cnt); Str(" files counted."); Ln; Texts.Append(T, W.buf); Oberon.Collect(0) END Stat; PROCEDURE Sort*; (**marked directory viewer**) VAR V: Viewers.Viewer; dir: Texts.Text; R: Texts.Reader; i, j, k, cnt: INTEGER; ch: CHAR; lines, line: Line; buf: LineBuf; ext: LineExt; l: INTEGER; (* position of first " *) BEGIN V := Oberon.MarkedViewer(); dir := V.dsc.next(TextFrames.Frame).text; OpenViewer("Catalogs.Sort"); cnt := 0; lines := NIL; Texts.OpenReader(R, dir, 0); Texts.Read(R, ch); WHILE ~R.eot DO i := 0; j := 0; k := -1; l := -1; WHILE ~R.eot & (ch # 0DX) DO buf[i] := ch; INC(i); IF k < 0 THEN IF ch = "." THEN j := i ELSIF (l < 0) & (ch = '"') THEN l := i (* <= CS, 9 Aug 94, ignore blanks within strings *) ELSIF (l >= 0) & (ch = '"') THEN l := -1 ELSIF (l < 0) & (ch = " ") THEN k := i END END ; Texts.Read(R, ch) END ; buf[i] := 0X; IF k < 0 THEN k := i END ; i := 0; WHILE (j < k) & (buf[j] # '"') DO ext[i] := buf[j]; INC(i); INC(j) END ; (* <= CS, 9 Aug 94, skip " at end of extension *) IF (i > 0) & (ext[i - 1] = '"') THEN ext[i - 1] := 0X ELSE ext[i] := 0X END ; IF ~R.eot THEN INC(cnt); NEW(line); line.ext := ext; line.buf := buf; SortIn(lines, line); Texts.Read(R, ch) END END ; OutLines(lines); Str("total of "); Int(cnt); Str(" files processed."); Ln; Texts.Append(T, W.buf); Oberon.Collect(0) END Sort; BEGIN Texts.OpenWriter(W) END Catalogs. Catalogs.Stat (*marked directory viewer*) Catalogs.Sort (*marked directory viewer*)