ML/I User's Manual --- Appendix P --- Implementation on ICL 2900 under EMAS

Node:Top, Next:, Up:(dir)

ML/I User's Manual -- Appendix P

This implementation is based on version BJB of ML/I.

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.

Node:Restrictions and Additions, Next:, Previous:Top, Up:Top

P.1 Restrictions and Additions

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.

Node:Operating instructions, Next:, Previous:Restrictions and Additions, Up:Top

P.2 Operating instructions and I/O

P.2.1 Access

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:


P.2.2 Parameters

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; .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.

P.2.2.1 Example calls
  1. To run ML/I with just input from and output to the terminal, the only command needed is:

    This is sufficient for working through the Simple Introductory Guide.

  2. To run with two input files called PIG and DOG, and output to FOO, with listing to .LP:

P.2.3 Control of input

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).

P.2.3.1 Input translation facility

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.

P.2.3.2 Ordering of input operations

The ordering of input operations is as follows:

  1. Checking for S10 equal to zero.
  2. Checking for invalid values of S10.
  3. Check for end of file (if the revert stream is selected as a consequence of this check, return to b)).
  4. Translation using S16 and S17.
  5. Checking for illegal characters.

P.2.4 Control of output

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).

P.2.5 Control of listing

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.

P.2.6 Workspace

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.

Node:Character set, Next:, Previous:Operating instructions, Up:Top

P.3 Character set

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.

Node:Error messages, Next:, Previous:Character set, Up:Top

P.4 Error messages

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.

P.4.1 I/O errors

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.

P.4.1.1 Too many lines to the debugging file


   Debugging file lines quota exhausted


The value of S12 (the quota of remaining lines allowed to the debugging file) has become negative.

System Action

The current process is aborted.
P.4.1.2 Illegal input stream


   S10 has illegal value, viz n


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 by S23 (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.
P.4.1.3 Output error


   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.

System Action

The current process is aborted.

Node:Integer calculations, Next:, Previous:Error messages, Up:Top

P.5 Integer calculations

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.

Node:Layout keywords, Next:, Previous:Integer calculations, Up:Top

P.6 Layout keywords

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.

Node:S-variables, Previous:Layout keywords, Up:Top

P.7 S-variables

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).

P.7.1 Use of S1-S9

If S1 is one, the imaginary startline character is inserted on input. If S1 is zero, no startlines are inserted; this is the initial setting.
The current source text line number is held in S2; it may be changed at any time.
If 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.
If 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.
Count of processing errors.
Not currently used.
Not currently used.
Not currently used.
Not currently used.

P.7.2 Use of S10-S23

Controls input selection; a value of zero forces end of all input. Values between 1 and 3 select the appropriate input stream; other values cause an error. The initial value of S10 is 1.
Not currently used.
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.
Not currently used.
Not currently used.
Not currently used.
Used to control character code translation. Characters with the code given by S16 are translated to characters with the code given by S17, on input. Initially S16 is -1, so no translations are performed.
See S16 above.
If 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.
The current line number of the output text is held in S19. It may be changed if desired.
The value of S20 controls output to the listing file. See Section P.2.5 for details.
The value of S21 controls output to the primary output stream; see Section P.2.4 for details.
The value of S22 controls output to the secondary output stream; see Section P.2.4 for details.
S23 contains the current revert stream. See Section P.2.3 for details.