COMCARG 
COMMON
          CTEXT  COMCARG - PROCESS ARGUMENTS. 
 ARG      SPACE  4
          IF     -DEF,QUAL$,1 
          QUAL   COMCARG
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 ARG      SPACE  4
***       ARG - PROCESS ARGUMENTS.
*         G. R. MANSFIELD.  70/10/09. 
*         B. G. ALBRECHT.   88/01/22. 
*         P. C. SMITH.      88/01/22. 
 ARG      SPACE  4
***              ARG PROCESSES AN ARGUMENT LIST BY THE USE OF AN
*         EQUIVALENCE TABLE.
* 
*         ENTRY  (B1) = 1.
*                (B4) = ARGUMENT COUNT. 
*                (A4) = ADDRESS OF FIRST ARGUMENT.
*                (X4) = FIRST ARGUMENT. 
*                (B5) = ADDRESS OF ARGUMENT TABLE IN ONE OF THE 
*                       FOLLOWING FORMS - 
*                       1.  12/ OP, 18/ ASV, 12/ ST, 18/ ADDR 
*                       2.  12/ 77B, 18/ ASV, 12/ ST, 18/ ADDR
*                           42/ OP, 18/0
*                            77B = INDICATION THAT TWO-WORD ENTRY TABLE 
*                                  FORMAT WAS USED. 
*                            OP = ONE TO SEVEN CHARACTER OPTION.
*                            ASV = ADDRESS OF ASSUMED VALUE.
*                            ST = STATUS. 
*                            ADDR = ADDRESS TO STORE ARGUMENT.
*                       THE LOWER 18 BITS OF THE ASSUMED VALUE ARE
*                       ENTERED INTO THE EQUIVALENCED ARGUMENT. 
* 
*                       IF *ASV* .LT. 0, THE ARGUMENT MUST NOT BE 
*                       EQUIVALENCED. 
*                       IF *ASV* = *ADDR*, ONLY ONE ENTRY OF THAT 
*                       ARGUMENT WILL BE ALLOWED (*OP* IS SET TO - 0).
* 
*                       IF STATUS = 4000B, A ZERO *0* PARAMETER IS
*                       RETAINED AS A DISPLAY ZERO, OTHERWISE A 
*                       VALUE OF ZERO IS STORED.
* 
*                       IF STATUS = 2000B, THE *ADDR* IS THE ADDRESS
*                       OF A TABLE.  IF A SEQUENCE OF ARGUMENT VALUES 
*                       SEPARATED BY SLASHES IS SPECIFIED, THE VALUES 
*                       WILL BE STORED AS SUCCESSIVE ENTRIES IN THE 
*                       TABLE.  NULL ARGUMENTS WILL BE IGNORED.  A ZERO 
*                       (*0*) ARGUMENT WILL BE RETAINED AS A DISPLAY
*                       ZERO.  THE LOWER 18 BITS OF EACH ARGUMENT VALUE 
*                       WILL BE SET TO BINARY ZERO.  A ZERO WORD WILL 
*                       BE STORED IN THE TABLE FOLLOWING THE LAST 
*                       SPECIFIED VALUE.
* 
*         EXIT   (X1) .NE. 0, IF ARGUMENT ERROR DETECTED. 
*                AN ERROR STATUS IS RETURNED FOR THE FOLLOWING
*                CONDITIONS - 
*                1.  OPTION NOT FOUND IN TABLE
*                2.  SINGLE ARGUMENT EQUIVALENCED 
*                3.  ILLEGAL RE-ENTRY OF ARGUMENT 
* 
*         USES   X - 0, 1, 2, 3, 4, 6, 7. 
*                B - 2, 3, 4. 
*                A - 2, 3, 4, 7.
  
  
 ARG      SUBR               ENTRY/EXIT 
          MX0    42 
          ZR     B4,ARG11    IF NO ARGUMENTS
          SX1    B1          PRESET ERROR 
  
*         SEARCH FOR MATCH IN ARGUMENT TABLE. 
  
 ARG1     ZR     X4,ARGX     IF NULL ARGUMENT 
          SA2    B5-B1
          MX3    12 
 ARG1.1   SA2    A2+B1       GET NEXT OPTION
          ZR     X2,ARGX     IF END OF OPTION TABLE 
          BX6    X3*X2       CHECK FOR KEYWORD MATCH
          BX7    X6 
          LX7    12 
          SX7    X7-77B 
          NZ     X7,ARG1.2   IF ARGUMENT LESS THAN THREE CHARACTERS 
          SA2    A2+B1       GET SECOND WORD OF THE ENTRY 
          BX6    X0*X2       GET OPTION 
 ARG1.2   BX6    X4-X6
          BX6    X0*X6
          NZ     X6,ARG1.1   IF NO MATCH
  
*         CHECK FOR EQUIVALENCE ALLOWED.
  
          NZ     X7,ARG2     IF ONE WORD ENTRY
          SA2    A2-1 
 ARG2     SX7    X4-1R=      CHECK FOR EQUIVALENCE SEPARATOR
          SB2    X2          SET VALUE ADDRESS
          LX2    30          GET ASSUMED VALUE
          ZR     X7,ARG2.1   IF NOS *=* 
          SX7    X4-2        CHECK FOR PRODUCT SET FORMAT *=* 
 ARG2.1   SB3    X2 
          PL     B3,ARG3     IF EQUIVALENCE ALLOWED 
          SA3    -B3         ASSUMED VALUE
          BX6    -X0*X3      ASSUMED STATUS 
          SB3    -B3
          NZ     X7,ARG5     IF ARGUMENT NOT EQUIVALENCED 
          SA4    A4+B1
          SB4    B4-B1
          ZR     B4,ARG11    IF NO MORE ARGUMENTS 
          ZR     X4,ARG10    IF NULL ARGUMENT 
          EQ     ARGX        RETURN 
  
*         PROCESS EQUIVALENCE.
  
 ARG3     SA3    B3          ASSUMED VALUE
          BX6    -X0*X3      ASSUMED STATUS 
          NZ     X7,ARG5     IF ARGUMENT NOT EQUIVALENCED 
          SA4    A4+B1       CHECK EQUIVALENCED VALUE 
          SB4    B4-B1
          ZR     B4,ARG11    IF NO MORE ARGUMENTS 
          LX2    59-28-59+29
          SB3    B2          START OF LIST ADDRESS
          NG     X2,ARG6     IF TABLE FOR ARGUMENT VALUES SPECIFIED 
          BX3    X0*X4
          AX4    42 
          LX2    59-29-59+28
          NG     X2,ARG4     IF DISPLAY ZERO IS TO BE PRESERVED 
          SX2    X4-1L0 
 ARG4     ZR     X3,ARG10    IF NULL ARGUMENT 
          NZ     X2,ARG5     IF NOT *0* 
          SX7    B0+         CLEAR ARGUMENT, STATUS 
          EQ     ARG9        TERMINATE ARGUMENT VALUE TABLE 
  
*         ENTER ARGUMENT VALUE. 
  
 ARG5     BX3    X0*X3       MERGE ARGUMENT AND STATUS
          BX7    X3+X6
          EQ     ARG9        CHECK IF FURTHER SPECIFICATION ALLOWED 
  
*         ENTER ARGUMENT VALUE(S) INTO TABLE SPECIFIED FOR VALUES.
  
 ARG6     BX7    X0*X4
          SX6    X4-1R/      CHECK SEPARATOR AFTER THIS VALUE 
          ZR     X7,ARG7     IF NULL ARGUMENT 
          SA7    B2          STORE VALUE INTO TABLE 
          SB2    B2+B1       INCREMENT TABLE INDEX
 ARG7     SX7    B0+         SET ARGUMENT TABLE TERMINATOR
          ZR     X6,ARG8     IF NOS */* 
          SX6    X4-3 
          NZ     X6,ARG8.1   IF NOT PRODUCT SET */* 
 ARG8     SA1    A4+1        CHECK SEPARATOR AFTER NEXT VALUE 
          SX6    X1-1R= 
          ZR     X6,ARG8.1   IF NOS *=* 
          SX6    X1-2 
          ZR     X6,ARG8.1   IF PRODUCT SET *=* 
          SA4    A4+B1       GET NEXT ARGUMENT VALUE
          SB4    B4-B1
          NZ     B4,ARG6     IF NOT END OF ARGUMENTS
 ARG8.1   EQ     B2,B3,ARG10 IF NO LIST THEN IGNORE PARAMETER 
  
*         CHECK IF FURTHER SPECIFICATION OF THIS ARGUMENT ALLOWED.
  
 ARG9     SA7    B2          STORE ARGUMENT 
          SA2    A2          GET ARGUMENT ADDRESS 
          SB2    X2 
          LX2    30          GET ASSUMED VALUE ADDRESS
          SB3    X2 
          SB3    B2-B3
          NZ     B3,ARG10    IF ASSUMED VALUE .NE. ARGUMENT ADDRESS 
          LX2    30 
          MX3    12 
          BX7    X3+X2       SET OP = -0 IF ONLY ONE ARGUMENT ALLOWED 
          AX2    48 
          SX2    X2-77B 
          NZ     X2,ARG9.1   IF A SINGLE WORD ENTRY 
          SA2    A2+1        SET OP = -0 IN SECOND WORD 
          MX7    42 
 ARG9.1   SA7    A2+
  
*         CHECK FOR MORE ARGUMENTS. 
  
 ARG10    ZR     B4,ARG11    IF LAST ARGUMENT ALREADY PROCESSED 
          SB4    B4-B1       CHECK FOR MORE ARGUMENTS 
          SA4    A4+B1
          NZ     B4,ARG1     IF MORE ARGUMENTS TO PROCESS 
 ARG11    SX1    B0+         CLEAR ERROR
          EQ     ARGX        RETURN 
          SPACE  4
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 ARG      EQU    /COMCARG/ARG 
 QUAL$    ENDIF 
          ENDX
