ISO Modula-2 standard I/O discussion
The structure of this collection of modules is not readily apparent thus we willdiscuss the organization of the library here.
The input/output library allows for the reading and writing of data streams overone or more "channels". Channels are connected to sources of input data,or to destinations of output data, known a "devices" or "device instances".There is a separation between modules that are concerned with device-independentoperations, such as reading and writing, and modules concerned with device-dependentoperations, such as making connections to named files. This separation allows thelibrary to be extended to work with new devices. The module structure is as follows.
Input/Output on a given channel.
IOResult | results of a Read operation |
TextIO | Characters and strings |
WholeIO | Whole CARDINAL and INTEGER numbers as text. |
RealIO | REAL numbers as text. |
LongIO | LONGREAL numbers as text. |
RawIO | Any value in binary form, as ARRAY OF SYSTEM.LOC. |
IOChan | Device-independent interface to channels. |
IOConsts | Constants for IO modules. |
LWholeIO | Whole LONGINT numbers as text. Stony Brook extension. |
ComplexIO | COMPLEX numbers as text. Stony Brook extension. |
LongComplexIO | LONGCOMPLEX numbers as text. Stony Brook extension. |
Device dependent operations.
StdChans | Standard and default I/O channels. |
StreamFile | Sequential streams. |
SeqFile | Rewindable, restart from beginning, sequential streams. |
RndFile | Random access streams. |
TermFile | Channels to the terminal/console. |
ProgramArgs | Channel to read the program command arguments. |
IOLink | Link between channels and new devices. |
ChanConsts | Constants for device modules. |
"Simple" IO modules. No channel parameter given. Usescurrent default from StdChans.
STextIO | TextIO using the current default channels. |
SWholeIO | WholeIO using the current default channels. |
SRealIO | RealIO using the current default channels. |
SLongIO | LongIO using the current default channels. |
SRawIO | RawIO using the current default channels. |
SIOResult | Read results for current default input channel. |
SLWholeIO | LWholeIO using the current default channels. Stony Brook extension. |
SComplexIO | ComplexIO using the current default channels. Stony Brook extension. |
SLongComplexIO | LongComplexIO using the current default channels. Stony Brook extension. |
Channels already open to standard sources and destinations can be identified usingprocedures provided by the module StdChans. This module also provides for the selectionof channels used by default for input and output operations.
Text operations produce or consume data streams as sequences of characters andline markers. Raw operations produce or consume data streams as sequences of storagelocations (i.e. as array whose component type is SYSTEM.LOC).
The library allows devices to support both text and raw operations on a singlechannel, although this behavior is not required.
The module IOResult provides the facility for a program to determine whether thelast operation to read data from a specified input channel found data in the requiredformat.
The module IOConsts defines types and constants used by IOResult and SIOResult.
The device modules StreamFile, SeqFile, RndFile and TermFile provide facilitiesthat allow a channel to be opened to a named stream, to a rewindable sequential file,to a random access file, or to a terminal device respectively. The device moduleProgramArgs provides an open channel from which program arguments may be read. Devicespecific operations, such as positioning within a random access file, are also definedby the appropriate device module.
The module IOChan defines general inout/output library exception values that maybe raised when using any device through a channel. Device errors, such as a hardwareread/write error, are reported by raising one of the general exception values, andproviding an implementation defined error number. Exception values associated withdevice specific operations are defined by the appropriate device module.
The module IOLink provides facilities that allow a user to provide further specializeddevice modules for use with channels, following the pattern of the rest of the library.
Standard channels do not have to be opened by a client program since they arealready open and ready for use.
No method is provided for closing a standard channel, and the values used to identifystandard channels are constant throughout the execution of the program.
Note: Most operating systems provide ways to redirect the standard handlesthemselves, possibly changing the standard handle value, so the above statement canbe broken.
Default channels are channels whose identities have been stored as those to beused by default for input and output operations. Initially these correspond to thestandard channels, but their values may be varied to obtain the effect of redirection.
The module StdChans defines functions that identify channels already open to implementation-defined sources and destinations of standard input, standard output and standard error output. Access to a "null device" is provided to allow unwanted output to be suppressed. The null device throws away all data written to it, and gives an immediate end of input indication on reading.
Using the I/O modules
The I/O modules TextIO, WholeIO, LWholeIO, RealIO, LongIO, ComplexIO, LongComplexIO are all text format (human readable). They perform I/O on a line by line basis. Multiple unique entry items can exist on a single line of input. Items are typically separated by spaces. The module ReadResult returns the status of the previous read API call. Input is processed a line at a time and the end of line will not be consumed until the SkipLine API is used. If the current input is at an end of line position and a read API (like ReadInt) is called the call will immediately return and set the read result value to endOfLine.
When receiving input from the console (keyboard), input is not accepted until the Enter key is pressed thus completing a single line of input. When receiving input from a file, input is read on a line by line basis. In this way reading input from the console or a file operates the same.
When receiving input from a file it is possible for read API calls to set the read result to endOfInput signifying the end of the file has been reached.
The "S" or simple I/O modules operate on the standard I/O channels. At program startup these are initialized to the standard I/O channels of the host operating system. Some operating systems do not have standard I/O channels. In these cases the standard I/O will be emulated. While an operating system can redirect standard I/O to sources other than the console, the ISO Modula-2 I/O system also gives you program control over redirection of the standard I/O channels. This control comes from the StdChans module.
ISO command line arguments
The module ProgramArgs allows you to read the implementation dependent programarguments. i.e. The command line. The simplest way to do this is
WHILE ProgramArgs.ArgIsPresent() DO
TextIO.ReadToken(ProgramArgs.ArgChan(), str);
END;
Arguments are separated by one or more spaces, as this is the way TextIO.ReadTokenoperates. If you want to re-read the arguments you can do the following IOChan.Reset(ProgramArgs.ArgChan()).