language-Modula2-0.1: examples/Modula-2_Libraries/andrea-m2/lib/eth-hamburg/directacc.mod
IMPLEMENTATION MODULE DirectAccessFiles;
(* Use direct access files - see the definition module for details *)
(* J. Andrea, Aug.8/91 - revitalized *)
(* J. Andrea, 1985 *)
(* This code may be freely used and distributed, it may not be sold. *)
FROM SYSTEM IMPORT BYTE, ADR;
FROM InOut IMPORT WriteLn, WriteString, WriteCard;
FROM FortranDirectAccess IMPORT For$DirCreate, For$DirOpen, For$DirClose,
For$DirRead, For$DirWrite;
CONST
min_file = 10; max_file = 90; (* allow for 80 files in this range *)
TYPE
FilesReady = ( available, notavailable );
VAR
last_file :DirectFile;
status :CARDINAL;
file_slots :ARRAY [min_file..max_file] OF FilesReady;
(* -------------------------------------------------- *)
PROCEDURE DirectCreate( VAR file :DirectFile;
name :ARRAY OF CHAR;
maxrec :CARDINAL );
(* create a file, and leave it in an open state *)
BEGIN (* DirectCreate *)
(* find the first open file *)
file := min_file;
WHILE ( file <= max_file ) & ( file_slots[file] # available ) DO
file := file + 1;
END; (* while *)
IF file > max_file THEN
last_file := 0; status := 1;
DirFileDone := FALSE;
ELSE
last_file := file;
For$DirCreate( file, name, maxrec, status );
DirFileDone := status = 0;
IF DirFileDone THEN
file_slots[file] := notavailable
END;
END; (* if *)
END DirectCreate;
(* -------------------------------------------------- *)
PROCEDURE DirectOpen( VAR file :DirectFile;
name :ARRAY OF CHAR );
BEGIN (* DirectOpen *)
(* find the first open file *)
file := min_file;
WHILE ( file <= max_file ) & ( file_slots[file] # available ) DO
file := file + 1;
END; (* while *)
IF file > max_file THEN
last_file := 0; status := 1;
DirFileDone := FALSE;
ELSE
last_file := file;
For$DirOpen( file, name, status );
DirFileDone := status = 0;
IF DirFileDone THEN
file_slots[file] := notavailable;
END;
END; (* if *)
END DirectOpen;
(* -------------------------------------------------- *)
PROCEDURE DirectClose( file :DirectFile );
BEGIN (* DirectClose *)
last_file := file;
IF file_slots[file] = notavailable THEN
For$DirClose( file, status );
DirFileDone := status = 0;
IF DirFileDone THEN
file_slots[file] := available;
END;
ELSE
DirFileDone := FALSE;
status := 29;
END;
END DirectClose;
(* -------------------------------------------------- *)
PROCEDURE DirectWrite( file :DirectFile;
record_number :CARDINAL;
record :ARRAY OF BYTE;
n_bytes :CARDINAL );
BEGIN (* DirectWrite *)
last_file := file;
IF file_slots[file] = notavailable THEN
For$DirWrite( file, record_number, ADR(record[0]), n_bytes,
status );
DirFileDone := status = 0;
ELSE
DirFileDone := FALSE;
status := 29;
END;
END DirectWrite;
(* -------------------------------------------------- *)
PROCEDURE DirectRead( file :DirectFile;
record_number :CARDINAL;
VAR record :ARRAY OF BYTE;
n_bytes :CARDINAL );
BEGIN (* DirectRead *)
last_file := file;
IF file_slots[file] = notavailable THEN
For$DirRead( file, record_number, ADR(record[0]), n_bytes,
status );
DirFileDone := status = 0;
ELSE
DirFileDone := FALSE;
status := 29;
END;
END DirectRead;
(* -------------------------------------------------- *)
PROCEDURE DirFileStatus;
(* return the status, and the unit number of the last operation *)
BEGIN (* DirFileStatus *)
WriteString('File Unit ='); WriteCard( last_file, 5 ); WriteLn;
WriteString('I/O Status ='); WriteCard( status, 5 ); WriteLn;
END DirFileStatus;
BEGIN (* DirectAccessFiles *)
DirFileDone := FALSE;
FOR last_file := min_file TO max_file DO
file_slots[last_file] := available;
END; (* for *)
last_file := 0;
END DirectAccessFiles.