OSSI: SIRandomIO
Edoardo Biagioni
biagioni at unc.UUCP
Fri Nov 7 03:51:11 AEST 1986
(***************************************************************************)
(*** ***)
(*** ***)
(*** O S S I ***)
(*** ========== ***)
(*** ***)
(**) DEFINITION MODULE SIRandomIO; (**)
(*** ============================ ***)
(*** ***)
(*** This module defines an interface for record oriented file I/O ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** Hardware: independent ***)
(*** Operating System: UNIX BSD 4.2 ***)
(*** Compiler: independent ***)
(*** ***)
(*** Version: 3.0 ***)
(*** Implemented: see copyright ***)
(*** Date: 1986-09-08 ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** Copyright 1984, 1985, 1986 by ***)
(*** E. S. Biagioni ***)
(*** G. Heiser ***)
(*** K. Hinrichs ***)
(*** C. Muller ***)
(*** ***)
(*** Institut fuer Informatik ***)
(*** ETH Zuerich ***)
(*** CH 8092 Zuerich ***)
(*** Switzerland ***)
(*** ***)
(*** Department of Computer Science ***)
(*** University of North Carolina ***)
(*** Chapel Hill, North Carolina 27514 ***)
(*** U.S.A. ***)
(*** ***)
(*** Permission to copy without fee all of this material is granted ***)
(*** provided that the copies are not made or distributed for direct ***)
(*** commercial advantage, that this OSSI copyright notice is ***)
(*** included in the copy, that the module is not modified in any way ***)
(*** except where necessary for compilation on a particular system, ***)
(*** and that the module is always distributed in its original form. ***)
(*** Distribution of this module in a modified form without including ***)
(*** the original version is a violation of this copyright notice. ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** Updates: ***)
(*** ***)
(*** ***)
(***************************************************************************)
(* This module allows for record oriented random access I/O to files.
In order to access the data of a file, a channel must be connected to it.
This is done using the procedure ConnectChannel. After processing of the
file's data is finished, the channel should be disconnected using
DisconnectChannel. A channel left connected at program termination time
is in an undefined state. Some data may be lost or corrupted.
For handling of files as units, see the module SIFiles.
DeleteFile may not be called for a file which is currently connected
to a channel. If this is done, the result is undefined.
Success or failure of an operation is indicated by a variable 'result'.
After a successful operation, 'result' will be equal to 'SIDone', after
an unsuccessful operation its value will be different from 'SIDone'. The
possible result values are system dependent; the error message corresponding
to a particular value can be obtained by a call to 'SMessage'. *)
(* Remarks on the UNIX implementation:
The following conventions hold for file names (as parameter to
ConnectChannel):
- a leading tilde character is replaced by the path name of the user's
home directory
- after making this substitution the name must be a valid UNIX path name. *)
FROM SISystem IMPORT
SIResult,
BYTE;
EXPORT QUALIFIED
ChannelMode,
Channel,
ConnectChannel,
DisconnectChannel,
RReadRecord,
RWriteRecord,
Truncate,
NumberOfLastEntry,
RecordLength;
TYPE ChannelMode = (channelRead, channelWrite, channelReadWrite);
Channel;
PROCEDURE ConnectChannel (VAR c: Channel; fileName: ARRAY OF CHAR;
mode: ChannelMode; recordLength: CARDINAL;
VAR result: SIResult);
(* connects the channel c to the file named fileName.
A new file is created if a file with fileName does not exist. The new
file will store arbitrary records of fixed size recordLength bytes.
This parameter is ignored if the channel connects to a file which has
been created previously by a call to this procedure. The operation fails
if the file exists, but has not been created by ConnectChannel.
ConnectChannel may not be called if a channel is already connected to the
specified file. If this is done, the result is undefined.
After a succesful call of this procedure, the parameter 'c' can be used
in the procedures that follow. *)
PROCEDURE DisconnectChannel (VAR c: Channel; VAR result: SIResult);
(* disconnects the channel from the file and closes the file.
This procedure must be called for every opened file to avoid possible
system errors. *)
PROCEDURE RReadRecord (c: Channel; recordNumber: CARDINAL;
VAR record: ARRAY OF BYTE;
VAR result: SIResult);
(* reads the record at position recordNumber in the file, and returns it in
the parameter record. The record number of the first record in the file
is 1. If the record has not previously been written the returned result
may or may not reflect the fact, but in any case the value returned is
undefined. If the size of record is less than recordLength declared for
the file the record is truncated to fit. If the size of record is greater
than recordLength declared for the file the value of the superfluous bytes
is undefined. *)
PROCEDURE RWriteRecord (c: Channel; recordNumber: CARDINAL;
VAR record: ARRAY OF BYTE;
VAR result: SIResult);
(* writes the record to the given position in the file. The record number of
the first record in the file is 1. The file is lengthened if necessary to
accomodate the record. If the size of record is less than recordLength
declared for the file the value of the missing bytes stored in the file is
undefined. If the size of record is greater than recordLength declared for
the file the record is truncated to fit. *)
PROCEDURE Truncate (c: Channel; lastEntryNumber: CARDINAL;
VAR result: SIResult);
(* A call to this procedure ensures that the file contains no records with
number greater than lastEntryNumber. After this call, NumberOfLastEntry
will return lastEntryNumber. If lastEntryNumber is 0, the number of
entries in the file becomes 0. *)
PROCEDURE NumberOfLastEntry (c: Channel; VAR lastEntry: CARDINAL;
VAR result: SIResult);
(* lastEntry returns the number of the last entry in the file, or 0 if the
file is empty. *)
PROCEDURE RecordLength (c: Channel; VAR recordLength: CARDINAL;
VAR result: SIResult);
(* recordLength is the length in bytes of the records stored in the file. *)
END SIRandomIO.
More information about the Comp.sources.unix
mailing list