Google
 

Trailing-Edge - PDP-10 Archives - BB-JR93K-BB_1990 - 10,7/decmai/mx/mxlcl.r36
There are 13 other files named mxlcl.r36 in the archive. Click here to see a list.
!	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1985, 1989.
!	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.
!Linkages to some TOPS-10 utility functions
%IF %SWITCHES(TOPS10) %THEN
    LINKAGE
	ned1 = PUSHJ(REGISTER=1,REGISTER=2; REGISTER=2):
		SKIP(1)
		LINKAGE_REGS(15,13,1)
		NOPRESERVE(1,2,3,4),

	ned2 = PUSHJ(REGISTER=1,REGISTER=2):
		SKIP(0)
		LINKAGE_REGS(15,13,1)
		NOPRESERVE(1,2,3,4,5,6,7,8,9),

	ned3 = PUSHJ(REGISTER=1; REGISTER=1):
		SKIP(1)
		LINKAGE_REGS(15,13,1)
		NOPRESERVE(1,2,3,4),

	ned4 = PUSHJ(REGISTER=1,REGISTER=2; REGISTER=1,REGISTER=2,REGISTER=3):
		SKIP(1)
		LINKAGE_REGS(15,13,1)
		NOPRESERVE(1,2,3,4),

        ned5 = PUSHJ(REGISTER=1; REGISTER=2):
                SKIP(1)
                LINKAGE_REGS(15,13,1)
                NOPRESERVE(1,2,3),

        ufd1 = PUSHJ(REGISTER=1,REGISTER=2):
                SKIP(0)
                LINKAGE_REGS(15,13,1)
                NOPRESERVE(1,2),

        ufd2 = PUSHJ(REGISTER=1):
                SKIP(1)
                LINKAGE_REGS(15,13,1)
                NOPRESERVE(1,2);

    EXTERNAL ROUTINE
	udtdat: ned2 NOVALUE,
        udttim: ned2 NOVALUE,
	namppn: ned3,
	ppnnam: ned3,
	quotas: ned4,
	fndusr: ned1,
	spltty: ned2 NOVALUE,
	bldque: ned5,
        ufdcre: ufd2,
        ufddel: ufd2;
%FI
!
! REQUIRE file for communication between MX modules
!
! Linkage used between MX and the outside world
!
!
! Define the IPCF message format
!
!    The IPCF message is divided into two parts: header and body.
!    The header contains information about the overall message,
!    while the body of the message contains one or more records to
!    indicate the destination of the message to be posted
!
! Define the IPCF message header
!
$FIELD
  hdr_fields =
    SET
    hdr_type = [$SHORT_INTEGER],	! Type of message
    hdr_domain_id = [$SHORT_INTEGER],   ! The domain id of the sender
    hdr_id = [$SHORT_INTEGER],		! packet message id
    hdr_msid = [$SHORT_INTEGER],        ! Id assigned by MS (don't touch)
    hdr_sequence = [$INTEGER],		! sequence number of this packet
    hdr_status = [$INTEGER],
    hdr_record_count = [$INTEGER],
    hdr_record = [$SUB_BLOCK()]		! first data record
    TES;

! Define the IPCF header size

LITERAL
  hdr_size = $FIELD_SET_SIZE;		! declare the header area size

! Define a macro to reference this data structure

MACRO
  ipcf_hdr = BLOCK [hdr_size] FIELD (hdr_fields) %;
!
! Define the header types
!
$LITERAL
  lcl_post = $DISTINCT,			! post a message
  lcl_cont = $DISTINCT,			! continue posting a previous one
  min_hdr_type = lcl_post,		! minimum
  max_hdr_type = lcl_cont;		! and maximum type

$LITERAL
    lcl_complete = $DISTINCT,
    lcl_incomplete = $DISTINCT,
    min_status = lcl_complete,
    max_status = lcl_incomplete;
!
! Define the IPCF message body
!
!    The IPCF packet body contains one or more variable length records
!    that contain the filespec of the message to be posted, and the node
!    name and destination string for each user to receive the message
!
! Define the packet body record format
!
$FIELD
  rec_fields =
    SET
    rec_seq = [$INTEGER],
    rec_type = [$SHORT_INTEGER],	! record type
    rec_error = [$SHORT_INTEGER],       ! The error code for this record
    rec_length = [$INTEGER],		! number of words in this record
    rec_data = [$STRING(1)]		! dummy pointer
    TES;

! Define the size of a record

LITERAL
  rec_size = $FIELD_SET_SIZE;

! Define a macro to reference this structure

MACRO
  ipcf_rec = BLOCK [rec_size] FIELD (rec_fields) %;

!
! Define the record types
!
$LITERAL
  rec_file = $DISTINCT,			! filespec
  rec_sender = $DISTINCT,		! sender string (for posting by proxy)
  rec_dest = $DISTINCT,			! destination string
  rec_subj = $DISTINCT,                 ! subject string
  min_rec_type = rec_file,		! minimum
  max_rec_type = rec_subj;		! and maximum record type

!
! Define the overall format of the IPCF packet
!
$FIELD
  ipcf_fields =
    SET
    ipcf_header = [$SUB_BLOCK(hdr_size)],	! header first
    ipcf_block = [$SUB_BLOCK(rec_size)]		! and the first record
    TES;

! Define the size of that block

LITERAL
  ipcf_size = $FIELD_SET_SIZE;

! Define a macro to use to reference this stuff

MACRO
  ipcf_msg = BLOCK [ipcf_size] FIELD (ipcf_fields) %;

! Error codes here, for the time being...

$LITERAL
  mx$_no_dest_node = $DISTINCT,
  mx$_invalid_destination = $DISTINCT,
  mx$_empty_work_request = $DISTINCT,
  mx$_invalid_continuation_packet = $DISTINCT,
  mx$_no_such_message = $DISTINCT,
  mx$_invalid_node_name = $DISTINCT,
  mx$_no_message_file = $DISTINCT,
  mx$_wrong_domain = $DISTINCT,
  mx$_duplicate_message_file = $DISTINCT;

!++[303] Add this macro for use in MX$GET_USERNAME
! Macro SPECIAL_CHARACTERS
!
!   This macro expands to a list of 128 1's and 0's separated by commas.  There
!   will be a 1 in the position of each special character, and a 0 in all other
!   positions.  For example: SPECIAL_CHARACTERS('@') will expand to 64 0's
!   followed by a 1, followed by 63 0's. The parameter must be a quoted string.
!   At present, non-printing characters cannot be represented, and the
!   parameters must be listed in ascending alphabetical order.
!   
!   This macro is used to build a CH$TRANSTABLE for an efficient check for
!   special characters.
!--
MACRO
    special_characters(s) =
        spec_char(%EXPLODE(s)) %,

    spec_char(c)[]=
        %IF %COUNT LSS 127
        %THEN
            %IF %ISSTRING(c)
            %THEN
                %IF %COUNT NEQ %C c 
                %THEN 
                    0 ,spec_char(c,%REMAINING)
                %ELSE
                    %IF %NULL(%REMAINING)
                    %THEN
                        1 ,spec_char(0)
                    %ELSE
                        1 ,spec_char(%REMAINING)
                    %FI
                %FI
            %ELSE
                0, spec_char(0)
            %FI
        %ELSE
            %IF %ISSTRING(c)
            %THEN
                %IF %COUNT NEQ %C c
                %THEN 
                    0 
                %ELSE
                    1
                %FI
            %ELSE
                0
            %FI
        %FI
    %;