*DECK CCKRACK 
USETEXT CCTTEXT 
 PROC CCKRACK;
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 #                                                                     #
 #     THIS IS THE CONTROL CARD CRACKER.  IT INITIALIZES CCT FIELDS    #
 #     THAT DEPEND ON CONTROL CARD PARAMETERS AND THEN CRACKS THE      #
 #     CONTROL CARD, MODIFYING CCT FIELDS IF NECESSARY.                #
 #                                                                     #
 #     TO ADD NEW PARAMETERS:                                          #
 #        1. ADD CALLS TO PARAMETER, ONLY, AND/OR VALUE FOR THE        #
 #           PARAMETER AND ITS VALUES, IF ANY.  USE ONLY FOR VALUES    #
 #           THAT MUST APPEAR BY THEMSELVES.  USE VALUE FOR VALUES THAT#
 #           CAN APPEAR WITH OTHER VALUES.                             #
 #        2.  ADD NAMES TO THE SWITCH PARAMROUTINE FOR EACH PARAMETER  #
 #           VALUE, AND ONLY CALL YOU ADDED.  FOLLOW THE NAMEING       #
 #           CONVENTION AND KEEP THINGS IN ALHABETICAL ORDER.          #
 #           THERE MUST BE A ONE TO ONE, ORDERED CORRESPONDENCE BETWEEN#
 #           THE NAMES IN PARAMROUTINE AND THE PARAMETER, ONLY AND     #
 #           VALUE CALLS OR THIS PROCEDURE WONT WORK.                  #
 #        3. ADD THE ROUTINES YOU NAMED IN PARAMROUTINE TO THE         #
 #           APPROIATE SPOT.                                           #
 #        4. UPDATE THE VALUE OF THE DEF, LASTPARAM.  THE VALUE OF     #
 #           THIS ITEM MUST BE EQUAL TO THE NUMBER OF ROUTINES NAMED   #
 #           IN PARAMROUTINE WHICH IS EQUAL TO THE NUMBER OF PARAMETER #
 #           ONLY, AND VALUE MACRO CALLS.                              #
 #                                                                     #
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
          BEGIN 
   # ****************#
*CALL ASSEMOP 
*CALL DIAGLVL 
          # EXTERNAL RELATIONS #
          XREF   PROC         PUTMSG; 
          XREF   PROC        ABORT;    #DO FINAL MSG + ABT, NO DMP# 
          DEF    ABTME       #ABORT#; 
           XREF PROC GETPAGE; 
  
  
 #THE FOLLOWING THREE ITEMS WILL BE XDEFD IN CBLIST. #
          XREF
              BEGIN 
              ITEM  CC$ET    I;    #ERROR LVL TO ABORT AT - RESIDES IN #
                                   #COBOL5# 
              ITEM  CC$PD    I;    #PRINT DENSITY#
              ITEM  CC$PS    I;    #PAGE SIZE#
              ITEM  CC$PW    I;    #PAGE WIDTH# 
           ARRAY PGSIZE [0:0] S(2); 
               BEGIN
                   ITEM JPD U(0,28,4);
                   ITEM JPS U(0,32,8);
                   ITEM JPW U(0,40,8);
                   ITEM SPD U(1,28,4);
                   ITEM SPS U(1,32,8);
                   ITEM SPW U(1,40,8);
               END
              ITEM  CC$BL    I;    #BURSTABLE LISTING FLAG# 
              ITEM FDLFILE  C(7); # LFN OF FDL FILE # 
              ITEM  SORTLIB  C(10);   # LIBRARY CONTAINING SORT.MERGE # 
              ITEM  TDFILE  C(7);  #TERMINAL DUMP FILE                 #
              END 
  
  
  
          STATUS PARAMS 
                 P$ERROR, P$B, P$D, P$E, P$FDL, P$I,
                 P$L, P$TDF, P$U, P$X;
  
          DEF    DELIMCOUNT  #7#; 
          ITEM   DELIMITER    I;
          ITEM   $DUMMY       I;
          STATUS ENTRYTYPE
                 ONLYTYPE,
                 PARAMTYPE, 
                 VALUETYPE; 
          ITEM   ERR$FLG     I = 0 ;
          DEF    ERROR(P1)
                    #BEGIN
                     MSGNUM = P1; 
                     ERR$ROUTINE; 
                     GOTO PARAMRETURN;
                     END#;
  
          ARRAY [1:9] S(2); 
                BEGIN 
                ITEM NAMEOFFILE C(0,0,7)  = ["1", "2", "3", "4", "5", 
                                             "6", "7", "8", "9"]; 
                ITEM NAMEDPARAM C(0,42,3) = [" B ", " D ", " E ", "FDL",
                                " I ", " L ", "TDF", " U ", " X "]; 
                ITEM FILEMATCH I(1,0,60)  = [PARAMS"P$ERROR", 
                               PARAMS"P$ERROR", PARAMS"P$L",
                               PARAMS"P$I", PARAMS"P$ERROR",
                               PARAMS"P$ERROR", PARAMS"P$ERROR",
                               PARAMS"P$ERROR", PARAMS"P$ERROR"]; 
                END 
  
          ITEM   FILENAME     C(7) = ",,,,,,,"; 
          ITEM   FILEVALUE    C(10);
          ITEM   I            I;
          ITEM   INTEGER      C(7) = "======="; 
          ITEM   INTEGERVALUE I;
          ITEM   J            I;
          ITEM   K            I;
          ITEM   L            I;
          DEF    LASTPARAM    #92#; 
          ITEM   LASTRA       I;
          ITEM   L$0$FLAG     B = FALSE;    # L=0 SPECIFIED ON CC      #
          DEF    MESSAGE(P1)
                    #C<I,69>MSGSTRING = P1; 
                     GOTO MSGOUT;#; 
          ITEM   MSGNUM       I;
          ITEM   MSGSTRING    C(80);
          DEF    ONLY(P1) 
                    #CREATEENTRY(ENTRYTYPE"ONLYTYPE",P1)#;
          CONTROL EJECT;
 #     ARRAY- PARAMCONTROL.                                            #
 #            THIS ARRAY CONTAINS ALL THE PARAMETERS AND VALUES THAT   #
 #            MAY APPEAR ON THE CONTROL CARD.                          #
 #            EACH PARAMETER AND VALUE OCCUPIES ONE ENTRY WITH THE     #
 #            FOLLOWING FIELDS:                                        #
 #                                                                     #
 #            1.  STRING- THE ACTUAL CHARACTER STRING, LEFT JUSTIFIED  #
 #                AND ZERO FILLED.  FOR VALUES THAT ARE FILE NAMES OR  #
 #                INTEGERS, SPECIAL CHARACTER STRINGS ARE USED.        #
 #            2.  PARAM- A SWITCH THAT IS SET TO TRUE IN PARAMETER     #
 #                TYPE ENTRIES AND FALSE IN VALUE TYPE ENTRIES.        #
 #            3.  FOUND-  A SWITCH THAT IS SET TO TRUE WHEN THE STRING #
 #                IS FOUND ON THE CONTROL CARD.  IT IS USED TO         #
 #                DIAGNOSE MULTIPLE OCCURRENCES OF PARAMETERS AND      #
 #                VALUES.                                              #
 #            4.  MOREALLOWED- A SWITCH THAT INDICATES IF A  VALUE     #
 #                MAY APPEAR WITH OTHER VALUES.  IT IS SET TO FALSE    #
 #                IN ENTRIES FOR ONLY TYPE VALUES AND TRUE IN ALL      #
 #                OTHER ENTRIES.                                       #
 #            5.  VALUECOUNT- ONLY USED IN PARAMETER TYPE ENTRIES.  IT #
 #                CONTAINS A COUNT OF THE NUMBER OF FOLLOWING WORDS    #
 #                WHICH CONTAIN VALUES FOR THE PARAMETER.              #
 #                                                                     #
 #            THIS ARRAY IS INITIALISED BY CREATEENTRY IN RESPONSE     #
 #            TO PARAMETER, ONLY, AND VALUE MACRO CALLS.  IT IS        #
 #            SEARCHED                                                 #
 #            BY LOOKUP AND VALUELOOKUP.                               #
          ARRAY  PARAMCONTROL[0:LASTPARAM ] S(1); 
                 BEGIN ITEM 
                 STRING      C(0, 0, 7),
                 PARAM       B(0,42, 1),
                 FOUND       B(0,43, 1),
                 MOREALLOWED B(0,44, 1),
                 VALUECOUNT  U(0,45, 6);
                 END
          DEF    PARAMETER(P1)
                    #CREATEENTRY(ENTRYTYPE"PARAMTYPE",P1)#; 
          ITEM   PARAMINDEX  I; 
          CONTROL EJECT;
 #     SWITCH- PARAMROUTINE.                                           #
 #             THIS SWITCH CONTAINS THE NAMES OF THE SEMANTIC ROUTINES #
 #             THAT CORRESPOND TO PARAMETERS AND VALUES.               #
 #             THERE MUST BE A ONE TO ONE, ORDERED CORRESPONDENCE      #
 #             BETWEEN THE NAMES IN THIS LIST AND THE PARAMETER, ONLY  #
 #             AND VALUE MACRO CALLS.                                  #
 #             THE NUMBER OF NAMES IN THIS LIST MUST BE THE VALUE OF   #
 #             THE VARIABLE LASTPARAM.                                 #
          SWITCH PARAMROUTINE 
                 #UNUSED#,
                 A$R, 
                 A$FILE$R,
                 ANSI$R,
                 ANSI$T$R,
                 ANSI$F$R,
                 ANSI$NOEDIT, 
                 ANSI$77LEFT, 
                 ANSI$AUDIT,
                 APO$R, 
                 B$R, 
                 B$0$R, 
                 B$FILE$R,
                 BL$R,
                 CC1$R, 
                 CHK$R, 
                 CHK$0$R, 
                 CHK$FILE$R,
                 CPY$R, 
                 CS$R,
                 D$R, 
                 D$0$R, 
                 D$FILE$R,
                 DAR$R, 
                 DB$R,
                 DB$0$R,
                 DB$DL$R, 
                 DB$SB$R, 
                 DB$TR$R, 
                 DB$B$R,
                 DB$RF$R, 
                DB$ID$R,
                 DD$R,
                 EL$R,
                 EL$0$R,
                 EL$T$R,
                 EL$W$R,
                 EL$F$R,
                 EL$C$R,
                 ET$R,
                 ET$0$R,
                 ET$T$R,
                 ET$W$R,
                 ET$F$R,
                 ET$C$R,
                 E$R, 
                 E$FILE$R,
                 FDL$R, 
                 FDL$0$R, 
                 FDL$FILE$R,
                 I$R, 
                 I$0$R, 
                 I$FILE$R,
                 L$R, 
                 L$0$R, 
                 L$FILE$R,
                 LBZ$R, 
                 LO$R,
                 LO$0$R,
                 LO$O$R,
                 LO$R$R,
                 LO$M$R,
                 LO$S$R,
                 LO$$S$R, 
                 MSB$R, 
                 PD$R,
                 PD$INTEGER$R,
                 PS$R,
                 PS$INTEGER$R,
                 PSQ$R, 
                 PW$R,
                 PW$INTEGER$R,
                 SB$R,
                  SORT4$R,
                  SORT5$R,
                 SY$R,
                 TAF$R, 
                 TDF$R, 
                 TDF$0$R, 
                 TDF$FILE$R,
                 TIM$R, 
                 U$R, 
                 U$0$R, 
                 U$FILE$R,
                 UC1$R, 
                 X$R, 
                 X$0$R, 
                 X$FILE$R,
                 FIPS,
                 FIPS1, 
                 FIPS2, 
                 FIPS3, 
                 FIPS4; 
          BASED ARRAY RAARRAY[0:64] S(1); 
              BEGIN 
              ITEM RA$STRING    C(0, 0, 7); 
              ITEM RA$CODE      U(0,54, 6); 
              ITEM ACTUALNUMBER U(0,42,18); 
              END 
          ITEM   RAINDEX      I;
          ITEM   SAVEDINDEX  I; 
          DEF    SETPARAM(P1,P2)
                     # P1 = P2; 
                       GOTO PARAMRETURN#; 
          DEF    SETVALUE(P1,P2)
                     # P1 = P2; 
                       GOTO VALUERETURN#; 
          DEF    VALUE(P1)
                    #CREATEENTRY(ENTRYTYPE"VALUETYPE",P1)#; 
          ITEM   VALUEINDEX   I;
          DEF    ZEROFILL(P1,P2)
                     #B<0,60>FILEVALUE = 0; 
                     C<0,P2>FILEVALUE = P1#;
          CONTROL EJECT;
          # THIS ARRAY CLASSIFY SEPARATORS. THE CLASSES ARE:           #
          #   1. PARAMDELIM- A SEPARATOR WHICH TERMINATES A PARAMETER. #
          #   2. FIRST VALUE- A SEPARATOR WHICH APPEARS BETWEEN A      #
          #                  PARAMETER AND THE FIRST VALUE IN ITS      #
          #                  VALUE LIST.                               #
          #   3. OTHERVALUE- A SEPARATOR WHICH APPEARS BETWEEN VALUES  #
          #                  IN A VALUE LIST.                          #
          #   4. OTHER     - ALL OTHER SEPARATORS.                     #
          #                                                            #
          # SEPARATORS ARE PLACED IN THE RIGHTMOST N BITS OF EACH      #
          # PARAMETER WORD IN THE RA AREA BY THE OPERATING SYSTEM.     #
          # FOR SCOPE, N = 4 AND IT IS A CODE THAT IS INSERTED         #
          # INSTEAD OF THE ACTUAL CHARACTER.  THE CODES OF INTEREST    #
          # ARE:     , - 1                                             #
          #          = - 2                                             #
          #          / - 3                                             #
          #          . - 17                                            #
          #          ) - 17                                            #
          #                                                            #
          # KRONOS PUTS THE ACTUAL DISPLAY CODE FOR THE SEPARATOR      #
          # INTO THE RIGHTMOST 6 BITS UNLESS THE SEPARATOR IS , . OR ) #
          # IN WHICH CASE IT STORES 0.                                 #
          #                                                            #
          # WE WILL ASSUME THAT SCOPE SETS THE FIRST 2 BITS OF         #
          # THE RIGHTMOST CHARACTER TO 0 AND USE ALL 6 BITS AS THE     #
          # SEPARATOR.  THE ONLY POSSIBLE CONFLICT THEN IS THAT        #
          # 0 MEANS , . OR ) UNDER KRONOS AND CONTINUATION UNDER       #
          # SCOPE.  THIS CONFLICT WILL BE IGNORED SINCE IT CANT BE     #
          # RESOLVED WITHOUT KNOWING WHICH OPERATING SYSTEM IS IN      #
          # CONTROL.                                                   #
          # THE SEPARATORS IN EACH OF THE ABOVE CLASSES ARE:           #
          #                                                            #
          # -CLASS-      -CHAR-   -SCOPE VALUE-  -KRONOS VALUE-        #
          #                          (OCTAL)        (OCTAL)            #
          # PARAMDELIM     ,            1              0               #
          #                .           17              0               #
          #                )           17              0               #
          #                                                            #
          #                                                            #
          # FIRSTVALUE     =            2             54               #
          #                                                            #
          #                                                            #
          # OTHERVALUE     /            3             50               #
          #                                                            #
          # OTHER          --- ALL OTHER CHARACTERS ---                #
          DEF    FIRSTVALUE   #1#;
          DEF    OTHER        #2#;
          DEF    OTHERVALUE   #3#;
          DEF    PARAMDELIM   #4#;
          ARRAY [0:DELIMCOUNT] S(1);
              BEGIN 
              ITEM ACTUALDELIM  U(0,0,6) =[   0 , # NOT USED     #
                                              0 , # KRONOS , . ) #
                                              1 , # SCOPE  ,     #
                                              2 , # SCOPE  =     #
                                              3 , # SCOPE  /     #
                                           O"17", # SCOPE  . )   #
                                           O"50", # KRONOS /     #
                                           O"54"];# KRONOS =     #
              ITEM CODEDDELIM   U(0,6,6) =[     OTHER,
                                           PARAMDELIM,
                                           PARAMDELIM,
                                           FIRSTVALUE,
                                           OTHERVALUE,
                                           PARAMDELIM,
                                           OTHERVALUE,
                                           FIRSTVALUE]; 
              END 
          CONTROL EJECT;
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 #                                                                     #
 #     NAME - CREATEENTRY                                              #
 #     PARAMETERS - 1.  AN ENTRYTYPE STATUS VALUE                      #
 #                  2.  A CHARACTER STRING WHICH IS LEGAL ON THE       #
 #                      CONTROL CARD.                                  #
 #     DESCRIPTION - THIS PROCEDURE IS ONLY CALLED FROM THE PARAM,     #
 #                   ONLY, AND VALUE MACROS.  IT IS PASSED THE CHARAC- #
 #                   TER STRING THAT APPEARED AS THE OPERAND OF THE    #
 #                   MACRO AND THE TYPE OF THE STRING- PARAM, ONLY,    #
 #                   OR VALUE.  IT DEFINES THE STRING BY PLACING IT IN #
 #                   THE STRING FIELD OF THE NEXT AVAILABLE WORD IN    #
 #                   THE ARRAY PARAMCONTROL, LEFT JUSTIFIED AND ZERO   #
 #                   FILLED, AND BY SETTING THE OTHER FIELDS IN PARAM- #
 #                   CONTROL ACCORDING TO THE TYPE OF THE STRING.      #
 #                                                                     #
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 PROC CREATEENTRY(P1,P2); 
          BEGIN 
          ITEM   P1           S:ENTRYTYPE;
          ITEM   P2           C(10);
          ITEM   I            I;
          SWITCH   ENTRYROUTINE:ENTRYTYPE 
                   PARAMROUT   :PARAMTYPE,
                   VALUEROUTINE:VALUETYPE,
                   ONLYROUTINE:ONLYTYPE;
          GOTO ENTRYROUTINE[P1];
 PARAMROUT: 
          PARAM[PARAMINDEX] = TRUE; 
          MOREALLOWED[PARAMINDEX] = TRUE; 
          SAVEDINDEX = PARAMINDEX;
          GOTO FINISHENTRY; 
 VALUEROUTINE:  
          MOREALLOWED[PARAMINDEX] = TRUE; 
          GOTO FINISHVALUE; 
 ONLYROUTINE: 
          MOREALLOWED[PARAMINDEX] = FALSE;
          GOTO FINISHVALUE; 
 FINISHVALUE: 
          PARAM[PARAMINDEX] = FALSE;
          VALUECOUNT[SAVEDINDEX] = VALUECOUNT[SAVEDINDEX] + 1;
          GOTO FINISHENTRY; 
 FINISHENTRY: 
          # MOVE P2 TO  STRING, LEFT JUSTIFIED ZERO FILLED #
          FOR I = 0 STEP 1 UNTIL 6 DO 
              IF C<I,1>P2 EQ " "
              THEN
                 C<I,1>STRING[PARAMINDEX] = O"00";
              ELSE
                 C<I,1>STRING[PARAMINDEX] = C<I,1>P2; 
          # INITIALIZE REMAINING FIELDS # 
          FOUND[PARAMINDEX] = FALSE;
          VALUECOUNT[PARAMINDEX] = 0; 
          PARAMINDEX = PARAMINDEX + 1;
          END   #CREATEENTRY# 
          CONTROL EJECT;
 FUNC DTOB(P1) I; 
          # P1 CONTAINS A DISPLAY INTEGER  LEFT JUSTIFIED , ZERO FILLED#
          # CONVERT IT TO BINARY AND RETURN                            #
          BEGIN 
          ITEM   RESULT      I; 
          ITEM   P1          C(10); 
          RESULT = 0; 
          FOR I = 0 STEP 6 WHILE I LS 42 AND B<I,6>P1 NQ 0 DO 
              BEGIN 
              RESULT = RESULT * 10 + B<I,6>P1 - O"33";
              END 
            DTOB = RESULT;
            RETURN; 
          END   # OF DOTB#
          CONTROL EJECT;
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 #                                                                     #
 #     NAME- LOOKUP.                                                   #
 #           THIS FUNCTION SEARCHES THE ARRAY PARAMCONTROL FOR A       #
 #           PARAMETER TYPE ENTRY WHOSE STRING FIELD IS THE SAME AS    #
 #           THE STRING IN THE CURRENT RA WORD.  IT RETURNS THE INDEX  #
 #           OF THE FOUND ENTRY OR 0 IF THE STRING IS NOT FOUND.       #
 #                                                                     #
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 FUNC  LOOKUP  I; 
          BEGIN 
          ITEM   TEMP         I;
          FOR TEMP   = 1 STEP 1 UNTIL LASTPARAM DO
              BEGIN 
              IF RA$STRING[RAINDEX] EQ STRING[TEMP  ] 
                 AND
                 PARAM[TEMP]
              THEN
                  GOTO GOTIT; 
              END 
          #NOT FOUND# 
          TEMP   = 0; 
 GOTIT: 
          LOOKUP = TEMP;
          RETURN; 
          END   # LOOKUP# 
          CONTROL EJECT;
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 #                                                                     #
 #     NAME- RA$ADVANCE.                                               #
 #           THIS PROCEDURE IS USED TO ADVANCE TO THE NEXT RA WORD.    #
 #           IT ADDS 1 TO RAINDEX AND THEN EXTRACTS THE SEPARATOR      #
 #           FROM THE NEW WORD AND CLASSIFIES IT AND PUTS ITS TYPE     #
 #           INTO THE ITEM DELIMITER.                                  #
 #           IF THE DELIMITER IS A MINUS SIGN, IT IS ASSUMED TO PREFIX #
 #           THE FOLLOWING FIELD, AND THIS CONDITION IS FAKED UP.      #
 #                                                                     #
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 PROC RA$ADVANCE; 
          BEGIN 
          ITEM   TEMP         I;
          ITEM   TEMP1        I;
 START$OVER:  
          RAINDEX = RAINDEX + 1;
          TEMP = RA$CODE  [RAINDEX];  #DELIMITER# 
          #TRANSLATE INTO PARAMDELIM, FIRSTVALUE, OTHERVALUE, OR OTHER #
          FOR TEMP1 = 1 STEP 1 UNTIL DELIMCOUNT DO
              IF TEMP EQ ACTUALDELIM[TEMP1] 
              THEN
                  GOTO GOTIT; 
          #NOT FOUND, ITS OTHER TYPE# 
          IF  TEMP EQ 6 OR TEMP EQ O"46"  THEN   #TEST FOR MINUS SIGN  #
              BEGIN 
              TEMP1 = RAINDEX + 1;
                             #THE EXISTING CHARACTER STRING IS MOVED   #
                             # OVER AND THE MINUS SIGN STUCK ON THE    #
                             # FRONT             #
              C<1,6>RA$STRING[TEMP1] = C<0,6>RA$STRING[TEMP1];
              C<0,1>RA$STRING[TEMP1] = "-"; 
              GOTO START$OVER;
              END 
          TEMP1 = 0;
 GOTIT: 
          DELIMITER = CODEDDELIM[TEMP1];
          #NOTE TYPE OTHER WILL EVENTUALLY BE DIAGNOSED BY# 
          #DELIMITER TEST IN PARAMLOOP.                    #
          RETURN; 
          END   #RA$ADVANCE#
          CONTROL EJECT;
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 #                                                                     #
 #     NAME- VALUELOOKUP.                                              #
 #           THIS FUNCTION SEARCHES THE VALUE TYPE ENTRIES THAT ARE    #
 #           ASSOCIATED WITH THE MOST RECENTLY ENCOUNTERED PARAMETER   #
 #           FOR THE STRING IN THE CURRENT RA WORD.  IT RETURNS THE    #
 #           INDEX OF THE FOUND ENTRY OR 0 IF THE STRING IS NOT        #
 #           FOUND.  IT ALSO PUTS OCTAL 0 INTO THE ITEM, FILEVALUE     #
 #           IF THE FOUND STRING IS CHARACTER 0.                       #
 #           IF THE ACTUAL STRING IS NOT FOUND IN PARAMCONTROL THEN A  #
 #           CHECK IS MADE FOR A VALUE OF FILENAME OR INTEGER IN       #
 #           PARAMCONTROL.  IF FOUND THE STRING IN THE RA WORD IS      #
 #           VERIFIED TO BE A FILENAME OR INTEGER AS THE CASE MAY BE   #
 #           AND IF IT                                                 #
 #           PASSES THE TEST, IT IS PUT IN THE ITEM, FILEVALUE IF IT   #
 #           IS A FILE NAME, OR THE ITEM INTEGERVALUE IF IT IS AN      #
 #           INTEGER.  INTEGERS ARE CONVERTED TO BINARY.               #
 #                                                                     #
 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
 FUNC  VALUELOOKUP I; 
          BEGIN 
          ITEM   TEMP, LB, UB, TEMP1; 
  
  
          # LOOKUP CURRENT RA WORD IN VALUES FOR CURRENT PARAM         #
          LB = PARAMINDEX + 1;
          UB = PARAMINDEX + VALUECOUNT[PARAMINDEX]; 
          FOR TEMP1       = LB STEP 1 UNTIL UB  DO
              BEGIN 
              IF RA$STRING[RAINDEX] EQ STRING[TEMP1]
              THEN
                  GOTO GOTIT; 
              END 
          #NOT FOUND# 
          # SEE IF THERE IS A FILENAME VALUE FOR CURRENT PARAM         #
          FOR TEMP1 = LB STEP 1 UNTIL UB DO 
              BEGIN 
              IF STRING[TEMP1]       EQ FILENAME
              THEN
                  GOTO GOTFILENAME; 
              END 
          #NO FILENAME, SEE IF THERES AN INTEGER# 
 CKFORINTEGER:  
          FOR TEMP1       = LB STEP 1 UNTIL UB DO 
              BEGIN 
              IF STRING[TEMP1]       EQ INTEGER 
              THEN
                  GOTO GOTINTEGER;
              END 
          #AT THIS POINT THE VALUE IS WRONG FOR THE CURRENT PARAM      #
          TEMP1 = 0;
 GOTIT: 
          # SPECIAL CASE:  IF VALUE IS 0 PUT OCTAL 0 IN FILEVALUE # 
          ZEROFILL("0",1);
          IF RA$STRING[RAINDEX] EQ C<0,7>FILEVALUE
          THEN
              B<0,60>FILEVALUE = 0; 
          VALUELOOKUP = TEMP1;
          RETURN; 
 GOTFILENAME: 
          #THERE IS A VALUE OF FILENAME IN PARAMCONTROL FOR THE        #
          #CURRENT PARAMETER. IF ACTUAL VALUE SATISFIES RULES          #
          #FOR FILENAME, OK, ELSE GO BACK TO CHECK FOR AN INTEGER IF   #
          #NECESSARY.                                                  #
          #RULES FOR FILENAMES:                                        #
          #  1. 1-7 ALPHANUMERIC CHARACTERS.                           #
          #  2.  1ST CHARACTER MUST BE ALPHABETIC.                     #
          IF B<0,6>RA$STRING[RAINDEX] GQ O"01"
             AND
             B<0,6>RA$STRING[RAINDEX] LQ O"32"
          THEN
              BEGIN 
              FOR TEMP = 1 STEP 1 WHILE TEMP LQ 6 
                                        AND 
                                        B<TEMP * 6,6>RA$STRING[RAINDEX] 
                                        NQ 0  DO
                  BEGIN 
              IF B<TEMP*6,6>RA$STRING[RAINDEX] GR O"44" 
                  THEN
                      #ITS NOT A FILE NAME AND IT CANT BE AN INTEGER   #
                      #BECAUSE FIRST CHARACTER IS ALPHABETIC           #
                      BEGIN 
                      VALUELOOKUP = 0;
                      RETURN; 
                      END 
                  END  #OF FOR TEMP#
              #ITS A GOOD FILENAME# 
              FILEVALUE = RA$STRING[RAINDEX]; 
              B<42,18>FILEVALUE = 0;
              VALUELOOKUP = TEMP1;
              RETURN; 
              END   #OF THEN# 
          #ITS NOT A FILE NAME BUT MIGHT BE AN INTEGER# 
          GOTO CKFORINTEGER;
 GOTINTEGER:  
          # THERE IS A VALUE OF INTEGER FOR CURRENT PARAM#
          # CHECK ACTUAL VALUE FOR INTEGRITY# 
          FOR TEMP = 0 STEP 1 WHILE TEMP LQ 6 
                                    AND 
                                    B<TEMP * 6,6>RA$STRING[RAINDEX] 
                                    NQ 0 DO 
              BEGIN 
              IF B<TEMP*6,6>RA$STRING[RAINDEX] LS O"33" 
                 OR 
                 B<TEMP*6,6>RA$STRING[RAINDEX] GR O"44" 
              THEN
                  BEGIN 
                  #NOT INTEGER# 
                  VALUELOOKUP = 0;
                  RETURN; 
                  END 
              END   #OF FOR $DUMMY# 
          #IT IS AN INTEGER#
              INTEGERVALUE = DTOB(RA$STRING[RAINDEX]);
          VALUELOOKUP = TEMP1;
          RETURN; 
          END   #VALUE LOOKUP#
          CONTROL EJECT;
 #     THE FOLLOWING CODE SETS UP THE ARRAY PARAMCONTROL.              #
          PARAMINDEX = 1; 
          PARAMETER ( "A"      );   #FILE FOR USER ANALYSIS REPORT# 
              ONLY  ( FILENAME );   #USE FILE FILENAME #
          PARAMETER ( "ANSI"   );   #ANSI VIOLATIONS DIAGNOSTICS LEVEL #
              VALUE ( "T"      );   #MAKE THEM -T- ERRORS              #
              VALUE ( "F"      );   #MAKE THEM -F- ERRORS              #
             VALUE("NOEDIT"    );   # DO NOT EDIT DISPLAY NUMERIC      #
             VALUE("77LEFT"    );   # STORE 77 ITEMS SYNC LEFT         #
              VALUE("AUDIT"    );   #COMPILE AUDIT TESTS               #
          PARAMETER ( "APO"    );   # REVERSE THE ROLES OF QUOTE AND   #
                                    # APOSTROPHE.                      #
          PARAMETER ( "B"      );   # FILE ON WHICH TO WRITE THE BINARY#
                                    # OUTPUT.                          #
                                    #    FD = LGO                      #
                                    #    SD = BIN                      #
              ONLY  ( "0"      );   # DO NOT WRITE BINARY OUTPUT.      #
              ONLY  ( FILENAME );   # WRITE BINARY OUTPUT ON FILENAME. #
          PARAMETER ( "BL"     );   #ISSUE PAGE EJECTS NORMALLY IN LIST#
          PARAMETER ( "CC1"    );   # TREAT COMP ITEMS AS COMP-1 ITEMS.#
          PARAMETER ( "CHK"    );   # FILE FOR CHECKOUT COMMANDS       #
                                    # FD = NO CHECKOUT                 #
                                    # SD = CHKFILE                     #
              ONLY  ( "0"      );   # NO CHECKOUT                      #
              ONLY  ( FILENAME );   # CHECKOUT COMMANDS ON FILENAME    #
          PARAMETER ( "CPY"    );   # COPY VERB PRESENT              #
          PARAMETER ( "CS"     );   # COMPILER STATISTICS              #
          PARAMETER ( "D"      );   # FILE ON WHICH THE DATABASE       #
                                    # SUBSCHEMA RESIDES.               #
                                    #    FD = NO SUBSCHEMA.            #
                                    #    SD =  SSFILE.                 #
              ONLY  ( "0"      );   #  NO SUBSCHEMA                    #
              ONLY  ( FILENAME );   # SUBSCHEMA IS ON FILE NAME        #
          PARAMETER ( "DAR"    );   #DETAILED ANALYSIS REPORT OPTION# 
          PARAMETER ( "DB"     );   # DEBUG OPTIONS                    #
                                    #    FD = NO DEBUGGING             #
                             #    SD = DL/SB/B                         #
              ONLY  ( "0"      );   # NO DEBUGGING                     #
              VALUE ( "DL"     );   #COMPILE DEBUGGING LINES           #
              VALUE ( "SB"     );   # SUBSCRIPT BOUNDS CHECKING        #
              VALUE ( "TR"     );   # TRACE PROCEDURE ENTRIES          #
              VALUE ( "B"      );   #BINARY REGARDLESS                 #
              VALUE ( "RF"     );   #REFERENCE MODIFICATION BOUND CHECK#
              VALUE ( "ID"     );   # INTERACTIVE DEBUGGING            #
          PARAMETER ( "DD"     );   #DUMP DATA TABLE FOR FMA           #
          PARAMETER ( "EL"     );   #ERROR LEVEL - LIST ERRORS OF      #
                                    #            SPECIFIED LEVEL OR    #
                                    #            HIGHER.               #
                                    #    FD = W                        #
                                    #    SD = F                        #
              VALUE ( "0"      );   #ILLEGAL                           #
              VALUE ( "T"      );   #TRIVIAL - SUSPICIOUS USAGE        #
              VALUE ( "W"      );   #WARNING - MINOR SYNTAX ERRORS     #
              VALUE ( "F"      );   #FATAL - MAJOR SYNTAX ERRORS       #
              VALUE ( "C"      );   #CATASTROPHIC - SYSTEM TYPE ERRORS #
          PARAMETER ( "ET"     );   #ERROR TERMINA0E - -EVE- OF ERROR  #
                                    #            AT WHICH THE JOB IS TO#
                                    #            BE ABORTED            #
                                    #    FD = 0                        #
                                    #    SD = F                        #
                                    #FD MAY BE CHANGED IN ASSEMOP      #
              ONLY  ( "0"      );   #NO ABORTS                         #
              ONLY  ( "T"      );   #ABORT IF ANY -T- ERRORS           #
              ONLY  ( "W"      );   #ABORT IF ANY -W- ERRORS           #
              ONLY  ( "F"      );   #ABORT IF ANY -F- ERRORS           #
              ONLY  ( "C"      );   #ABORT IF ANY -C- ERRORS           #
          PARAMETER ( "E"      );   # ADDITIONAL ERROR FILE            #
                                    #    FD = OUTPUT                   #
                                    #    SD = ERR                      #
              ONLY  ( FILENAME );   # WRITE ERRORS ON FILENAME         #
          PARAMETER ( "FDL"    );   # FDL - CALL/CANCEL LIST           #
                                    #   FD = 0                         #
                                    #   SD = FDLFILE                   #
              ONLY  ( "0"      );   # NO FDL FILE                      #
              ONLY  ( FILENAME );   # FDL INFO ON FILENAME             #
          PARAMETER ( "I"      );   # INPUT FILE                       #
                                    #    FD = INPUT                    #
                                    #    SD = COMPILE                  #
              ONLY  ( "0"      );   # NO INPUT FILE                    #
              ONLY  ( FILENAME );   # INPUT FILE IS FILENAME           #
          PARAMETER ( "L"      );   # LISTING FILE                     #
                                    #    FD = OUTPUT                   #
                                    #    SD = LIST                     #
              ONLY  ( "0"      );   # NO LISTING                       #
              ONLY  ( FILENAME );   # LISTING FILE IS FILENAME         #
          PARAMETER ( "LBZ"    );   # LEADING BLANK ZERO               #
          PARAMETER ( "LO"     );   # LISTING OPTIONS                  #
                                    #    FD = NO OPTIONS SELECTED      #
                                    #    SD = S/M/R                    #
              ONLY  ( "0"      );   # NO OPTIONS SELECTED              #
              VALUE ( "O"      );   #OBJECT LISTING                    #
              VALUE ( "R"      );   #CROSS REF MAP                     #
              VALUE ( "M"      );   #MEMORY MAP                        #
              VALUE ( "S"      );   #SOURCE LIST                       #
              VALUE ( "-S"     );   # NO SOURCE LIST                   #
          PARAMETER ( "MSB"    );   # MAIN SUBROUTINE                  #
          PARAMETER ( "PD"     );   # PRINT DENSITY                    #
                                    #    FD = INSTALLATION PARAM       #
                                    #    SD = INSTALLATION PARAM       #
              VALUE ( INTEGER  );   # INTEGER LINES PER INCH           #
          PARAMETER ( "PS"     );   # LINES PER PAGE                   #
                                    #    FD = PD * 60 / 6              #
                                    #    SD = PD * 60 / 6              #
              VALUE ( INTEGER  );   # INTEGER LINES PER INCH           #
          PARAMETER ( "PSQ"    );   #PROCESS SEQUENCE NUMBERS          #
          PARAMETER ( "PW"     );   # PAGE WIDTH                       #
                                    #    FD = 136                      #
                                    #    SD = 136                      #
              VALUE ( INTEGER  );   # INTEGER CHARACTERS PER LINE      #
          PARAMETER ( "SB"     );   # SUBCOMPILE                       #
          PARAMETER (  "SORT4"  );  # SORT4 - USE SORT/MERGE VERS 4    #
          PARAMETER (  "SORT5"  );  # SORT5 - USE SORT/MERGE VERS 5    #
          PARAMETER ( "SY"     );   # SYNTAX ONLY                      #
          PARAMETER ( "TAF"     ); # TAF - TRANSACTION FACILITY        #
          PARAMETER ( "TDF"    );   #TERMINAL DUMP                     #
              ONLY  ( "0"      ); 
              ONLY  ( FILENAME ); 
          PARAMETER ( "TIM"    );   #TIMING REPORT ON...CDC ONLY       #
          PARAMETER ( "U"      );   #UPDATE INPUT - FILE ON WHICH TO   #
                                    #            WRITE COMPASS CARD    #
                                    #            IMAGES                #
                                    #    FD = 0                        #
                                    #    SD = COMPS                    #
              ONLY  ( "0"      );   #DONT WRITE ANYTHING               #
              ONLY  ( FILENAME );   #WRITE CARD IMAGES TO FILENAME     #
          PARAMETER ( "UC1"    );   # UNPACK COMP-1 ITEMS              #
          PARAMETER ( "X"      );   # EXTERNAL TEXT FOR COPY           #
                                    #    FD = OLDPL                    #
                                    #    SD = NEWPL                    #
              ONLY  ( "0"      );   # NO EXTERNAL TEXT                 #
              ONLY  ( FILENAME );   # FILENAME CONTAINS EXTERNAL TEXT  #
          PARAMETER ("FIPS");          #FIPS DIAGNOSTIC LEVEL#
          ONLY ("1");                  #LOW LEVEL#
          ONLY ("2");                  #LOW INTERMEDIATE LEVEL# 
          ONLY ("3");                  #HIGH INTERMEDIATE LEVEL#
          ONLY ("4");                  #HIGH LEVEL# 
          CONTROL EJECT;
          # INITIALIZE FIELDS THAT DEPEND ON CONTROL CARD PARAMETERS   #
          # TO DEFAULT VALUES.                                         #
          CCTANSIDIAG = 0;                 #ANSI ERRORS DONT GET FLAGED#
          CCTNOEDIT = FALSE;                      #EDIT DISPLAY NUMERIC#
          CCTLEFT77 = FALSE;                #STORE 77 ITEMS SYNC LEFT  #
          CCTAUDIT = FALSE; 
          CCTQUOTEAPOS[0] = FALSE;         # APO #
          CCTAPO = FALSE; 
          ZEROFILL("LGO",3);               # B   #
          CCTOBJFILE[0] = FILEVALUE;
          NAMEOFFILE[PARAMS"P$B"] = FILEVALUE;
          CCTCOMPC1[0] = FALSE;            # CC1 #
          B<0,60>CCTCHKOUT[0] = 0;         # CHK #
          CCTCOMSTATS[0] = FALSE;          # CS # 
          CCTICHKOUT[0] = FALSE;
          B<0,60>CCTSSLIB[0]=0;          # D   #
          CCTDEBUGLINE = FALSE;            # DB=DL #
          CCTSUBSCHECK[0] = FALSE;
          CCTTRACE[0] = FALSE;
          CCTFORCEDOBJ = FALSE;            # B   #
          CCTDIAGLEVEL = WARNING;          # EL # 
          CCTDIAGTT[0] = FALSE; 
          ZEROFILL("OUTPUT",6); 
          CCTDGLISTFIL = FILEVALUE;        # E   #
          NAMEOFFILE[PARAMS"P$E"] = FILEVALUE;
          CCTFDL = FALSE;                  # FDL #
          ZEROFILL("INPUT",5);             # I   #
          CCTSOURCEFIL[0] = FILEVALUE;
          NAMEOFFILE[PARAMS"P$I"] = FILEVALUE;
          ZEROFILL("OUTPUT",6);            # L   #
          CCTSCLISTFIL[0] = FILEVALUE;
          NAMEOFFILE[PARAMS"P$L"] = FILEVALUE;
          CCTSOURCLIST [0] = TRUE;    #INDICATE TO LIST SOURCE# 
          CCTLBZ[0] = FALSE;               # LBX #
          CCTASSEMLIST[0] = FALSE;         # LO  #
          CCTMEMORYMAP[0] = FALSE;
          CCTXREFLIST[0]  = FALSE;
          CCTMAINSUB[0] = FALSE;              # MSB # 
          CCTSUBPROGR[0]  = FALSE;         # SB  #
          CCTSYNTXONLY[0] = FALSE;         # SY  #
          CCTTIMRPT = FALSE;               # TIM #
          CCTTAF = FALSE;     # TAF # 
          B<0,60>CCTCOMPASS = 0;           # U   #
          CCTUNPACKC1[0]  = FALSE;         # UC1 #
          ZEROFILL("OLDPL",5);
          CCTLIBFILE[0] = FILEVALUE;       # X   #
          NAMEOFFILE[PARAMS"P$X"] = FILEVALUE;
          CCT1STCOMPIL[0] = TRUE;          # INDICATE FIRST OF STACK   #
          CCTPSQ[0] = FALSE; # PSQ #
          CCTFIPSLEVEL = 5; 
          GETPAGE(PGSIZE);
          CC$PW = JPW[0]; 
          IF CC$PW GR 132 THEN
             CC$PW = 132; 
  
          #INITIALIZE OF PS HERE MEANS NO RELATIONSHIP   #
          #BETWEEN SETTING OF PD AND PS          #
  
          IF CB5$LINP EQ 0
           THEN CC$PS = JPS[0]; 
           ELSE CC$PS = 0; # TO FLAG THE USE OF CB5$LINP #
          IF CB5$PDENS EQ 0 
           THEN CC$PD = JPD[0]; 
          ELSE CC$PD = CB5$PDENS; 
          CONTROL EJECT;
          #INITIALIZATION FOR CRACKING# 
          DELIMITER = PARAMDELIM; 
          P<RAARRAY> = 0; 
          LASTRA = ACTUALNUMBER[52 #64 OCTAL#] + 1; 
                   # RAINDEX OF LAST PARAM WORD#
          RAINDEX = 1;   #FIRST PARAM WORD - 1 #
    #PARAMLOOP# 
          FOR $DUMMY = 0  WHILE RAINDEX LS LASTRA DO
              BEGIN 
              #STARTING ON NEXT PARAM      #
              #DELIMITER MUST BE PARAMDELIM#
              IF DELIMITER NQ PARAMDELIM  THEN ERROR(1) 
              RA$ADVANCE; 
              #LOOK UP IN PARAMCONTROL# 
              PARAMINDEX = LOOKUP;
              IF PARAMINDEX EQ 0
              THEN
                 #DIDNT FIND IT#
                 ERROR(2) 
              IF FOUND[PARAMINDEX]
              THEN
                 #PREVIOUSLY ENCOUNTERED# 
                 ERROR(3) 
              FOUND[PARAMINDEX] = TRUE; 
              # NOW WORRY ABOUT VALUES. FOUR CASES MAY BE              #
              # DISTINGUISHED:                                         #
              #  1. A PARAM WHICH SHOULD NOT HAVE VALUES HAS VALUES.   #
              #  2. A PARAM WHICH SHOULD HAVE VALUES DOESNT HAVE VALUES#
              #  3. A PARAM WHICH SHOULD HAVE VALUES HAS VALUES.       #
              #  4. A PARAM WHICH SHOULDNT HAVE VALUES DOESNT.         #
              #                                                        #
              #  1 AND 2 ARE ERRORS. 3 AND 4 ARE OK                    #
              #                                                        #
              #  TAKE CARE OF 2 AND 4 FIRST                            #
              # 2   IS RATHER SPECIAL SINCE THERE IS NO INDICATION     #
              # IN PARAMCONTROL AS TO WHETER A PARAMETER MUST HAVE     #
              # VALUES OR MAY HAVE VALUES.                             #
              # IN EITHER CASE WE WILL CALL THE PARAMROUTINE. IT ONLY  #
              # IS CALLED IF NO VALUES ARE FOUND SO IT CAN DIAGNOSE    #
              # THIS FACT IF IT MUST HAVE VALUES. IF IT ONLY MAY       #
              # HAVE VALUES THEN IT WILL SET THE SECONDARY DEFAULT.    #
              #                                                        #
              # 4 ALSO REQUIRES THE PARAM ROUTINE TO BE CALLED         #
              IF DELIMITER NQ FIRSTVALUE
              THEN
                  GOTO PARAMROUTINE[PARAMINDEX];
              # AND NOW FOR 1- DELIMITER IS FIRSTVALUE SO WE ASSUME    #
              # VALUES WILL FOLLOW                                     #
              IF VALUECOUNT[PARAMINDEX] EQ 0
              THEN
                  ERROR(8)
              # FINALLY CASE 3                                         #
              #                                                        #
              #THE FOLLOWING LOOP WILL PICK OFF THE VALUES AND         #
              #CALL THE CORRESPONDING PARAMROUTINES.                   #
              DELIMITER = OTHERVALUE; 
    #VALUELOOP# 
              FOR I = 0 STEP 1 WHILE
                                     DELIMITER EQ OTHERVALUE
                                     AND
                                     #SAFETY MEASURE--THE LAST         #
                                     #DELIMITER ON A CARD CANT         #
                                     #BE OTHERVALUE, BUT JUST          #
                                     #IN CASE...                       #
                                     RAINDEX LS LASTRA DO 
                  BEGIN 
                  RA$ADVANCE; 
                  VALUEINDEX = VALUELOOKUP; 
                  IF VALUEINDEX EQ 0
                  THEN
                      #NOT FOUND# 
                      ERROR(4)
                  IF FOUND[VALUEINDEX]
                  THEN
                      #PREVIOUSLY ENCOUNTERED#
                      ERROR(5)
                  FOUND[VALUEINDEX] = TRUE; 
                  IF NOT MOREALLOWED[VALUEINDEX]
                     AND
                     (I GR 0 OR DELIMITER EQ OTHERVALUE)
                  THEN
                      #AN ONLY TYPE OCCURS WITH OTHER VALUES# 
                      ERROR(6)
                  GOTO PARAMROUTINE[VALUEINDEX];
 VALUERETURN: 
                  #VALUE ROUTINES RETURN HERE#
                  END   #VALUE LOOP#
 PARAMRETURN: 
              #PARAMETER ROUTINES RETURN HERE#
              END   #PARAM LOOP#
  
 #     WRAP UP PROCESSING # 
  
 #       CHECK FOR PARAMETERS SPECIFYING THE SAME FILE NAME            #
             FOR K = 1 STEP 1 UNTIL 8 DO
                FOR L = K+1 STEP 1 UNTIL 9 DO 
                   IF NAMEOFFILE[K] EQ NAMEOFFILE[L]
                             AND L NQ FILEMATCH[K] THEN 
                      BEGIN 
                      C<0,3>RA$STRING[RAINDEX] = NAMEDPARAM[K]; 
                      C<3>RA$STRING[RAINDEX] = " "; 
                      C<4,3>RA$STRING[RAINDEX] = NAMEDPARAM[L]; 
                      MSGNUM=9; 
                      ERR$ROUTINE;
                      END 
  
 #     SET FILE NAMES TO CONTROL CARD SELECTED ONES OR TO DEFAULTS     #
          IF  L$0$FLAG  THEN
              BEGIN 
              CCTSCLISTFIL = CCTDGLISTFIL;
              CCTDGLISTFIL = " "; 
              END 
# 
                 IF THERE WERE CONTROL CARD ERROR(S), ABORT WITH
                             NO DUMP. 
# 
          IF  ERR$FLG NQ 0 THEN ABTME;
          IF  L$0$FLAG  THEN
              RETURN; 
  
          IF  CCTSCLISTFIL NQ CCTDGLISTFIL  THEN
              RETURN; 
          CCTDGLISTFIL = " "; 
  
  
          RETURN; 
          CONTROL EJECT;
 PROC ERR$ROUTINE;
          BEGIN 
          # ALL ERROR HANDLING IS DONE HERE.                           #
          # MSGNUM IS  NUMBER OF ERROR MESSAGE TO BE PUT IN DAYFILE.   #
          # RA$STRING[RAINDEX] IS INSERTED AT THE BEGINNING OF THE     #
          # MESSAGE, SET OFF BY * *.                                   #
          #                                                            #
          # RECOVERY ACTION IS TO SKIP TO THE NEXT PARAMDELIM.         #
          # RETURN IS TO PARAMRETURN.                                  #
          SWITCH MSGROUTINES
                 ,  #NOT USED#
                 M1,
                 M2,
                 M3,
                 M4,
                 M5,
                 M6,
                 M7,
                 M8,
                 M9;
          # EACH MESSAGE SHOULD BE NO LONGER THAN 68 CHARACTERS        #
          # (68 + 10 FOR THE INSERT + 2 0 BYTES MAKES THE MAX OF 80)   #
          # AND SHOULD END WITH $ SO WE CAN CALCULATE ITS LENGTH.      #
          # THE $ WILL NOT BE PRINTED AND IS NOT PART OF THE 68 MAX.   #
          # INSERT      ERRONEOUS PARAMETER. #
          ERR$FLG = 1;
          C<0,2>MSGSTRING = "* ";   #IF PARAM IS NULL WE WILL INSERT   #
                                    #ONE SPACE.                        #
          I = 1;
          FOR $DUMMY = 0  WHILE I LQ 7
                                AND 
                                C<I-1,1>RA$STRING[RAINDEX] NQ 0  DO 
              BEGIN 
              C<I,1>MSGSTRING = C<I-1,1>RA$STRING[RAINDEX]; 
              I = I + 1;
              END 
          C<I,2>MSGSTRING = "* "; 
          I = I + 2;
          #CONCATENATE MESSAGE# 
          GOTO MSGROUTINES[MSGNUM]; 
 M1:      MESSAGE("IS FOLLOWED BY AN INVALID SEPARATOR.$")
 M2:      MESSAGE("IS NOT A VALID PARAMETER.$") 
 M3:      MESSAGE("APPEARS MORE THAN ONCE.$") 
 M4:      MESSAGE("IS NOT A VALID VALUE FOR THE CURRENT PARAMETER.$") 
 M5:      MESSAGE("APPEARS MORE THAN ONCE AS A VALUE OF A PARAMETER.$") 
 M6:      MESSAGE("CANNOT BE USED ALONG WITH OTHER VALUES.$") 
 M7:      MESSAGE("CANNOT BE USED WITHOUT VALUES.$")
 M8:      MESSAGE("MUST APPEAR WITHOUT VALUES.$") 
 M9:      MESSAGE("PARAMETERS CANNOT USE THE SAME FILE.$")
 MSGOUT:  
          #MESSAGE IS BUILT BUT STILL HAS $ AT END.       # 
          #REMOVE $ AND ADD 2 0 BYTES AT END OF LAST WORD # 
          #THIS IS REQUIRED BY THE SYSTEM                 # 
          FOR J = I + 1 STEP 1 UNTIL 80 DO
              BEGIN 
              IF C<J,1>MSGSTRING EQ "$" THEN GOTO MSGSTOP;
              END 
          # NO $ FOUND, COMPILER ERROR #
 MSGSTOP: 
          # BLANK FILL UNTIL CHAR 8 OF A WORD # 
          I = (J + 1) / 10;   # NUMBER OF THE WORD IN WHICH WE STOP    #
          FOR $DUMMY = 0 WHILE J - I * 10 NQ 8 DO 
              BEGIN 
              C<J,1>MSGSTRING = " ";
              J = J + 1;
              END 
          # MESSAGE COMPLETE. WRITE TO DAYFILE. # 
          PUTMSG (MSGSTRING); 
          # SKIP TO NEXT PARAM #
          FOR $DUMMY = 0 WHILE RAINDEX LS LASTRA
                                AND 
                                DELIMITER NQ PARAMDELIM DO
              RA$ADVANCE; 
          RETURN; 
          END 
          CONTROL EJECT;
 #     THESE ARE THE SEMANTIC ROUTINES THAT ARE NAMED IN THE SWITCH    #
 #     PARAMROUTINE.  THE MACROS SETPARAM AND SETVALUE ARE ONLY USED   #
 #     FOR BREVITY.  THEY MERELY GENERATE AN ASSIGNMENT STATEMENT      #
 #     AND A GOTO PARAMRETURN OR VALUERETURN, AS THE CASE MAY BE.      #
 A$R: 
          CCTUARWANTED[0] = TRUE; 
          ZEROFILL("MODULE",6); 
          SETPARAM(CCTUARFILE,FILEVALUE); 
 A$FILE$R:  
          CCTUARWANTED[0] = TRUE; 
          SETVALUE(CCTUARFILE,FILEVALUE); 
 ANSI$R:  
 ANSI$T$R:  
          SETVALUE(CCTANSIDIAG,TRIVIAL);
 ANSI$F$R:  
          SETVALUE(CCTANSIDIAG,FATAL);
ANSI$NOEDIT:  
          SETVALUE(CCTNOEDIT,TRUE); 
ANSI$77LEFT:  
          SETVALUE(CCTLEFT77,TRUE); 
 ANSI$AUDIT:  
          CCTNOEDIT = TRUE; 
          CCTLEFT77 = TRUE; 
          SETVALUE(CCTAUDIT,TRUE);
 APO$R: 
          CCTAPO = TRUE;
          SETPARAM(CCTQUOTEAPOS[0],TRUE); 
 B$R: 
          ZEROFILL("BIN",3);
          NAMEOFFILE[PARAMS"P$B"] = FILEVALUE;
          SETPARAM(CCTOBJFILE[0],FILEVALUE);
 B$0$R: 
          NAMEOFFILE[PARAMS"P$B"] = "21"; #INDICATES B OMITTED# 
          SETVALUE(CCTOBJFILE[0],FILEVALUE);
 B$FILE$R:  
          NAMEOFFILE[PARAMS"P$B"] = FILEVALUE;
          SETVALUE(CCTOBJFILE[0],FILEVALUE);
 BL$R:  
          SETVALUE(CC$BL,1);
 CC1$R: 
          SETPARAM(CCTCOMPC1[0],TRUE);
 CHK$R: 
          ZEROFILL ("CHKFILE",7); 
          CCTICHKOUT[0] = TRUE; 
          SETPARAM(CCTCHKOUT[0],FILEVALUE); 
 CHK$0$R: 
          SETVALUE(CCTICHKOUT[0],FALSE);
 CHK$FILE$R:  
          CCTICHKOUT[0] = TRUE; 
          SETVALUE(CCTCHKOUT[0],FILEVALUE); 
 CPY$R: 
#         COBOL 5.1 NEEDED -CPY- BUT COBOL 5.2 DOES NOT                #
          GOTO PARAMRETURN;            # IGNORE -CPY-                  #
 CS$R:  
          SETPARAM(CCTCOMSTATS[0],TRUE);   #ISSUE COMPILER STATISTICS#
 D$R: 
          NAMEOFFILE[PARAMS"P$D"] = "22"; #INDICATES D ASSUMED OK#
          SETPARAM(CCTDPARAM,TRUE); 
 D$0$R: 
          NAMEOFFILE[PARAMS"P$D"] = "22"; #INDICATES D OMITTED# 
          SETPARAM(CCTDPARAM,FALSE);
 D$FILE$R:  
          CCTDPARAM = TRUE; 
          NAMEOFFILE[PARAMS"P$D"] = FILEVALUE;
          SETVALUE(CCTSSLIB[0],FILEVALUE);
 DAR$R: 
         SETPARAM(CCTUARDETAIL[0],TRUE);
 DB$R:  
          CCTFORCEDOBJ = TRUE;    # SELECT B OPTION # 
          SETPARAM(CCTSUBSCHECK[0],TRUE); 
 DB$0$R:  
          SETVALUE(CCTIDBUG,FALSE); 
 DB$DL$R: 
          SETVALUE(CCTDEBUGLINE,TRUE);
 DB$SB$R: 
          SETVALUE(CCTSUBSCHECK[0],TRUE); 
 DB$TR$R: 
          SETVALUE(CCTTRACE[0],TRUE); 
 DB$B$R:  
          SETVALUE(CCTFORCEDOBJ,TRUE);
 DB$RF$R: 
          SETVALUE (CCTRFCHECK,TRUE); 
 DB$ID$R: 
          SETVALUE(CCTIDBUG,TRUE);
 DD$R:  
          SETVALUE(CCTDUMPDATA,TRUE); 
 EL$R:  
 EL$F$R:  
          SETVALUE(CCTDIAGLEVEL,FATAL); 
 EL$0$R:  
          ERROR(4)
 EL$T$R:  
          SETVALUE(CCTDIAGLEVEL,TRIVIAL); 
 EL$W$R:  
          SETVALUE(CCTDIAGLEVEL,WARNING); 
 EL$C$R:  
          SETVALUE(CCTDIAGLEVEL,CATASTROPH);
 ET$R:  
 ET$F$R:  
          SETVALUE(CC$ET,FATAL);
 ET$0$R:  
          GOTO VALUERETURN;  #SAME AS FIRST DEFAULT#
 ET$T$R:  
          SETVALUE(CC$ET,TRIVIAL);
 ET$W$R:  
          SETVALUE(CC$ET,WARNING);
 ET$C$R:  
          SETVALUE(CC$ET,CATASTROPH); 
 E$R: 
          ZEROFILL("ERR",3);
          NAMEOFFILE[PARAMS"P$E"] = FILEVALUE;
          SETPARAM(CCTDGLISTFIL[0],FILEVALUE);
 E$FILE$R:  
          NAMEOFFILE[PARAMS"P$E"] = FILEVALUE;
          SETVALUE(CCTDGLISTFIL[0],FILEVALUE);
 FDL$R: 
          CCTFDL = TRUE;
          ZEROFILL ("FDLFILE", 7);
          NAMEOFFILE[PARAMS"P$FDL"] = FILEVALUE;
          SETPARAM (FDLFILE, FILEVALUE);
 FDL$0$R: 
          NAMEOFFILE[PARAMS"P$FDL"] = "23"; #INDICATES FDL OMITTED# 
          SETVALUE (CCTFDL, FALSE); 
 FDL$FILE$R:  
          CCTFDL = TRUE;
          NAMEOFFILE[PARAMS"P$FDL"] = FILEVALUE;
          SETVALUE (FDLFILE, FILEVALUE);
 I$R: 
          ZEROFILL("COMPILE",7);
          NAMEOFFILE[PARAMS"P$I"] = FILEVALUE;
          SETPARAM(CCTSOURCEFIL[0],FILEVALUE);
 I$0$R: 
          ERROR(4)
 I$FILE$R:  
          NAMEOFFILE[PARAMS"P$I"] = FILEVALUE;
          SETVALUE(CCTSOURCEFIL[0],FILEVALUE);
 L$R: 
          ZEROFILL("LIST",4); 
          NAMEOFFILE[PARAMS"P$L"] = FILEVALUE;
          SETPARAM(CCTSCLISTFIL[0],FILEVALUE);
 L$0$R: 
          CCTXREFLIST = FALSE;
          CCTMEMORYMAP = FALSE; 
          CCTASSEMLIST = FALSE; 
          L$0$FLAG = TRUE;
          NAMEOFFILE[PARAMS"P$L"] = "25"; #INDICATES L OMITTED# 
          SETVALUE (CCTSOURCLIST [0], FALSE);   #INDICATE NO SOURCE LIS#
 L$FILE$R:  
          NAMEOFFILE[PARAMS"P$L"] = FILEVALUE;
          SETVALUE(CCTSCLISTFIL[0],FILEVALUE);
 LBZ$R: 
          SETPARAM(CCTLBZ[0],TRUE); 
 LO$R:  
          IF  L$0$FLAG  THEN
              GOTO PARAMRETURN; 
          CCTXREFLIST[0] = TRUE;
          CCTMEMORYMAP[0]= TRUE;
          GOTO PARAMRETURN; 
 LO$$S$R: 
          SETVALUE(CCTSOURCLIST,FALSE); 
 LO$0$R:  
          CCTXREFLIST = FALSE;
          CCTMEMORYMAP = FALSE; 
          CCTASSEMLIST = FALSE; 
          SETVALUE(CCTSOURCLIST,FALSE); 
 LO$S$R:  
          # DO NOTHING, SAME AS FIRST DEFAULT # 
          GOTO VALUERETURN; 
 LO$O$R:  
          IF  L$0$FLAG  THEN
              GOTO VALUERETURN; 
          SETVALUE(CCTASSEMLIST[0],TRUE); 
 LO$R$R:  
          IF  L$0$FLAG  THEN
              GOTO VALUERETURN; 
          SETVALUE(CCTXREFLIST[0],TRUE);
 LO$M$R:  
          IF  L$0$FLAG  THEN
              GOTO VALUERETURN; 
          SETVALUE(CCTMEMORYMAP[0],TRUE); 
 MSB$R: 
          CCTSUBPROGR[0] = TRUE;
          SETPARAM(CCTMAINSUB[0],TRUE); 
 PD$R:  
          SETVALUE(CC$PD,8);
 PD$INTEGER$R:  
          IF INTEGERVALUE NQ 3  AND 
             INTEGERVALUE NQ 4  AND 
             INTEGERVALUE NQ 6  AND 
             INTEGERVALUE NQ 8
          THEN
              ERROR(4)
          SETVALUE(CC$PD,INTEGERVALUE); 
 PS$R:  
          SETVALUE(CC$PS,JPS[0]); 
 PS$INTEGER$R:  
           IF INTEGERVALUE LS 7 
           THEN 
              BEGIN 
                 INTEGERVALUE = 7;
                 C<0,28>MSGSTRING = " PAGE SIZE RANGE 7 - 99999. "; 
                 C<28,2>MSGSTRING = 0;
                 PUTMSG(MSGSTRING); 
              END 
           ELSE IF INTEGERVALUE GR 99999 THEN 
              BEGIN 
                 INTEGERVALUE = 99999;
                 C<0,28>MSGSTRING = " PAGE SIZE RANGE 7 - 99999. "; 
                 C<28,2>MSGSTRING = 0;
                 PUTMSG(MSGSTRING); 
              END 
          SETVALUE(CC$PS,INTEGERVALUE); 
 PSQ$R: 
          SETPARAM(CCTPSQ[0],TRUE); 
 PW$R:  
          SETVALUE(CC$PW,72); 
 PW$INTEGER$R:  
           IF INTEGERVALUE LS 1 
           THEN 
              BEGIN 
                 INTEGERVALUE = 1;
                 C<0,26>MSGSTRING = " PAGE WIDTH RANGE 1 - 132."; 
                 C<26,4>MSGSTRING = 0;
                 PUTMSG(MSGSTRING); 
              END 
           ELSE IF INTEGERVALUE GR 132 THEN 
              BEGIN 
                 INTEGERVALUE = 132;
                 C<0,26>MSGSTRING = " PAGE WIDTH RANGE 1 - 132."; 
                 C<26,4>MSGSTRING = 0;
                 PUTMSG(MSGSTRING); 
              END 
          SETVALUE(CC$PW,INTEGERVALUE); 
 SB$R:  
          CCTSUBONLY[0] = TRUE; 
          SETPARAM(CCTSUBPROGR[0],TRUE);
 SY$R:  
          SETPARAM(CCTSYNTXONLY[0],TRUE); 
 TAF$R: 
          SETPARAM(CCTTAF,TRUE);
 SORT4$R: 
          CCTSORT4 = TRUE;
          SETPARAM (SORTLIB,"SRTLIB");
 SORT5$R: 
          CCTSORT4 = FALSE; 
          SETPARAM (SORTLIB,"SRT5LIB"); 
 TDF$R: 
          CCTTDF = TRUE;
          ZEROFILL("TDFILE",6); 
          NAMEOFFILE[PARAMS"P$TDF"] = FILEVALUE;
          SETPARAM(TDFILE, FILEVALUE);
 TDF$0$R: 
          NAMEOFFILE[PARAMS"P$TDF"] = "26"; #INDICATES TDF OMITTED# 
          SETVALUE(CCTTDF, FALSE);
 TDF$FILE$R:  
          CCTTDF = TRUE;
          NAMEOFFILE[PARAMS"P$TDF"] = FILEVALUE;
          SETVALUE (TDFILE, FILEVALUE); 
 TIM$R: 
          SETVALUE(CCTTIMRPT,TRUE); 
 U$R: 
          ZEROFILL("COMPS",5);
          NAMEOFFILE[PARAMS"P$U"] = FILEVALUE;
          SETPARAM(CCTCOMPASS[0],FILEVALUE);
 U$0$R: 
          NAMEOFFILE[PARAMS"P$U"] = "27"; #INDICATES U OMITTED# 
          SETVALUE(CCTCOMPASS[0],FILEVALUE);
 U$FILE$R:  
          NAMEOFFILE[PARAMS"P$U"] = FILEVALUE;
          SETVALUE(CCTCOMPASS[0],FILEVALUE);
 UC1$R: 
          SETPARAM(CCTUNPACKC1[0],TRUE);
 X$R: 
          ZEROFILL("NEWPL",5);
          NAMEOFFILE[PARAMS"P$X"] = FILEVALUE;
          SETPARAM(CCTLIBFILE[0],FILEVALUE);
 X$0$R: 
          NAMEOFFILE[PARAMS"P$X"] = "28"; #INDICATES X OMITTED# 
          SETVALUE(CCTLIBFILE[0],FILEVALUE);
 X$FILE$R:  
          NAMEOFFILE[PARAMS"P$X"] = FILEVALUE;
          SETVALUE(CCTLIBFILE[0],FILEVALUE);
 FIPS1: SETVALUE (CCTFIPSLEVEL,1);
 FIPS2: SETVALUE (CCTFIPSLEVEL,2);
 FIPS3: SETVALUE (CCTFIPSLEVEL,3);
 FIPS4: SETVALUE (CCTFIPSLEVEL,4);
FIPS:  SETVALUE (CCTFIPSLEVEL,5); 
          END  # OF CCKRACK#
 TERM 
