Google
 

Trailing-Edge - PDP-10 Archives - bb-ee87b-sb - 10,7/dil/xpnerr.b36
There are 26 other files named xpnerr.b36 in the archive. Click here to see a list.
%TITLE 'XPNERR - Return error message for a given error code'
MODULE xpnerr (
               ENTRY ( XPN$ERRMSG )
              ) =
BEGIN
!  COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1985.
!  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:
!   Transportable BLISS interface to DECNET-10.
!
! ABSTRACT:
!   This module contains code to implement the $XPN_ERRMSG macro, which
!   returns the text message corresponding to a given error code.
!
! ENVIRONMENT:
!   TOPS-10 user mode.
!
! AUTHOR:  Larry Campbell, CREATION DATE:  January 14, 1982
!
! MODIFIED BY:
!
! 01    - (LC) Include prefix and numeric code in all error messages.
! 
! Start using the DIL standard edit history format.
!
! Facility Blissnet
!
! Edit (%O'2', '12-Apr-84', 'Sandy Clemens')
!  %( Add the TOPS-10 BLISSnet sources for DIL V2.  )%
!
! Edit (%O'6', '5-Oct-84', 'Sandy Clemens')
!  %( Add new format of COPYRIGHT notice.  FILES:  ALL )%
!--

!
! TABLE OF CONTENTS:
!
FORWARD ROUTINE
    xpn$errmsg,                         ! Top level routine
    xpn$$blissnet_error: NOVALUE,       ! BLISSnet interface error codes
    xpn$$decnet_error : NOVALUE;        ! DECNET disconnect codes
!
! INCLUDE FILES:
!
LIBRARY 'BLI:XPORT';
LIBRARY 'BLISSNET';
LIBRARY 'BLI:UUOSYM';
LIBRARY 'BLSN10';
!
! MACROS:
!
MACRO
    xpn$$canned_msg (text) =
        BEGIN
        $STR_COPY (STRING = text, TARGET = temp_descriptor);
        (.length) = .temp_descriptor[STR$H_LENGTH]
        END %;

COMPILETIME
    error_table_size = 0,
    error_table_index = 0;

$FIELD
    xpn$$error_fields =
    SET
    xpn$$error_code = [$INTEGER],
    xpn$$error_severity = [$BYTE],
    xpn$$error_text = [$DESCRIPTOR ()]
    TES;

LITERAL
    xpn$$error_block_size = $FIELD_SET_SIZE;
!
! Count the number of error strings to be defined
!
UNDECLARE
    %QUOTE DATE,
    %QUOTE $xpn$comp_code;

MACRO
    $xpn$comp_code (name, severity, text) =
        %ASSIGN (error_table_size, error_table_size + 1) %;

xpn$$define_codes
!
! Now define a macro to create the PRESET attributes for the error table
!
UNDECLARE
    %QUOTE $xpn$comp_code;

MACRO
    $xpn$comp_code (name, severity, text) =
        [error_table_index, xpn$$error_code] = %NAME ('XPN$_', name),
        [error_table_index, xpn$$error_severity] = %NAME ('XPN$K_SEVERITY_', severity),
        [error_table_index, $SUB_FIELD (xpn$$error_text, STR$A_POINTER)] = CH$PTR (UPLIT (%ASCII text)),
        [error_table_index, $SUB_FIELD (xpn$$error_text, STR$H_LENGTH)] = %CHARCOUNT (text),
        [error_table_index, $SUB_FIELD (xpn$$error_text, STR$B_DTYPE)] = STR$K_DTYPE_T,
        [error_table_index, $SUB_FIELD (xpn$$error_text, STR$B_CLASS)] = STR$K_CLASS_F,
        %ASSIGN (error_table_index, error_table_index + 1) %;
!
! Put these tables in the high segment
!
PSECT
    OWN = $HIGH$;

OWN
    error_table : BLOCKVECTOR [error_table_size + 1, xpn$$error_block_size]
                  FIELD (xpn$$error_fields)
                  PRESET (xpn$$define_codes
                          [error_table_index, xpn$$error_code] = 0);
!
! Define the DECNET error message table
!
$FIELD
    decnet_msg_fields =
    SET
    xpn$$dcn_code = [$BYTE],
    xpn$$dcn_text = [$DESCRIPTOR()]
    TES;

LITERAL
    xpn$$dcn_block_size = $FIELD_SET_SIZE;

MACRO
    $xpn$define_decnet_codes =
        $xpn$dcn_codes (NSABE_,'The argument block was formatted incorrectly',
			NSALF_,'An allocation attempt failed',
			NSBCN_,'An invalid channel number was specified',
			NSBFT_,'An illegal format type was specified in the process descriptor block',
			NSCFE_,'The connect block was formatted incorrectly',
			NSIDL_,'Interrupt data block pointed to a string block that was too long',
			NSIFM_,'Illegal flow control',
			NSILF_,'Illegal function code specified',
			NSJQX_,'Job quota exhausted',
			NSLQX_,'Link quota exhausted',
			NSNCD_,'No connect data to read',
			NSPIO_,'Percentage input out of bounds',
			NSPRV_,'Insufficient privileges to perform specified function',
			NSSTB_,'Segment size too big',
			NSUKN_,'Unknown node name was specified',
			NSUXS_,'Unexpected or unspecified state',
			NSWNA_,'Wrong number of arguments',
			NSWRS_,'Function call while connected in wrong state',
			NSCBL_,'Wrong length for connect block',
			NSPBL_,'Wrong length for process block',
			NSSBL_,'Wrong length for string block',
			NSUDS_,'Unexpected state: disconnect sent',
			NSUDC_,'Unexpected state: disconnect confirmed',
			NSUCF_,'Unexpected state: no confidence',
			NSULK_,'Unexpected state: no link',
			NSUCM_,'Unexpected state: no communication',
			NSUNR_,'Unexpected state: no resources',
			NSRBO_,'Rejected by object',
			NSDBO_,'Disconnected by object when running',
			NSRES_,'No resources',
			NSUNN_,'Unrecognized node name',
			NSRNS_,'Remote node shut down',
			NSURO_,'Unrecognized object',
			NSIOF_,'Invalid object name format',
			NSOTB_,'Object too busy',
			NSABM_,'Abort by management',
			NSABO_,'Abort by object',
			NSINF_,'Invalid node name format',
			NSLNS_,'Local node shut down',
			NSACR_,'Access control rejection',
			NSNRO_,'No response from object',
			NSNUR_,'Node unreachable',
			NSNLK_,'No link',
			NSDSC_,'Disconnect complete',
			NSIMG_,'Image field too long',
			NSBCF_,'Invalid combination of NS.EOM and NS.WAI flags',
			NSADE_,'Address error') %;

COMPILETIME
    dcn_count = 0,
    dcn_index = 0;
!
! Count the number of entries in DECNET error message table
!
MACRO
    $xpn$dcn_codes [code, text] =
        %ASSIGN (dcn_count, dcn_count + 1) %;

$xpn$define_decnet_codes                ! Count the entries

UNDECLARE
    %QUOTE $xpn$dcn_codes;
!
! Define a macro to do the PRESETs for the table
!
MACRO
    $xpn$dcn_codes [code, text] =
        [dcn_index, xpn$$dcn_code] = code,
        [dcn_index, $SUB_FIELD (xpn$$dcn_text, STR$A_POINTER)] = CH$PTR (UPLIT (text)),
        [dcn_index, $SUB_FIELD (xpn$$dcn_text, STR$H_LENGTH)] = %CHARCOUNT (text),
        [dcn_index, $SUB_FIELD (xpn$$dcn_text, STR$B_DTYPE)] = STR$K_DTYPE_T,
        [dcn_index, $SUB_FIELD (xpn$$dcn_text, STR$B_CLASS)] = STR$K_CLASS_F
        %ASSIGN (dcn_index, dcn_index + 1) %;
!
! Now build the table
!
OWN
    decnet_errors : BLOCKVECTOR [dcn_count, xpn$$dcn_block_size]
                    FIELD (decnet_msg_fields)
                    PRESET ($xpn$define_decnet_codes);
!
! EXTERNAL REFERENCES:
!
EXTERNAL ROUTINE
    xpo$xmsg : NOVALUE;                 ! XPORT error message translator

GLOBAL ROUTINE xpn$errmsg (code, buffer_descriptor, length, bits) =
!++
! FUNCTIONAL DESCRIPTION:
!   This routine, called by the $XPN_ERRMSG macro, returns in the buffer
!   described by the descriptor in buffer_descriptor the error message
!   text corresponding to the code supplied.
!
! FORMAL PARAMETERS:
!   code                - Interface error code
!   buffer_descriptor   - Address of a descriptor defining the buffer 
!                         the error message text
!   length              - Address of a fullword to receive the length
!                         of the message returned
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and
! COMPLETION CODES:
!   NONE
!
! SIDE EFFECTS:
!   The message is copied to the buffer described by buffer_descriptor.
!   The length of the message is copied into the location pointed to by length.
!--
    BEGIN

    MAP
        buffer_descriptor : REF $STR_DESCRIPTOR();

    LOCAL
        xport_msg_descr : $STR_DESCRIPTOR ();

    SELECTONE .code OF
        SET
        [XPN$_NLBADDR TO XPN$_MSGNOTFD1,
         XPN$_ABORTED TO XPN$_MSGTRUNC,
         XPN$_NO_OPEN TO XPN$_NO_ACCESS,
         XPN$_ACTIVE TO XPN$_ACCVIO] :
            xpn$$blissnet_error (.code, .buffer_descriptor, .length);
        [NSABE_ TO NSADE_] :
            xpn$$decnet_error (.code, .buffer_descriptor, .length);
        [OTHERWISE] :
            BEGIN
            xpo$xmsg (.code, xport_msg_descr);
            $STR_COPY (TARGET = .buffer_descriptor,
                       STRING = xport_msg_descr);
            (.length) = .xport_msg_descr[STR$H_LENGTH];
            END;
        TES;
    RETURN (XPN$_NORMAL)
    END;

ROUTINE xpn$$blissnet_error (code, buffer_descriptor, length) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!   Return the error message for a BLISSnet-defined error code.
!
! FORMAL PARAMETERS:
!   same as for xpn$errmsg
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and 
! COMPLETION CODES:
!   NONE
!
! SIDE EFFECTS:
!   The error message is copied to the buffer described by buffer_descriptor.
!   The length of the message is copied to the location pointed to by length.
!
!--
    BEGIN

    MAP
        buffer_descriptor : REF $STR_DESCRIPTOR();

    LOCAL
	msg_index,
        temp_descriptor : $STR_DESCRIPTOR (CLASS = DYNAMIC);

    $STR_DESC_INIT (DESCRIPTOR = temp_descriptor, CLASS = DYNAMIC);
    msg_index =
        (INCR index FROM 0 TO error_table_size DO
             IF .error_table[.index, xpn$$error_code] EQL .code
             THEN
                 EXITLOOP .index);
    IF .msg_index EQL -1
    THEN
        xpn$$canned_msg ($STR_CONCAT ('Undefined XPN error code ',
                                      $STR_ASCII (.code, BASE10)))
    ELSE
        BEGIN
        $STR_COPY (STRING =
                   $STR_CONCAT ('XPN event ',
                                $STR_ASCII (.code, BASE10),
                                ': ',
                                error_table[.msg_index, xpn$$error_text]),
                   TARGET = temp_descriptor);
        (.length) = .temp_descriptor[STR$H_LENGTH];
        END;
    $STR_COPY (TARGET = .buffer_descriptor, STRING = temp_descriptor);
    $XPO_FREE_MEM (STRING = temp_descriptor);
    END;                                ! End of xpn$$blissnet_error

ROUTINE xpn$$decnet_error (code, buffer_descriptor, length) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!   Return the error message associated with a DECNET disconnect code.
!
! FORMAL PARAMETERS:
!   same as xpn$errmsg
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and
! COMPLETION CODES:
!   NONE
!
! SIDE EFFECTS:
!   The error message is copied to the buffer described by buffer_descriptor.
!   The length of the message is copied to the location pointed to by length.
!
!--
    BEGIN

    MAP
        buffer_descriptor : REF $STR_DESCRIPTOR();

    LOCAL
	msg_index,
        temp_descriptor : $STR_DESCRIPTOR (CLASS = DYNAMIC);
        
    $STR_DESC_INIT (DESCRIPTOR = temp_descriptor, CLASS = DYNAMIC);
    msg_index =
        (INCR index FROM 0 TO dcn_count DO
            IF .decnet_errors[.index, xpn$$dcn_code] EQL .code
            THEN EXITLOOP (msg_index = .index));
    IF .msg_index EQL -1
    THEN
        xpn$$canned_msg ($STR_CONCAT ('Undefined DECNET disconnect code ',
                                      $STR_ASCII (.code, BASE10)))
    ELSE
        BEGIN
        $STR_COPY (STRING =
                   $STR_CONCAT ('DECNET disconnect code ',
                                $STR_ASCII (.code, BASE10),
                                ': ',
                                decnet_errors[.msg_index, xpn$$dcn_text]),
                   TARGET = temp_descriptor);
        (.length) = .temp_descriptor[STR$H_LENGTH];
        END;
    $STR_COPY (TARGET = .buffer_descriptor, STRING = temp_descriptor);
    $XPO_FREE_MEM (STRING = temp_descriptor);
    END;                                ! End of xpn$$decnet_error

END                                     ! End of module
ELUDOM