Google
 

Trailing-Edge - PDP-10 Archives - bb-bt99n-bb - mxerr.y20
There is 1 other file named mxerr.y20 in the archive. Click here to see a list.
%title 'MXERR - Error message handler macros'
!++
! Facility: DECMAIL/MS - Message EXchange
!
! Abstract:
!          This set of macros is used to manipulate error strings used
!      by MX.
!
! Environment: Bliss 36,
!
! Author: Richard B. Waddington, Creation Date: October 8, 1984
!
!--
MACRO error$data =
        (
            MP$MKF, 'MP$MKF-Missing key field',
            MP$SYN, 'MP$SYN-Syntax error in line #%D of %A',
            MP$TEL, 'MP$TEL-Extraneous text at end of line - "%A"',
            MP$UHF, 'MP$UHF-Unsupported host format requested (Internal Error)',
            MQ$MHE, 'MQ$MHE-Message has expired',
            SP$UIE, 'SP$UIE-Unexpected internal error',
            UF$ACF, 'UF$ACF-Abort close failed',
            UF$FCF, 'UF$FCF-File close failed for %A',
            UF$FRF, 'UF$FRF-File read failed for %A',
            UF$FWF, 'UF$FWF-File write failed for %A',
            UF$FOF, 'UF$FOF-File open failed for %A',
            UF$CGP, 'UF$CGP-Cannot get page',
            UF$IFA, 'UF$IFA-Invalid file access attempted',
	    UF$IFS, 'UF$IFS-Invalid file specification',
            UF$NSR, 'UF$NSR-Non-sequential read attempted',
            UF$NSW, 'UF$NSW-Non-sequential write attempted',
            UF$TLF, 'UF$TLF-Table lookup failed',
            ER$MLE, 'ER$MLE-Message level error occured in SERVER or SPOOLER',
            MX$NOM,                 'MX$NOM-Insufficient memory',
            MX$NOQ, 'MX$NOQ-Insufficient quota in %A',
            MG$NSU, 'MG$NSU-%A: No such user %A',
            MG$LTL, 'MG$LTL-SMTP: Line too long',
            MG$UEC, 'MG$UEC-SMTP: Unexpected command',
            MG$UIC, 'MG$UIC-SMTP: Unimplemented command',
            MG$UNC, 'MG$UNC-SMTP: Unknown command',
            MG$ARG, 'MG$ARG-SMTP: Bad Argument',
            MG$NNK, 'MG$NNK-%A: Node %A is not known here',
            MG$MFC, 'MG$MFC-SMTP: Mail File corrupted - Mail lost',
            MG$IPS, 'MG$IPS-Insufficient privilege for sending mail to SYSTEM',
            MG$GPE, 'MG$GPE-%A: %I',       !Gen. Purpose Error
            SL$NSU, 'SL$NSU-No such user %A',
            SL$NNK, 'SL$NNK-Node %A is not known here',
            LS$DMF, 'LS$DMF-Duplicate message files %A, %A',
            LS$NMF, 'LS$NMF-Message file %A does not exist',
            LS$ICP, 'LS$ICP-Invalid continuation packet',
            LS$ISP, 'LS$ISP-Invalid sender pid',
            LS$ISU, 'LS$ISU-Invalid sender uid',
            LS$INN, 'LS$INN-MX does not service node %A',
            LS$IDS, 'LS$IDS-Invalid destination string %A',
            NW$ERR, 'NW$ERR-Network error at node %A - %A',
            S2$ERR, 'S2$ERR-%A',
            LS$UOQ, 'LS$UOQ-User %A was over quota',
            DN$INP, 'DN$INP-Invalid DECNET mail protocol',            
            LS$IHT, 'LS$IHT-Invalid Scan_packet Header Type',
            LS$IRT, 'LS$IRT-Invalid Scan_packet Record Type',
            UF$NQE, 'UF$NQE-ENQ Error: %O',
            UF$CGL, 'UF$CGL-Could not get lock',
            UF$DQE, 'UF$DQE-DEQ Error: %O',
            UF$CFL, 'UF$CFL-Could not free lock',
            UF$FPE, 'UF$FPE-FILOP Error: %O',
            UF$FPF, 'UF$FPF-FILOP failed',
            UF$FNF, 'UF$FNF-File not found',
            UF$CNP, 'UF$CNP-Could not parse',
            UF$LOK, 'UF$LOK-file is locked',
            UF$LEN, 'UF$LEN-Could not get length of %A',
            UFD$CR, 'UFD$CR-Could not create searchlist for %A',
            LS$CCP, 'LS$CCP-Could not create PID %A',
            MX$MZB, 'MX$MZB-Message file %A contained zero bytes',
            MX$CTP, 'MX$CTP-Could not translate POBOX:',
            MP$PLD, 'MP$PLD-Path loop detected at node %A'
          ) %;

MACRO
    $GLITERAL =				! Initialize for constant creation
	%ASSIGN( $xpo$distinct, 0 )     !NOTE GLOBAL LITERAL cannot occur
	GLOBAL LITERAL %;               !in LIBRARY file.

MACRO 
    $ERROR_TABLE =
        UNDECLARE mxerrs;
        UNDECLARE $ebuf;
        UNDECLARE ext_lines(%remove(error$data));

        $gliteral
        lit_lines(%REMOVE(error$data));
        
        GLOBAL mxerrs: VECTOR [max_error]
        INITIAL
            (0,
             STR_LINES(%remove(error$data)) );

        GLOBAL $ebuf: VECTOR[CH$ALLOCATION(256)] %;

macro EXT_LINES (CODE,TEXT)[] =
         CODE
         %if not %null(%remaining) %then ,EXT_LINES(%remaining) 
         %else ;
         %if %declared(max_error) %then 
         UNDECLARE max_error;
         %fi

         LITERAL
            max_error = %count + 2 %fi %;

macro LIT_LINES (CODE,TEXT)[] =
         CODE = $distinct
         %if not %null(%remaining)
         %then
              ,LIT_LINES(%remaining)
         %fi %;

macro STR_LINES (CODE,TEXT)[] =
         ch$ptr(uplit(%string(%asciz TEXT)))
         %if not %null(%remaining)
         %then
              ,STR_LINES(%remaining) %fi %;

EXTERNAL ext_lines(%remove(error$data));
EXTERNAL mxerrs: vector[max_error];
EXTERNAL $ebuf:  vector[CH$ALLOCATION(256)];

MACRO $$cnt(_A_) =
    %LENGTH %;

MACRO $$oplen(_arg) =
    %IF %CTCE(_arg) %THEN
        %IF (_arg NEQ 0) AND (_arg NEQ $error_code)
        %THEN 1
        %ELSE 0 %FI
    %ELSE 1 %FI %;

MACRO $$assign_args(_n, _arg)[] =
    %IF NOT %NULL(_arg) %THEN
    _argblck[_n] = _arg;
    $$assign_args(_n+1, %REMAINING) %FI %;

KEYWORDMACRO
    $error(severity, code, facility,
           id=0,
           message_data=,
           optional_message=0,
           optional_data=) =

        BEGIN
        %IF facility EQL $message
        %THEN
            %IF %CTCE(id)
            %THEN
                %ERROR('Missing Message ID in $ERROR call') %FI %FI

        STACKLOCAL
            _argblck: VECTOR[5 + $$cnt(%remove(message_data)) +
                                 $$cnt(%remove(optional_data)) +
                                 $$oplen(optional_message)]

                        INITIAL(4 + $$cnt(%remove(message_data)) +
                                    $$cnt(%remove(optional_data)) +
                                    $$oplen(optional_message),

                                sts$value(SEV=severity,COD=code,FAC=facility),

                                0,
                                0,
                                5 + $$cnt(%remove(message_data)) +
                                    $$oplen(optional_message)
                                );

        _argblck[2] = id;
        _argblck[3] = optional_message;

        $$assign_args(5, %REMOVE(message_data))

        %IF $$oplen(optional_message) %THEN
            _argblck[5+$$cnt(%REMOVE(message_data))] = optional_message; %FI

        $$assign_args(5+$$cnt(%REMOVE(message_data))+$$oplen(optional_message),
                        %REMOVE(optional_data))

        mx$error_processor(_argblck);
        $false
        END %;

KEYWORDMACRO
    $signal_error(severity, code, facility,
                  id=0,
                  message_data=,
                  optional_message=0,
                  optional_data=) =
        SIGNAL(
            sts$value(SEV=severity, COD=code, FAC=facility),
            id,
            optional_message,
            5 + $$cnt(%REMOVE(message_data))
            %IF NOT %NULL(message_data) %THEN ,%REMOVE(message_data) %FI
            %IF $$oplen(optional_message) %THEN ,optional_message %FI
            %IF NOT %NULL(optional_data) %THEN ,%REMOVE(optional_data) %FI
                    ) %;

    MACRO
        $e_display(b) =
        %IF %SWITCHES(TOPS20) %THEN
            BEGIN
            DECLARE_JSYS(psout);
            $$psout(b);
            END
        %ELSE
            task_info(CH$PTR(b))
        %FI %;

%if $TOPS20 %then
macro
     $LAST_ERROR =
           (declare_jsys(geter);
           local error;

           $$geter($fhslf;error);
           .error<0,18>
            ) %;
%fi
!
! Severity codes:
!
LITERAL
    $warning = 0,
    $success = 1,
    $err     = 2,
    $info    = 3,
    $severe  = 4;

!
! Facility codes:
!
$LITERAL
    $protocol = $DISTINCT,
    $message  = $DISTINCT,
    $internal = $DISTINCT;

LITERAL
    min_facility = $protocol,
    max_facility = $internal;
!
! Other symbols
!
LITERAL
    $error_code = -1;

MACRO
    abort_mx =
        %IF %SWITCHES(TOPS20) %THEN

        BEGIN
        DECLARE_JSYS(psout,haltf);

        $$psout(crlf_pointer);                          ![314]New MONSYM change
        $$psout(UPLIT(%ASCIZ %STRING('?MX crashed')));
        $$haltf();
        END

        %ELSE
!           %WARN('ABORT_MX not implemented for this OS')
	BEGIN
	BUILTIN UUO;

	UUO(0,EXIT(1));
	END
        %FI %;