*DECK CRACKCC                                                           007510
USETEXT TAFIT 
USETEXT TCLFN 
USETEXT TCMMDEF 
USETEXT TCRMDEF 
USETEXT TENVIRN 
USETEXT TFIT
USETEXT TREPCOM 
      PROC CRACKCC;                                                     007520
                                                                        007530
# INTERPRET THE CONTROL CARD PARAMETERS, AS FOUND IN RA+2 ON.  FIRST    007540
  GO THROUGH THEM ALL, CHECKING SYNTAX AND RECORDING WHAT WAS FOUND.    007550
  NEXT CHECK FOR COMPLETENESS AND CONSISTENCY.  FINALLY, IF EVERYTHING  007560
  WAS OK, FILL IN THE LFN'S IN THE FITS. #                              007570
                                                                        007580
      BEGIN                                                             007590
  
      DEF BATMODE#0#;              # TERMINAL - BATCH MODE             #
      DEF TTYMODE#1#;              #TERMINAL - TTYMODE                 #
      DEF CRTMODE#2#;              #TERMINAL - CRT MODE                #
      XREF PROC DIAG;        # PRINT DIAGNOSTIC MSG #                   007690
      XREF  PROC  CLOSETL;
      XREF PROC  READ;       #TO READ VARIABLES FROM -INPUT-# 
      XREF PROC  OPENM;      #TO COPY VARIABLES TO CRM FILE#
      XREF PROC  ENDFILE; 
      XREF PROC  CLOSEM;
      XREF PROC  PUT; 
      XREF ITEM QUIRL;       #LENGTH OF INPUT IN -QUIWSA-#
      XREF ITEM PFLAG;             # PREVIEW FLAG FOR *REPORT*         #
      XREF ITEM MXTRNLG I;         #MAX TRANS LENGTH                   #
      XREF ITEM QUIWLGW;           # WHOLE WORDS TO CONTAIN MXTRNLG    # FEAT157
      XREF  ITEM  OPROCESSED  B;
      XREF  ITEM  IPROCESSED  B;
      XREF  ITEM  TPROCESSED  B;
      XREF BASED ARRAY WBUFFER; 
        BEGIN 
        ITEM WBUFFC  C(0,0,10); 
        END 
      XREF BASED ARRAY RBUFFER;;   # BUFFER FOR READ/WRITE             #
      XREF ARRAY INPUT;            #INPUT FILE FET                     #
        BEGIN 
        END 
      ITEM  I;
      ITEM RETCODE;          #RETURN CODE FOR -READ-# 
      ITEM J;                #LOOP VARIABLE#
      ITEM WORD I;           # POINTER INTO LOW CORE #                  007700
      ITEM KEY C(7);         # KEYWORD PARAMETER #                      007710
      ITEM FOUNDR B;         # FLAGS TO TELL IF EACH KEYWORD #          007720
      ITEM FOUNDT B;         # HAS BEEN FOUND YET #                     007730
      XDEF ITEM FOUNDI B; 
      ITEM FOUNDP B;                                                    007750
      # FOUNDV IS IN COMMON REPCOM #                                    007760
      ITEM QUIT B;           # ERROR FLAG #                             007770
      ITEM TABFILE C(7);     # TABLE LFN #                              007780
      XDEF ITEM INFILE C(7);       # DATA INPUT LFN                    #
      ITEM VARFILE C(7);     # VARIABLE FILE LFN #                      007800
      ITEM DEFAULTV B;       # FLAG--VARFILE EXPLICIT #                 007810
      ITEM PARM C(7);        # PREVIEW PARAMETER CODE #                 007820
      ARRAY OPTIONS [0:6];   # CONTROL CARD OPTIONS #                   007830
        BEGIN                                                           007840
        ITEM OPT C (0,0,7);                                             007850
        ITEM CHAR C (0,0,6)=["R", "T", "I", "P", "V", "X", "A"];        007860
        ITEM ZER U (0,6,54)=[0, 0, 0, 0, 0, 0, 0];                      007870
        END                                                             007880
      XREF PROC QUCLOCK;           # UPDATES CURRENT-TIME (MAYBE DATE) #
      XREF BASED ARRAY QUIWSA S(1);                                      FEAT157
        BEGIN                                                            FEAT157
        ITEM QUITEM;                                                     FEAT157
        END                                                              FEAT157
      XREF BASED ARRAY KEYWSA S(1);                                      FEAT157
        BEGIN                                                            FEAT157
        ITEM KEYAREA C(0,0,10);                                          FEAT157
        END                                                              FEAT157
      XREF PROC WRITE;
      XREF PROC CMOVE;
      ITEM B; 
      BASED ARRAY CARD;;
      CONTROL EJECT;                                                    007890
      PROC CHECKLFN(LFN, QUIT);                                         007900
                                                                        007910
# MAKE SURE THAT THE CHARACTER STRING LFN IS A LEGAL FILE NAME.         007920
  IT MUST START WITH A LETTER, WHICH IS FOLLOWED BY 0 TO 6              007930
  ALPHANUMERIC CHARACTERS, AND BLANK FILLED TO A TOTAL OF 7             007940
  CHARACTERS.  IF THERE IS ANYTHING WRONG, PRINT A MESSAGE AND          007950
  SET QUIT = TRUE. #                                                    007960
                                                                        007970
        BEGIN                                                           007980
        ITEM LFN C(7);       # PARAMETER--STRING TO BE CHECKED #        007990
        ITEM QUIT B;         # PARAMETER--ERROR FLAG #                  008000
        ITEM BLANK B;        # FLAG--BLANKS FOUND YET... #              008010
        ITEM CHAR I;         # LOOP VBLE--INDEX INTO STRING #           008020
                                                                        008030
# FIRST CHARACTER MUST BE A LETTER #                                    008040
                                                                        008050
        IF C<0,1>LFN GQ O"33" OR C<0,1>LFN EQ O"00" THEN                008060
          BEGIN             # DISPLAY CODE 0 OR BLANK #                 008070
          DIAG(240, LFN);                                               008080
          QUIT = TRUE;
          RETURN;                                                       008090
          END                                                           008100
                                                                        008110
# CHECK EACH SUBSEQUENT CHARACTER.  ONCE BLANKS START, ONLY             008120
  BLANKS ARE ALLOWED. #                                                 008130
                                                                        008140
        BLANK = FALSE;                                                  008150
        FOR CHAR=1 STEP 1                                                CRACKCC
          UNTIL 6                                                        CRACKCC
        DO                                                               CRACKCC
          BEGIN                                                          CRACKCC
          IF NOT BLANK THEN                                             008170
            BEGIN                                                        CRACKCC
            IF C<CHAR,1>LFN EQ O"00" THEN   # BLANK #                   008180
              BLANK = TRUE;                                             008190
            ELSE                                                        008200
              IF C<CHAR,1>LFN GR O"44" THEN   # DISPLAY CODE 9 #        008210
                BEGIN                                                   008220
                DIAG(240, LFN);                                         008230
                QUIT = TRUE;                                            008240
                RETURN;                                                 008250
                END                                                     008260
            END                                                          CRACKCC
          ELSE                                                          008280
            BEGIN                                                        CRACKCC
            IF C<CHAR,1>LFN NQ O"00" THEN   # BLANK #                   008290
              BEGIN                                                     008300
              DIAG(240, LFN);                                           008310
              QUIT = TRUE;                                              008320
              RETURN;                                                   008330
              END                                                       008340
            END                                                          CRACKCC
          END                                                            CRACKCC
        END                                                             008350
      CONTROL EJECT;                                                    008360
# INITIALIZATION #                                                      008370
                                                                        008380
      FOUNDR = FALSE;                                                   008390
      FOUNDT = FALSE;                                                   008400
      FOUNDI = FALSE;                                                   008410
      FOUNDP = FALSE;                                                   008420
      FOUNDV = FALSE;                                                   008430
      DEFAULTV = TRUE;                                                  008440
      QUIT = FALSE;                                                     008450
      PFLAG = 0;                                                        008460
                                                                        008470
      BEGIN 
        B<0,60>TIME=0;
      QUCLOCK;                     # UPDATE CURRENT-TIME               #
      QUIWLGW = (MXTRNLG / 9) * 10;   # NUMBER OF WHOLE WORDS FOR IT   # FEAT157
      J = QUIWLGW + 4;             # TRANS LENGTH PLUS A FEW...        # FEAT157
      I = CMM$ALF(J,0,0);          # GET -J- WORDS FOR QUIWSA          #
      P<KEYWSA> = I;               # -KEYWSA- POINTS TO THE FIRST WORD # FEAT157
      P<QUIWSA> = P<KEYWSA> + 1;   #-QUIWSA-  POINTS TO SECOND WORD    # FEAT157
      I = CMM$ALF(J,0,0); 
      P<AFIT> = LOC(INPUT);                                              CRACKCC
      AFITFWB = I;                 #SET FET FIELDS                     # CRACKCC
      AFITIN = I;                                                        CRACKCC
      AFITOUT = I;                                                       CRACKCC
      AFITLAST = I + J;                                                  CRACKCC
      I = CMM$ALF(J,0,0); 
        P<WBUFFER> = I; 
        P<RBUFFER> = I + 1; 
        WBUFFC[0] = "  "; 
        IPROCESSED = TRUE;
        OPROCESSED = TRUE;
        TERMINAL   = BATMODE; 
        TPROCESSED = FALSE; 
        CHPLINE = 136;
      END 
                                   # SET UP TO PRINT THE CONTROL CARD  #
      FOR WORD=O"70"  STEP 1  UNTIL O"77"   DO
        BEGIN 
        FOR B=0  STEP 6  UNTIL 54   DO
          BEGIN 
          IF B<B,6>RA[WORD]  EQ  00  THEN  B<B,6>RA[WORD] = O"55";
          END 
        END 
  
      P<CARD> = LOC(RA0[O"70"]);
      CMOVE (CARD, 0, 80, QUIWSA, 1); 
      B<0,6>QUITEM[0] = O"55";     # SET IN CARAGE CONTROL             #
      WRITE (QUIWSA, 80, RETCODE);
  
# GO THROUGH ALL PARAMETERS #                                           008480
                                                                        008490
      IF B<42,18>RA[O"64"] NQ 0 THEN   #NUMBER OF PARAMETERS#           008500
        BEGIN                                                           008510
        WORD = 1;                                                       008520
        FOR J=J                                                          CRACKCC
          WHILE WORD EQ 1                                                CRACKCC
          OR B<56,4>RA[WORD] EQ O"01"  #COMMA                          # CRACKCC
        DO                                                               CRACKCC
          BEGIN                                                         008540
          WORD = WORD + 1;                                              008550
          B<0,42>KEY = B<0,42>RA[WORD];    #NEXT PARAMETER#             008560
                                                                        008570
# THIS STRUCTURE HANDLES THE CASES KEY = R,T,I,P,V,OTHER #              008580
# IN MOST CASES, LOGIC GOES AS FOLLOWS: CHECK FOR DUPLICATION OF        008590
  PARAMETER.  MARK IT FOUND.  CHECK FOR EQUAL SIGN.  IF ONE IS THERE,   008600
  GET THE PARAMETER (USUALLY AN LFN) FROM THE NEXT WORD.  ONLY THE      008610
  FIRST CASE HERE IS COMMENTED. #                                       008620
                                                                        008630
          IF KEY EQ OPT[0] THEN      #REPORT FILE#                      008640
            BEGIN                                                       008650
            IF FOUNDR THEN       #CHECK DUPLICATION#                    008660
              DIAG(229, "REPORT");                                      008670
            FOUNDR = TRUE;                                              008680
            IF B<56,4>RA[WORD] EQ O"2" THEN   #EXPECT EQUAL SIGN#       008690
              BEGIN                                                     008700
              WORD = WORD + 1;                                          008710
              B<0,42>REPFILE = B<0,42>RA[WORD];   #LFN FROM NEXT WORD#  008720
              CHECKLFN(REPFILE, QUIT);                                  008730
              END                                                       008740
            ELSE                                                        008750
              BEGIN                                                     008760
              IF B<56,4>RA[WORD] EQ O"1" OR B<56,4>RA[WORD] EQ O"17"    008770
                THEN         #COMMA OR TERMINATOR#                      008780
                DIAG(234, "R");   # NEED =LFN #                         008790
              QUIT = TRUE;                                              008800
              END                                                       008810
            TEST;                                                       008820
            END                                                         008830
                                                                        008840
          IF KEY EQ OPT[1] THEN   # TABLE FILE #                        008850
            BEGIN                                                       008860
            IF FOUNDT THEN                                              008870
              DIAG(229, "TABLE");                                       008880
            FOUNDT = TRUE;                                              008890
            IF B<56,4>RA[WORD] EQ O"2" THEN                             008900
              BEGIN                                                     008910
              WORD = WORD + 1;                                          008920
              B<0,42>TABFILE = B<0,42>RA[WORD];                         008930
              CHECKLFN(TABFILE, QUIT);                                  008940
              END                                                       008950
            ELSE                                                        008960
              BEGIN                                                     008970
              IF B<56,4>RA[WORD] EQ O"1" OR B<56,4>RA[WORD] EQ O"17"    008980
                THEN                                                    008990
                DIAG(234, "T");                                         009000
                QUIT = TRUE;                                            009010
                END                                                     009020
            TEST;                                                       009030
            END                                                         009040
                                                                        009050
          IF KEY EQ OPT[2] THEN   # INPUT FILE #                        009060
            BEGIN                                                       009070
            IF FOUNDI THEN                                              009080
              DIAG(229, "INPUT");                                       009090
            FOUNDI = TRUE;                                              009100
            IF B<56,4>RA[WORD] EQ O"2" THEN                             009110
              BEGIN                                                     009120
              WORD = WORD + 1;                                          009130
              B<0,42>INFILE = B<0,42>RA[WORD];                          009140
              CHECKLFN(INFILE, QUIT);                                   009150
              END                                                       009160
            ELSE                                                        009170
              BEGIN                                                     009180
              IF B<56,4>RA[WORD] EQ O"1" OR B<56,4>RA[WORD] EQ O"17"    009190
                THEN                                                    009200
                DIAG(234, "I");                                         009210
                QUIT = TRUE;                                            009220
                END                                                     009230
            TEST;                                                       009240
            END                                                         009250
                                                                        009260
          IF KEY EQ OPT[3] THEN   # PREVIEW PARAMETER #                 009270
            BEGIN                                                       009280
            IF FOUNDP THEN                                              009290
              DIAG(229, "PREVIEW");                                     009300
            FOUNDP = TRUE;                                              009310
            TEST;                                                       009540
            END                                                         009550
                                                                        009560
          IF KEY EQ OPT[4] THEN   # VARIABLE FILE #                     009570
            BEGIN                                                       009580
            IF FOUNDV THEN                                              009590
              DIAG(229, "VARIABLE");                                    009600
            FOUNDV = TRUE;                                              009610
            IF B<56,4>RA[WORD] EQ O"2" THEN                             009620
              BEGIN                                                     009630
              DEFAULTV = FALSE;                                         009640
              WORD = WORD + 1;                                          009650
              B<0,42>VARFILE = B<0,42>RA[WORD];                         009660
              CHECKLFN(VARFILE, QUIT);                                  009670
              END                                                       009680
            TEST;                                                       009690
            END                                                         009700
                                                                        009710
          ELSE                                                          009720
            BEGIN                                                       009730
            DIAG(232, KEY);   # UNRECOGNIZED KEY #                      009740
            IF B<56,4>RA[WORD] EQ O"2" THEN   # EQUAL SIGN #            009750
              WORD = WORD + 1;                                          009760
            QUIT = TRUE;                                                009770
            END                                                         009780
          END                                                           009790
                                                                        009800
# AT THE END, MAKE SURE THAT WE STOPPED AT A TERMINATOR. #              009810
                                                                        009820
        IF B<56,4>RA[WORD] NQ O"17" THEN    #TERMINATOR#                009830
          BEGIN                                                         009840
          DIAG(233, C<0,7>RA[WORD]); # DIAGNOSTIC - INVALID DELIMITER. #
          QUIT = TRUE;                                                  009860
          END                                                           009870
        END                                                             009880
                                                                        009890
      IF FOUNDP  AND  FOUNDI   THEN 
        PFLAG = 2;                 # SET FOR 2 PAGE PREVIEW WITH DATA  #
      IF FOUNDP  AND  NOT FOUNDI   THEN 
        PFLAG = 1;                 # SET FOR 2 PAGE WITH DUMMY DATA    #
# CHECK COMPLETENESS AND CONSISTENCY OF PARAMETERS #                    009900
                                                                        009910
      IF NOT FOUNDR THEN                                                009920
        BEGIN                                                           009930
        DIAG(230, "REPORT");                                            009940
        QUIT = TRUE;                                                    009950
        END                                                             009960
      IF NOT FOUNDT THEN                                                009970
        BEGIN                                                           009980
        DIAG(230, "TABLE");                                             009990
        QUIT = TRUE;                                                    010000
        END                                                             010010
      IF NOT FOUNDI AND NOT FOUNDP THEN                                 010020
        BEGIN                                                           010030
        DIAG(231);           # AT LEAST I OR P MUST BE PRESENT #        010040
        QUIT = TRUE;                                                    010050
        END                                                             010060
                                                                        010120
      IF QUIT THEN                                                      010130
        BEGIN 
        CLOSETL;
        STOP; 
        END 
                                                                        010150
# INSERT THE FILE NAMES INTO THE FITS #                                 010160
                                                                        010170
      P<FIT> = LOC(RPTFIT);                                              CHANGES
      FITLFN = REPFILE;            #GET THE RPT LFN                    # CHANGES
      C<0,7>TFITWD[0] = TABFILE;                                        010190
  
# IF A VARIABLE FILE IS GIVEN AND IT IS -INPUT-, THE NEXT RECORD OF 
  -INPUT- IS COPIED TO THE FILE -ZZZZZQ9-, SO THAT IT CAN BE REWOUND AND
  SCANNED AT WILL.                                                     #
  
      P<FIT> = LOC(VARFIT);                                              CRACKCC
      IF FOUNDV THEN
        BEGIN 
          IF DEFAULTV OR B<0,42>VARFILE EQ O"11162025240000" THEN 
            BEGIN 
              FITBBH = TRUE;       # ALLOCATE BUFFERS BELOW HHA        #
              OPENM (VARFIT, $IO$, $R$, RA0);                           000100
              FOR J = J WHILE RETCODE EQ 0 DO 
              BEGIN 
                READ (QUIWSA, QUIRL, MXTRNLG, RETCODE); 
                IF RETCODE EQ 0    # IF WE ARE NOT AT END OF FILE      #
                THEN
                  BEGIN 
                  PUT(VARFIT, QUIWSA, QUIRL, RA0);
                  END 
              END 
              ENDFILE (VARFIT, RA0);
              CLOSEM(VARFIT, $DET$, RA0);  # CLOSE, RELEASE BUFFER SPC #
            END 
          ELSE
            BEGIN                                                        CRACKCC
            C<0,7>FITLFN = VARFILE;                                      CRACKCC
            END                                                          CRACKCC
        END 
  
      CLOSETL;               # CLEAN UP BEFOR EXIT                     #
      END                                                               010240
      TERM                                                              010250
