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

 
Output of file : TOOLUTIL.MOD contained in archive : FILETOO2.ZIP
IMPLEMENTATION MODULE ToolUtilities;

(*
Title : TOOLUTIL.MOD
LastEdit : 12/31/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
SIZE;
FROM MemoryOperations IMPORT
FillChar;
FROM Drectory IMPORT (* REPERTOIRE *)
ModeSet, FileInfoRec,
FindFirstFile, FindNextFile,
GetDefaultDrive, SetDefaultDrive, VolumeLabel, ChDir;
FROM StringIO IMPORT (* REPERTOIRE *)
ErrorMessage;
FROM Strings IMPORT
Assign, Pos, Copy, Length, Concat, CompareStr;
FROM StrEdit IMPORT (* REPERTOIRE *)
CAPstr;
FROM ToolDisplay IMPORT
DisplayInfo, DisplaySummaryLine;
FROM ToolTypes IMPORT
DirectoryRecPtr, DirectoryInfo, FileInfoRecord,
ActiveWindow, BothWindowsActive, WindowType;

PROCEDURE InitDirectoryInfo (directory: DirectoryRecPtr);
VAR
i: CARDINAL;
BEGIN
WITH directory^ DO
NumberOfEntries := 0;
NumberTagged := 0;
CurrentFile := 0;
FirstDisplayed := 0;
DirectorySize := VAL (LONGINT, 0);
TaggedSize := VAL (LONGINT, 0);
DirectoryDrive := ' ';
FillChar (DirectoryPath, SIZE (DirectoryPath), ' ');
FillChar (Label, SIZE (Label), ' ');
FillChar (DirectoryMask, SIZE (DirectoryMask), ' ');
FOR i := 0 TO HIGH (FileInfoArray) DO
WITH FileInfoArray [i] DO
tagged := FALSE;
FileAttribute := ModeSet {};
FileHour := 0;
FileMinute := 0;
FileSecond := 0;
FileMonth := 0;
FileDay := 0;
FileYear := 0;
FileSize := VAL (LONGINT, 0);
FillChar (FileName, SIZE (FileName), CHR (255));
FillChar (FileExtension, SIZE (FileExtension), CHR (255));
END;
END;
END;
END InitDirectoryInfo;

PROCEDURE ReadInfo (directory: DirectoryRecPtr);
VAR
p: CARDINAL;
DOSInfo: FileInfoRec;
SavedMessage: ErrorMessage;

BEGIN
WITH directory^ DO
NumberOfEntries := 0;
DirectoryDrive := GetDefaultDrive ();
VolumeLabel (GetDefaultDrive (), Label);
SavedMessage := FindFirstFile (DirectoryMask, DOSInfo);
WHILE SavedMessage = NoError DO
WITH FileInfoArray [NumberOfEntries] DO
FileAttribute := DOSInfo . attribute;
FileHour := DOSInfo . hour;
FileMinute := DOSInfo . minute;
FileSecond := DOSInfo . second;
FileMonth := DOSInfo . month;
FileDay := DOSInfo . day;
FileYear := DOSInfo . year;
FileSize := DOSInfo .size;
IF (DOSInfo . name [0] = '.') OR (* special DOS *)
((DOSInfo . name [0] = '.') AND
(DOSInfo . name [1] = '.')) THEN (* files *)
Assign (DOSInfo . name, FileName);
FillChar (FileExtension, SIZE (FileExtension), ' ');
ELSE
p := Pos ('.', DOSInfo . name);
IF p = HIGH (DOSInfo . name) + 1 THEN (* not found *)
FillChar (FileExtension, SIZE (FileExtension), ' ');
Copy (DOSInfo . name, 0, Length (DOSInfo . name), FileName);
ELSE
Copy (DOSInfo . name, 0, p, FileName);
Copy (DOSInfo . name, p + 1, Length (DOSInfo . name) - p, FileExtension);
Concat (FileExtension, ' ', FileExtension);
END;
END;
END;
DirectorySize := DirectorySize + DOSInfo . size;
SavedMessage := FindNextFile (DOSInfo);
INC (NumberOfEntries);
END (* while *);
IF NumberOfEntries # 0 THEN
DEC (NumberOfEntries);
CurrentFile := 0;
END;
END;
END ReadInfo;

PROCEDURE SortByName (l, r: INTEGER);
VAR
iDone,
jDone: BOOLEAN;
i, j: INTEGER;
Pivot,
Temp: FileInfoRecord;
BEGIN
WITH DirectoryInfo [ORD (ActiveWindow)] DO
IF r > l THEN
Pivot := FileInfoArray [r];
i := l - 1;
j := r;
REPEAT
iDone := FALSE;
REPEAT
INC (i);
WITH FileInfoArray [i] DO
IF (CompareStr (FileName, Pivot . FileName) > 0) OR
((CompareStr (FileName, Pivot . FileName) = 0) AND
(CompareStr (FileExtension, Pivot . FileExtension) > -1)) THEN
iDone := TRUE;
END;
END;
UNTIL (iDone) OR
(i = r);
jDone := FALSE;
REPEAT
DEC (j);
WITH FileInfoArray [j] DO
IF (CompareStr (FileName, Pivot . FileName) < 0) OR
((CompareStr (FileName, Pivot . FileName) = 0) AND
(CompareStr (FileExtension, Pivot . FileExtension) < 1)) THEN
jDone := TRUE;
END;
END;
UNTIL (jDone) OR
(j = l);
Temp := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [j];
FileInfoArray [j] := Temp;
UNTIL j <= i;
FileInfoArray [j] := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [r];
FileInfoArray [r] := Temp;
SortByName (l, i - 1);
SortByName (i + 1, r);
END;
END;
END SortByName;

PROCEDURE SortByExtension (l, r: INTEGER);
VAR
iDone,
jDone: BOOLEAN;
i, j: INTEGER;
Pivot,
Temp: FileInfoRecord;
BEGIN
WITH DirectoryInfo [ORD (ActiveWindow)] DO
IF r > l THEN
Pivot := FileInfoArray [r];
i := l - 1;
j := r;
REPEAT
iDone := FALSE;
REPEAT
INC (i);
WITH FileInfoArray [i] DO
IF (CompareStr (FileExtension, Pivot . FileExtension) > 0) OR
((CompareStr (FileExtension, Pivot . FileExtension) = 0) AND
(CompareStr (FileName, Pivot . FileName) > -1)) THEN
iDone := TRUE;
END;
END;
UNTIL (iDone) OR
(i = r);
jDone := FALSE;
REPEAT
DEC (j);
WITH FileInfoArray [j] DO
IF (CompareStr (FileExtension, Pivot . FileExtension) < 0) OR
((CompareStr (FileExtension, Pivot . FileExtension) = 0) AND
(CompareStr (FileName, Pivot . FileName) < 1)) THEN
jDone := TRUE;
END;
END;
UNTIL (jDone) OR
(j = l);
Temp := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [j];
FileInfoArray [j] := Temp;
UNTIL j <= i;
FileInfoArray [j] := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [r];
FileInfoArray [r] := Temp;
SortByExtension (l, i - 1);
SortByExtension (i + 1, r);
END;
END;
END SortByExtension;

PROCEDURE SortBySize (l, r: INTEGER);
VAR
i, j: INTEGER;
Pivot,
Temp: FileInfoRecord;
BEGIN
WITH DirectoryInfo [ORD (ActiveWindow)] DO
IF r > l THEN
Pivot := FileInfoArray [r];
i := l - 1;
j := r;
REPEAT
REPEAT
INC (i);
UNTIL NOT (FileInfoArray [i] . FileSize > Pivot . FileSize) OR
(i = r);
REPEAT
DEC (j);
UNTIL NOT (FileInfoArray [j] . FileSize < Pivot . FileSize) OR
(j = l);
Temp := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [j];
FileInfoArray [j] := Temp;
UNTIL j <= i;
FileInfoArray [j] := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [r];
FileInfoArray [r] := Temp;
SortBySize (l, i - 1);
SortBySize (i + 1, r);
END;
END;
END SortBySize;

PROCEDURE SortByDate (l, r: INTEGER);
VAR
iDone,
jDone: BOOLEAN;
i, j: INTEGER;
Pivot,
Temp: FileInfoRecord;
BEGIN
WITH DirectoryInfo [ORD (ActiveWindow)] DO
IF r > l THEN
Pivot := FileInfoArray [r];
i := l - 1;
j := r;
REPEAT
iDone := FALSE;
REPEAT
INC (i);
IF FileInfoArray [i] . FileYear > Pivot . FileYear THEN
iDone := TRUE
ELSE
IF FileInfoArray [i] . FileYear = Pivot . FileYear THEN
IF FileInfoArray [i] . FileMonth > Pivot . FileMonth THEN
iDone := TRUE
ELSE
IF FileInfoArray [i] . FileMonth = Pivot . FileMonth THEN
IF FileInfoArray [i] . FileDay > Pivot . FileDay THEN
iDone := TRUE
ELSE
IF FileInfoArray [i] . FileDay = Pivot . FileDay THEN
IF FileInfoArray [i] . FileHour > Pivot . FileHour THEN
iDone := TRUE
ELSE
IF FileInfoArray [i] . FileHour = Pivot . FileHour THEN
IF FileInfoArray [i] . FileMinute > Pivot . FileMinute THEN
iDone := TRUE
ELSE
IF FileInfoArray [i] . FileMinute = Pivot . FileMinute THEN
IF FileInfoArray [i] . FileSecond > Pivot . FileSecond THEN
iDone := TRUE
END;
END;
END;
END;
END;
END;
END;
END;
END;
END;
END;
UNTIL (iDone) OR
(i = r);
jDone := FALSE;
REPEAT
DEC (j);
IF FileInfoArray [j] . FileYear < Pivot . FileYear THEN
jDone := TRUE
ELSE
IF FileInfoArray [j] . FileYear = Pivot . FileYear THEN
IF FileInfoArray [j] . FileMonth < Pivot . FileMonth THEN
jDone := TRUE
ELSE
IF FileInfoArray [j] . FileMonth = Pivot . FileMonth THEN
IF FileInfoArray [j] . FileDay < Pivot . FileDay THEN
jDone := TRUE
ELSE
IF FileInfoArray [j] . FileDay = Pivot . FileDay THEN
IF FileInfoArray [j] . FileHour < Pivot . FileHour THEN
jDone := TRUE
ELSE
IF FileInfoArray [j] . FileHour = Pivot . FileHour THEN
IF FileInfoArray [j] . FileMinute < Pivot . FileMinute THEN
jDone := TRUE
ELSE
IF FileInfoArray [j] . FileMinute = Pivot . FileMinute THEN
IF FileInfoArray [j] . FileSecond < Pivot . FileSecond THEN
jDone := TRUE
END;
END;
END;
END;
END;
END;
END;
END;
END;
END;
END;
UNTIL (jDone) OR
(j = l);
Temp := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [j];
FileInfoArray [j] := Temp;
UNTIL j <= i;
FileInfoArray [j] := FileInfoArray [i];
FileInfoArray [i] := FileInfoArray [r];
FileInfoArray [r] := Temp;
SortByDate (l, i - 1);
SortByDate (i + 1, r);
END;
END;
END SortByDate;

PROCEDURE BuildFullFileName (directory: DirectoryRecPtr;
filenum: CARDINAL;
VAR FullFileName: ARRAY OF CHAR);
BEGIN
FullFileName [0] := 0C;
WITH directory^ . FileInfoArray [filenum] DO
Concat (FileName, '.', FullFileName);
Concat (FullFileName, FileExtension, FullFileName);
END;
END BuildFullFileName;

PROCEDURE BuildFullPath (TheDrive: CHAR;
ThePath: ARRAY OF CHAR;
VAR FullPath: ARRAY OF CHAR);
BEGIN
FullPath [0] := 0C;
Concat (TheDrive, ':', FullPath);
Concat (FullPath, ThePath, FullPath);
CAPstr (FullPath);
END BuildFullPath;

PROCEDURE ConcatPathFile (Path: ARRAY OF CHAR;
FileName: ARRAY OF CHAR;
VAR Combined: ARRAY OF CHAR);
BEGIN
IF Path [Length (Path) - 1] = '\' THEN
Concat (Path, FileName, Combined);
ELSE
Concat (Path, '\', Combined);
Concat (Combined, FileName, Combined);
END;
CAPstr (Combined);
END ConcatPathFile;

PROCEDURE RedisplayDirectory (directory: DirectoryRecPtr;
first: CARDINAL);
VAR
SaveDrive: CHAR;
SaveCurrent: CARDINAL;
SaveMask: ARRAY [0 .. 11] OF CHAR;
SavePath: ARRAY [0 .. 65] OF CHAR;
error: ErrorMessage;
BEGIN
WITH directory^ DO
SaveDrive := DirectoryDrive;
SaveCurrent := CurrentFile;
Assign (DirectoryPath, SavePath);
Assign (DirectoryMask, SaveMask);
InitDirectoryInfo (directory);
Assign (SavePath, DirectoryPath);
Assign (SaveMask, DirectoryMask);
DirectoryDrive := SaveDrive;
FirstDisplayed := first;
SetDefaultDrive (DirectoryDrive);
error := ChDir (DirectoryPath);
ReadInfo (directory);
CurrentFile := SaveCurrent;
DisplayInfo (directory, first, TRUE);
DisplaySummaryLine (directory);
END;
END RedisplayDirectory;

PROCEDURE RedisplayScreen (directory, LeftDirectory, RightDirectory: DirectoryRecPtr);
VAR
SaveWindow: WindowType;
BEGIN
IF BothWindowsActive THEN
SaveWindow := ActiveWindow;
ActiveWindow := LeftWindow;
IF SaveWindow = LeftWindow THEN
DisplayInfo (LeftDirectory, LeftDirectory^ . FirstDisplayed, TRUE);
ELSE
DisplayInfo (LeftDirectory, LeftDirectory^ . FirstDisplayed, FALSE);
END;
DisplaySummaryLine (LeftDirectory);
ActiveWindow := RightWindow;
IF SaveWindow = RightWindow THEN
DisplayInfo (RightDirectory, RightDirectory^ . FirstDisplayed, TRUE);
ELSE
DisplayInfo (RightDirectory, RightDirectory^ . FirstDisplayed, FALSE);
END;
DisplaySummaryLine (RightDirectory);
ActiveWindow := SaveWindow;

ELSE
DisplayInfo (directory, directory^ . FirstDisplayed, TRUE);
DisplaySummaryLine (directory);
END;
END RedisplayScreen;

BEGIN
END ToolUtilities.


  3 Responses to “Category : Modula II Source Code
Archive   : FILETOO2.ZIP
Filename : TOOLUTIL.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/