COMCZAP 
COMMON
          CTEXT  COMCZAP - *Z* ARGUMENT PROCESSOR.
          IF     -DEF,QUAL$,1 
          QUAL   COMCZAP
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 ZAP      SPACE  4
***       COMCZAP - *Z* ARGUMENT PROCESSOR. 
*         A. D. FORET.       77/02/08.
*         D. R. HILGREN.     79/04/15.
*         J. L. LARSON.      79/04/15.
 ZAP      SPACE  4,10 
***       ZAP - *Z* ARGUMENT PROCESSOR. 
* 
*         ENTRY  (X2) = ADDRESS OF INPUT FET TO ENTER DIRECTIVES INTO.
*                (B6) = STRING BUFFER LENGTH.  REQUIRED AND USED ONLY 
*                       WHEN VARIABLE LENGTH STRING BUFFER OPTION IS
*                       SELECTED (USBL$ DEFINED).  SEE COMCUSB. 
*                USBB = STRING BUFFER.  MUST BE USER DEFINED IF USBL$ 
*                       IS SELECTED.  SEE COMCUSB.
*                CCDR = CONTROL STATEMENT IMAGE.
* 
*         EXIT   DIRECTIVES ENTERED INTO BUFFER OF FET SPECIFIED. 
*                FET STATUS SET TO EOR READ.
*                IF *ZAP$* IS DEFINED IN THE CALLING PROGRAM, 
*                *COMCZAP* WILL APPEND A TERMINATOR AT THE END OF 
*                A DIRECTIVE IF NO TERMINATOR (PERIOD OR RIGHT
*                PARENTHESIS) HAS BEEN DETECTED WITHIN THE DIRECTIVE. 
*                NOTE THAT ANY PERIOD OR RIGHT PARENTHESIS WITHIN 
*                THE DIRECTIVE (EVEN IN A LITERAL OR AS PART OF A 
*                LOGICAL EXPRESSION) WILL PREVENT ANOTHER TERMINATOR
*                FROM BEING APPENDED AT THE END OF THE DIRECTIVE, 
*                SO THE USER MUST SUPPLY THE ADDITIONAL TERMINATOR
*                IN THIS CASE IF IT IS NEEDED.
* 
*         USES   A - 1, 3, 6, 7.
*                B - 2, 6, 7. 
*                X - 1, 2, 3, 4, 6, 7.
* 
*         CALLS  USB. 
* 
*         MACROS RECALL, WRITES.
* 
*         NOTES  THE FIRST CHARACTER AFTER THE CONTROL STATEMENT
*                TERMINATOR IS THE SEPARATOR CHARACTER FOR ALL
*                DIRECTIVES ON THE CONTROL STATEMENT.  ANY DISPLAY
*                CODE CHARACTER NOT USED IN ANY DIRECTIVE (INCLUDING
*                SPACE) CAN BE USED AS THE SEPARATOR CHARACTER. 
*                MULTIPLE CONSECUTIVE SEPARATORS GENERATE EMPTY LINES.
  
  
 ZAP      SUBR               ENTRY/EXIT 
  
*         SET INPUT FET STATUS TO EOR READ. 
  
          BX4    X2 
          RECALL X2 
          MX3    42 
          SA1    X4          SET EOR READ STATUS IN FET 
          SX2    31B
          BX6    X3*X1
          SX3    41B         PRESET TERMINATOR INDICATOR
          BX6    X6+X2
          LX3    12 
          SA6    A1 
          SB2    CCDR        FWA CONTROL STATEMENT
          RJ     USB         UNPACK CONTROL STATEMENT 
  
*         FIND CONTROL STATEMENT TERMINATOR.
  
 ZAP1     SA1    B6          GET NEXT CHARACTER FROM CONTROL STATEMENT
          SB2    X1 
          LX7    X3,B2
          SB6    B6+B1
          GE     B6,B7,ZAPX  IF END OF CONTROL STATEMENT
          PL     X7,ZAP1     IF NOT TERMINATOR
  
*         EXTRACT ONE DIRECTIVE.
  
 ZAP2     SA3    B6          GET SEPARATOR
          SB2    B6+B1       SAVE FWA DIRECTIVE 
 .C       IF     DEF,ZAP$ 
          SX2    B1          ASSUME NO TERMINATOR FOUND 
 .C       ENDIF 
 ZAP3     SB6    B6+B1
          SA1    B6+         GET NEXT CHARACTER FROM CONTROL STATEMENT
          BX7    X3-X1       CHECK FOR SEPARATOR
          GT     B6,B7,ZAP4  IF END OF CONTROL STATEMENT
 .D       IF     DEF,ZAP$ 
          ZR     X7,ZAP4     IF END OF DIRECTIVE
          SX7    X1-1R. 
          ZR     X7,ZAP3.1   IF TERMINATOR
          SX7    X1-1R) 
          NZ     X7,ZAP3     IF NOT TERMINATOR
 ZAP3.1   SX2    B0          INDICATE TERMINATOR FOUND
          EQ     ZAP3        GET SEPARATOR
  
 .D       ELSE
          NZ     X7,ZAP3     IF NOT END OF DIRECTIVE
 .D       ENDIF 
  
*         ENTER DIRECTIVE INTO INPUT FET BUFFER.
  
 ZAP4     SX6    B6          SAVE SEPARATOR ADDRESS 
          SA6    ZAPA 
          SB7    B6-B2       SET DIRECTIVE LENGTH 
          EQ     B2,B6,ZAP7  IF TWO SEPARATORS AT END OF STATEMENT
 .A       IF     DEF,ZAP$ 
          BX7    X1          SAVE SEPARATOR 
          SA7    ZAPB 
          ZR     X2,ZAP5     IF TERMINATOR FOUND
          SX6    1R.
          SA6    A1 
          SB7    B7+B1       INCREMENT DIRECTIVE LENGTH FOR TERMINATOR
 ZAP5     BSS    0
 .A       ENDIF 
          WRITES X4,B2,B7 
          SA1    ZAPA        RESTORE SEPARATOR ADDRESS
 .B       IF     DEF,ZAP$ 
          SA3    ZAPB        RESTORE PROPER SEPARATOR 
          BX6    X3 
          SA6    X1 
 .B       ENDIF 
 ZAP6     SA3    USBC        RESTORE LWA CONTROL STATEMENT
          SX4    X2          RESET INPUT FET ADDRESS
          SB6    X1 
          SB7    X3+
          LT     B6,B7,ZAP2  IF MORE DIRECTIVES TO PROCESS
          EQ     ZAPX        RETURN 
  
 ZAP7     WRITES X4,ZAPC,1   WRITE BLANK LINE 
          SA1    ZAPA        RESTORE SEPARATOR ADDRESS
          EQ     ZAP6        PROCESS NEXT DIRECTIVE 
  
  
 ZAPA     CON    0           SEPARATOR ADDRESS
 ZAPB     CON    0           SEPARATOR USED BY CALLER 
 ZAPC     CON    1R          BLANK LINE 
 ZAP      SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 ZAP      EQU    /COMCZAP/ZAP 
 QUAL$    ENDIF 
          ENDX
