Category : Modula II Source Code
Archive   : FILETOO2.ZIP
Filename : TOOLMENU.MOD

 
Output of file : TOOLMENU.MOD contained in archive : FILETOO2.ZIP
IMPLEMENTATION MODULE ToolMenuCommands;

(*
Title : TOOLMENU.MOD
LastEdit : 01/05/87
Author : Russell G. Osterlund, Jr.
System : LOGITECH MODULA-2/86, REPERTOIRE, BlackBeard

This product has been developed with the use of, and embodies portions of,
LOGITECH software development tools - compiler, linker, and M2MAKE.

*)

FROM SYSTEM IMPORT
ADR;
FROM Exec IMPORT
DosShell, DosCommand;
FROM Keyboard IMPORT
Read, KeyPressed;
FROM EnvironUtils IMPORT (* REPETOIRE *)
ReadEnvironment, GetDate, GetTime;
FROM SmartScreen IMPORT (* REPETOIRE *)
Colors, SetCursorHeight, ClearScreen, TextColor;
FROM FileIO IMPORT (* REPETOIRE *)
OpenFile, CloseHandle, FileExists, EndReached;
FROM StringIO IMPORT (* REPETOIRE *)
ErrorMessage, ReadStr;
FROM StrEdit IMPORT (* REPETOIRE *)
CAPstr;
FROM Strings IMPORT
Pos, Assign, Concat, Delete, Length, Copy, CompareStr;
FROM StrConv IMPORT (* REPETOIRE *)
CardinalToStr;
FROM Drectory IMPORT (* REPETOIRE *)
FileMode, ModeSet,
GetFileMode, SetFileMode,
SetFileDateAndTime,
RenameFile, DeleteFile, CopyFile,
MkDir, RmDir, ChDir,
SetDefaultDrive, GetDefaultDrive, GetCurrentDir;
FROM GetKey IMPORT (* REPETOIRE *)
CRchar, ESCchar, TABchar, BTBnum,
KeySet,
MakeKeySet, GetKey;
FROM ToolUtilities IMPORT
InitDirectoryInfo, ReadInfo,
SortByName, SortByExtension, SortBySize, SortByDate,
BuildFullFileName, BuildFullPath, ConcatPathFile,
RedisplayDirectory, RedisplayScreen;
FROM ToolDisplay IMPORT
ConfigForeground, ConfigBackground,
DisplayInfo, DisplayFileLine, DisplaySummaryLine,
CopyMenu, RenameMenu, ExecuteMenu, AdditionalMenu,
SortMenu, AttributesMenu, OtherMenu,
DisplaySubMenu, DisplayAdditionalMenu, INCMenuPos, DECMenuPos,
YesAnswer, GetMoreInfo, DisplayMessage, NoErrorMsg, DisplayHelpScreen;
FROM ToolTypes IMPORT
DirectoryRecPtr,
WindowType, ActiveWindow, BothWindowsActive,
SubmenuType, DirectoryInfo;

VAR
CopyMenuKeySet,
RenameMenuKeySet,
ExecuteMenuKeySet,
AdditionalMenuKeySet,
SortMenuKeySet,
AttributesMenuKeySet,
OtherMenuKeySet: KeySet;
Key: CHAR;
ListUtility,
EditUtility: ARRAY [0 .. 65] OF CHAR;
TheMessage,
TheQuestion: ARRAY [0 .. 79] OF CHAR;


(* Begin Internal Routines *)


PROCEDURE WaitASec ();
VAR
key: CHAR;
BEGIN
DisplayMessage ('Press any key to return to FILETOOL.');
WHILE NOT KeyPressed () DO END;
Read (key);
END WaitASec;

PROCEDURE ProcessCommand (VAR Key: CHAR;
MenuKeySet: KeySet;
Menu: ARRAY OF SubmenuType;
blank: BOOLEAN): BOOLEAN;
VAR
Done,
ProcessCmd,
ExtendedKey: BOOLEAN;
MenuPos: CARDINAL;
BEGIN
Done := FALSE;
ProcessCmd := FALSE;
MenuPos := 0;
REPEAT
DisplaySubMenu (Menu, MenuPos, blank);
GetKey (MenuKeySet, Key, ExtendedKey);
IF ExtendedKey THEN
IF ORD (Key) = BTBnum THEN
DECMenuPos (HIGH (Menu), MenuPos);
END
ELSE
IF Key = CRchar THEN
Key := Menu [MenuPos] . KeyEquivalent;
ProcessCmd := TRUE;
Done := TRUE;
ELSE
CASE Key OF
ESCchar:
Done := TRUE;
| TABchar:
INCMenuPos (HIGH (Menu), MenuPos);
ELSE
Done := TRUE;
ProcessCmd := TRUE;
END;
END;
END;
UNTIL Done;
RETURN ProcessCmd;
END ProcessCommand;

PROCEDURE ParsePath (directory: DirectoryRecPtr;
Path: ARRAY OF CHAR;
VAR TheDrive: CHAR;
VAR ThePath: ARRAY OF CHAR;
VAR TheFile: ARRAY OF CHAR;
VAR DifferentWindow: BOOLEAN);
VAR
l: CARDINAL;
error: ErrorMessage;
BEGIN
DifferentWindow := FALSE;
TheFile [0] := 0C;

IF Length (Path) > 0 THEN
Assign (Path, ThePath);

IF ThePath [1] = ':' THEN
TheDrive := ThePath [0];
Delete (ThePath, 0, 2);
ELSE
TheDrive := GetDefaultDrive ();
END;

IF Length (ThePath) = 0 THEN (* only a drive letter entered, e.g. A: *)
TheFile [0] := 0C;
error := GetCurrentDir (TheDrive, ThePath);
ELSE
IF (Pos ('\', ThePath) # HIGH (ThePath) + 1) OR
(Pos ('/', ThePath) # HIGH (ThePath) + 1) THEN (* if found *)
l := Length (ThePath);
LOOP
IF (ThePath [l] = '\') OR
(ThePath [l] = '/') THEN
EXIT;
END;
DEC (l);
END;
IF l = 0 THEN
Copy (ThePath, 1, Length (ThePath) - 1, TheFile);
ThePath [0] := '\';
ThePath [1] := 0C;
ELSE
Copy (ThePath, l + 1, Length (ThePath) - l, TheFile);
Copy (ThePath, 0, l, ThePath);
END;
ELSE (* if not found, then assume the remainder is a filename *)
Assign (ThePath, TheFile);
error := GetCurrentDir (TheDrive, ThePath);
END;
END;

ELSE (* Length (Path) = 0, default to current *)
TheDrive := directory^ . DirectoryDrive;
Assign (directory^ . DirectoryPath, ThePath);
TheFile [0] := 0C;
END;

IF TheDrive # directory^ . DirectoryDrive THEN
DifferentWindow := TRUE;
END;
IF CompareStr (ThePath, directory^ . DirectoryPath) # 0 THEN
DifferentWindow := TRUE;
END;
END ParsePath;

PROCEDURE OpenNewWindow (NewDrive: CHAR;
NewPath: ARRAY OF CHAR;
NewMask: ARRAY OF CHAR);
VAR
NewWindow: WindowType;
OldDirectory,
NewDirectory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
OldDirectory := ADR (DirectoryInfo [ORD (LeftWindow)]);
NewWindow := RightWindow;
BothWindowsActive := TRUE;
ELSE
OldDirectory := ADR (DirectoryInfo [ORD (RightWindow)]);
NewWindow := LeftWindow;
END;
NewDirectory := ADR (DirectoryInfo [ORD (NewWindow)]);
SetDefaultDrive (NewDrive);
IF NoErrorMsg (ChDir (NewPath)) THEN
IF BothWindowsActive THEN
DisplayFileLine (OldDirectory, OldDirectory^ . CurrentFile, FALSE);
END;
InitDirectoryInfo (NewDirectory);
Assign (NewPath, NewDirectory^ . DirectoryPath);
NewDirectory^ . DirectoryDrive := NewDrive;
Assign (NewMask, NewDirectory^ . DirectoryMask);
ActiveWindow := NewWindow;
ReadInfo (NewDirectory);
DisplayInfo (NewDirectory, 0, TRUE);
END;
END OpenNewWindow;

PROCEDURE CopyOther (Delete: BOOLEAN;
directory: DirectoryRecPtr);
VAR
handle: CARDINAL;
OldWindow,
NewWindow: BOOLEAN;
OldDrive,
NewDrive: CHAR;
OldPath,
NewPath,
OldName,
NewName,
TheFile,
ThePath: ARRAY [0 .. 65] OF CHAR;
BEGIN
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, OldDrive, OldPath, OldName, OldWindow);
BuildFullPath (OldDrive, OldPath, TheFile);
ConcatPathFile (TheFile, OldName, TheFile);

GetMoreInfo (' Enter target pathname:', ThePath);
CAPstr (ThePath);
ParsePath (directory, ThePath, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, ThePath);

IF Delete THEN
Concat (' Move ', TheFile, TheQuestion);
ELSE
Concat (' Copy ', TheFile, TheQuestion);
END;
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, ThePath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);

IF YesAnswer (TheQuestion) THEN
IF Length (NewName) > 0 THEN
ConcatPathFile (ThePath, NewName, ThePath);
ELSE (* default to old name *)
ConcatPathFile (ThePath, OldName, ThePath);
END;
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
IF NoErrorMsg (CopyFile (handle, ThePath)) THEN
IF NoErrorMsg (CloseHandle (handle)) THEN
IF Delete THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was moved.', TheMessage);
DisplayMessage (TheMessage);
END;
ELSE
Concat (TheFile, ' was copied.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
ELSE
IF NoErrorMsg (CloseHandle (handle)) THEN
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
END;
END;
END;
END;
END;
END CopyOther;

PROCEDURE CopyTagged (Delete: BOOLEAN;
directory: DirectoryRecPtr);
VAR
i, handle: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewName,
OldName,
NewPath,
OldPath,
TheFile,
ThePath: ARRAY [0 .. 65] OF CHAR;
BEGIN
CardinalToStr (directory^ . NumberTagged, 3, NumFiles);
BuildFullPath (directory^ . DirectoryDrive,
directory^ . DirectoryPath,
OldPath);

GetMoreInfo (' Enter target pathname:', ThePath);
CAPstr (ThePath);
ParsePath (directory, ThePath, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, ThePath);

IF Delete THEN
Concat (' Move ', NumFiles, TheQuestion);
ELSE
Concat (' Copy ', NumFiles, TheQuestion);
END;
Concat (TheQuestion, ' file(s) from ', TheQuestion);
Concat (TheQuestion, OldPath, TheQuestion);
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, ThePath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);

IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO directory^ . NumberOfEntries DO
IF directory^ . FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, OldName);
ConcatPathFile (OldPath, OldName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
ConcatPathFile (ThePath, OldName, NewName);
IF NoErrorMsg (CopyFile (handle, NewName)) THEN
IF NoErrorMsg (CloseHandle (handle)) THEN
IF Delete THEN
IF NoErrorMsg (DeleteFile (OldName)) THEN
Concat (TheFile, ' was moved.', TheMessage);
DisplayMessage (TheMessage);
END;
ELSE
Concat (TheFile, ' was copied.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
END;
END; (* IF tagged *)
END; (* FOR *)

IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSIF Delete THEN
RedisplayDirectory (directory, 0);
ELSE
END;
END;
END CopyTagged;

PROCEDURE CopyCurrent (Delete: BOOLEAN;
directory: DirectoryRecPtr);
VAR
handle: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
TheFile,
ThePath,
NewPath,
OldPath,
NewName,
OldName: ARRAY [0 .. 65] OF CHAR;
BEGIN
BuildFullFileName (directory, directory^ . CurrentFile, OldName);
BuildFullPath (directory^ . DirectoryDrive,
directory^ . DirectoryPath,
OldPath);
ConcatPathFile (OldPath, OldName, TheFile);

IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
GetMoreInfo (' Enter target pathname:', ThePath);
CAPstr (ThePath);
ParsePath (directory, ThePath, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, ThePath);

IF Delete THEN
Concat (' Move ', TheFile, TheQuestion);
ELSE
Concat (' Copy ', TheFile, TheQuestion);
END;
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, ThePath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);

IF YesAnswer (TheQuestion) THEN
IF Length (NewName) > 0 THEN
ConcatPathFile (ThePath, NewName, ThePath);
ELSE (* default to old name *)
ConcatPathFile (ThePath, OldName, ThePath);
END;
IF NoErrorMsg (CopyFile (handle, ThePath)) THEN
IF NoErrorMsg (CloseHandle (handle)) THEN
IF Delete THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was moved.', TheMessage);
DisplayMessage (TheMessage);
END;
ELSE
Concat (TheFile, ' was copied.', TheMessage);
DisplayMessage (TheMessage);
END;

IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSIF Delete THEN
RedisplayDirectory (directory, 0);
ELSE
END;
END;
END;
END;
END;
END CopyCurrent;


(* Begin External Routines *)


PROCEDURE HelpCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr);
VAR
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
DisplayHelpScreen ();
WaitASec ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END HelpCommand;

PROCEDURE CopyCommand (directory: DirectoryRecPtr);
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
CopyCurrent (FALSE, directory);
END;
| "t", "T":
IF NumberTagged > 0 THEN
CopyTagged (FALSE, directory);
END;
| "o", "O":
CopyOther (FALSE, directory);
ELSE
END;
END;
END;
END CopyCommand;

PROCEDURE MoveCommand (directory: DirectoryRecPtr);
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
CopyCurrent (TRUE, directory);
END;
| "t", "T":
IF NumberTagged > 0 THEN
CopyTagged (TRUE, directory);
END;
| "o", "O":
CopyOther (TRUE, directory);
ELSE
END;
END;
END;
END MoveCommand;

PROCEDURE DeleteCommand (directory: DirectoryRecPtr);
VAR
i: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewPath,
NewName,
TheFile: ARRAY [0 .. 65] OF CHAR;
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [i] . FileName [1] = '.')) THEN
ELSE
BuildFullFileName (directory, CurrentFile, NewName);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
ConcatPathFile (NewPath, NewName, TheFile);
Concat (' Delete ', NewName, TheQuestion);
Concat (TheQuestion, ' from ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
RedisplayDirectory (directory, 0);
Concat (TheFile, ' was deleted.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
| "t", "T":
IF NumberTagged > 0 THEN
CardinalToStr (NumberTagged, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
Concat (' Delete ', NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) from ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, NewName);
ConcatPathFile (NewPath, NewName, TheFile);
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was deleted.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
RedisplayDirectory (directory, 0);
END;
END;
| "o", "O":
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, TheFile);
ConcatPathFile (TheFile, NewName, TheFile);
Concat (' Delete ', TheFile, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was deleted.', TheMessage);
DisplayMessage (TheMessage);
END;
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
END;
END;
ELSE
END;
END;
END;
END DeleteCommand;

PROCEDURE RenameCommand (directory: DirectoryRecPtr);
VAR
NewName,
OldName: ARRAY [0 .. 65] OF CHAR;

PROCEDURE PerformRename (redisplay: BOOLEAN);
BEGIN
Concat (' Rename ', OldName, TheQuestion);
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, NewName, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (RenameFile (OldName, NewName)) THEN
IF redisplay THEN
RedisplayDirectory (directory, directory^ . FirstDisplayed);
END;
Concat (OldName, ' was renamed.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END PerformRename;

BEGIN
IF ProcessCommand (Key, RenameMenuKeySet, RenameMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
GetMoreInfo (' Enter new name:', NewName);
CAPstr (NewName);
BuildFullFileName (directory, CurrentFile, OldName);
PerformRename (TRUE);
END;
| "o", "O":
GetMoreInfo (' Enter old name:', OldName);
GetMoreInfo (' Enter new name:', NewName);
CAPstr (OldName);
CAPstr (NewName);
PerformRename (FALSE);
ELSE
END;
END;
END;
END RenameCommand;

PROCEDURE AttributesCommand (directory: DirectoryRecPtr);
VAR
i: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewPath,
NewName,
TheFile: ARRAY [0 .. 65] OF CHAR;
TheMessage,
TheResponse: ARRAY [0 .. 79] OF CHAR;

PROCEDURE ProcessAttribute (TheAttribute: FileMode;
Include: BOOLEAN);
VAR
TheAttributes: ModeSet;
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
CASE TheAttribute OF
ReadOnlyFile:
IF Include THEN
TheQuestion := ' Protect ';
TheResponse := ' was protected.';
ELSE
TheQuestion := ' Unprotect ';
TheResponse := ' was unprotected.';
END;
| HiddenFile:
IF Include THEN
TheQuestion := ' Hide ';
TheResponse := ' was hidden.';
ELSE
TheQuestion := ' Show ';
TheResponse := ' was unhidden.';
END;
ELSE
END;
WITH directory^ DO
CASE Key OF
"c", "C":
BuildFullFileName (directory, CurrentFile, NewName);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
Concat (TheQuestion, NewName, TheQuestion);
Concat (TheQuestion, ' in ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
ConcatPathFile (NewPath, NewName, TheFile);
IF Include THEN
INCL (FileInfoArray [CurrentFile] . FileAttribute, TheAttribute);
ELSE
EXCL (FileInfoArray [CurrentFile] . FileAttribute, TheAttribute);
END;
IF NoErrorMsg (SetFileMode (TheFile,
FileInfoArray [CurrentFile] . FileAttribute)) THEN
RedisplayDirectory (directory, 0);
Concat (TheFile, TheResponse, TheResponse);
DisplayMessage (TheResponse);
END;
END;
| "o", "O":
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, TheFile);
ConcatPathFile (TheFile, NewName, TheFile);
Concat (TheQuestion, TheFile, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (GetFileMode (TheFile, TheAttributes)) THEN
IF Include THEN
INCL (TheAttributes, TheAttribute);
ELSE
EXCL (TheAttributes, TheAttribute);
END;
IF NoErrorMsg (SetFileMode (TheFile, TheAttributes)) THEN
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSE
RedisplayDirectory (directory, 0);
END;
Concat (TheFile, TheResponse, TheResponse);
DisplayMessage (TheResponse);
END;
END;
END;
| "t", "T":
IF NumberTagged > 0 THEN
CardinalToStr (NumberTagged, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
Concat (TheQuestion, NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) in ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, NewName);
ConcatPathFile (NewPath, NewName, TheFile);
IF Include THEN
INCL (FileInfoArray [i] . FileAttribute, TheAttribute);
ELSE
EXCL (FileInfoArray [i] . FileAttribute, TheAttribute);
END;
IF NoErrorMsg (SetFileMode (TheFile,
FileInfoArray [i] . FileAttribute)) THEN
Concat (TheFile, TheResponse, TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
RedisplayDirectory (directory, 0);
END;
END;
ELSE
END;
END;
END;
END ProcessAttribute;

PROCEDURE ProcessDateTime ();
VAR
handle,
Month, Day, Year,
Hours, Minutes, Seconds, Hundreths: CARDINAL;
Time, DayOfWeek, Date: ARRAY [0 .. 79] OF CHAR;
BEGIN
GetDate (Month, Day, Year, DayOfWeek, Date);
GetTime (Hours, Minutes, Seconds, Hundreths, Time);
Concat (' Set file(s) to SYSTEM date/time of ', Date, TheQuestion);
Concat (TheQuestion, '/', TheQuestion);
Concat (TheQuestion, Time, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
BuildFullFileName (directory, CurrentFile, NewName);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
ConcatPathFile (NewPath, NewName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
SetFileDateAndTime (handle, Month, Day, Year, Hours, Minutes, Seconds);
IF NoErrorMsg (CloseHandle (handle)) THEN
RedisplayDirectory (directory, 0);
Concat (' New date/time was set for ', TheFile, TheResponse);
DisplayMessage (TheResponse);
END;
END;
| "o", "O":
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, TheFile);
ConcatPathFile (TheFile, NewName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
SetFileDateAndTime (handle, Month, Day, Year, Hours, Minutes, Seconds);
IF NoErrorMsg (CloseHandle (handle)) THEN
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSE
RedisplayDirectory (directory, 0);
END;
Concat (' New date/time was set for ', TheFile, TheResponse);
DisplayMessage (TheResponse);
END;
END;
| "t", "T":
IF NumberTagged > 0 THEN
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, NewName);
ConcatPathFile (NewPath, NewName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
SetFileDateAndTime (handle, Month, Day, Year, Hours, Minutes, Seconds);
IF NoErrorMsg (CloseHandle (handle)) THEN
Concat (' New date/time was set for ', TheFile, TheResponse);
DisplayMessage (TheResponse);
END;
END;
END;
END;
RedisplayDirectory (directory, 0);
END;
ELSE
END;
END;
END;
END;
END ProcessDateTime;

BEGIN
IF ProcessCommand (Key, AttributesMenuKeySet, AttributesMenu, TRUE) THEN
CASE Key OF
"d", "D":
ProcessDateTime ();
| "p", "P":
ProcessAttribute (ReadOnlyFile, TRUE);
| "h", "H":
ProcessAttribute (HiddenFile, TRUE);
| "s", "S":
ProcessAttribute (HiddenFile, FALSE);
| "u", "U":
ProcessAttribute (ReadOnlyFile, FALSE);
ELSE
END;
END;
END AttributesCommand;

PROCEDURE EditListCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr;
edit: BOOLEAN);

VAR
done,
NewWindow: BOOLEAN;
NewDrive: CHAR;
i: CARDINAL;
FullFileName: ARRAY [0 .. 11] OF CHAR;
NewPath,
NewName,
OtherName: ARRAY [0 .. 65] OF CHAR;
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
BuildFullFileName (directory, CurrentFile, FullFileName);
SetCursorHeight (2);
IF edit THEN
DosCommand (EditUtility, FullFileName, done);
ELSE
DosCommand (ListUtility, FullFileName, done);
END;
ClearScreen ();
SetCursorHeight (0);
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
| "o", "O":
GetMoreInfo (' Enter filename:', OtherName);
ParsePath (directory, OtherName, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, OtherName);
ConcatPathFile (OtherName, NewName, OtherName);
SetCursorHeight (2);
IF edit THEN
DosCommand (EditUtility, OtherName, done);
ELSE
DosCommand (ListUtility, OtherName, done);
END;
ClearScreen ();
SetCursorHeight (0);
RedisplayScreen (directory, LeftDirectory, RightDirectory);
| "t", "T":
IF NumberTagged > 0 THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, FullFileName);
SetCursorHeight (2);
IF edit THEN
DosCommand (EditUtility, FullFileName, done);
ELSE
DosCommand (ListUtility, FullFileName, done);
END;
ClearScreen ();
SetCursorHeight (0);
END;
END;
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
ELSE
END;
END;
END;
END EditListCommand;

PROCEDURE ExecuteCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr);
VAR
done: BOOLEAN;
MenuPos: CARDINAL;
FullFileName: ARRAY [0 .. 11] OF CHAR;
Parameters,
OtherName: ARRAY [0 .. 65] OF CHAR;
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
IF ProcessCommand (Key, ExecuteMenuKeySet, ExecuteMenu, TRUE) THEN
CASE Key OF
"c", "C":
WITH directory^ DO
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
GetMoreInfo (' Enter any parameters:', Parameters);
SetCursorHeight (2);
BuildFullFileName (directory, CurrentFile, FullFileName);
ClearScreen ();
DosCommand (FullFileName, Parameters, done);
IF done THEN
SetCursorHeight (0);
WaitASec ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
END;
END;
| "s", "S":
SetCursorHeight (2);
ClearScreen ();
DosShell (done);
IF done THEN
ClearScreen ();
SetCursorHeight (0);
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
| "o", "O":
GetMoreInfo (' Enter other command:', OtherName);
GetMoreInfo (' Enter any parameters:', Parameters);
SetCursorHeight (2);
ClearScreen ();
DosCommand (OtherName, Parameters, done);
IF done THEN
SetCursorHeight (0);
WaitASec ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
| "m", "M":
DisplayAdditionalMenu ();
IF ProcessCommand (Key, AdditionalMenuKeySet, AdditionalMenu, FALSE) THEN
DisplaySubMenu (ExecuteMenu, 2, TRUE);
CASE Key OF
"a", "A":
Assign (AdditionalMenu [0] . Command, OtherName);
MenuPos := 0;
| "b", "B":
Assign (AdditionalMenu [1] . Command, OtherName);
MenuPos := 1;
| "c", "C":
Assign (AdditionalMenu [2] . Command, OtherName);
MenuPos := 2;
| "d", "D":
Assign (AdditionalMenu [3] . Command, OtherName);
MenuPos := 3;
| "e", "E":
Assign (AdditionalMenu [4] . Command, OtherName);
MenuPos := 4;
| "f", "F":
Assign (AdditionalMenu [5] . Command, OtherName);
MenuPos := 5;
| "g", "G":
Assign (AdditionalMenu [6] . Command, OtherName);
MenuPos := 6;
| "h", "H":
Assign (AdditionalMenu [7] . Command, OtherName);
MenuPos := 7;
| "i", "I":
Assign (AdditionalMenu [8] . Command, OtherName);
MenuPos := 8;
| "j", "J":
Assign (AdditionalMenu [9] . Command, OtherName);
MenuPos := 9;
ELSE
END;
DisplaySubMenu (AdditionalMenu, MenuPos, FALSE);
GetMoreInfo (' Enter any parameters:', Parameters);
SetCursorHeight (2);
ClearScreen ();
DosCommand (OtherName, Parameters, done);
SetCursorHeight (0);
IF done THEN
WaitASec ();
END;
END;
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
ELSE
END;
END;
END ExecuteCommand;

PROCEDURE SortCommand ();
BEGIN
IF ProcessCommand (Key, SortMenuKeySet, SortMenu, TRUE) THEN
CASE Key OF
"n", "N":
SortByName (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
| "e", "E":
SortByExtension (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
| "d", "D":
SortByDate (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
| "s", "S":
SortBySize (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
ELSE
END;
END;
END SortCommand;

PROCEDURE OtherCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr);
VAR
i, n: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewDirectory: ARRAY [0 .. 10] OF CHAR;
FullPath,
NewPath,
NewName,
Path: ARRAY [0 .. 65] OF CHAR;
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
IF ProcessCommand (Key, OtherMenuKeySet, OtherMenu, TRUE) THEN
CASE Key OF
"c", "C":
GetMoreInfo (' Enter new directory name:', NewDirectory);
IF NoErrorMsg (MkDir (NewDirectory)) THEN
CAPstr (NewDirectory);
RedisplayDirectory (directory, 0);
Concat ('Subdirectory ', NewDirectory, TheMessage);
Concat (TheMessage, ' was created.', TheMessage);
DisplayMessage (TheMessage);
END;
| "d", "D":
IF SubdirectoryFile IN directory^ . FileInfoArray [directory^ . CurrentFile] . FileAttribute THEN
IF NoErrorMsg (RmDir (directory^ . FileInfoArray [directory^ . CurrentFile] . FileName)) THEN
Concat ('Subdirectory ', directory^ . FileInfoArray [directory^ . CurrentFile] . FileName, TheMessage);
Concat (TheMessage, ' was deleted.', TheMessage);
RedisplayDirectory (directory, 0);
DisplayMessage (TheMessage);
END;
END;
| "l", "L":
GetMoreInfo (' Enter new path:', Path);
IF Path [0] = 0C THEN
IF ActiveWindow = LeftWindow THEN (* do nothing *)
ELSE
IF BothWindowsActive THEN
(* blank out "diamond" sign if present *)
DisplayFileLine (RightDirectory, RightDirectory^ . CurrentFile, FALSE);
END;
ActiveWindow := LeftWindow;
RedisplayDirectory (LeftDirectory, 0);
END;
ELSE
CAPstr (Path);
ParsePath (directory, Path, NewDrive, NewPath, NewName, NewWindow);
IF NewName [0] = 0C THEN
NewName := '*.*';
END;
ActiveWindow := RightWindow;
OpenNewWindow (NewDrive, NewPath, NewName);
END;
| "r", "R":
GetMoreInfo (' Enter new path:', Path);
IF Path [0] = 0C THEN
IF ActiveWindow = RightWindow THEN (* do nothing *)
ELSIF BothWindowsActive THEN
(* blank out "diamond" sign if present *)
DisplayFileLine (LeftDirectory, LeftDirectory^ . CurrentFile, FALSE);
ActiveWindow := RightWindow;
RedisplayDirectory (RightDirectory, 0);
END;
ELSE
CAPstr (Path);
ParsePath (directory, Path, NewDrive, NewPath, NewName, NewWindow);
IF NewName [0] = 0C THEN
NewName := '*.*';
END;
ActiveWindow := LeftWindow;
OpenNewWindow (NewDrive, NewPath, NewName);
END;
| "s", "S":
InitConfiguration ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
| "t", "T":
WITH directory^ DO
n := NumberOfEntries - NumberTagged + 1;
CardinalToStr (n, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, FullPath);
Concat (' Tag ', NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) in ', TheQuestion);
Concat (TheQuestion, FullPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
ELSE
IF SubdirectoryFile IN FileInfoArray [i] . FileAttribute THEN
ELSIF (FileInfoArray [i] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [i] . FileName [0] = '.') AND
(FileInfoArray [i] . FileName [1] = '.')) THEN
ELSE
FileInfoArray [i] . tagged := TRUE;
INC (NumberTagged);
TaggedSize := TaggedSize + FileInfoArray [i] . FileSize;
END;
END;
END;
DisplayInfo (directory, FirstDisplayed, TRUE);
DisplaySummaryLine (directory);
END;
END;
| "u", "U":
WITH directory^ DO
IF NumberTagged > 0 THEN
CardinalToStr (NumberTagged, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, FullPath);
Concat (' Untag ', NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) in ', TheQuestion);
Concat (TheQuestion, FullPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
FileInfoArray [i] . tagged := FALSE;
DEC (NumberTagged);
TaggedSize := TaggedSize - FileInfoArray [i] . FileSize;
END;
END;
DisplayInfo (directory, FirstDisplayed, TRUE);
DisplaySummaryLine (directory);
END;
END; (* IF *)
END; (* WITH *)
ELSE
END;
END;
END OtherCommand;

PROCEDURE InitConfiguration ();
CONST
filler = ' ';
VAR
count,
handle: CARDINAL;
color: ARRAY [0 .. 19] OF CHAR;
ConfigurationFile: ARRAY [0 .. 65] OF CHAR;
TheUtility: ARRAY [0 .. 79] OF CHAR;
BEGIN
ReadEnvironment ('FILETOOL=', ConfigurationFile);
ListUtility := 'List';
EditUtility := 'BB';
ConfigForeground := lightgrey;
ConfigBackground := black;
FOR count := 0 TO HIGH (AdditionalMenu) DO
AdditionalMenu [count] . Command := filler;
END;
count := 0;
IF ConfigurationFile [0] = 0C THEN
ELSE
IF FileExists (ConfigurationFile) THEN
IF OpenFile (handle, ConfigurationFile) = NoError THEN
REPEAT
ReadStr (handle, TheUtility);
CAPstr (TheUtility);
IF Pos ('LIST=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('LIST=', TheUtility) + 5,
Length (TheUtility) - 5 - Pos ('LIST=', TheUtility),
ListUtility);
ELSIF Pos ('EDIT=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('EDIT=', TheUtility) + 5,
Length (TheUtility) - 5 - Pos ('EDIT=', TheUtility),
EditUtility);
ELSIF Pos ('OPTION=', TheUtility) # HIGH (TheUtility) + 1 THEN
IF count <= HIGH (AdditionalMenu) THEN
Copy (TheUtility,
Pos ('OPTION=', TheUtility) + 7,
Length (TheUtility) - 7 - Pos ('OPTION=', TheUtility),
AdditionalMenu [count] . Command);
Concat (AdditionalMenu [count] . Command, filler, AdditionalMenu [count] . Command);
INC (count);
END;
ELSIF Pos ('FCOLOR=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('FCOLOR=', TheUtility) + 7,
Length (TheUtility) - 7 - Pos ('FCOLOR=', TheUtility),
color);
IF CompareStr (color, 'BLACK') = 0 THEN
ConfigForeground := black;
ELSIF CompareStr (color, 'BLUE') = 0 THEN
ConfigForeground := blue;
ELSIF CompareStr (color, 'GREEN') = 0 THEN
ConfigForeground := green;
ELSIF CompareStr (color, 'CYAN') = 0 THEN
ConfigForeground := cyan;
ELSIF CompareStr (color, 'RED') = 0 THEN
ConfigForeground := red;
ELSIF CompareStr (color, 'MAGENTA') = 0 THEN
ConfigForeground := magenta;
ELSIF CompareStr (color, 'BROWN') = 0 THEN
ConfigForeground := brown;
ELSIF CompareStr (color, 'LIGHTGREY') = 0 THEN
ConfigForeground := lightgrey;
ELSIF CompareStr (color, 'DARKGREY') = 0 THEN
ConfigForeground := darkgrey;
ELSIF CompareStr (color, 'LIGHTBLUE') = 0 THEN
ConfigForeground := lightblue;
ELSIF CompareStr (color, 'LIGHTGREEN') = 0 THEN
ConfigForeground := lightgreen;
ELSIF CompareStr (color, 'LIGHTCYAN') = 0 THEN
ConfigForeground := lightcyan;
ELSIF CompareStr (color, 'LIGHTRED') = 0 THEN
ConfigForeground := lightred;
ELSIF CompareStr (color, 'LIGHTMAGENTA') = 0 THEN
ConfigForeground := lightmagenta;
ELSIF CompareStr (color, 'YELLOW') = 0 THEN
ConfigForeground := yellow;
ELSIF CompareStr (color, 'BRIGHTWHITE') = 0 THEN
ConfigForeground := brightwhite;
ELSE
END;
ELSIF Pos ('BCOLOR=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('BCOLOR=', TheUtility) + 7,
Length (TheUtility) - 7 - Pos ('BCOLOR=', TheUtility),
color);
IF CompareStr (color, 'BLACK') = 0 THEN
ConfigBackground := black;
ELSIF CompareStr (color, 'BLUE') = 0 THEN
ConfigBackground := blue;
ELSIF CompareStr (color, 'GREEN') = 0 THEN
ConfigBackground := green;
ELSIF CompareStr (color, 'CYAN') = 0 THEN
ConfigBackground := cyan;
ELSIF CompareStr (color, 'RED') = 0 THEN
ConfigBackground := red;
ELSIF CompareStr (color, 'MAGENTA') = 0 THEN
ConfigBackground := magenta;
ELSIF CompareStr (color, 'BROWN') = 0 THEN
ConfigBackground := brown;
ELSIF CompareStr (color, 'LIGHTGREY') = 0 THEN
ConfigBackground := lightgrey;
ELSE
END;
ELSE
END;
UNTIL EndReached (handle);
END;
END;
END;
TextColor (ConfigForeground, ConfigBackground);
END InitConfiguration;

BEGIN
MakeKeySet (' 13;27;9;E15;"c";"C";"t";"T";"o";"O" ',
CopyMenuKeySet);
MakeKeySet (' 13;27;9;E15;"c";"C";"o";"O" ',
RenameMenuKeySet);
MakeKeySet (' 13;27;9;E15;"c";"C";"m";"M";"s";"S";"o";"O" ',
ExecuteMenuKeySet);
MakeKeySet (' 13;27;9;E15;"a";"A";"b";"B";"c";"C";"d";"D";"e";"E";"f";"F";"g";"G";"h";"H";"i";"I";"j";"J" ',
AdditionalMenuKeySet);
MakeKeySet (' 13;27;9;E15;"n";"N";"e";"E";"d";"D";"s";"S" ',
SortMenuKeySet);
MakeKeySet (' 13;27;9;E15;"d";"D";"h";"H";"p";"P";"s";"S";"u";"U" ',
AttributesMenuKeySet);
MakeKeySet (' 13;27;9;E15;"c";"C";"d";"D";"l";"L";"r";"R";"s";"S";"t";"T";"u";"U" ',
OtherMenuKeySet);
InitConfiguration ();
END ToolMenuCommands.


  3 Responses to “Category : Modula II Source Code
Archive   : FILETOO2.ZIP
Filename : TOOLMENU.MOD

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/