Copyright © 1982 R.D. Eager
Permission is granted to copy and/or modify this document for private use only. Machine readable versions must not be placed on public web sites or FTP sites, or otherwise made generally accessible in an electronic form. Instead, please provide a link to the original document on the official ML/I web site.
This implementation of ML/I contains all the features described in the ML/I User's Manual, 4th Edition, August 1970.
With reference to the earlier Editions of that Manual, this implementation contains all the features described in the Fourth Edition, plus New Features 1 to 4 as described in supplements to it. In addition, system variable five is used to maintain a count of processing errors.
Before ML/I may be used for the first time, its object file must be inserted into a directory in the user's search list. The simplest way of doing this is to type:
The call of ML/I takes the form:
Any of the parameters may be omitted. From the above, it can be seen that ML/I has three possible input streams and two possible output streams. There is also a stream for listing the output of a process, and a stream for debugging messages.
Any legal EMAS character file, or member of a partitioned
file, may be specified as an input file;
also accepted. input1 defaults to
.IN; there are no
defaults for the other two input streams.
All output files must be different, and they must also be different from
any of the input files (except for
.NULL). Any legal
EMAS filename may be specified for an output file (though not
a member of a partitioned file), and the suffix
-MOD may be used
to append to a file (creating it if it does not exist). Output device
are also permitted. If output1 is omitted, it defaults to
.OUT; there is no default for output2. If listing
is omitted, no listing file is generated. If debugfile is
.OUT is used for the debugging file.
This is sufficient for working through the Simple Introductory Guide.
DOG, and output to
FOO, with listing to
Input may be taken from any one of the input streams. The value of
S10 controls the selection. The possible values are:
|input is taken from input1.
|input is taken from input2.
|input is taken from input3.
S10 is set to zero, ML/I treats this as "end of file", and
ceases processing. If
S10 is set to any illegal value (negative,
greater than three, or a value between one and three associated with an
input stream which has not been specified) then the process is aborted.
If a change of input stream is made, the original stream is not
"forgotten". Any attempt to read from this stream again will cause
ML/I to carry on where it left off. When the end of an input stream is
reached, ML/I checks to see if it is the revert stream. If it is,
the process is terminated; otherwise input is switched to the revert
stream, and processing continues. The revert stream is initially 1; its
value is held in
S23 and may be altered by the user if required.
There is no restriction on the length of an input line (although the communications network will not handle long lines from terminals).
It is possible to designate that one character be translated to another on input. This makes it possible to input a character that a device does not support (e.g. a tab from an EMAS terminal). However, only one character code can be translated in this way.
If it is desired to perform a translation,
S16 should be set to
the ASCII code of the character to be translated, and
S17 to the ASCII code of the
character that is to replace it. For example, if
(ASCII 37) was to represent a tab (ASCII 9),
S17 should be set in the following way:
MCSET S16 = 37 MCSET S17 = 9
S16 has the value -1, which since it does not
correspond to a valid ASCII code, will not cause any
translations to be made.
The ordering of input operations is as follows:
S10equal to zero.
Output may be directed to either, both or neither of output1 and
output2. The values of
S22 control the
S21 controls output1, and
output2. In both cases, a value of zero means that no output is
to take place, and a value of one means that output is to take place.
There is no restriction on the length of an output line (although the communications network will insert extra newlines into over-long lines sent to terminals).
A listing of the output from ML/I may be directed to the listing file
specified in the call of ML/I.
Listing is controlled by the value of
S20 is zero, no listing is produced at all.
S20 is one, a listing without line numbers is generated;
S20 is two, line numbers are included in the listing.
S20 has an initial value of zero.
ML/I uses the standard compiler workfile for its workspace;
the size of this is expressed in kilobytes, and may be checked (and
altered) by using the Subsystem command
OPTION. The relevant
INITWORKSIZE; remember that changes in the size of
this file do not take place until the next logon.
In practice, this workfile is so enormous that it is unlikely that its size will need to be changed for ML/I.
The character set used by ML/I is 7-bit ASCII (codes from 0 to 127 decimal). Tabs are accepted on input, but are converted to multiple spaces on output; tab stops are every 8 positions starting at columns 9,17,25, ..., etc.
Error messages are output to the debugging file specified in the call of
ML/I; this defaults to
With reference to Chapter 6 (of the ML/I User's Manual),
the number 2N (the maximum number of characters in a piece of
text inserted into an error message without truncating) is 64.
The error character is question mark (
A count of processing errors (i.e. occurrences of the word
Errors(s) on the debugging file) is maintained in
the end of a process, ML/I checks this value; if it is nonzero, ML/I
sets the Subsystem "return code" to 1000, otherwise it is set to zero.
This allows job control programs to detect the success (or otherwise)
of an ML/I process.
An output lines limit is imposed on the debugging file, to curb
excessive output from a process that has gone badly wrong. The limit is
implemented by holding a quota of "lines left" in
S12 ever goes negative, the process is aborted.
initially 500, but may be changed by the user.
At the end of a process, a message of the form:
At end of process: N lines, M calls
is output to the debugging file, preceded (if
S18 equals 1) by a
list of the currently defined constructions.
All files are opened as soon as ML/I is entered. Failure to open any file may be followed by other, advisory, messages which are self-explanatory.
Debugging file lines quota exhausted
The value of
S12(the quota of remaining lines allowed to the debugging file) has become negative.
The current process is aborted.
S10 has illegal value, viz n
S10has been set to the value n, which is either outside the range 1-3, or is associated with an input stream that was not specified in the call of ML/I. Note that this error may be caused by
S23(the revert stream) being set to an illegal value, and end of file then being reached on another input stream.
The current process is aborted.
Error while writing to name file - details
An error has occurred while writing to the file indicated by name; the EMAS error message corresponding to the error is given by details.
The current process is aborted.
The initial environment contains ten permanent variables, all set to zero. All integers in, or derived from, macro expressions should be less than 2147483647 in magnitude. Overflow is not detected, except in the case of division by zero, and its effect is undefined.
The following are the layout keywords for this implementation:
|meaning a space.
|meaning a newline.
|meaning a tab.
|meaning the imaginary startline character.
|meaning a sequence of one or more spaces.
There are 23 S-variables.
S9 are independent of the
implementation, and are used to control and monitor ML/I itself.
S23 are implementation dependent, and are used to
control input/output, etc. If an S-variable is set to any value other
than those given below, the effect is undefined (except for invalid
S10, which always cause the process to be terminated).
S1is one, the imaginary startline character is inserted on input. If
S1is zero, no startlines are inserted; this is the initial setting.
S2; it may be changed at any time.
S3is one, the error message normally generated if a warning marker is not followed by a macro name is suppressed. If
S3is zero (the initial value), the message is produced.
S4is one, the context print-out normally given after a call of
MCNOTEis suppressed. If
S4is zero, the context print-out is given; this is the initial setting.
S12contains the quota of lines on the debugging file. It is initially 500, and every time ML/I outputs a line to the debugging file (whether via an error message or a
MCNOTE) it decreases
S12by one. If
S12ever becomes negative, the process is aborted. The user is at liberty to adjust the value of
S12at any time.
S16are translated to characters with the code given by
S17, on input. Initially
S16is -1, so no translations are performed.
S18is one at the end of a process, a list is given of all currently defined constructions. This is output to the debugging file (and is not subject to the quota of lines imposed by
S18is zero, the list is not produced. The initial value of
S18is zero in a foreground job, and one in a background job.
S19. It may be changed if desired.
S20controls output to the listing file. See Section P.2.5 for details.
S21controls output to the primary output stream; see Section P.2.4 for details.
S22controls output to the secondary output stream; see Section P.2.4 for details.
S23contains the current revert stream. See Section P.2.3 for details.