*DECK CSESDA
USETEXT TEXTOV
USETEXT TEXTCS
USETEXT TEXTSS
USETEXT TXTAPSS 
USETEXT TXTSMCS 
      PROC CSESDA;
# TITLE - SEND DI ACCOUNTING DATA.                                     #
      BEGIN 
# 
**    CSESDA - SEND DI ACCOUNTING DATA. 
* 
*     D.K. ENDO    84/11/19 
* 
*     THIS PROCEDURE FORMATS STATISTICS INFORMATION FROM THE DI.  IT
*     THEN SENDS IT OUT TO THE SYSTEM ACCOUNT FILES.
* 
*     PROC CSESDA 
* 
*     ENTRY        1. STI/TE/U AND STI/AP/U FROM THE EVENT QUEUE. 
* 
*     EXIT         1. STATISTICS INFO SENT TO THE SYSTEM ACCOUNT FILES. 
* 
* 
*     ACCOUNT DAYFILE MESSAGE FORMATS:  
* 
*     *SCTE, C1, DEVICE_NAME. 
*     *SCTE, C2, DEVICE_TYPE. 
*     *SCTE, C3, DESTINATION_SERVICE. 
*     *SCTE, C4, DI_NAME_OR_ADDRESS.
*     *SCTE, C5, LIM, PRT, VVVV.
*     *SCTE, C6, TTTTTTRRRRRRSSSSSS.
*     *SCTE, C7, CCCCCC.
*     *SCTE, C8, CONNECT_TIME.
* 
*     *SCAP, C1, SOURCE_SERVICE.
*     *SCAP, C2, DESTINATION_SERVICE. 
*     *SCAP, C3, DI_NAME_OR_ADDRESS.
*     *SCAP, C4, MMM, PRT, VVVV.
*     *SCAP, C5, TTTTTTRRRRRRSSSSSS.
*     *SCAP, C6, CCCCCC.
*     *SCAP, C7, CONNECT_TIME.
* 
*      WHERE: 
* 
*         LIM    = LINE INTERFACE MODULE
*         MMM    = LIM OR MAINFRAME CHANNEL INTERFACE 
*         PRT    = PORT NUMBER ON THE LIM 
*         VVVV   = X.25 VIRTUAL CIRCUIT NUMBER
*         TTTTTT = BLOCKS/PACKETS TRANSFERRED 
*         RRRRRR = BLOCKS/PACKETS RECEIVED
*         SSSSSS = CHARACTERS TRANSFERRED 
*         CCCCCC = CHARACTERS RECEIVED. 
* 
# 
# 
****  PROC CSESDA - XREF LIST BEGINS. 
# 
      XREF
        BEGIN 
        PROC MESSAGE;        # SEND TEXT TO SYSTEM ACCOUNT FILE        #
        PROC SSBEBF;         # EXTRACT BIT FIELD                       #
        PROC SSBSBF;         # STORE BIT FIELD                         #
        FUNC SSDCAD U;       # CONVERT ASCII TO DISPLAY CODE           #
        FUNC XCDD U;         # CONVERT DECIMAL VALUE TO DISPLAY CODE   #
        END 
# 
****
# 
      DEF ACCT$ # 5 #;       # IDENTIFIER FOR ACCOUNT FILE             #
      DEF ABLANK$ # X"20" #; # ASCII BLANK                             #
  
      ITEM BITS;             # BIT PRSITION IN WORD -- STORE           #
      ITEM BITX;             # BIT POSITION IN WORD -- EXTRACT         #
      ITEM CHR I = 0;        # TEMPORARY TO STORE CHARACTER IN         #
      ITEM FINISHED B;       # FLAG INDICATING STATUS OF CONVERSION    #
      ITEM I;                # LOOP VARIABLE                           #
      ITEM WORDS;            # WORD POSITION -- STORE                  #
      ITEM WORDX;            # WORD POSITION -- EXTRACT                #
  
# 
*     THIS ARRAY DEFINES THE STATISTICS TEXT FORMAT THAT IS SENT WHEN 
*     THE PROC IS INVOKED.
# 
      ARRAY DIS$TXT [00:00] S(5); 
        BEGIN 
        ITEM DIS$SC     C(00,00,02) = ["SC"]; 
        ITEM DIS$TYPE   C(00,12,02);   # STATISTIC TYPE -- TE/AP       #
        ITEM DIS$C1     C(00,24,03) = [", C"];
        ITEM DIS$CNUM   C(00,42,01);   # LINE NUMBER                   #
        ITEM DIS$UNUM   U(00,42,06);
        ITEM DIS$C2     C(00,48,12) = [", "]; 
        ITEM DIS$TEXT   C(01,00,31);   # TEXT LINES                    #
        ITEM DIS$LIM    U(01,00,06);   # LINE INTRFACE MODULE (1..7)   #
        ITEM DIS$COMMA1 C(01,06,02);
        ITEM DIS$PORT   U(01,18,06);   # LIM PORT NUMBER (1..3)        #
        ITEM DIS$COMMA2 C(01,24,02);
        ITEM DIS$VCIR   U(01,36,24);   # VIRTUAL CIRCUIT NUMBER        #
        ITEM DIS$CNT1   U(01,00,36);   # BLKS XFERRED AND CHARS RCV-ED #
        ITEM DIS$CNT21  U(01,36,24);   # BLOCKS RECEIVED               #
        ITEM DIS$CNT22  U(02,00,12);
        ITEM DIS$CNT3   U(02,12,36);   # CHARACTERS TRANSFERRED        #
        END 
# 
*     THIS ARRAY IS USED AS A CONSTANT FOR TERMINATING THE ACCOUNT
*     MESSAGES. 
# 
      ARRAY END$TXT [00:00] S(1); 
        BEGIN 
        ITEM ETX$PER    C(00,36,01) = ["."];
        ITEM ETX$ZBYT   U(00,42,18) = [0];
        END 
# 
*     THIS ARRAY IS USED AS A TEMPORARY FOR AN INTEGER ITEM.
# 
      ARRAY ITEMP2 [00:00] S(1);
        BEGIN 
        ITEM IT2$CNST1  U(00,44,04);
        ITEM IT2$CNST2  U(00,48,12);
        ITEM IT2$ZERO   I(00,00,60) = [0];
        END 
      CONTROL EJECT;
# 
*                            CSESDA CODE BEGINS HERE
# 
# 
*     IF THIS SM IS STI/TE/U, THEN SET THE MESSAGE TYPE TO *TE*, ELSE 
*     ASSUME THAT THE MESSAGE IS STI/TE/U AND SET THE MESSAGE TYPE TO 
*     *AP*. 
# 
      IF WCB$SMID[0] EQ SMID"STITE" 
      THEN
        BEGIN 
        DIS$TYPE[0] = "TE"; 
        END 
      ELSE
        BEGIN 
        DIS$TYPE[0] = "AP"; 
        END 
# 
*     EXTRACT THE FIRST ASCII STRING IN SM AND STORE IT IN THE
*     ACCOUNT MESSAGE BUFFER, SET THE LINE NUMBER, TERMINATE THE
*     THE MESSAGE, AND SEND IT TO THE ACCOUNT DAYFILE.
# 
      DIS$CNUM[0] = "1";
  
      FINISHED = FALSE; 
      WORDX = 0;
      BITX = 16;
      WORDS = 1;
      BITS = 0; 
      FOR I=1 STEP 1 WHILE NOT FINISHED AND 
                           I LQ 7 
      DO
        BEGIN 
        SSBEBF(MSGBUF[0],WORDX,BITX,8,CHR); 
        IF CHR EQ ABLANK$ 
        THEN
          BEGIN 
          FINISHED = TRUE;
          END 
        ELSE
          BEGIN 
          SSBSBF(DIS$TXT,WORDS,BITS,6,SSDCAD(CHR)); 
          END 
        END 
  
      SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
      MESSAGE(DIS$TXT,ACCT$); 
# 
*     IF THE SM IS STI/TE, THEN EXTRACT THE DEVICE TYPE, CONVERT
*     IT TO DISPLAY CODE AND STORE IT IN THE MESSAGE BUFFER.
# 
      IF WCB$SMID[0] EQ SMID"STITE" 
      THEN
        BEGIN 
        DIS$UNUM[0] = DIS$UNUM[0] + 1;
  
        WORDX = 1;
        BITX = 12;
        WORDS = 1;
        BITS = 0; 
        FOR I=1 STEP 1 UNTIL 3
        DO
          BEGIN 
          SSBEBF(MSGBUF[0],WORDX,BITX,8,CHR); 
          SSBSBF(DIS$TXT,WORDS,BITS,6,SSDCAD(CHR)); 
          END 
  
        SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
        MESSAGE(DIS$TXT,ACCT$); 
        END 
# 
*     EXTRACT THE NEXT ASCII STRING IN SM AND STORE IT IN THE 
*     ACCOUNT MESSAGE BUFFER, SET THE LINE NUMBER, TERMINATE THE
*     THE MESSAGE, AND SEND IT TO THE ACCOUNT DAYFILE.
# 
      DIS$UNUM[0] = DIS$UNUM[0] + 1;
  
      FINISHED = FALSE; 
      WORDX = 1;
      BITX = 36;
      WORDS = 1;
      BITS = 0; 
      FOR I=1 STEP 1 WHILE NOT FINISHED AND 
                           I LQ 31
      DO
        BEGIN 
        SSBEBF(MSGBUF[0],WORDX,BITX,8,CHR); 
        IF CHR EQ ABLANK$ 
        THEN
          BEGIN 
          FINISHED = TRUE;
          END 
        ELSE
          BEGIN 
          SSBSBF(DIS$TXT,WORDS,BITS,6,SSDCAD(CHR)); 
          END 
        END 
  
      SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
      MESSAGE(DIS$TXT,ACCT$); 
# 
*     EXTRACT THE NEXT ASCII STRING IN SM AND STORE IT IN THE 
*     ACCOUNT MESSAGE BUFFER, SET THE LINE NUMBER, TERMINATE THE
*     THE MESSAGE, AND SEND IT TO THE ACCOUNT DAYFILE.
# 
      DIS$UNUM[0] = DIS$UNUM[0] + 1;
  
      FINISHED = FALSE; 
      WORDX = 5;
      BITX = 44;
      WORDS = 1;
      BITS = 0; 
      FOR I=1 STEP 1 WHILE NOT FINISHED AND 
                           I LQ 31
      DO
        BEGIN 
        SSBEBF(MSGBUF[0],WORDX,BITX,8,CHR); 
        IF CHR EQ ABLANK$ 
        THEN
          BEGIN 
          FINISHED = TRUE;
          END 
        ELSE
          BEGIN 
          SSBSBF(DIS$TXT,WORDS,BITS,6,SSDCAD(CHR)); 
          END 
        END 
  
      SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
      MESSAGE(DIS$TXT,ACCT$); 
# 
*     CONVERT THE LIM/MCI, LIM PORT, AND VIRTUAL CIRCUIT NUMBERS AND
*     STORE THEM IN THE ACCOUNTING MESSAGE, SET THE LINE NUMBER, SEPA-
*     THE VALUES BY COMMAS, TERMINATE THE MESSAGE, AND SEND IT TO THE 
*     ACCOUNT DAYFILE.
# 
      DIS$LIM[0] = XCDD(STILIM[0]); 
      DIS$PORT[0] = XCDD(STIPN[0]); 
      DIS$VCIR[0] = XCDD(STIVCN[0]);
  
      DIS$UNUM[0] = DIS$UNUM[0] + 1;
  
      DIS$COMMA1[0] = ", "; 
      DIS$COMMA2[0] = ", "; 
  
      WORDS = 2;
      BITS = 0; 
      SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
      MESSAGE(DIS$TXT,ACCT$); 
# 
*     CONVERT THE BLOCKS TRANSMITTED, BLOCKS RECEIVED, AND CHARACTERS 
*     TRANSMETTED VALUES AND PUT THEM IN THE ACCOUNT MESSAGE BUFFER,
*     TERMINATE THE MESSAGE, AND SEND IT TO THE ACCOUNT DAYFILE.
# 
      DIS$CNT1[0] = XCDD(STIDBT[0]);
      WORDS = 1;
      BITS = 36;
      SSBSBF(DIS$TXT,WORDS,BITS,36,XCDD(STIDBR[0]));
      IT2$CNST1[0] = STIDCT1[0];
      IT2$CNST2[0] = STIDCT2[0];
      DIS$CNT3[0] = XCDD(ITEMP2); 
  
      DIS$UNUM[0] = DIS$UNUM[0] + 1;
  
      WORDS = 2;
      BITS =48; 
      SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
      MESSAGE(DIS$TXT,ACCT$); 
# 
*     EXTRACT THE NUMBER OF CHARACTERS RECEIVED, CONVERT IT, STORE
*     IT IN THE ACCOUNT MESSAGE BUFFER, SET THE LINE NUMBER, TER- 
*     MINATE THE MESSAGE, AND SEND IT THE THE ACCOUNT DAYFILE.
# 
      DIS$CNT1[0] = XCDD(STIDCR[0]);
  
      DIS$UNUM[0] = DIS$UNUM[0] + 1;
  
      WORDS = 1;
      BITS = 36;
      SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
      MESSAGE(DIS$TXT,ACCT$); 
# 
*     EXTRACT THE CONNECT TIME STRING IN SM AND STORE IT IN THE 
*     ACCOUNT MESSAGE BUFFER, SET THE LINE NUMBER, TERMINATE THE
*     THE MESSAGE, AND SEND IT TO THE ACCOUNT DAYFILE.
# 
      DIS$CNT1[0] = XCDD(STITI[0]); 
  
      DIS$UNUM[0] = DIS$UNUM[0] + 1;
  
      WORDS = 1;
      BITS = 36;
      SSBSBF(DIS$TXT,WORDS,BITS,24,END$TXT);
  
      MESSAGE(DIS$TXT,ACCT$); 
  
  
END # CSESDA #
TERM
