MODULE Master; FROM SYSTEM IMPORT WORD, ADDRESS, UNIXCALL; FROM UnixCalls IMPORT chdir, write, link, unlink; FROM SysStreams IMPORT sysOut; FROM ScanDir IMPORT ScanUnixDir; FROM ScanS IMPORT ParseF0, ParseF1, ParseF2, ParseF3, ParseF4; FROM WriteF IMPORT WriteF0, WriteF1, WriteF2, H, S; IMPORT Strings; FROM Strings IMPORT String; CONST MaxFiles = 1023; MaxFileNameLen = 255; ReadMode=40H; WriteMode=80H; VAR Catalogue: ARRAY [0..MaxFiles] OF String; LastIndex: INTEGER; PROCEDURE SaveToUnix(FileName: ARRAY OF CHAR; Length: INTEGER; Load, Exec, Attr :INTEGER); VAR ReturnedHandle: INTEGER; BEGIN OpenFile(FileName, WriteMode, ReturnedHandle); PutBytesToUnix(ReturnedHandle, Length); CloseFile(ReturnedHandle); SetAttrs(FileName, Load, Exec, Attr); END SaveToUnix; PROCEDURE SetAttrs(FileName: ARRAY OF CHAR; Load, Exec, Attr :INTEGER); (* WARNING: File may be open *) BEGIN (* If so, remember, & set later *) END SetAttrs; PROCEDURE ReadAttrs(FileName: ARRAY OF CHAR; VAR Load, Exec, Attr :INTEGER); BEGIN END ReadAttrs; PROCEDURE DeleteFile(FileName: ARRAY OF CHAR); BEGIN END DeleteFile; PROCEDURE LoadFromUnix(FileName: ARRAY OF CHAR; VAR Length: INTEGER; VAR Load, Exec, Attr :INTEGER); BEGIN END LoadFromUnix; PROCEDURE ReadUnixFilePointer(Handle: INTEGER; VAR NextByte: INTEGER); BEGIN END ReadUnixFilePointer; PROCEDURE WriteUnixFilePointer(Handle: INTEGER; ThisByte: INTEGER); BEGIN END WriteUnixFilePointer; PROCEDURE ReadUnixFileLength(Handle: INTEGER; VAR NextByte: INTEGER); BEGIN END ReadUnixFileLength; PROCEDURE UpdateMedia(Handle: INTEGER); BEGIN END UpdateMedia; PROCEDURE PutBytesToUnix(Handle: INTEGER; Length: INTEGER); BEGIN END PutBytesToUnix; PROCEDURE GetBytesFromUnix(Handle: INTEGER; VAR Length: INTEGER); BEGIN END GetBytesFromUnix; PROCEDURE CloseFile(Handle: INTEGER); BEGIN END CloseFile; PROCEDURE OpenFile(FileName: ARRAY OF CHAR; Mode: INTEGER; VAR Handle: INTEGER); BEGIN END OpenFile; (*------------------------------------------------------------------------*) PROCEDURE GetEntries(VAR Filename: ARRAY OF CHAR; Environ: ADDRESS): BOOLEAN; VAR I: INTEGER; BEGIN IF Filename[0]="." THEN RETURN(FALSE) END; LastIndex := LastIndex+1; Catalogue[LastIndex] := Strings.CopyCS(Filename); (* Convert all '.'s to '_'s *) FOR I := 0 TO Strings.LengthS(Catalogue[LastIndex]) DO IF Catalogue[LastIndex]^[I] = "." THEN Catalogue[LastIndex]^[I] := "_"; END (* if *); END (* for *); RETURN(FALSE) END GetEntries; (*------------------------------------------------------------------------*) PROCEDURE ReadUnixCatalogue(VAR FileName: ARRAY OF CHAR;VAR Index: INTEGER); VAR Env: POINTER TO WORD; I: INTEGER; CurrentDir: ARRAY [0..1] OF CHAR; BEGIN Env := NIL; IF Index=0 THEN FOR I := 0 TO LastIndex DO Strings.Dispose(Catalogue[I]) END (* for *); LastIndex := -1; CurrentDir[0] := "."; CurrentDir[1] := 0C; IF ScanUnixDir(CurrentDir, GetEntries, Env) THEN END; END; IF Index>LastIndex THEN Index := 0; RETURN END; Strings.CopySC(Catalogue[Index], FileName); Index := Index+1 END ReadUnixCatalogue; PROCEDURE PerformSpecialCommandLine(command: String); VAR file1, file2: String; PROCEDURE Rename(); BEGIN WriteF2(sysOut, "Renaming %S to %S\n", S(file1), S(file2)); END Rename; PROCEDURE CreateDir(); BEGIN WriteF1(sysOut, "Creating %S\n", S(file1)); END CreateDir; PROCEDURE SelectDir(); VAR Status: INTEGER; BEGIN IF file1^[0] = 0C THEN WriteF0(sysOut, "Selecting home directory\n"); RETURN END (* if *); Status := UNIXCALL (chdir, ADDRESS(file1)); IF Status <> 0 THEN ErrorF1(06H, "Cannot change to directory %S\N", S(file1)); RETURN END; WriteF1(sysOut, "Selected %S\n", S(file1)); END SelectDir; BEGIN file1 := NIL; file2 := NIL; IF ParseF2("?\*rename ^~ * ^~ ", command, "%^0", file1, "%^1", file2) THEN Rename(); ELSIF ParseF1("?\*cdir ^~ ", command, "%^0", file1) THEN CreateDir(); ELSIF ParseF1("?\*dir* *~ ", command, "%~0", file1) THEN (* Syntax chosen to allow "*DIR" on its own *) SelectDir(); END (* if *); Strings.Dispose(command); IF file1<>NIL THEN Strings.Dispose(file1) END; IF file2<>NIL THEN Strings.Dispose(file2) END; END PerformSpecialCommandLine; PROCEDURE ErrorF0(ErrorNo: INTEGER; Text: ARRAY OF CHAR); BEGIN END ErrorF0; PROCEDURE ErrorF1(ErrorNo: INTEGER; Text: ARRAY OF CHAR; Culprit: WORD); BEGIN WriteF1(sysOut, "Error %I: ", ErrorNo); WriteF1(sysOut, Text, Culprit); END ErrorF1; PROCEDURE ErrorF2(ErrorNo: INTEGER; Text: ARRAY OF CHAR; Culprit1, Culprit2: WORD); BEGIN END ErrorF2; VAR FileName: ARRAY [0..MaxFileNameLen] OF CHAR; Index: INTEGER; BEGIN LastIndex := -1; Index := 0; LOOP ReadUnixCatalogue(FileName, Index); IF Index=0 THEN EXIT END; WriteF1(sysOut, "%S\N", H(FileName)); END; PerformSpecialCommandLine(Strings.CopyCS("rename fred jim")); PerformSpecialCommandLine(Strings.CopyCS("DELETE fred")); PerformSpecialCommandLine(Strings.CopyCS("*DIR testdir")); PerformSpecialCommandLine(Strings.CopyCS("*DIR")); END Master.