home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
filetool
/
toolutil.mod
< prev
Wrap
Text File
|
1987-12-29
|
12KB
|
446 lines
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.