*COMDECK  CCLEXP
 CCLEXP   TITLE  EXPAND PROCEDURE BODY LINES
**        CCLEXP - EXPAND PROCEDURE BODY LINES
* 
* 
*         CCLEXP CREATES A NEW EXPANDED LINE IMAGE.  THE
*         NEW LINE IS CREATED BY TRANSFERRING A CHARACTER 
*         STRING AND ITS FOLLOWING SEPARATOR FROM THE 
*         ORIGINAL PROCEDURE BODY LINE IMAGE.  IF THE 
*         STRING IS EQUAL TO A FORMAL PARAMETER NAME, THEN
*         THE ACTUAL PARAMETER IS SUBSTITUTED.  IF THE NEW
*         LINE IS TOO LARGE FOR THE BUFFER, IT MUST BE
*         BROKEN SO THAT THE LAST CHARACTER IN THE NEW LINE 
*         IS A SEPARATOR.  IF A SEPARATOR IS A CONCATENATION CHARACTER
*         (NORMALLY _ ), IT IS DELETED SO THAT THE ADJACENT STRINGS ARE 
*         CONCATENATED.  IF THE SEPARATOR IS THE INHIBIT SYMBOL 
*         (NORMALLY # ), IT IS DELETED.  IF THE INHIBIT CHARACTER IS
*         FOLLOWED IMMEDIATELY BY A CHARACTER STRING, THAT STRING MUST
*         BE TRANSFERRED WITHOUT SUBSTITUTION.  IF ANOTHER SEPARATOR
*         FOLLOWS THE INHIBIT CHARACTER, THE SEPARATOR IS TRANSFERRED 
*         WITHOUT EXAMINATION.
* 
*         THE ORIGINAL LINE IMAGE FROM THE PROCEDURE BODY 
*         IS SCATTERED INTO SCATBF2.  EACH CHARACTER STRING 
*         IS ASSEMBLED AND PROCESSED AS A PAIR WITH ITS 
*         FOLLOWING SEPARATOR.  EITHER THE STRING OR A
*         SUBSTITUTED STRING IS UNPACKED INTO SCATBF1. SCATBF1
*         WILL CONTAIN THE NEW LINE.
* 
*         WHEN CONCATENATION IS REQUIRED, THE CONCATENATED
*         STRING IS BUILT UP IN SCATX AND THEN TRANFERRED 
*         AS ONE STRING WHEN CONCATENATION IS COMPLETE. 
* 
*         IF THE EXPANDED LINE IS LARGER THAN SCATBF1, CCLEXP 
*         RETURNS.  THE REMAINDER OF THE LINE WILL BE EXPANDED
*         WHEN CCLEXP IS RE-ENTERED.
* 
*         ENTRY  - SCATBF2 CONTAINS PROCEDURE BODY LINE 
* 
*         EXIT   - SCATBF1 CONTAINS THE EXPANDED LINE 
*                TO *BRWERR4* IF STRING OR STATEMENT TOO LONG.
* 
*         USES   X - ALL. 
*                A - 1, 2, 3, 4, 5, 6, 7. 
*                B - 2, 3, 4, 5, 6, 7.
* 
*         CALLS  STRANS, STRPKS, STRUPS.
  
 CCLEXP   SUBR   =
  
 EXP      IFEQ   PB.EXP,0 
          SX6    1
 EXP      ELSE
          SA1    INHIBIT
          SX6    B1 
          BX7    X1 
          SA7    INHIBEXP          SET EXPANSION FLAG/INHIBIT CHARACTER 
 EXP      ENDIF 
  
          SA6    ANSMDE            ANY .GT. 44B ARE SEP 
          MX7    0
          MX6    0
          SA7    SCATBF1           CLEAR HEADERS
          SA6    SCATX
          SA7    EXPINHT           NEW LINE 
          SA6    EXPCAT 
          SA7    EXPENCT
          SA6    MORLINE
          SA7    EXPSEP 
          SA6    EXPLITK
          SA3    IACEXP            CHECK FOR .EXPAND(OFF) 
          SA1    MOREXP 
          NZ     X3,EXP10          A .EXPAND(OFF) IS IN EFFECT
          ZR     X1,EXP18          OLD LINE COMPLETE/EXPAND NEW LINE
  
          SX7    1
          SA7    MORLINE           INDICATE CONTINUATION LINE 
          SA6    MOREXP 
          SA1    EXPHSTR           OLD STRING 
          SA3    EXPNCST           SIZE OF STRING 
          SB2    X3 
          SA4    EXPSP             SEPARATOR
          BX7    X4 
          SA7    ANSSEP 
          JP     EXP150            REMAINDER OLD LINE TO BUFFER 
  
  
*         A .EXPAND(OFF) IS IN EFFECT.  THERE WILL BE NO
*         SUBSTITUTION FOR PROCEDURE PARAMETERS, SO MOVE THE
*         CONTENTS OF SCATBF2 TO SCATBF1. 
  
 EXP10    BSS    0                 .NOSUB IN EFFECT 
          SA2    SCATBF2
          EX0    X2,SBTOT 
          SB7    X0 
          SB6    B0 
  
 EXP15    BSS    0                 MOVE SCATBF2 TO SCATBF1
          SA2    SCATBF2+B6 
          BX7    X2 
          SA7    SCATBF1+B6 
          SB6    B6+B1
          LE     B6,B7,EXP15       NEXT CHARACTER 
          JP     EXP210            CLEAR FLAGS AND RETURN 
  
 EXP18    BSS    0
          SA7    EXPSP             CLEAR PREVIOUS SEPARATOR 
  
 EXP20    BSS    0
          SA2    SCATBF2
          RJ     =XSTRANS 
  
          SA5    ANSSEP 
          BX7    X5 
          SA5    EXPSP
          SA7    A5                STORE ANSSEP AS PREVIOUS SEP 
          SA4    ANSCHR 
          SA3    EXPINHT
          SA1    ANSSTR 
          SB2    X4 
          SB7    10 
          NZ     X3,EXP40          PREVIOUS CHAR. WAS INHIBIT CHAR. 
  
          ZR     X4,EXP40          NULL STRING
  
          LT     B7,B2,EXP40       MORE THAN 10 CHARACTERS
  
          SA3    EXPCAT 
          SA4    IACSUB 
          NZ     X3,EXP25    IF PREVIOUS CHARACTER WAS CONCATENATION
  
          NZ     X4,EXP40    IF EXPLICIT EXPANSION REQUESTED
  
  
 OSNOS    IFEQ   HOST,NOS 
*         CCLEXP HAS TO DETERMINE WHETHER IT IS PROCESSING
*         AN ASCII STRING.  IF THE STRING CONTAINS 6/12 
*         ASCII CHARACTERS THEN STRANS MAY HAVE PICKED UP 
*         AN ASCII PREFIX (76B OR 74B) AS A DELIMITER.  IN
*         THIS CASE THIS STRING SHOULD NOT BE COMPARED TO 
*         THE HEADER PARAMETERS FOR SUBSTITUTION. 
  
          SX6    X5-76B 
          SX0    X7-76B 
          ZR     X6,EXP40          PREVIOUS SEP ASCII/SKIP SUBSTITUTION 
          NZ     X0,EXP25          NOT PREFIX, CHECK HEADER PARAMETERS
  
*         AN ASCII 76B PREFIX WAS FOUND, SO CHECK THE FOLLOWING 
*         6 BITS FOR DISPLAY CODE ALPHA CHARACTER.
  
          EX6    X2,SBTOT 
          SB4    X2                CURRENT CHARACTER IN BUFFER
          SB5    X6                TOTAL CHARACTERS IN BUFFER 
          GE     B4,B5,EXP25       END OF STRING, CHECK SUBSTITUTION
  
          SB4    B4+B1
          SA5    A2+B4             NEXT CHARACTER 
          SX0    X5-44B 
          NG     X0,EXP40          ASCII CHARACTER, SKIP SUBSTITUTION 
  
 OSNOS    ENDIF 
*         COMPARE THIS STRING WITH HEADER PARAMETERS
  
 EXP25    BSS    0
          SA5    PPTCL
          SB6    X5-LE.PPT
 EXP30    BSS    0
          LT     B6,B0,EXP40       PPT SEARCH COMPLETE
  
          SA3    PPT+W.PPFPN+B6    FETCH PARAMETER NAME 
          BX0    X1-X3
          SB6    B6-LE.PPT
          NZ     X0,EXP30          NEXT PARAMETER 
  
*         REPLACEMENT STRING IN FPS 
  
          SA3    A3+W.PPDO1-W.PPFPN 
          EX6    X3,PPDC1 
          EX7    X3,PPDO1 
          SB2    X6                NUMBER OF CHARACTERS 
          SA1    FPS+X7            BEGINNING OF STRING
          SA3    A3+W.PPLIT-W.PPDO1 
          LX3    59-S.PPLIT 
          PL     X3,EXP40          IF NOT A LITERAL KEYWORD 
  
          ZR     B2,EXP35          IF A NULL STRING 
  
*         CHECK TO SEE IF VALUE IS ALREADY A LITERAL. 
  
          SA2    A1 
          SB3    B2 
          SB4    B0                INITIALIZE $ COUNT 
          SB5    B1                INITIALIZE $ FLAG
          MX0    -6 
          SB6    10 
 EXP31    LX2    6
          BX6    -X0*X2            EXTRACT CHARACTER FROM STRING
          SB3    B3-B1
          SB6    B6-B1
          SX3    X6-1R+ 
          NG     X3,EXP33          IF ALPHA OR NUMERIC
  
          SX3    X6-1R$ 
          NZ     X3,EXP32          IF NOT A $ SYMBOL
  
          SB5    -B5               TOGGLE $ SYMBOL FLAG 
          SB4    B4+B1             INCREMENT COUNT
          JP     EXP33             CHECK FOR END OF STRING
  
 EXP32    BSS    0
          SX3    X6-1R* 
          ZR     X3,EXP33          IF NON-DELIMITER * FOUND 
  
          GE     B5,B0,EXP35       IF DELIMITER NOT WITHIN $ SYMBOLS
  
 EXP33    BSS    0
          ZR     B3,EXP34          IF ALL CHARACTERS EXAMINED 
  
          NZ     B6,EXP31          IF MORE LEFT IN CURRENT WORD 
  
          SA2    A2+1 
          SB6    10 
          JP     EXP31
  
 EXP34    BSS    0
          ZR     B4,EXP35          IF NO $ SYMBOLS FOUND
  
          PL     B5,EXP40          IF ALREADY IN LITERAL FORMAT 
  
 EXP35    BSS    0
          SX7    B1 
          SA7    EXPCAT            FORCE CONCATENATION
          SA7    EXPLITK           INDICATE LITERAL KEYWORD 
  
  
*         A1 = REPLACEMENT STRING BEGINNING ADDRESS 
*         B2 = NUMBER OF CHARACTERS IN REPLACEMENT
  
 EXP40    BSS    0
          SA3    EXPINHT
          SA5    ANSSEP 
          ZR     X3,EXP50          PREVIOUS WAS NOT INHIBIT CHAR. 
  
          MX6    0
          SA6    A3                CLEAR EXPINHT
          NG     X5,EXP50          NO SEPARATOR 
  
          EQ     B0,B2,EXP100      NULL AND INHIBIT - ACCEPT CHAR.
  
 EXP50    BSS    0
          SA4    INHIBIT           INHIBIT CHARACTER
          BX0    X5-X4
          NZ     X0,EXP60          SEPARATOR NOT INHIBIT
  
          SX7    B1 
          MX5    1                 INHIBIT TRANSFER OF SEPARATOR
          SA7    EXPCAT            SET CONCATENATION FLAG 
          SA7    EXPINHT           SET INHIBIT FLAG 
          JP     EXP100 
  
 EXP60    BSS    0
          SA2    CCATENAT 
          BX0    X5-X2             CONCATENATION CHARACTER
          NZ     X0,EXP70          NOT CONCATENATION
  
          SX7    B1 
          MX5    1                 INHIBIT TRANSFER OF SEPARATOR
          SA7    EXPCAT            SET CONCATENATION
          JP     EXP100            ADD NEW STRING 
  
 EXP70    BSS    0
          SA3    SCATBF2
          EX6    X3,SBTOT 
          EX7    X3,SBCUR 
          SB6    X6                TOTAL SIZE OF OLD LINE 
          SB7    X7                CURRENT CHARACTER
          GE     B7,B6,EXP90       END OF LINE
  
          SA3    SCATBF2+1+B7      NEXT CHARACTER 
          SA4    INHIBIT
          BX6    X3-X4
          SA2    CCATENAT 
          BX7    X3-X2
          ZR     X6,EXP80          INHIBIT CHARACTER FOUND
          NZ     X7,EXP90          NEITHER INHIBIT OR CONCATENATION 
  
 EXP80    BSS    0
          SX7    B1 
          SA7    EXPCAT            SET CONCATENATION FLAG SINCE THE 
*                                  NEXT CHAR. IS CONCATENATION OR INHIBIT 
          JP     EXP100            ADD STRING TO NEW LINE 
  
 EXP90    BSS    0
          SA4    EXPCAT 
          ZR     X4,EXP150         NOT CONCATENATING
  
          SX7    B1 
          MX5    1                 DONT ADD THIS SEP. TO SCATX
          SA7    EXPENCT           END OF CONCATENATION 
  
*         FLAGS ARE NOW SET TO INDICATE THE CONCATENATION 
*         OR ENDING CONCATENATION PROCESS 
  
*         A1 = STRING BEGINNING ADDRESS 
*         X5 = SEPARATOR / FLAG 
*         B2 = NUMBER OF CHARACTERS IN STRING 
  
 EXP100   BSS    0
          SB3    B2 
          NG     X5,EXP110         SEPARATOR NOT TO TRANSFER
  
          SB3    B2+B1
 EXP110   BSS    0
          SA2    SCATX
          BX7    X5 
          SA7    EXPSEP            SAVE SEPARATOR / FLAG
          SB4    V.CCCPC
          MX0    59-S.SBTOT 
          BX3    -X0*X2 
          AX3    S.SBTOT-N.SBTOT+1
          SB5    X3 
          SB7    B4-B5
          SB7    B7-B3             SPACE LEFT AFTER CURRENT STRING
          GE     B7,B0,EXP130      IF SUFFICIENT ROOM FOR STRING
  
          SB2    B2+B7             ADJUST FOR OVERFLOW
 EXP130   BSS    0
          SA4    EXPLITK
          SB3    A2+B1
          MX0    -6 
          BX7    X4 
          ZR     X4,EXP131         IF NOT A LITERAL KEYWORD 
  
          SX7    1R$
          SB7    B7-B1
          LT     B7,B0,EXP131      IF NO ROOM TO INSERT $ SYMBOL
  
          SA7    B5+B3
          SB5    B5+B1
 EXP131   BSS    0
          GE     B0,B2,EXP134      IF NO CHARACTERS TO UNPACK 
  
          SB6    10 
 EXP132   BSS    0
          LX1    6
          BX6    -X0*X1            EXTRACT CHARACTER
          SA6    B5+B3
          SB5    B5+B1
          SB2    B2-B1
          SB6    B6-B1
          ZR     X7,EXP133         IF NOT A LITERAL KEYWORD 
  
          BX6    X7-X6
          NZ     X6,EXP133         IF NOT A $ SYMBOL
  
          SB7    B7-B1
          LT     B7,B0,EXP133      IF NO ROOM TO INSERT $ SYMBOL
  
          SA7    B5+B3
          SB5    B5+B1
 EXP133   BSS    0
          GE     B0,B2,EXP134      IF ALL CHARACTERS UNPACKED 
  
          LT     B0,B6,EXP132      IF WORD NOT COMPLETE 
  
          SA1    A1+1 
          SB6    10 
          LT     B0,B2,EXP132      IF MORE CHARACTERS TO UNPACK 
  
 EXP134   BSS    0
          BX6    X6-X6
          ZR     X7,EXP135         IF NO LITERAL KEYWORD
  
          SB7    B7-B1
          SA6    EXPLITK           CLEAR LITERAL KEYWORD FLAG 
          LT     B7,B0,EXP135      IF NO ROOM FOR CLOSING $ SYMBOL
  
          SA7    B5+B3
          SB5    B5+B1
 EXP135   BSS    0
          SA1    EXPSEP 
          NG     X1,EXP140         IF SEPARATOR NOT TO BE TRANSFERRED 
  
          BX7    X1                TRANSFER SEPARATOR TO BUFFER 
          SA7    B5+B3
          SB5    B5+B1
 EXP140   BSS    0
          SA6    B5+B3             CLEAR NEXT WORD IN BUFFER
          MX7    -N.SBCUR 
          SX0    B5                NEW TOTAL OF CHARACTERS IN BUFFER
          BX2    -X7*X2 
          LX0    S.SBTOT-N.SBTOT+1
          BX7    X0+X2
          BX2    X0+X2
          SA7    A2                STORE UPDATED BUFFER HEADER
          GE     B7,B0,EXP145      IF THE STRING WAS NOT TOO LONG 
  
          SA1    MSGBUF 
          RJ     =XSTRPKS 
          SX3    MSGBUF 
          RJ     STRMGA      ASSEMBLE AND ISSUE ABORT MESSAGE 
  
          SX3    MSG250            STRING .GT. "IP.SCL" 
          JP     =XBRWERR4         ISSUE MSG AND ABORT
  
 EXP145   BSS    0
          SA4    EXPENCT
          ZR     X4,EXP20          CONCATENATION NOT ENDED
  
          SA2    SCATX
          SA1    EXPHSTR
          RJ     =XSTRPKS 
  
          SA1    EXPHSTR           GET X1 FOR INPUT TO STRUPS 
          MX6    0
          SA6    EXPCAT 
          SA6    EXPENCT           CLEAR END OF CONCATENATION 
          SA6    SCATX
  
*         ADD THE STRING TO THE NEW LINE.  THE STRING IS EITHER 
*         NOT INVOLVED WITH CONCATENATION OR THE STRING IS
*         THE RESULTING STRING OF SOME CONCATENATION
  
*         A1 = STRING BEGINNING ADDRESS 
*         B2 = NUMBER OF CHARACTERS 
  
 EXP150   BSS    0
          SA5    ANSSEP 
          SB3    B2 
          NG     X5,EXP160         SEPARATOR NOT TRANSFERRED
  
          SB3    B2+B1             ADD 1 FOR SEPARATOR
 EXP160   BSS    0
          SA2    SCATBF1
          EX6    X2,SBTOT 
          SB6    V.CCCPC
          SB7    X6+B3             SIZE OF NEW IMAGE
          LT     B6,B7,EXP190      NOT ENOUGH SPACE FOR STRING
  
          EQ     B0,B2,EXP170      NULL 
  
          RJ     =XSTRUPS 
  
 EXP170   BSS    0
          SA1    ANSSEP 
          NG     X1,EXP180         SEPARATOR NOT ADDED TO LINE
  
          LX1    54 
          SB2    B1 
          RJ     =XSTRUPS          ADD SEPARATOR
  
 EXP180   BSS    0
          PL     X5,EXP20          NEXT STRING IN LINE
  
          JP     EXP210            RESTORE ANSMDE - RETURN
  
*         THE REPLACEMENT STRING WILL NOT FIT IN SCATBF1
*         THE REMAINDER OF THE LINE WILL BE PROCESSED 
*         UPON RE-ENTRY.
  
 EXP190   BSS    0
          SX7    B1 
          SA7    MOREXP            INDICATE LINE TO BE CONTINUED
  
*         SAVE STRING (A1 BEGINNING ADDRESS), SIZE
*         OF STRING AND SEPARATOR 
  
          SA3    ANSSEP 
          BX7    X3 
          SA7    EXPSP
          SB6    V.CCCW            MOVE STRING TO EXPHSTR 
          SB4    B0 
          SX7    B2 
          SA7    EXPNCST           SAVE SIZE OF STRING
 EXP200   BSS    0                 NEXT WORD
          LE     B2,B0,EXP210      RETURN WHEN DONE 
  
          SA4    A1+B4
          BX7    X4 
  
          SA7    EXPHSTR+B4 
          SB2    B2-10
          SB4    B4+B1
          LT     B4,B6,EXP200      NEXT WORD
  
          SX3    MSG253            EXPANDED LINE TOO LARGE
          JP     =XBRWERR4         ISSUE MSG AND ABORT
  
  
 EXP210   BSS    0
          SX7    B0+
          SA7    ANSMDE            ALL ARE NOT SEPARATORS 
  
 EXP      IFNE   PB.EXP,0 
          SA7    INHIBEXP          CLEAR STATEMENT EXPANSION FLAG 
 EXP      ENDIF 
  
          JP     CCLEXP            RETURN 
  
 EXPINHT  BSSZ   1                 1 = INHIBIT CHARACTER
 EXPCAT   BSSZ   1                 1 = CONCATENATION CHARACTER
 EXPENCT  BSSZ   1                 1 = END CONCATENATION
 EXPHSTR  BSS    0                 SAVE HEADER STRING 
          BSS    V.CCCW 
 EXPNCST  BSS    1                 NUMBER OF CHARACTERS 
 EXPSP    BSS    1                 SAVE SEPARATOR 
 EXPSEP   BSSZ   1                 SEPARATOR / FLAG 
 EXPLITK  BSS    1                 1 = EXPANDING LITERAL KEYWORD
