*COMDECK ALRDDIRS 
      OVERLAY(1,0)
      PROGRAM RDDIRS
C 
C 
C 
C        THIS ROUTINE READS THE INPUT DIRECTIVES AND SETS FLAGS 
C        AND FIELDS IN TABLES TO REFLECT THE USER REQUESTS. 
C 
C 
*CALL ALCOMMON
      LOGICAL EOFFLAG,ERR,OVADFLG,ALFANUM,TESTVAL 
      DIMENSION RPTS(4) 
C 
C 
      DATA MODULE /1/ 
      DATA MODTYPE,MAXAPPL,MAXRPTS,PASSIVE / 8,60,4,1 / 
      DATA HIGHBIT / 40000000000000000000B /
      DATA NOHIBIT / 37777777777777777777B /
      DATA MAXCORE,MAXBFSP,CHARC,CHARN / 128,64,1RC,1RN / 
      DATA RPTS / "BUFSP" , "DIR" , "MAP" , "INFO" /
      DATA CVALUE,NCVALUE / 20000000B , 0 / 
      DATA BASE,NOBASE / 10000000B , 0 /
      DATA MAXRCLM/15/
C 
C 
C 
C 
      OVADFLG = .FALSE. 
      TMPDATA = .FALSE. 
C 
      RNAMECT = 1 
      RPTNAME(1,1) = AND (10HBASE      ,ANAMASK)
C 
C 
C        READ A DIRECTIVE, AND BRANCH OUT IF WE GOT EOF OR AN ERROR.
C 
    1 CALL RDACARD(INPUT,EOFFLAG) 
      IF (EOFFLAG) GO TO 200
      IF (DIRTYPE.EQ.99) GO TO 900
      IF (DIRTYPE.EQ.98) GO TO 9000 
C 
C        IF THIS IS NOT A MOD DIRECTIVE, MAKE SURE NO MOD DIRECTIVES
C        HAVE BEEN ENCOUNTERED YET. 
C 
      IF (DIRTYPE.EQ.MODTYPE .OR. DIRTYPE.EQ.PASSIVE) GO TO 5 
      IF (GOTMOD) GO TO 905 
C 
C        BRANCH ACCORDING TO THE DIRECTIVE TYPE.
C 
    5 GO TO (10,20,30,40,50,60,70,80,90,100,110,120,130,140,150), 
     1   DIRTYPE
C 
C 
C        PASSIVE DIRECTIVES 
C 
C        OUTPUT THE DIRECTIVE IF REQUIRED.
C 
   10 BACKSPACE INPUT 
      READ (INPUT,15) (CARD(I),I=1,72)
   15 FORMAT (80R1) 
      CALL OUTPASS
      GO TO 1 
C 
C 
C        APPL=
C 
C        GET THE APPLICATION NAME.
C 
  20  CALL GETPARM(ANAME,ERR) 
      IF (ERR) GO TO 910
* 
*        SEE IF THIS NAME HAS ALREADY BEEN SPECIFIED
* 
         ANAME = ANAME.AND.ANAMASK
         DO 2005 I = 1,APPLCTR
         IF ((APPLNAM(I).AND.ANAMASK) .EQ. ANAME) GO TO 996 
2005     CONTINUE 
* 
C 
C        VERIFY APPLICATION LIMIT HAS NOT BEEN EXCEEDED.
C 
      APPLCTR = APPLCTR + 1 
      IF (APPLCTR.GT.MAXAPPL) GO TO 915 
C 
C        STORE THE APPLICATION NAME.
C 
26       APPLNAM(APPLCTR) = ANAME 
265      CONTINUE 
C 
C        IF THE USER IS SPECIFYING C/NC/ADDRESS, THEN BRANCH. 
C 
      CHAR = CARD(CARDPTR)
      IF (CHAR.EQ.LPAREN) GO TO 21
C 
C        IF A COMMA OR BLANK FOLLOWS THE APPLICATION NAME,
C        SET C AS THE DEFAULT.
C 
      IF (CHAR .NE. COMMA .AND. CHAR .NE. BLANK) GO TO 925
      APPLNAM(APPLCTR) = OR(APPLNAM(APPLCTR), CVALMSK)
      IF (CHAR .EQ. BLANK) GO TO 1
  24  CARDPTR = CARDPTR + 1 
      GO TO 20
C 
C        DETERMINE WHETHER THE NEXT CHARACTER IS AN ALFANUMERIC.
C 
  21  CARDPTR = CARDPTR + 1 
      CHAR = CARD(CARDPTR)
      IF (.NOT. ALFANUM(CHAR)) GO TO 920
C 
C        EXPLANATION OF LETRDIG VALUES: 
C            0 - NON-ALFANUMERIC
C            1 - LETTER 
C            2 - DIGIT
C 
      IF (LETRDIG - 1) 920,220,221
 220  IF (CHAR .EQ. CHARC) GO TO 22 
      IF (CHAR .NE. CHARN .OR. CARD(CARDPTR+1) .NE. 
     X    CHARC) GO TO 920
C 
C        IF "NC" SPECIFIED, SET THE "NC" VALUE FLAG AND 
C        INCREMENT THE POINTER TO THE SECOND CHARACTER AFTER "C". 
C 
      VALUE = NCVALUE 
      CARDPTR = CARDPTR + 3 
      GO TO 23
C 
C        THE LETTER HAS BEEN DETERMINED TO BE "C".  SET THE VALUE 
C        FLAG, INCREMENT THE POINTER TO THE SECOND CHARACTER AFTER "C", 
C        BUT STATEMENT 221 KEEPS THE POINTER STATIC WHEN ONLY AN
C        ADDRESS IS WITHIN THE PARENTHESES. 
C 
 221  CARDPTR = CARDPTR - 2 
  22  VALUE = CVALMSK 
      CARDPTR = CARDPTR + 2 
C 
C        SET THE CORRECT VALUE IN THE APPLICATION TABLE.
C 
  23  APPLNAM(APPLCTR) = AND(APPLNAM(APPLCTR), ANAMASK) + VALUE 
C 
C        BRANCH DEPENDING UPON WHETHER THE ADDRESS HAS BEEN INCLUDED, 
C        AN APPLICATION FOLLOWS, OR THE CARD TERMINATES.
C 
      CHAR = CARD(CARDPTR-1)
      CHAR1 = CARD(CARDPTR) 
C 
C        DETERMINE WHETHER ANOTHER APPLICATION FOLLOWS. 
C 
      IF (CHAR .EQ. RPAREN .AND. CHAR1 .EQ. COMMA) GO TO 24 
C 
C        AN ADDRESS MAY FOLLOW
C 
      TESTVAL = ALFANUM(CHAR1)
      IF (LETRDIG .EQ. 2) GO TO 27
C 
C        OTHERWISE CARD TERMINATES WITH A BLANK, AN ERROR IF NOT. 
C 
      IF (CHAR .NE. RPAREN) GO TO 920 
  25  IF (CARD(CARDPTR) .NE. BLANK) GO TO 925 
      GO TO 1 
C 
C        DETERMINE THE ADDRESS. 
C 
  27  CALL GETNUM(APPLADD(APPLCTR),ERR) 
      IF (ERR) GO TO 920
C 
C        TEST THE SYNTAX
C 
      IF(CARD(CARDPTR) .NE. RPAREN) GO TO 920 
C 
C        THE NEXT CHARACTER MUST BE EITHER A COMMA TO CONTINUE
C        OR A BLANK TO TERMINATE. 
C 
      IF(CARD(CARDPTR+1) .EQ. BLANK) GO TO 1
      IF(CARD(CARDPTR+1) .NE. COMMA) GO TO 920
      CARDPTR = CARDPTR + 2 
      GO TO 20
C 
C 
C        BUFSPSIZE= 
C 
C        GET ONE BUFFER SPACE MAP SIZE. 
C 
   30 CALL GETNUM(VALUE,ERR)
      IF (ERR) GO TO 930
C 
C        MAKE SURE THE VALUE IS WITHIN RANGE AND WE HAVE NOT
C        EXCEEDED THE MAXIMUM NUMBER OF SPECIFICATIONS. 
C 
      IF (VALUE.GT.MAXCORE) GO TO 945 
      BUFSPCT = BUFSPCT + 1 
      IF (BUFSPCT.GT.MAXBFSP) GO TO 935 
C 
C        INSERT THE VALUE, AND CHECK FOR A COMMA.  A COMMA INDICATES
C        ANOTHER BUFFER SPACE VALUE, AND IF NO COMMA FOLLOWS, GO
C        CHECK FOR VALID END OF DIRECTIVE.
C 
   31 BUFSP(BUFSPCT) = VALUE
      IF (CARD(CARDPTR).NE.COMMA) GO TO 25
      CARDPTR = CARDPTR + 1 
      GO TO 30
C 
C 
C        CCP
C 
C        SET THE CCP FLAG TRUE, THEN GO GET THE NEXT DIRECTIVE. 
C 
   40 CCP = .TRUE.
      GO TO 1 
C 
C 
C        CORESIZE=
C 
C        IF WE ALREADY HAVE ONE OF THESE, FLAG AN ERROR.
C 
   50 IF(CRSZDIR) GO TO 940 
C 
C        IF THIS IS THE FIRST ONE, GET THE VALUE AND PUT IT IN THE
C        CORESIZE ALLOCATION, MAKING SURE IT IS WITHIN LIMITS.
C 
      CRSZDIR = .TRUE.
   51 CALL GETNUM(VALUE,ERR)
      IF (ERR) GO TO 930
      IF (CORESIZ.GT.MAXCORE) GO TO 945 
      CORESIZ = VALUE * 1024
      GO TO 25
C 
C 
C        DEF= 
C 
C        SET THE VALUE FOR THE NON-BASE DEFINITION. 
C 
   60 VALUE = NOBASE
C 
C        GET THE NAME OF THE DEFINED APPLICATION. 
C 
   61 CALL GETPARM(ANAME,ERR) 
      IF (ERR) GO TO 910
C 
C        MAKE SURE WE DON'T HAVE TOO MANY DEFINED APPLICATIONS. 
C 
      DAPPLCT = DAPPLCT + 1 
      IF (DAPPLCT.GT.MAXAPPL) GO TO 950 
C 
C        PUT THE NAME IN THE DEFINED APPLICATIONS ARRAY.
C 
   62 DEFAPPL(DAPPLCT) = AND(ANAME,ANAMASK) + VALUE 
C 
C        IF WE DO NOT HAVE A COMMA, CHECK FOR VALID END OF DIRECTIVE. 
C        OTHERWISE, GET THE NEXT APPLICATION NAME.
C 
      IF (CARD(CARDPTR).NE.COMMA) GO TO 25
      CARDPTR = CARDPTR + 1 
      GO TO 61
C 
C 
C        DEFBASE= 
C 
C        TREAT THIS THE SAME AS DEF=, BUT SET THE BASE FLAG WITH THE NAME.
C 
   70 VALUE = BASE
      GO TO 61
C 
C 
C        MOD= 
C 
C        INDICATE THAT WE HAVE READ A MOD DIRECTIVE, THEN CALL THE
C        ROUTINE TO PARSE IT. 
C 
   80 GOTMOD = .TRUE. 
      CALL MODPARS(ERR) 
      GO TO 1 
C 
C 
C        PAGEREG= 
C 
C        INDICATE THAT THE USER HAS SUPPLIED A PAGE REGISTER. 
C 
   90 PGREGD = .TRUE. 
C 
C        GET THE PAGE REGISTER, MAKE SURE IT IS O.K., THEN SAVE IT. 
C 
      CALL GETNUM(VALUE,ERR)
      IF (ERR) GO TO 930
      IF (VALUE.GT.31) GO TO 960
      PAGEREG = VALUE 
      GO TO 25
C 
C 
C        PAGESIZES= 
C 
C        GET THE VALUE OF A PAGESIZE, AND MAKE SURE IT IS WITHIN RANGE. 
C 
  100 CALL GETNUM(VALUE,ERR)
      IF (ERR) GO TO 930
      IF (VALUE.GT.64) GO TO 965
C 
C        MAKE SURE WE HAVEN'T GOTTEN TOO MANY PAGE SIZES, THEN STORE IT.
C 
      PGSZCNT = PGSZCNT + 1 
      IF (PGSZCNT.GT.32) GO TO 970
      PAGSIZS(PGSZCNT) = VALUE * 1024 
C 
C        IF THIS DOES NOT END WITH A COMMA, GO CHECK FOR VALID END. 
C        OTHERWISE, GO GET THE NEXT PAGE SIZE.
C 
      IF (CARD(CARDPTR).NE.COMMA) GO TO 25
      CARDPTR = CARDPTR + 1 
      GO TO 100 
C 
C 
C        RESERVE= 
C 
C        GET THE START ADDRESS OF THE RESERVED AREA.
C 
  110 CALL GETNUM(VALUE,ERR)
      IF (ERR) GO TO 930
C 
C        INSERT VALUE = 1 TO PROTECT THE RESERVED AREA STARTING 
C        AT $0000.  OTHERWISE IT IS UNRECOGNIZABLE. 
C 
      IF (VALUE .EQ. 0) VALUE = 1 
C 
C        ERROR IF THERE IS NO COMMA HERE. 
C 
      IF (CARD(CARDPTR).NE.COMMA) GO TO 975 
C 
C        GET THE END ADDRESS OF THE RESERVED AREA.
C 
      CARDPTR = CARDPTR + 1 
      CALL GETNUM(VALUE2,ERR) 
      IF (ERR) GO TO 930
C 
C        STORE AWAY THE RESERVED AREA VALUES, WITH A FLAG INDICATING
C        THIS IS NOT RESERVED DUE TO AN ABSOLUTE ADDRESSES MODULE.
C 
      RSRVCTR = RSRVCTR + 1 
      RESERVD(1,RSRVCTR) = VALUE
      RESERVD(2,RSRVCTR) = VALUE2 
      RESERVD(3,RSRVCTR) = 0
      GO TO 25
C 
C 
C        RPT= 
C 
C        FLAG AN ERROR IF NO LIST FILE WAS PROVIDED.
C 
  120 IF (NOLIST) GO TO 985 
C 
C        GET A REPORT TYPE REQUESTED. 
C 
      CALL GETPARM(VALUE,ERR) 
      IF (ERR) GO TO 980
C 
C        SEE IF IT MATCHES ANY OF THE VALID TYPES.
C 
      DO 121 I=1,MAXRPTS
      IF (VALUE.EQ.RPTS(I)) GO TO 122 
  121 CONTINUE
C 
C        ERROR IF NOT MATCHED.
C 
      GO TO 980 
C 
C        SET THE PROPER REPORT TYPE TRUE, THEN CHECK FOR ANOTHER
C        REPORT IF A COMMA FOLLOWS, OR A VALID END IF ANYTHING
C        ELSE FOLLOWS.
C 
  122 REPORTS(I) = .TRUE. 
      IF (CARD(CARDPTR).NE.COMMA) GO TO 25
      CARDPTR = CARDPTR + 1 
      GO TO 120 
C 
C 
C        OVLYADDR=
C 
C 
C        FLAG AN ERROR IF THIS COMMAND HAS ALREADY BEEN GIVEN.
C 
C 
  130 IF (OVADFLG) GO TO 990
      OVADFLG = .TRUE.
C 
C        PICK UP THE BEGINNING OVERLAY AREA ADDRESS.
C 
      CALL GETNUM(OVLYBGN,ERR)
      IF (ERR) GO TO 930
C 
C        GO CHECK FOR END OF CARD IF A COMMA DOES NOT FOLLOW. 
C 
      IF (CARD(CARDPTR).NE.COMMA) GO TO 25
C 
C        OTHERWISE, PICK UP THE AREA END ADDRESS. 
C 
      CARDPTR = CARDPTR + 1 
      CALL GETNUM(OVLYEND,ERR)
      IF (ERR) GO TO 930
      GO TO 25
C 
C 
C        DEFRPT=
C 
C        GET THE APPLICATION NAME 
  140 CALL GETPARM(ANAME,ERR) 
      IF (ERR) GO TO 910
      RAPPLCT = RAPPLCT + 1 
      IF(RAPPLCT .GT.MAXAPPL) GO TO 1000
      RPTAPPL(1,RAPPLCT) = AND (ANAME,ANAMASK)
      IF(RPTAPPL(1,RAPPLCT).EQ.6LLIP   )
     1      INTRFC = INTRFC + 1 
      IF(RPTAPPL(1,RAPPLCT).EQ.6LHIP   )
     1      INTRFC = INTRFC + 2 
      IF (CARD(CARDPTR) .NE. LPAREN) GO TO 910
      CARDPTR = CARDPTR + 1 
C 
C        GET REPORT NAME
      CALL GETPARM (ANAME,ERR)
      IF(ERR) GO TO 910 
      ANAME = AND(ANAME,ANAMASK)
      DO 141 I=1,RNAMECT
  141 IF(ANAME .EQ.RPTNAME(1,I)) GO TO 142
C 
C        NEW REPORT NAME
C 
      RNAMECT = RNAMECT + 1 
      IF (RNAMECT .GT. MAXRCLM) GO TO 1010
      RPTNAME(1,RNAMECT) = ANAME
      RPTNAME(2,RNAMECT) = RAPPLCT
      GO TO 1 
C 
C        OLD REPORT NAME
C 
  142 RPTAPPL(2,RAPPLCT) = RPTNAME(2,I) 
      RPTNAME(2,I) = RAPPLCT
      GO TO 1 
* 
*        SAMAREA= 
*          ERROR IF MORE THAN ONE 
* 
150      CONTINUE 
         IF (SAMAFLG) GO TO 992 
         SAMAFLG = .TRUE. 
* 
*        GET START ADDRESS
* 
         CALL GETNUM (SAMSTRT,ERR)
         IF (ERR) GO TO 930 
* 
*        ERROR IF NO COMMA
* 
         IF (CARD(CARDPTR) .NE. COMMA) GO TO 994
* 
*        GET END ADDRESS
* 
         CARDPTR = CARDPTR+1
         CALL GETNUM (SAMEND,ERR) 
         IF (ERR) GO TO 930 
         IF (SAMSTRT .GE. SAMEND) GO TO 994 
         GO TO 25 
C 
C 
C 
C        END OF INPUT DIRECTIVES PROCESSING.
C 
C        IF ANY ERRORS OCCURRED, PUT A MESSAGE TO THE DAYFILE.
C 
C 
C        FIRST CHECK DEF AND RPT APPL NAMES 
C 
  200 SWITCH = 1
      IF(RAPPLCT .EQ. 0) GO TO 205
      DO 202 I = 1,RAPPLCT
      DO 201 J = 1,APPLCTR
  201 IF(RPTAPPL(1,I) .EQ. AND(APPLNAM(J),ANAMASK)) GO TO 202 
      GO TO 1020
  202 CONTINUE
  205 SWITCH = 1
      IF(DAPPLCT .EQ. 0) GO TO 206
      DO 204 I=1,DAPPLCT
      DO 203 J=1,APPLCTR
  203 IF(AND(DEFAPPL(I),ANAMASK).EQ.AND(APPLNAM(J),ANAMASK))GO TO 204 
      GO TO 1030
  204 CONTINUE
  206 CONTINUE
      IF (ERROR) CALL REMARK("AUTO-LINK INPUT DIRECTIVES ERROR")
      IF (TMPDATA) END FILE TMPUNIT 
      RETURN
C 
C 
C 
C 
C        ERROR BRANCHES 
C 
C 
C        UNRECOGNIZABLE DIRECTIVE 
C 
  900 CALL ERRMSG(MODULE,1) 
      GO TO 1 
C 
C        NON-MOD DIRECTIVE FOLLOWED MOD 
C 
  905 CALL ERRMSG(MODULE,2) 
      GO TO 1 
C 
C        INVALID SUBPARAMETER 
C 
  910 CALL ERRMSG(MODULE,3) 
      GO TO 1 
C 
C        MORE THAN 60 APPLICATIONS DEFINED
C 
  915 CALL ERRMSG(MODULE,4) 
      APPLCTR = MAXAPPL 
      GO TO 26
C 
C        INVALID APPLICATION (C/NC/ADDRESS) PARAMETER.
C 
  920 CALL ERRMSG(MODULE,5) 
      GO TO 1 
C 
C        INVALID TERMINATION OF DIRECTIVE 
C 
  925 CALL ERRMSG(MODULE,6) 
      GO TO 1 
C 
C        INVALID NUMERIC DIGIT
C 
  930 CALL ERRMSG(MODULE,7) 
      GO TO 1 
C 
C        MORE THAN 64 BUFSPSIZES
C 
  935 CALL ERRMSG(MODULE,8) 
      BUFSPCT = MAXBFSP 
      GO TO 31
C 
C        MORE THAN ONE CORESIZE DIRECTIVE 
C 
  940 CALL ERRMSG(MODULE,9) 
      GO TO 51
C 
C        CORE SIZE VALUE .GT. 128 
C 
  945 CALL ERRMSG(MODULE,10)
      GO TO 1 
C 
C        MORE THAN 60 DEFINED APPLICATIONS
C 
  950 CALL ERRMSG(MODULE,11)
      DAPPLCT = MAXAPPL 
C 
C        ERROR IN MOD CARD
C 
  955 CALL ERRMSG(MODULE,12)
      GO TO 1 
C 
C        INVALID PAGE REGISTER NUMBER 
C 
  960 CALL ERRMSG(MODULE,13)
      GO TO 25
C 
C        PAGE SIZE .GT. 64
C 
  965 CALL ERRMSG(MODULE,14)
      GO TO 1 
C 
C        MORE THAN 32 PAGESIZES 
C 
  970 CALL ERRMSG(MODULE,15)
      GO TO 1 
C 
C        INVALID RESERVE ADDRESS
C 
  975 CALL ERRMSG(MODULE,16)
      GO TO 1 
C 
C        INVALID REPORT TYPE REQUEST
C 
  980 CALL ERRMSG(MODULE,17)
      GO TO 1 
C 
C        REPORTS REQUESTED, BUT NO LIST FILE PROVIDED.
C 
  985 CALL ERRMSG(MODULE,44)
      GO TO 1 
C 
C        MULTIPLE OVERLAY AREA ADDRESS DIRECTIVES.
C 
  990 CALL ERRMSG(MODULE,48)
      GO TO 1 
* 
*        MULTIPLE SAM AREA DIRECTIVES 
* 
992      CONTINUE 
         CALL ERRMSG (MODULE,58)
         GO TO 1
* 
*        INVALID SAM AREA ADDRESS 
* 
994      CONTINUE 
         CALL ERRMSG (MODULE,59)
         GO TO 1
* 
*        APPLICATION ALREADY SPECIFIED
* 
996      CONTINUE 
         WARNING = .TRUE. 
         CALL ERRMSG (MODULE,62)
         GO TO 265
C 
C 
C 
C        TOO MANY REPORT APPLICATIONS 
C 
 1000 CALL ERRMSG(MODULE,54)
      RAPPLCT = MAXAPPL 
      GO TO 1 
C 
C        TOO MANY REPORT NAMES
C 
 1010 CALL ERRMSG(MODULE,55)
      RNAMECT = MAXRCLM 
      GO TO 1 
C 
C        BAD REPORT APPL NAME 
C 
 1020 GO TO (1021,1022) SWITCH
 1021 SWITCH = 2
      CALL ERRMSG(MODULE,56)
 1022 WRITE (ERRFIL,1023) RPTAPPL(1,I)
 1023 FORMAT (10X,A6) 
      GO TO 202 
C 
C        BAD DEF APPL NAME
C 
 1030 GO TO (1031,1032) SWITCH
 1031 SWITCH = 2
      CALL ERRMSG(MODULE,57)
 1032 WRITE(ERRFIL,1023) DEFAPPL(I) 
      GO TO 204 
C 
C 
 9000 VALUE = CARD(3) - ZERO
      IF (VALUE.EQ.1) CALL PDUMP(APPLNAM,APPLNAM(60),0) 
      IF (VALUE.EQ.2) CALL PDUMP(DEFMASK,REPORTS(4),0)
      IF (VALUE.EQ.3) CALL PDUMP(MODCNTR,MODTABL(5,6),0)
      GO TO 1 
      END 
C 
C 
*CALL ALMODPARS 
*CALL ALOUTPASS 
*CALL ALRDACARD 
*CALL ALGETPARM 
*CALL ALGETNUM
*CALL ALNUM 
*CALL ALOUTIDIR 
