Google
 

Trailing-Edge - PDP-10 Archives - bb-h138f-bm - 7-sources/diu.r36
There are 4 other files named diu.r36 in the archive. Click here to see a list.
%TITLE 'DIU.R36 - DIU Program Wide Definitions'

!	COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1986.
!	ALL RIGHTS RESERVED.
!
!	THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY  BE  USED  AND
!	COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH
!	THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.   THIS  SOFTWARE  OR
!	ANY  OTHER  COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE
!	AVAILABLE TO ANY OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE
!	SOFTWARE IS HEREBY TRANSFERRED.
!
!	THE INFORMATION IN THIS SOFTWARE IS  SUBJECT  TO  CHANGE  WITHOUT
!	NOTICE  AND  SHOULD  NOT  BE CONSTRUED AS A COMMITMENT BY DIGITAL
!	EQUIPMENT CORPORATION.
!
!	DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF
!	ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
!
! FACILITY:	 DIU    Data Interchange Utility
!
! ENVIRONMENT:   TOPS-20 V6.1 or TOPS-10 V7.02
!	 	 XPORT V4.0
!		 BLISS-32 V4.0
!
! ABSTRACT:	This file contains various literal, macro and data structure
!		declarations used throughout the DIU system.    
! HISTORY:
!
!  267	Add DIU$_KEY_OPTIONS_INVALID.
!	Sandy Clemens  10-Jul-86
!
!  252	In DIU.R36: Remove library of  CONDIT and add condition handing  stuff.
!	Sandy Clemens  1-Jul-86
!
!  241  In DIU.REQ, add DIU$_PAR_INFO for the new signal in DEFINE_DTYPE.
!	Sandy Clemens  20-Jun-86
!
!  206  Add message DIU$_INVALID_RFM.
!       Gregory A. Scott 27-May-86
!
!  172  Change $TRACE to do a call to  S$TRACE  to  type  its  strings.  (Note:
!       S$TRACE will have to be added to DIUT10 later.)
!       Gregory A. Scott 20-May-86
!
!  164  Remove $APPEND_FAO and $PUT_FAO from here.
!       Gregory A. Scott 16-May-86
!
!  162  Change DIU$_USAGE_CONFLICT message so that is doesn't mention
!       the now non-existent /USAGE switch.
!       Sandy Clemens  14-May-86
!
!  160  Add DIU$_DAMAGED and DIU$_ANOTHER_VERSION.
!       Gregory A. Scott 14-May-86
!
!  156  Remove unused  DIU$G_SNAPSHOT,  DIU$G_INITIATED,  DIU$G_TRANSFER_START,
!       DIU$G_TOTAL_XFER,       DIU$G_CURR_XFER,        DIU$B_SOURCE_USAGE_TYP,
!       DIU$B_DEST_USAGE_TYP,          DIU$H_TRIES,           DIU$V_CHECKPOINT,
!       DIU$V_MATCH_EITHER, DIU$V_DEFER, DIU$G_MAXTIME, DIU$G_REQUEUE_INTERVAL,
!       DIU$G_STATUS_DELTA,         DIU$V_CONVERSION,         DIU$V_BLOCK_MODE,
!       DIU$H_TOTAL_FILES, DIU$H_STATUS, DIU$G_TOTAL_WARNINGS,  DIU$G_WARNINGS,
!       DIU$G_REQUEUE_ERROR, DIU$G_FILE_SIZE, DIU$B_INPUT_OS,  DIU$B_OUTPUT_OS,
!       DIU$H_CURRENT_INPUT,     DIU$H_CURRENT_OUTPUT,     DIU$T_CURRENT_INPUT,
!       DIU$T_CURRENT_OUTPUT.
!       Gregory A. Scott 13-May-86
!
!  155  Add DIU$_IMAGE_INVALID message for /IMAGE specified for non-TOPS-20 or
!       non-TOPS-10 file.
!       Sandy Clemens 12-May-86
!
!  154  Add DIU$_REQUEUE_COUNT message, delete DIU$_NOT_DISK,  DIU$_NEED_USAGE,
!       DIU$_CHECKPOINT,  DIU$_INVALID_ATTRIBUTES,   DIU$_WILDCARD_NOT_ALLOWED.
!       Gregory A. Scott 12-May-86
!
!  153  Remove DIU$_SRCDESMIS.  The command parser tells the user of the
!       missing source description so we don't have to signal it later.
!       Sandy Clemens 12-May-86
!
!  152  Add    DIU$_ILLEGAL_USER_LOG,    DIU$_INIT_QUEUE,     DIU$_REQ_CREATED,
!       DIU$_SLAVE_ABNORMAL, DIU$_REQUEUE, DIU$_REQ_TIME_OUT, delete DIU$_HOLD.
!       Gregory A. Scott 11-May-86
!
!  146  Add  the   following:   DIU$_PREREQ_NOT_YOURS,   DIU$_PREREQ_NON_EXIST,
!       DIU$_PREREQ_LOOP,   rename/modify    DIU$_INVALID_DEPENDENCY   to    be
!       DIU$_INVALID_PREREQ,    rename/modify    DIU$_NO_DEPENDENT    to     be
!       DIU$_NO_PREREQ.
!       Gregory A. Scott 7-May-86
!
!  145  Add message DIU$_RSZ_INVALID.
!       Sandy Clemens 7-May-86
!
!  135  Remove DIU$$message macros since they are just so much baggage, and now
!       the  text   string   are   in   DIUDO.    Add   DIU$_CONNECTED_TO   and
!       DIU$_MAXIMUM_REQ_SET messages.
!       Gregory A. Scott 1-May-86
!
!  133  Add message DIU$_SHUTDOWN_ABORTED.
!       Gregory A. Scott 30-Apr-86
!
!  132  Add    messages    DIU$_PANIC_ILL_INST,    DIU$_PANIC_ILL_READ,     and
!       DIU$_PANIC_ILL_WRIT, DIU$_SPOOLER_ABORTED.
!       Gregory A. Scott 24-Apr-86
!
!  131  Change $TRACE and $TRACE_FAO  to be conditional  assembly based on  the
!       DEBUG switch, and remove refereced to diudbg.
!       Gregory A. Scott 24-Apr-86
!
!  125  Add DIU$_SPOOLER_RESTARTED  message,  comment out  the  *_TOO_LONG  and
!       *_FILESPEC_MISSING  errors  since   they  are   never  used   anywhere.
!       Reorganize the  various macro  defs to  make a  little easier  reading.
!       Remove diu$$version macro since  it was (1) wrong  and (2) never  used.
!       $GET_FAO and  $MSG_FAO  shouldn't add  an  extra CRLF  to  the  control
!       string.  
!       Gregory A. Scott 24-Apr-86
!
!  122  Remove DIU$_NOT_MY_JOB_SENOR and DIU$_SYSTEM_FULL errors.
!       Gregory A. Scott 17-Apr-86
!
!  117  Remove  storage   not  used:   DIU$H_COMMAND,  DIU$T_COMMAND.    Remove
!       $STR_DESC_INIT of fao_rec in $APPEND_FAO so that more than one of  them
!       can be used at a time.
!       Gregory A. Scott 17-Apr-86
!
!  116  Remove DIU$_NO_MESSAGE_PENDING.
!       Gregory A. Scott 14-Apr-86
!
!  113  Remove error codes that have been replaced with parser error messages:
!       DIU$_ARG_RANGE, DIU$_TOOMANY_KEYSEGS, DIU$_TOOMANY_KEYS, 
!       DIU$_INV_KEY_OPTION.  Remove unreferenced literal DIU$K_ACCESS_PROMPT.
!       Gregory A. Scott 7-Apr-86
!
!   75	Add new error codes for /KEY: parsing.  Change /KEY: action routine so
!       that the key command text is saved in a buffer in the REQBLK.
!	Sandy Clemens	19-Mar-86
!
!      V01-041  Sandy Clemens  10-Oct-85
!               Implement PUSH, SPAWN and EXECUTE commands.  New error
!               message for PUSH/SPAWN.
!
!	V01-01  DPR0001           Doug Rayner		       14-Aug-85
!		Minor modification for TOPS-10.  Additional error messages.
!		LINKAGE declaration for GLXLIB routines.  PSOUT => OUTSTR in
!		$TRACE macro definition.  Modify text string definitions of
!		system banner and version.
!
!       V01-00  RDF0001           Rick Fricchione              30-Aug-1984
!               Original version of DIU.R36.  Convert over needed items
!               from FTS.R36 and DIU.SDL.  
!
!       DIU Edit 2  Sandy Clemens   11-Jun-85
!               Change 'FATAL' in MACRO $DIU$ERRORS to 'SEVERE' (sts$k_fatal
!               is not defined).  
!
!       DIU Edit 10  Sandy Clemens   20-Jun-85
!               Add FAO directive to DIU$_INVFLDDSC error condition.
!
!       DIU Edit 11  Sandy Clemens   26-Jun-85
!                Remove error table definition from ERROR.B36 and put it into
!                DIU.R36 for the general world to use.  Add DIU$CONVERR error
!                to DIU.R36.
!
!       DIU Edit 16 Andy Nourse   26-Jun-85
!                Fix size of USERNAME and CONNECTED_DIRECTORY fields.
!                (RDF had changed them to conform to VMS, not TOPS-20).
!                Also add comments for XDUMP.
!
!       DIU Edit 17  Sandy Clemens   16-Jul-85
!                Make DIU$_INVDATTYP and DIU$_INVTYPSYS give the data
!                type code which is invalid.  FILES: DIUMAP.BLI, DIU.R36.
!
!       DIU Edit 24 Andy Nourse   19-Jul-85
!                Add DIU$_SRCDESMIS, Put FAO directive in DIU$_TEXT.
!
!	DIU edit 25 Charlotte Richardson	2-Aug-85
!		Add PAT parser error signalling, DIU$_PATPAR.
!
! 46    Remove /NOTIFY:FAILURE code.
!	Sandy Clemens	4-Nov-85
!
! 64	Teach DIU about the signal codes DIU$_PARTRA and DIU$_PARDES.
!	Sandy Clemens  15-Jan-86
!
! 65	New error codes.
!	Sandy Clemens  12-Feb-86
!
! 70    New error codes.
!	Sandy Clemens  25-Feb-86
!
! 73	Make all /WARNINGS and /USAGE information be stored in the REQBLK
!	structure.
!	Sandy Clemens	4-Mar-86
!--

LIBRARY 'BLI:XPORT';
LIBRARY 'RMS:RMSINT';
! Condition handling stuff

LITERAL
    STS$K_NORMAL = 1,
    STS$K_SUCCESS = 1,
    STS$K_ERROR = 2,
    STS$K_INFO = 3,
    STS$K_FATAL = 4,
    STS$K_SEVERE = 4,
    STS$K_WARNING = 0;

LITERAL
    SS$_NORMAL = STS$K_NORMAL,
    SS$_ERROR = STS$K_ERROR,
    SS$_FATAL = STS$K_FATAL,
    SS$_WARNING = STS$K_WARNING;

LITERAL STS$K_RESIGNAL=0,
        SS$_RESIGNAL=0,
        STS$K_CONTINUE=1,
        SS$_CONTINUE=1;

EXTERNAL LITERAL SS$UNW;

MACRO STS$K_UNWIND=SS$UNW %;
MACRO SS$_UNWIND=SS$UNW %;
! Request Block Definitions:

MACRO
       lh = 18,18,0%,
       rh = 0,18,0%;

LITERAL
       DIU$K_MAX_TAGS   = 100,
       DIU$K_FAB_BKS    = 1,
       DIU$K_FAB_BLS    = 2,
       DIU$K_FAB_DEQ    = 3,
       DIU$K_FAB_DEV    = 4,
       DIU$K_FAB_FOP    = 5,
       DIU$K_FAB_FSZ    = 6,
       DIU$K_FAB_GBC    = 7,
       DIU$K_FAB_MRN    = 8,
       DIU$K_FAB_ORG    = 9,
       DIU$K_FAB_RAT    = 10,
       DIU$K_FAB_RFM    = 11,
       DIU$K_FAB_RTV    = 12,
       DIU$K_FAB_SDC    = 13,
       DIU$K_FAB_SHR    = 14,
       DIU$K_FAB_MRS    = 15,
       DIU$K_FAB_FAC    = 16,
       DIU$K_FAB_BSZ    = 17,

! RMS RAB tag codes, to be used in logic for building RAB's
! at run time

       DIU$K_RAB_RAC    = 25,
       DIU$K_RAB_ROP    = 26,
       DIU$K_RAB_RSZ    = 27,

!* RMS RAB tag codes for use (base of 25)

       DIU$K_XAB_ALQ    = 51,
       DIU$K_XAB_AOP    = 52,
       DIU$K_XAB_BKZ    = 53,
       DIU$K_XAB_DEQ    = 54,
       DIU$K_XAB_FLG    = 55,

!* RMS XAB tag codes for use (base of 50)

       DIU$K_DIU_ACCESS        = 75,
       DIU$K_DIU_ACCOUNT       = 76,
       DIU$K_DIU_PASSWORD      = 77,
       DIU$K_DIU_USER          = 78,
       DIU$K_DIU_DESCRIPTION   = 79,
       DIU$K_DIU_FILE_DATATYPE = 80;

!* DIU tag codes, to be used with base of 75

MACRO $DIU_BLOCK = BLOCK[DIU$K_LEN] FIELD(DIU$$REQUEST_FIELDS) %;
MACRO $ETG               = %C'|'%;                                       !m27
MACRO $NUL               = %CHAR(0)%;
MACRO PROMPT_CHARACTER   = '*'%;
MACRO PROMPT_STRING      = '*'%;

LITERAL
    DIU$K_NORMAL_FILE_SIZE        = 100,       ! 200 less than NAM$K_MAXRSS
    DIU$K_FILE_BUFFER_MAX         = 200,       ! Size of filespec buffers
    DIU$K_FILESPEC_MAXIMUM_LENGTH = 200,       ! Characters in a filespec
    DIU$K_NODE_NAME_LENGTH        = 6,         ! Characters in a node name
    DIU$K_MAX_MJOB                = 8,         ! Max simultaneous transfers
    DIU$K_NODESIZE                = 6;         ! Length of nodename 
!
! DEF$ - Default block
!  ^ Name used by XDUMP for block dump routine
!

$FIELD def_fields =
    SET
    def$a_nxt              =   [$ADDRESS],               ! Address of next DEF 
    def$d_node             =   [$DESCRIPTOR(DYNAMIC)],   ! Node name plus null

    def$d_user             =   [$DESCRIPTOR(DYNAMIC)],   ! User id for ACS
    def$d_password         =   [$DESCRIPTOR(DYNAMIC)],   ! Password for ACS
    def$d_account          =   [$DESCRIPTOR(DYNAMIC)],   ! Account for ACS

    def$b_notify           =   [$BYTES(1)],              ! Notify options
    def$b_defer            =   [$BYTES(1)],              ! Defer options
    def$b_tries            =   [$BYTES(1)],              ! Tries max
    def$d_log              =   [$DESCRIPTOR(DYNAMIC)],   ! Log file name

    def$g_maxtime          =   [$INTEGER],               ! Max elapsed time
    def$g_requeue_interval =   [$INTEGER],               ! Requeue delta
    def$g_status_delta     =   [$INTEGER]                ! Status delta

    TES;

!
! End of DEF$
! (Above comment used by XDUMP)
!

LITERAL def$k_bln = $FIELD_SET_SIZE,
        def$k_end = 255;

MACRO $DEF_DECL = BLOCK[def$k_bln] FIELD (def_fields) %;
!
! DIU request block definition
!

LITERAL
    DIU$K_VERSION = 3;                  ! Version no. of request block format
                                        ! IMPORTANT!!  Update each time you
                                        ! change DIU$$REQUEST_FIELDS

LITERAL

%IF %SWITCHES(TOPS20)
%THEN
    DIU$K_TOPS20_DIRECTORY_SIZE = 6 + 1 + RMS$K_USERID_SIZE + 2;           !m16
%FI

%IF %SWITCHES(TOPS10)
%THEN
    DIU$K_TOPS10_SEARCH_LIST_SIZE = (5 + 1) * 10 + 1;
    ! Max of ten (five char str names + ",") as ASCIZ string
%FI

!
! DIU$ -- Request block field definitions
!   ^ This name is used by XDUMP for request block dump routine (debugging)
!

$FIELD
    DIU$$REQUEST_FIELDS =
       SET

! Request Accounting information

       DIU$H_LENGTH          = [$SHORT_INTEGER],    ! Size of block
       DIU$H_VERSION         = [$SHORT_INTEGER],    ! Version no. 
       DIU$H_NEXT_RECORD     = [$SHORT_INTEGER],    ! Record # of next 
       DIU$H_PREV_RECORD     = [$SHORT_INTEGER],    ! Record # of previous 

! Global request information

       DIU$H_REQUEST_ID      = [$SHORT_INTEGER], ! Binary request ID number
       DIU$H_FUNCTION        = [$SHORT_INTEGER], ! COPY,APPEND,etc
       DIU$H_JOBNAME         = [$SHORT_INTEGER], ! Size of jobname
       DIU$T_JOBNAME         = [$STRING(6)],     ! Six-character job name
       DIU$G_CREATION        = [$INTEGER],       ! Date-time of creation 
       DIU$G_CTX             = [$INTEGER],          ! Supplied by user
       DIU$H_OPTIONS         = [$BITS(16)],         ! Global options
       $OVERLAY(DIU$H_OPTIONS)
           DIU$Z_NOTIFY         = [$BITS(3)], ! /NOTIFY bits
           DIU$V_ACTIVE         = [$BIT],     ! Request is active
           DIU$V_HOLDING        = [$BIT],     ! Request is being held
           DIU$V_DELETED        = [$BIT],     ! Request has been deleted
           DIU$V_SEQ_CONTINUE   = [$BIT],     ! Continue sequence in spite of 
           DIU$Z_LIST_LEVEL     = [$BITS(2)], ! Level of directory listing 
        $CONTINUE

        $OVERLAY(DIU$Z_NOTIFY)
           DIU$V_NOTIFY_TERMINAL = [$BIT],  ! /NOTIFY:TERMINAL
           DIU$V_NOTIFY_MAIL     = [$BIT],  ! /NOTIFY:MAIL
           DIU$V_NOTIFY_IPCF     = [$BIT],  ! /NOTIFY:IPCF
        $CONTINUE

       DIU$H_TERMINAL            = [$SHORT_INTEGER], ! Terminal id
       DIU$H_JOB_NUMBER          = [$SHORT_INTEGER],
       DIU$G_NOTIFY_PID          = [$INTEGER],     
       DIU$H_ACCOUNT             = [$SHORT_INTEGER],
       DIU$T_ACCOUNT             = [$STRING(RMS$K_ACCOUNT_SIZE)],
       DIU$G_USER_NUMBER         = [$INTEGER],
       DIU$H_USERNAME            = [$SHORT_INTEGER],
       DIU$T_USERNAME            = [$STRING(RMS$K_USERID_SIZE)],
       DIU$G_CAPABILITIES        = [$INTEGER],
       $ALIGN (FULLWORD)
       DIU$T_KEY_SWITCH          = [$STRING(256)],      ! Key switch info
       DIU$H_KEY_SWITCH          = [$SHORT_INTEGER],
       DIU$H_CONNECTED_DIRECTORY = [$SHORT_INTEGER],
%IF %SWITCHES(TOPS20)
%THEN
       DIU$T_CONNECTED_DIRECTORY = [$STRING(DIU$K_TOPS20_DIRECTORY_SIZE)],
%ELSE
       DIU$T_CONNECTED_DIRECTORY = [$STRING(DIU$K_TOPS10_SEARCH_LIST_SIZE)],
%FI

! Processing options

       DIU$B_PRIORITY         = [$BYTE],          
       DIU$H_WARNING_MAX      = [$SHORT_INTEGER],
       DIU$H_PREREQUISITE_ID  = [$SHORT_INTEGER],
       DIU$H_DEPENDENT_ID     = [$SHORT_INTEGER],
       DIU$G_AFTER            = [$INTEGER],       
       DIU$G_DEADLINE         = [$INTEGER],       
       DIU$H_LOG_FILESPEC     = [$SHORT_INTEGER],
       DIU$T_LOG_FILESPEC     = [$STRING(DIU$K_NORMAL_FILE_SIZE)],
       DIU$H_TRANSFORM        = [$SHORT_INTEGER],
       DIU$T_TRANSFORM        = [$STRING(DIU$K_NORMAL_FILE_SIZE)],

! Current request state

       DIU$G_REQUEUE_COUNT    = [$INTEGER],      ! Tries so far

! Source filespec buffer

       DIU$H_SOURCE_DESCRIPTION = [$SHORT_INTEGER],
       DIU$T_SOURCE_DESCRIPTION = [$STRING(DIU$K_NORMAL_FILE_SIZE)],
       DIU$H_SOURCE_FILESPEC    = [$SHORT_INTEGER],
       DIU$T_SOURCE_FILESPEC    = [$STRING(DIU$K_FILESPEC_MAXIMUM_LENGTH)],

! Destination filespec buffer

       DIU$H_DESTINATION_DESCRIPTION = [$SHORT_INTEGER],
       DIU$T_DESTINATION_DESCRIPTION = [$STRING(DIU$K_NORMAL_FILE_SIZE)],
       DIU$H_DESTINATION_FILESPEC    = [$SHORT_INTEGER],
       DIU$T_DESTINATION_FILESPEC    = [$STRING(DIU$K_FILESPEC_MAXIMUM_LENGTH)]

       TES;
!
! End of DIU$ -- Request block
! (Above comment is read by XDUMP)
!

LITERAL
   DIU$K_SIZE       = $FIELD_SET_SIZE,
   DIU$K_LEN        = $FIELD_SET_SIZE,
   DIU$K_CHAR_COUNT = %BLISS36 ( 5* ) DIU$K_LEN;

LITERAL
    DIU$K_COPY      = 1,
    DIU$K_APPEND    = 2,
    DIU$K_DELETE    = 3,
    DIU$K_RENAME    = 4,
    DIU$K_PRINT     = 5,
    DIU$K_SUBMIT    = 6,
    DIU$K_DIRECTORY = 7,

    DIU$K_MIN_FUNCTION = 1,
    DIU$K_MAX_FUNCTION = 7;

! Directory listing level (/BRIEF, /FULL, /LIST):

LITERAL
    DIU$K_LIST_NONE         = 0,
    DIU$K_LIST_BRIEF        = 1,
    DIU$K_LIST_NORMAL       = 2,
    DIU$K_LIST_FULL         = 3,
    DIU$K_LIST_NAME_ONLY    = 5;             ! Used internally


! /QUEUE switch values: check DIUSHD.R36 whenever you change these.

LITERAL
       DIU$K_NO_QUEUE    = 0,
       DIU$K_QUEUE       = 1,
       DIU$K_MAYBE_QUEUE = 2;

! Interprocess message codes

$LITERAL
    DIUQ$K_ENTER      = $DISTINCT,      ! Enter a request in the queue
    DIUQ$K_DELETE     = $DISTINCT,      ! Delete a request
    DIUQ$K_FIND       = $DISTINCT,      ! Find a request or requests
    DIUQ$K_MODIFY     = $DISTINCT,      ! Modify a request
    DIUQ$K_LOG        = $DISTINCT,      ! Place text in log file
    DIUQ$K_STATUS     = $DISTINCT,      ! Report status of a request
    DIUQ$K_ACK        = $DISTINCT,      ! Acknowledgement message
    DIUQ$K_NACK       = $DISTINCT,      ! Negative acknowledgement
    DIUQ$K_CONNECT_ME = $DISTINCT;      ! Connect me (slave) to a directory

! DIUQBK - Interprocess queue manipulation messages

$FIELD
    DIUQ$$MESSAGE_FIELDS =
        SET
        DIUQ$B_FUNCTION            = [$BYTE],
        DIUQ$B_ITEM_CODE           = [$BYTE],   
        DIUQ$H_LENGTH              = [$SHORT_INTEGER],
        DIUQ$G_COMP_CODE           = [$INTEGER],
        $OVERLAY (DIUQ$G_COMP_CODE)
            DIUQ$G_REQ_ID          = [$INTEGER], ! For MODIFY and DELETE
        $CONTINUE
        DIUQ$G_NEW_VALUE           = [$INTEGER], ! For MODIFY only
        $OVERLAY (DIUQ$G_NEW_VALUE)
            DIUQ$G_2ND_CODE        = [$INTEGER], ! For STATUS and ACK/NACK only
        $CONTINUE
        DIUQ$H_SEQUENCE_NUMBER     = [$SHORT_INTEGER],
        DIUQ$H_SENDER_JOB          = [$SHORT_INTEGER],
        DIUQ$Z_REQ_BLOCK           = [$SUB_BLOCK (DIU$K_LEN)],
        $OVERLAY (DIUQ$Z_REQ_BLOCK)        ! For STATUS and CONNECT msgs
            DIUQ$G_JOB_HANDLE      = [$INTEGER],
            DIUQ$H_STATUS_TEXT     = [$SHORT_INTEGER],
            DIUQ$T_STATUS_TEXT     = [$STRING (255)],
        $CONTINUE
        DIUQ$G_CTX                 = [$INTEGER]
        TES;
!
! End of DIUQBK
!
! The message cannot be larger than one page
!
%IF $FIELD_SET_SIZE GTR 512
%THEN %ERROR ('DIUQ IPCF message exceeds one page')
%FI

!
! Item number codes for MODIFY messages.
!
$LITERAL
    DIUQ$K_AFTER              = $DISTINCT,
    DIUQ$K_DEADLINE           = $DISTINCT,
    DIUQ$K_PRIORITY           = $DISTINCT,
    DIUQ$K_HOLDING            = $DISTINCT,
    DIUQ$K_DEPENDENT_ID       = $DISTINCT,
    DIUQ$K_PREREQUISITE_ID    = $DISTINCT,
    DIUQ$K_SEQUENCE           = $DISTINCT,
    DIUQ$K_LOG_FILESPEC       = $DISTINCT,
    DIUQ$K_NOTIFY             = $DISTINCT;

!
! DIUJBK - Scheduler job status block
!
$FIELD
    DIUJ$$JOBSTAT_FIELDS =
        SET
        DIUJ$V_BITS                        = [$BITS (16)],
        $OVERLAY (DIUJ$V_BITS)
            DIUJ$V_INUSE                   = [$BIT],
            DIUJ$V_SIGNED_ON               = [$BIT],
            DIUJ$V_STATUS_REPORTED         = [$BIT],
            DIUJ$V_ERROR_LOGOUT_PENDING    = [$BIT],
            DIUJ$V_FORCED_LOGOUT_PENDING   = [$BIT],
            DIUJ$V_FLUSH_REQUEST           = [$BIT],
            DIUJ$V_REQ_COMPLETED           = [$BIT],
            DIUJ$V_NOTIFY_MAIL             = [$BIT],
            DIUJ$V_NOTIFY_TERMINAL         = [$BIT],
            DIUJ$V_NOTIFY_IPCF             = [$BIT],
            DIUJ$V_ALREADY_DELETED         = [$BIT],
            DIUJ$V_ALREADY_NOTIFIED        = [$BIT],
%IF %SWITCHES (TOPS10) %THEN
	    DIUJ$V_PID_INVALID		   = [$BIT],    ! TOPS-10 ONLY
%FI
        $CONTINUE
        DIUJ$H_JOB_NUMBER                  = [$SHORT_INTEGER],
        DIUJ$H_REQUEST_ID                  = [$SHORT_INTEGER],

! Request status

        DIUJ$V_CONVERSION           = [$BIT],
        DIUJ$V_BLOCK_MODE           = [$BIT],
        DIUJ$H_TOTAL_FILES          = [$SHORT_INTEGER],
        DIUJ$G_LAST_ERROR           = [$INTEGER],
        DIUJ$G_TOTAL_WARNINGS       = [$INTEGER],
        DIUJ$G_BLOCKS_READ          = [$INTEGER],
        DIUJ$G_BLOCKS_WRITTEN       = [$INTEGER],
        DIUJ$G_PACKETS_XFERRED      = [$INTEGER],
        DIUJ$G_FILE_SIZE            = [$INTEGER],
        DIUJ$H_CURRENT_INPUT        = [$SHORT_INTEGER],
        DIUJ$T_CURRENT_INPUT        = [$STRING(DIU$K_FILESPEC_MAXIMUM_LENGTH)],
        DIUJ$H_CURRENT_OUTPUT       = [$SHORT_INTEGER],
        DIUJ$T_CURRENT_OUTPUT       = [$STRING(DIU$K_FILESPEC_MAXIMUM_LENGTH)],

        DIUJ$A_REQ_BLOCK                   = [$ADDRESS],
        DIUJ$G_JOB_CREATE_TIME             = [$INTEGER],
        DIUJ$G_USER_NUMBER                 = [$INTEGER],
        DIUJ$G_RUNTIME                     = [$INTEGER],
        DIUJ$G_2ND_CODE                    = [$INTEGER],
        DIUJ$T_EXTRA_TEXT                  = [$DESCRIPTOR (DYNAMIC)],
        DIUJ$G_SERIAL_NUMBER               = [$INTEGER],
        DIUJ$G_JOB_RUNTIME                 = [$INTEGER]
%IF %SWITCHES (TOPS10) %THEN  ,
	DIUJ$G_SLAVE_PID		   = [$INTEGER] ! TOPS-10 ONLY
%FI
        TES;
!
! End of DIUJBK
!

LITERAL
    DIUJ$K_LEN = $FIELD_SET_SIZE;

!
! Some bits for NOTIFY
!
LITERAL
    DIU$$V_NOTIFY_MAIL     = 1,
    DIU$$V_NOTIFY_TERMINAL = 2,
    DIU$$V_NOTIFY_FAILURE  = 3,
    DIU$$V_NOTIFY_IPCF     = 4;
!
! Some handy definitons to make my life easier
!

LITERAL
        TRUE  = 1,                      ! used for flags to indicate TRUE
        FALSE = 0;                      ! used for flags to indicate FALSE


! Macro to return a pointer to the furnished ASCIZ string

MACRO PP(STR)=CH$PTR(UPLIT(%ASCIZ %STRING(STR))) %;                        

! Macro to count the characters in an ASCIZ string and return the length
! of that string.  The null at the end of the string is NOT counted.

MACRO
     ASCIZ_LEN(ASCIZ)=(LOCAL TPTR;
                       TPTR=ASCIZ;
                       INCR I FROM 0
                       DO IF CH$RCHAR_A(TPTR) EQL 0 THEN EXITLOOP .I) %;

! macro to return two arguments (length,addr) for used in $STR macros

MACRO ASCIZ_STR(ASCIZ)=(ASCIZ_LEN(ASCIZ),ASCIZ) %;

! macro to cause a vector of storage to be zeroed

MACRO CLEARV(var) = CH$FILL(0,%ALLOCATION(var),CH$PTR(var,0,36))%;

! Define linkage to RMS and GLXLIB

LINKAGE 
   RMS$ERCAL = PUSHJ (REGISTER=1) : LINKAGE_REGS(15,14,1);

%IF %SWITCHES(TOPS10)
%THEN                                   ! TOPS-10 only

BUILTIN
    UUO;

LINKAGE
    GLXLIB = PUSHJ (REGISTER = 1, REGISTER = 2 ; REGISTER = 1, REGISTER = 2) :
	LINKAGE_REGS(15, 14, 0)
	NOPRESERVE  (0, 1, 2, 3, 4, 5, 6)
	PRESERVE    (7, 8, 9, 10, 11, 12, 13);

%FI                                     ! end TOPS-10 only
!
! Define DIU error message text table
!
$FIELD DIU_ERROR_TABLE_FIELDS =
    SET
    DIU$G_ERRTAB_CODE = [$INTEGER],
    DIU$T_ERRTAB_TEXT = [$DESCRIPTOR (FIXED)],
    $OVERLAY (DIU$T_ERRTAB_TEXT)
    DIU$B_ERRTAB_DTYPE = [$SUB_FIELD (DIU$T_ERRTAB_TEXT,STR$B_DTYPE)],
    DIU$B_ERRTAB_CLASS = [$SUB_FIELD (DIU$T_ERRTAB_TEXT,STR$B_CLASS)],
    DIU$H_ERRTAB_LENGTH = [$SUB_FIELD (DIU$T_ERRTAB_TEXT,STR$H_LENGTH)],
    DIU$A_ERRTAB_POINTER = [$SUB_FIELD (DIU$T_ERRTAB_TEXT,STR$A_POINTER)]
    $CONTINUE
    TES;

LITERAL DIU$K_ERRTAB_WIDTH = $FIELD_SET_SIZE;

MACRO DIU_ERROR_TABLE (size) = BLOCKVECTOR [size, DIU$K_ERRTAB_WIDTH]
                               FIELD (DIU_ERROR_TABLE_FIELDS) %;
!
! Define DIU error codes and related strings
!
MACRO
    $DIU$errors = 
	$DIU$error
(
DIU$_NORMAL,		NORM, 1, SUCCESS,     'Successful completion',
DIU$_MORE,		MORE, 2, SUCCESS,     'Successful partial completion',
DIU$_REQ_NOT_FOUND,	RQNF, 3, WARNING,     'Request not found',
DIU$_REQ_CREATED, RCRE, 4, INFO, 'Request created',
DIU$_INVALID_REQUEST,	INVR, 5, ERROR,       'Invalid request block format',
DIU$_RMS_ERROR,		RMSE, 6, ERROR,       'Unexpected RMS error',
DIU$_ACTIVE,		ACTI, 7, ERROR,       'Request already active',
DIU$_INV_BLK_LEN,	INVL, 8, ERROR,       'Invalid request block length',
DIU$_INV_FUN_CODE,	INVC, 9, ERROR,       'Invalid request function code',
DIU$_INV_FLAGS,		INVF, 10, ERROR,      'Invalid request flags',
DIU$_NO_SPOOLER,        NSPL, 11, ERROR,      'Spooler not started',
DIU$_MJOB_EXCEEDED,     MJOB, 12, ERROR,      'Mjob exceeded',
DIU$_NO_MEMORY,         NMEM, 13, ERROR,      'Insufficient dynamic memory',
DIU$_NO_MASTER,         NMAS, 14, ERROR,      'DIU spooler job not running',
DIU$_NO_SEND, NSEN, 15, ERROR, 'Cannot send IPCF to DIU spooler',
DIU$_NO_RECEIVE, NREC, 16, ERROR, 'Cannot receive IPCF from DIU spooler',
DIU$_INSUFF_PRIVS, NPRV, 17, ERROR, 'Insufficient privileges',
DIU$_BUG, BUG, 18, SEVERE, 'Internal DIU error',
DIU$_TWO_MASTERS, TMAS, 19, ERROR, 'Another spooler already active',
DIU$_ALREADY_STARTED, ASTA, 20, ERROR, 'Spooler already active',
DIU$_NO_JOB_SLOTS, NJOB, 21, ERROR, 'No free job slots',
DIU$_SHUTDOWN, SHUT, 22, ERROR, 'Spooler has been shut down',
DIU$_SPOOLER_STOP_NOW,  SPSN, 23, INFO, 'Immediate spooler shutdown initiated',
DIU$_UNSOLICITED_STATUS, USTA, 24, ERROR, 'Status message received from non-slave job',
DIU$_REQUEST_COMPLETED, OK, 25, SUCCESS, 'Request completed OK',
DIU$_REQUEUED, REQU, 26, INFO, 'Request requeued',
DIU$_REQUEST_STARTED, STAR, 27, SUCCESS, 'Request started',
DIU$_NOT_STARTED, NSTA, 29, ERROR, 'Spooler not (yet) started',
DIU$_NO_MAILER, NMAI, 30, ERROR, 'Cannot get PID for MAILER or MAILEX',
DIU$_NO_MAIL_CPY, NWMC, 31, ERROR, 'Cannot write MAIL.CPY',
DIU$_CANT_MAIL, CMAI, 32, ERROR, 'Cannot notify user via mail',
DIU$_INV_IPCF_MSG, IIPC, 33, ERROR, 'Invalid IPCF message received',
DIU$_USER_LOG_FAULT, ULGF, 34, WARNING, 'Error writing to user log file',
DIU$_NOT_IMPLEMENTED, NIMP, 35, ERROR, 'Function not implemented',
DIU$_KILLED_BY_USER, KBUS, 36, ERROR, 'Request killed',
DIU$_SPOOLER_RESTARTED, SRST, 37, INFO, 'Spooler version !V restarted',
DIU$_SPOOLER_STARTED, SSTA, 38, INFO, 'Spooler version !V started',
DIU$_SPOOLER_STOP, SSTO, 39, INFO, 'Spooler shutdown initiated',
DIU$_SPOOLER_DOWN, SDWN, 40, INFO, 'Spooler shutdown completed',
DIU$_MISSED_MESSAGE, MMES, 41, INFO, 'Missed IPCF message from master DIU job',
DIU$_DEADLINE_EXPIRED, DEXP, 42, ERROR, 'Deadline expired',
DIU$_DEPENDENT_ABORTED, DEPA, 43, ERROR, 'Prerequisite in a sequence aborted or failed',
DIU$_INVALID_PREREQ, IPRQ, 44, ERROR, 'Invalid prerequisite specified',
DIU$_TOO_MANY_OKINT, TMOK, 45, SEVERE, 'S$OKINT invoked while OKINT',
DIU$_SYS_LOG_FAULT, SLGF, 46, SEVERE, 'Can''t open system log file',
DIU$_INVALID_PRIORITY,  IPRI, 47, ERROR,      'Invalid priority specified',
DIU$_INV_REQ_BLK_VER,   IRQV, 48, ERROR,      'Invalid request block version',
DIU$_INV_STR_LENGTH,    ISTL, 49, ERROR,      'Invalid length string in request block',
DIU$_DEADLINE_CONFLICT, DEDC, 50, ERROR, 'Deadline and after parameters conflict',
DIU$_TEXT,              TEXT, 51, INFO,       '!AD',
DIU$_STRUCTURE_NOT_UP,  NSTR, 52, ERROR,      'File structure not mounted',
DIU$_QUEUE_EMPTY,       QEMP, 53, WARNING,    'The queue is empty',
DIU$_DEADLINE_PAST,     DEDP, 54, ERROR,      'Deadline cannot be in the past',
DIU$_NO_CONNECT,        NCON, 55, ERROR,      'Cannot connect to directory',
DIU$_ARG_MISSING,       ARGM, 57, ERROR,      'Argument missing',
DIU$_NO_HELP_FILE,      NHLP, 58, ERROR,      'Cannot open help file (HLP:DIU.HLP)',
DIU$_HAS_DEPENDENT, HDEP, 59, ERROR, 'Request specified as prerequisite already has a dependent',
DIU$_NO_PREREQ, NDEP, 60, ERROR, 'Request specified does not have a prerequisite',
DIU$_QUEUE_FULL, QFUL, 61, ERROR, 'DIU queue is full',
DIU$_CANT_GET_TOP_INT, CGTP, 62, INFO, 'Cannot enable network topology change interrupts',
DIU$_REQ_TIME_OUT, RTIO, 63, WARNING, 'Request time out',
DIU$_REQUEUE_COUNT, RQCT, 64, INFO, 'Request requeued !SL time!%S',
DIU$_SLAVE_ABNORMAL, SABN, 65, ERROR, 'Slave job terminated abnormally',
DIU$_CANT_CREATE_JOB, CJOB, 66, ERROR, 'Can''t create slave job',
DIU$_CANT_GET_DIU, CGFT, 67, ERROR, 'Can''t get SYS:DIU.EXE',
DIU$_SPACE_NOT_ALLOWED, SPCN, 68, ERROR, 'Spaces not allowed in USER, PASSWORD, or ACCOUNT fields',
DIU$_PANIC_ILL_INST, IILI, 69, ERROR, 'Illegal instruction trap at PC !OW',
DIU$_PANIC_ILL_READ, IIRD, 70, ERROR, 'Illegal memory read at PC !OW',
DIU$_PANIC_ILL_WRIT, IIWR, 71, ERROR, 'Illegal memory write at PC !OW',
DIU$_SPOOLER_ABORTED, SABT, 72, ERROR, 'Spooler version !V restart aborted',
DIU$_SHUTDOWN_ABORTED, SSAB, 73, WARNING, 'Spooler shutdown aborted',
DIU$_CONNECTED_TO, SCON, 74, INFO, 'Connected to directory',
DIU$_MAXIMUM_REQ_SET, SMAX, 75, INFO, 'Maximum simultaneous requests set to !SL',
DIU$_PREREQ_NON_EXIST, PNXM, 76, ERROR, 'Prerequisite request does not exist',
DIU$_PREREQ_NOT_YOURS, PNYR, 77, ERROR, 'Prerequisite request is not yours',
DIU$_PREREQ_LOOP, PLUP, 78, ERROR, 'Prerequisite loop detected',
DIU$_ILLEGAL_USER_LOG, IULF, 79, ERROR, 'Illegal user log file specified',
DIU$_TEMPORARY_RMS_ERROR, TRMS, 80, ERROR, 'Temporary RMS error, try later',
DIU$_ACJ_DENIED_ACCESS, ACJD, 81, ERROR, 'Access control facility denied access',
DIU$_INVDATTYP,                 DTYP, 82, ERROR, 'Datatype !SL invalid or not supported by DIU',
DIU$_INVTYPSYS,                 TSYS, 83, WARNING, 'Datatype !SL not supported by specified system type',
DIU$_INVFLDDSC,                 FDSC, 84, ERROR, 'Invalid field description for !AS',
DIU$_MOVPREV,                   MPRV, 85, INFO, 'Field moved explicitly has been moved again by MOVE_MATCHING',
DIU$_VARFLDSKP,                 SKPV, 86, INFO, 'VARIANT fields are being skipped by MOVE_MATCHING',
DIU$_CONVERR,                   CONV, 87, INFO, 'Record !SL: Error converting field !AS to !AS',
DIU$_DEPITMINV,                 DITM, 88, INFO, '!AS depend item invalid in rec !SL, used min occurs instead',
DIU$_IMAGE_INVALID,             IMAI, 89, ERROR, '/IMAGE switch invalid with non-TOPS-10 or non-TOPS-20 system type',
DIU$_PATPAR,			PPAR, 90, INFO, ' !AS',
DIU$_KILLED_BY_SPOOLER,		JKBS, 91, SEVERE,'Job killed by spooler',
DIU$_NO_DETACH,			NDET, 92, ERROR, 'Job could not be detached',
DIU$_CANT_CREATE_FORK,          NFRK, 93, SEVERE, 'Can not create inferior fork',
DIU$_PARDES,                    PDES, 94, ERROR, 'Error parsing description, cannot process request ',
DIU$_PARTRA,                    PTRA, 95, ERROR, 'Error parsing transform, cannot process request ',
DIU$_USAGE_CONFLICT,            UCFL, 96, ERROR, 'Conflicting datatypes specified in record description',
DIU$_INIT_QUEUE, INIQ, 97, INFO, 'Initializing queue file',
DIU$_INVALID_ISAM_REQUEST,      IISM, 98, ERROR, 'If dest file is ISAM, src must be ISAM, and a transform is illegal',
DIU$_INVALID_NONRMS_REQUEST,    INRM, 99, ERROR, 'If dest file is non-RMS, src must be non-RMS, and a transform is illegal',
DIU$_RMS_FILE_FOUND,            RFFO, 100, WARNING, 'User specified NONRMS for source file actually in RMS format',
DIU$_NONRMS_FILE_FOUND,         NRFF, 101, WARNING, 'User specified RMS for source file actually in NONRMS format',
DIU$_KEY_NAME_INVALID,          KNAM, 105, ERROR, 'Key "!AS" is not defined in record description',
DIU$_KEY_DATATYPE_INVALID,      KDTP, 106, ERROR, 'Datatype of key field is invalid',
DIU$_KEY_DTP_CONFLICT,          KDCF, 107, ERROR, 'Conflict between key segment datatypes detected',
DIU$_SEGMENT_KEY_INVALID,       SEGK, 108, ERROR, 'Segments invalid for keys with packed decimal or numeric datatypes',
DIU$_KEY_SIZE_INVALID,          KSIZ, 109, ERROR, 'Key size out of range for key datatype',
DIU$_RSZ_INVALID,		IRSZ, 110, ERROR, 'Computed record size: !SL conflicts with user record size: !SL',
DIU$_DAMAGED, DAMA, 111, FATAL, 'Queue file is damaged',
DIU$_ANOTHER_VERSION, AVER, 112, FATAL, 'Queue file is written by another version',
DIU$_INVALID_RFM, IRFM, 113, ERROR, 'Record format is not supported by destination system',
DIU$_PAR_INFO, PARI, 114, INFO, '!AS',
DIU$_KEY_OPTIONS_INVALID, KOPT, 115, ERROR, 'Alternate key with NODUPLICATES and CHANGES not allowed on VMS'
) %;
!
! Now define the symbolic names
!
COMPILETIME
    DIU$K_ERRTAB_LENGTH = 0,
    DIU$K_FACILITY_CODE = %O'1000000';

MACRO
    $DIU$ERROR[CODE,SCODE,VALUE,SEVERITY,TEXT] =
        %ASSIGN (DIU$K_ERRTAB_LENGTH, %COUNT + 1)
        CODE = (VALUE ^ 3) + DIU$K_FACILITY_CODE + %NAME (STS$K_, SEVERITY)
        %;

LITERAL
   $DIU$ERRORS;
!
! Log file hacking macros
!
MACRO
    !
    ! Place a line of text into the log file
    !
    $DIU_LOG (text) =
        BEGIN
        %IF NOT %DECLARED (l$text)
        %THEN
        EXTERNAL ROUTINE
            l$text : NOVALUE;
        %FI
        EXTERNAL
            mst_flag : VOLATILE;
        LOCAL
            log_descr : $STR_DESCRIPTOR ();
        IF .mst_flag
        THEN
            BEGIN
            $STR_DESC_INIT (DESCRIPTOR=log_descr,CLASS=DYNAMIC);
            $STR_COPY (STRING=%REMOVE(text),TARGET=log_descr);
            l$text(log_descr);
            $XPO_FREE_MEM(STRING=log_descr);
            END;
        END %,
    !
    ! Place a line of text pertaining to a particular slave job in the log
    !
    $DIU_JOB_LOG (jobhandle, text) =
        BEGIN
        EXTERNAL ROUTINE
            lj$text : NOVALUE;
        EXTERNAL
            mst_flag;
        LOCAL
            log_descr : $STR_DESCRIPTOR ();
        IF .mst_flag
        THEN
            BEGIN
            $STR_DESC_INIT (DESCRIPTOR = log_descr,
                            CLASS = DYNAMIC);
            $STR_COPY (STRING = %REMOVE (text), TARGET = log_descr);
            lj$text (log_descr, jobhandle);
            $XPO_FREE_MEM (STRING = log_descr);
            END;
        END % ;

! $MSG_FAO prints the following FAO argument list on the terminal if running
! interactive, and the user log file and system log if running as a slave job.

MACRO  $MSG_FAO (control) = 
    BEGIN
      EXTERNAL
         interactive,
         tty   : $XPO_IOB();
      EXTERNAL ROUTINE
         Lj$UTxt: NOVALUE,
         Ip_Status;

      LOCAL
         fao_len,
         fao_buf  : VECTOR[CH$ALLOCATION(200)],
         fao_desc : $STR_DESCRIPTOR(CLASS=BOUNDED),
         fao_ctl  : $STR_DESCRIPTOR(STRING=control);

      ! Init the descriptor.  $STR_DESC_INIT wouldn't seem to work..

      fao_desc[STR$H_LENGTH]  = 0;
      fao_desc[STR$H_MAXLEN]  = 200;
      fao_desc[STR$H_PFXLEN]  = 0;
      fao_desc[STR$B_DTYPE]   = STR$K_DTYPE_T;
      fao_desc[STR$B_CLASS]   = STR$K_CLASS_B;
      fao_desc[STR$A_POINTER] = CH$PTR(fao_buf);

      ! Format the text

      $FAO(fao_ctl,fao_len,fao_desc,%REMAINING);

      ! Write it to the terminal if any

      IF .tty[IOB$V_OPEN]               ! If TTY open use it
      THEN $XPO_PUT(IOB=tty,STRING=fao_desc);

      ! to user and system log file if needed

      IF .interactive EQL 0
      THEN BEGIN
           Lj$utxt(fao_desc);
           Ip_Status(DIU$_TEXT,0,fao_desc);
           END;
END%;

MACRO  $GET_FAO (control,result) = 
    BEGIN

      LOCAL
         fao_len,
         fao_buf  : VECTOR[CH$ALLOCATION(200)],
         fao_ctl  : $STR_DESCRIPTOR(STRING=control),
         fao_desc : $STR_DESCRIPTOR(CLASS=BOUNDED);

      ! Init the descriptor.  $STR_DESC_INIT wouldn't seem to work..

      fao_desc[STR$H_LENGTH]  = 0;
      fao_desc[STR$H_MAXLEN]  = 200;
      fao_desc[STR$H_PFXLEN]  = 0;
      fao_desc[STR$B_DTYPE]   = STR$K_DTYPE_T;
      fao_desc[STR$B_CLASS]   = STR$K_CLASS_B;
      fao_desc[STR$A_POINTER] = CH$PTR(fao_buf);

      ! Format the text

      $FAO(fao_ctl,fao_len,fao_desc,%REMAINING);

      ! Copy it to the user

      $STR_COPY(STRING=fao_desc,TARGET=result);

END%;
!
! Macro to produce trace messages on the terminal if we are debugging
!

MACRO $TRACE(text) = %IF %SWITCHES(DEBUG)
                     %THEN BEGIN
                           EXTERNAL ROUTINE S$TRACE : NOVALUE;
                           S$TRACE(CH$PTR(UPLIT(%STRING(text,%CHAR(13,10,0)))))
                           END;
                     %FI %;

MACRO $TRACE_FAO(text) = %IF %SWITCHES(DEBUG)
                         %THEN $MSG_FAO(%STRING(text,'!/'),%remaining)
                         %FI %;

! define macros that are standardized strings


MACRO diu$$system_banner  =
		%IF %SWITCHES(TOPS20)
		%THEN CH$PTR(UPLIT(%ASCIZ'TOPS-20 Data Interchange Utility'))
		%ELSE CH$PTR(UPLIT(%ASCIZ'TOPS-10 Data Interchange Utility'))
		%FI
                %;
!
! The below macros were pulled out of DAP.REQ in order to not pull in DAP
! sources for DIU usage.
!

MACRO Str_Exclude( Desc, Chars )=
   ( BIND excl$$chars=(Chars);
     Desc[Str$a_Pointer]=CH$PLUS(.desc[Str$a_Pointer],excl$$chars);
     Desc[Str$h_Length]=MAX((.desc[Str$h_Length]-excl$$chars),0);
     Desc[Str$h_Pfxlen]=.desc[Str$h_Pfxlen]+excl$$chars ) %;

MACRO Str_Include( Desc, Chars)=
    (Desc[Str$h_Length]=.desc[Str$h_Length]+Chars ) %;

MACRO Str_Prefix( Desc )=
    ( .desc[Str$h_Pfxlen],
      CH$PLUS(.desc[Str$a_Pointer],-.desc[Str$h_Pfxlen]) ) %;

MACRO Str_String_Plus_Prefix( Desc )=
    ( .desc[Str$h_Pfxlen]+.desc[Str$h_Length],
      CH$PLUS(.desc[Str$a_Pointer], -.desc[Str$h_Pfxlen]) ) %;

MACRO Str_String_Plus_Remainder( Desc )=
    ( .desc[Str$h_Maxlen]-.desc[Str$h_Pfxlen],  .desc[Str$a_Pointer] ) %;

MACRO Str_Remainder( Desc ) =
    ( .desc[Str$h_Maxlen]-(.desc[Str$h_Length]+.desc[Str$h_Pfxlen]),
      CH$PLUS(.desc[Str$a_Pointer], .desc[Str$h_Length]) ) %;

MACRO Str_String( Desc ) =
    ( .desc[Str$h_Length], .desc[Str$a_Pointer] ) %;

MACRO
     ASCIZ_TO_DESCRIPTOR(ASCIZ,DESC)=$STR_DESC_INIT(DESCRIPTOR=DESC,
                                                    STRING=(ASCIZ_LEN(ASCIZ),
                                                            ASCIZ),
                                                    CLASS=BOUNDED) %;
                                                            
MACRO ASCIZ_TO_FIXED_DESCRIPTOR(ASCIZ,DESC)=
           $STR_DESC_INIT(DESCRIPTOR=DESC,
                          STRING=(ASCIZ_LEN(ASCIZ), ASCIZ),
                          CLASS=FIXED) %;

UNDECLARE %QUOTE STR_STRING;