S3 (programming language)


S3 is a structured, imperative high-level computer programming language. It was developed by the UK company International Computers Limited for its 2900 Series mainframes. It is a system programming language with syntax influenced by ALGOL 68 but with data types and operators aligned to those offered by the 2900 Series. It was the implementation language of the operating system VME.

Annotated Example

A rare example of an S3 program available in the public domain is the implementation of Kermit developed at the South-West Universities Regional Computer Centre, and archived in the Columbia University archive of Kermit implementations. The examples below are selected highlights of the main module.
The program starts with a module identification, and comments which we quote by way of acknowledgment to the authors:
MODULE KMT_MAIN_MODULE; @ Version 1.01 @
@------------------------------------------------------------------------------@
@ @
@ @
@ ----- S W U R C C V M E K E R M I T ----- @
@ @
@ @
@ ---------------------------------------------------------------- @
@ @
@ @
@ Version 1.00 @
@ @
@ Written by : Richard Andrews and David Lord, @
@ South West Universities Regional Computer Centre, @
@ Claverton Down, Bath BA2 7AY, U.K. @
@ @
@ @
@ ---------------------------------------------------------------- @
@ @
@ @
@ Version 1.01 @
@ @
@ Fixes by : Dave Allum and David Lord, SWURCC. @
@ ---------------------------------------------------------------- @
Next follow a number of "mode declarations". Mode is the Algol 68 term for a type.

MODE KMT_BUFFER IS BYTE;
MODE KMT_STRING IS REFBYTE;
MODE KMT_WORD IS REFBYTE;

MODE KMT_MTM_VALUES IS ANY
BYTE RVB_VALUE,
REFREFBYTE RVRVB_VALUE);

MODE KMT_PP_PACKET_STATISTICS_S IS STRUCT
;

The first type is an array of 96 bytes; the next two are references to arrays of bytes. KMT_MTM_VALUES is a union type allowing a variety of different types to appear. Note that WORD is a 32-bit unsigned integer, INT is a 32-bit signed integer; LONG makes it 64 bits. The last option in the union is marked REFREFBYTE, which means it is a pointer to an array whose members are pointers to arrays of bytes.
The final type declared here is a STRUCT, specifically a tuple containing two integers.
The program continues by declaring external procedures on which the module depends. RESPONSE indicates a return value containing error information:

EXT PROC KMT_UI;

EXT PROC KMT_PH;

EXT PROC KMT_PP_GET_PACKET,
PROC KMT_PP_SEND_PACKET,
PROC KMT_PP_BUILD_STRING_PACKET_DATA;

and also some external variables:

EXT REF BYTE KMT_VERSION;

EXT REF BOOL ASG_ROUTE;

EXT REFKMT_MTM_VALUES KMT_MTM_AREA;
EXT REFBYTE MTM_TEXT;
EXT REF INT MTM_TEXT_LEN;
EXT REF REF BYTE MTM_RECALL_DATA;

The rest of the program consists of a number of procedure definitions. One of these, which actually defines the entry point to the program, is reproduced here:

GLOBAL STATIC PROC KERMIT_THE_FROG IS
REFBYTE OPTION,
REFBYTE VME_FILE,
REFBYTE REM_FILE,
:

BEGIN

BYTE JSV_NAME := "ASG"; @ obtain value for ASG_ROUTE bool @
CTM_JS_READ;
IF RC_IGNORED NE 0 THEN ASG_ROUTE := FALSE FI;

@ verify parameter references : @
@ OPTION must be of mode REF BYTE, may not be ZLR or NIL @
@ VME_FILE must be of mode REF BYTE, may be ZLR, must not be NIL @
@ REM_FILE must be of mode REF BYTE, may be ZLR, must not be NIL @

UNLESS
AND
AND
THEN @ invalid parameter reference @
RESULT := 10002 @ ARCH_INACCESSIBLE_PARAMETER @

ELSF @ create resource block @
CTM_JS_BEGIN;
RESULT <= 0
THEN @ resource block created @
LONG LONG WORD KERMIT_RESULT;
ANYLONG WORD AS_LW, PARAMS;
PARAMS.AS_LW := ;

@ set up program error handler @
IF KMT_EH_INFORM_PE_CONTINGENCY;
RESULT > 0
THEN @ failed to set error handler @
SKIP
ELSF CTM_JS_CALL; @ create firewall @
RESULT <= 0
THEN @ either exited normally or via CTM_STOP @
RESULT := IF <= 0
THEN 0 @ ignore warnings @
ELSE 52000 @ error return common resultcode @
FI
FI;

CTM_JS_END @ end resource block @
FI

END

Features to note here include: