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:
INSERT(PUBLIC.ML1)
The call of ML/I takes the form:
ML1(input1,input2,input3/output1,output2,listing,debugfile)
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; .IN
and .NULL
are
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
names (e.g. .OUT
, .NULL
, .LP
, .PP
etc.)
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
omitted, .OUT
is used for the debugging file.
ML1
This is sufficient for working through the Simple Introductory Guide.
PIG
and DOG
, and output
to FOO
, with listing to .LP
:
ML1(PIG,DOG/FOO,,.LP)
Input may be taken from any one of the input streams. The value of
S10
controls the selection. The possible values are:
S10 = 1 | input is taken from input1.
|
S10 = 2 | input is taken from input2.
|
S10 = 3 | input is taken from input3.
|
If 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),
S16
and S17
should be set in the following way:
MCSET S16 = 37 MCSET S17 = 9
Initially, 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:
S10
equal to zero.
S10
.
S16
and S17
.
Output may be directed to either, both or neither of output1 and
output2. The values of S21
and S22
control the
selection; S21
controls output1, and S22
controls
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
.
If S20
is zero, no listing is produced at all.
If S20
is one, a listing without line numbers is generated;
if 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
keyword is 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 .OUT
.
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 S5
. At
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
; if
S12
ever goes negative, the process is aborted. S12
is
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.
Message
Debugging file lines quota exhausted
Description
The value of S12
(the quota of remaining lines allowed to the
debugging file) has become negative.
System Action
The current process is aborted.
Message
S10 has illegal value, viz n
Description
S10
has 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 byS23
(the revert stream) being set to an illegal value, and end of file then being reached on another input stream.
System Action
The current process is aborted.
Message
Error while writing to name file - details
Description
An error has occurred while writing to the file indicated by name; the EMAS error message corresponding to the error is given by details.
System Action
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:
SPACE | meaning a space.
|
NL | meaning a newline.
|
TAB | meaning a tab.
|
SL | meaning the imaginary startline character.
|
SPACES | meaning a sequence of one or more spaces.
|
There are 23 S-variables. S1
to S9
are independent of the
implementation, and are used to control and monitor ML/I itself.
S10
to 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
values of S10
, which always cause the process to be terminated).
S1
-S9
S1
S1
is one, the imaginary startline
character is inserted on input. If S1
is zero, no startlines are
inserted; this is the initial setting.
S2
S2
; it may be changed at any time.
S3
S3
is one, the error message normally
generated if a warning marker is not followed by a macro name is
suppressed. If S3
is zero (the initial value), the message is
produced.
S4
S4
is one, the context print-out
normally given after a call of MCNOTE
is suppressed. If
S4
is zero, the context print-out is given; this is the initial
setting.
S5
S6
S7
S8
S9
S10
-S23
S10
S10
is 1.
S11
S12
S12
contains 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
S12
by one. If S12
ever becomes negative, the process is
aborted. The user is at liberty to adjust the value of S12
at any
time.
S13
S14
S15
S16
S16
are translated to characters with the code given by
S17
, on input. Initially S16
is -1, so no
translations are performed.
S17
S16
above.
S18
S18
is 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 S12
). If
S18
is zero, the list is not produced. The initial value of
S18
is zero in a foreground job, and one in a background job.
S19
S19
. It may
be changed if desired.
S20
S20
controls output to the listing file. See Section
P.2.5 for details.
S21
S21
controls output to the primary output stream;
see Section P.2.4 for details.
S22
S22
controls output to the secondary output stream;
see Section P.2.4 for details.
S23
S23
contains the current revert stream. See Section P.2.3 for
details.