| (* Library module defined by the International Standard |
| Information technology - programming languages |
| BS ISO/IEC 10514-1:1996E Part 1: Modula-2, Base Language. |
| |
| Copyright ISO/IEC (International Organization for Standardization |
| and International Electrotechnical Commission) 1996-2021. |
| |
| It may be freely copied for the purpose of implementation (see page |
| 707 of the Information technology - Programming languages Part 1: |
| Modula-2, Base Language. BS ISO/IEC 10514-1:1996). *) |
| |
| DEFINITION MODULE SeqFile; |
| |
| (* Rewindable sequential files *) |
| |
| IMPORT IOChan, ChanConsts; |
| |
| TYPE |
| ChanId = IOChan.ChanId; |
| FlagSet = ChanConsts.FlagSet; |
| OpenResults = ChanConsts.OpenResults; |
| |
| (* Accepted singleton values of FlagSet *) |
| |
| CONST |
| (* input operations are requested/available *) |
| read = FlagSet{ChanConsts.readFlag}; |
| |
| (* output operations are requested/available *) |
| write = FlagSet{ChanConsts.writeFlag}; |
| |
| (* a file may/must/did exist before the channel is opened *) |
| old = FlagSet{ChanConsts.oldFlag}; |
| |
| (* text operations are requested/available *) |
| text = FlagSet{ChanConsts.textFlag}; |
| |
| (* raw operations are requested/available *) |
| raw = FlagSet{ChanConsts.rawFlag}; |
| |
| PROCEDURE OpenWrite (VAR cid: ChanId; name: ARRAY OF CHAR; |
| flags: FlagSet; VAR res: OpenResults); |
| (* |
| Attempts to obtain and open a channel connected to a stored |
| rewindable file of the given name. |
| The write flag is implied; without the raw flag, text is |
| implied. If successful, assigns to cid the identity of |
| the opened channel, assigns the value opened to res, and |
| selects output mode, with the write position at the start |
| of the file (i.e. the file is of zero length). |
| If a channel cannot be opened as required, the value of |
| res indicates the reason, and cid identifies the invalid |
| channel. |
| *) |
| |
| PROCEDURE OpenAppend (VAR cid: ChanId; name: ARRAY OF CHAR; |
| flags: FlagSet; VAR res: OpenResults); |
| (* |
| Attempts to obtain and open a channel connected to a stored |
| rewindable file of the given name. The write and old flags |
| are implied; without the raw flag, text is implied. If |
| successful, assigns to cid the identity of the opened channel, |
| assigns the value opened to res, and selects output mode, |
| with the write position corresponding to the length of the |
| file. If a channel cannot be opened as required, the value |
| of res indicates the reason, and cid identifies the invalid |
| channel. |
| *) |
| |
| PROCEDURE OpenRead (VAR cid: ChanId; name: ARRAY OF CHAR; |
| flags: FlagSet; VAR res: OpenResults); |
| (* Attempts to obtain and open a channel connected to a stored |
| rewindable file of the given name. |
| The read and old flags are implied; without the raw flag, |
| text is implied. If successful, assigns to cid the |
| identity of the opened channel, assigns the value opened to |
| res, and selects input mode, with the read position |
| corresponding to the start of the file. |
| If a channel cannot be opened as required, the value of |
| res indicates the reason, and cid identifies the invalid |
| channel. |
| *) |
| |
| PROCEDURE IsSeqFile (cid: ChanId): BOOLEAN; |
| (* Tests if the channel identified by cid is open to a |
| rewindable sequential file. *) |
| |
| PROCEDURE Reread (cid: ChanId); |
| (* If the channel identified by cid is not open to a rewindable |
| sequential file, the exception wrongDevice is raised; |
| otherwise attempts to set the read position to the |
| start of the file, and to select input mode. |
| If the operation cannot be performed (perhaps because of |
| insufficient permissions) neither input mode nor output |
| mode is selected. |
| *) |
| |
| PROCEDURE Rewrite (cid: ChanId); |
| (* If the channel identified by cid is not open to a |
| rewindable sequential file, the exception wrongDevice is |
| raised; otherwise, attempts to truncate the file to zero |
| length, and to select output mode. If the operation |
| cannot be performed (perhaps because of insufficient |
| permissions) neither input mode nor output mode is selected. |
| *) |
| |
| PROCEDURE Close (VAR cid: ChanId); |
| (* If the channel identified by cid is not open to a rewindable |
| sequential file, the exception wrongDevice is raised; |
| otherwise closes the channel, and assigns the value |
| identifying the invalid channel to cid. |
| *) |
| |
| END SeqFile. |
| |