*DECK TYPECL
USETEXT DNTEXT
USETEXT RPTEXT
PROC TYPECL;
          BEGIN 
  
          #TYPE CLAUSE ROUTINE# 
          #X# 
          #THIS ROUTINE#
          #- DOES ANALYSIS ON ONE REPORT GROUP WITH RESPECT TO# 
          #SYNTAX RULES IN SECTION 6.41.3 ON  THE TYPE CLAUSE#
  
  
          #DECLARATIONS FOR TYPE CLAUSE RT# 
  
          ITEM
                 TYPEINDEX    I,
                 PAGEAUXINDX  I,
                 F1CNTRLAUXIN I,
                 RGDNATPTR    I,
                 AUXINDEX     I,
                 DISOURCEID   I,
                 LOWBOUNDSRCE I,
                 UPPBOUNDSRCE I,
                 TCDIAGNO     I,
                 TCLINEREF    I;
          DEF    M64          #64#; 
          DEF    M65          #65#; 
          DEF    M66          #66#; 
          DEF    M67          #67#; 
          DEF    M68          #68#; 
          DEF    M69          #69#; 
  
  
          ITEM   $TEMP$,
                $DUMMY$;
  
          XREF   FUNC         OVERLAP;
          XREF   PROC         INTERCEPT;
          XREF   FUNC         PLTCNVRT I; 
          XREF   PROC         RWSET    ;
          XREF   PROC         RWSET1   ;
          XREF   PROC         GETNEXT  ;
          XREF   FUNC         RP$AUXPTR;
          XREF   FUNC         RWGET    ;
          XREF   FUNC         RWGET1   ;
  
          DEF    GET          #GETFIELD#; 
          DEF    SET          #SETFIELD#; 
          DEF    GETQ         #GETQUICK#; 
  
*CALL RPCOMM
  
*CALL AUXT1 
*CALL AUXTVALS
*CALL DNATVALS
*CALL GETSET
*CALL TABLNAMES 
  
  
  
          CONTROL EJECT;
  
          #INTERNAL PROCEDURE  NO 1#
  
PROC RTTCDIAG;
          BEGIN 
  
          #PARAMETERS TO THIS PROC. ARE#
          #TCDIAGNO  (INDICATES WHICH DIAG TO PRINT)# 
          #TCLINEREF (USE THIS TO GET LINE NUM. REFERENCE)# 
  
          ANALONLYRGRP = 1; 
          CALLDDIAG(TCLINEREF,TCDIAGNO);
          END #RTTCDIAG#
          CONTROL EJECT;
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EPTRACE("TYPECL ")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
  
          #WILL FIRST DETERMINE IF IT IS POSSIBLE TO ANALYZE TYPE#
          #CLAUSE FOR THIS REPORT GROUP#
  
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,DNATPOINTER);
          IF $TEMP$ EQ 1
              AND 
              RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER)) NQ 0 
          THEN
              GOTO TC2; 
  
          #ELSE- CANNOT ANALYZE TYPE CLAUSE,  SO# 
  
          ANALONLYRGRP = 1; 
          #INSURE THAT IT IS ON#
          GOTO ENDTYPECLRT; 
  
          #BUILD A "SHELL" AUX-RPW-GENERATE TYPE AUX-TABLE# 
          #ENTRY IF TYPE OF REPORT GROUP = DETAIL#
  
TC2:  
          IF RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER)) EQ DE 
          THEN
              BEGIN 
              LASTAUXENTRY = LASTAUXENTRY + 1;
              SET(DN$AUXREF,DNAT$,DNATPOINTER,LASTAUXENTRY);
              SET(AX$TNEXTPTR,AUX$,LASTAUXENTRY,0); 
              SET(AX$TTYPE,AUX$,LASTAUXENTRY,AUXRPWGEN);
  
              #THE FOLLOWING 3 ITEMS WILL BE CHANGED/SET UP BY# 
              #BLDETAILTABL IF NO USER ERROR INTERVENES#
              #TO PREVENT GENERATION OF DETAIL TABLES#
  
              SET(AX$1DETPAR,AUX$,LASTAUXENTRY,0);
              SET(AX$LSTDETPAR,AUX$,LASTAUXENTRY,0);
              SET(AX$SUPPERF,AUX$,LASTAUXENTRY,1);
              END 
  
          #RULE 6.41.3.2   RH, PH, PF, RF, CF-FINAL, CH-FINAL REPORT# 
          #GROUPS CAN APPEAR ONLY ONCE IN A REPORT DESCRIPTION# 
  
          TYPEINDEX = RP$AUXPTR(DNATPOINTER); 
          $TEMP$ = RWGET(RATYPERGROUP,TYPEINDEX); 
          IF $TEMP$ EQ RH 
              OR
              $TEMP$ EQ PH
              OR
              $TEMP$ EQ PF
              OR
              $TEMP$ EQ RF
          THEN
              GOTO TC2B;
  
          #ELSE -#
  
          IF RWGET(RATYPERGROUP,TYPEINDEX) NQ CH
              AND 
              RWGET(RATYPERGROUP,TYPEINDEX) NQ CF 
          THEN
              GOTO TC3; 
          #IF TYPE IS CF OR CH, SEE IF CONTROL ID = FINAL#
          IF RWGET(RACI$FINAL,TYPEINDEX) EQ 0 
          THEN
              GOTO TC3; 
TC2B: 
  
          #HAS THIS TYPE REPORT GROUP ALREADY APPEARED IN THIS# 
          #REPORT. IF SO WILL ISSUE A DIAG, ELSE WILL SET#
          #A FLAG TO INDICATE THAT TYPE REPORT GROUP HAS# 
          #APPEARED NOW#
  
          SWITCH GTYPERG TC3,RHCASE1,PHCASE2,CHFCASE3,TC3,CFFCASE5, 
                         PFCASE6,RFCASE7; 
          $TEMP$ = RWGET(RATYPERGROUP,TYPEINDEX); 
          GOTO GTYPERG[$TEMP$]; 
RHCASE1:  
              BEGIN 
              IF RHDEFIND EQ 1
              THEN
                  GOTO TC2BDIAG;
              ELSE
                  RHDEFIND = 1; 
              GOTO TC3; 
              END 
PHCASE2:  
              BEGIN 
              IF PHDEFIND EQ 1
              THEN
                  GOTO TC2BDIAG;
              ELSE
                  PHDEFIND = 1; 
              GOTO TC3; 
              END 
CHFCASE3: 
              BEGIN 
              IF CHFDEFIND EQ 1 
              THEN
                  GOTO TC2BDIAG;
              ELSE
                  CHFDEFIND = 1;
              GOTO TC3; 
              END 
CFFCASE5: 
              BEGIN 
              IF CFFDEFIND EQ 1 
              THEN
                  GOTO TC2BDIAG;
              ELSE
                  CFFDEFIND = 1;
              GOTO TC3; 
              END 
PFCASE6:  
              BEGIN 
              IF PFDEFINED EQ 1 
              THEN
                  GOTO TC2BDIAG;
              ELSE
                  PFDEFINED = 1;
              GOTO TC3; 
              END 
RFCASE7:  
              BEGIN 
              IF RFDEFIND EQ 1
              THEN
                  GOTO TC2BDIAG;
              ELSE
                  RFDEFIND = 1; 
              GOTO TC3; 
              END 
TC2BDIAG: 
  
          #DIAGNOSTIC (M64  )#
          #RH, PH, CH-FINAL, CF-FINAL, PF, AND RF REPORT GROUPS MAY#
          #EACH APPEAR ONLY ONCE IN THE DESCRIPTION OF A REPORT#
          TCDIAGNO = M64  ; 
          TCLINEREF = DNATPOINTER;
          RTTCDIAG; 
  
          #RULE 6.41.3.3# 
          #PH AND PF REPORT GROUPS MAY BE SPECIFIED ONLY IF A#
          #PAGE CLAUSE IS SPECIFIED IN CORRESPONDING RD ENTRY#
  
TC3:  
          IF RDOCURDSWTCH EQ 0
          THEN
              BEGIN 
              ANALONLYRGRP = 1; 
              GOTO ENDTYPECLRT; 
              END 
          #IS NO VALID CURRDDNAT-NOR WORTHWHILE CIDTLINK# 
          #FOR RULE 4, 5# 
  
          IF RWGET(RATYPERGROUP,TYPEINDEX) EQ PH
              OR
              RWGET(RATYPERGROUP,TYPEINDEX) EQ PF 
          THEN
              BEGIN 
              PAGEAUXINDX = 1 + RP$AUXPTR(CURRDDNAT); 
              IF RWGET(PAGELIMITBIT,PAGEAUXINDX) EQ 1 
              THEN
                  GOTO TC4; 
  
              #ELSE ERROR-# 
  
  
              #DIAGNOSTIC  (M65)# 
              #PH AND PF REPORT GROUPS MAY BE SPECIFIED ONLY IF A#
              #PAGE CLAUSE IS SPECIFIED IN CORRESPONDING RD ENTRY#
  
              TCDIAGNO = M65; 
              TCLINEREF = DNATPOINTER;
              RTTCDIAG; 
              END 
  
          #RULE 6.41.3.4# 
          #CONTROL DATA ITEM AND FINAL MUST BE SPECIFIED IN THE#
          #CONTROL CLAUSE OF CORRESPONDING RD ENTRY. AT MOST ONE #
          #CH GROUP AND ONE CF GROUP CAN BE SPECIFIED            #
          #FOR EACH DATA-NAME OR FINAL IN THE CONTROL CLAUSE OF THE#
          #RD ENTRY.# 
  
TC4:  
          IF RWGET(RATYPERGROUP,TYPEINDEX) EQ CH
              OR
              RWGET(RATYPERGROUP,TYPEINDEX) EQ CF 
          THEN
              BEGIN 
              IF RWGET(RACONTRLDNAT,TYPEINDEX)EQ 0
              THEN
                  GOTO TC4CHKFINAL; 
  
              #ELSE SEARCH THRU CIDTLINK TO SEE IF FIND IT AMONG VALID# 
              #CONTROL-DATA-ITEMS#
  
              IF CIDTPTRCURRD NQ 0
              THEN
                  BEGIN 
                  CURRCIDTPTR = CIDTPTRCURRD; 
                  FOR $DUMMY$ = 0 WHILE RWGET1(CIDTLINK  #CURRCIDTPTR#) 
                      NQ 0 DO 
                      BEGIN 
                      IF  RWGET1(CIDTCONTRLID  #CURRCIDTPTR#) EQ
                      RWGET(RACONTRLDNAT,TYPEINDEX) 
                      THEN
                          GOTO TC4B;
                      CURRCIDTPTR = RWGET1(CIDTLINK  #CURRCIDTPTR#);
                      END 
                  END 
  
              #ELSE - ERROR#
  
  
              #DIAGNOSTIC  (M66  )# 
              #CONTROL DATA ITEM IN TYPE CLAUSE MUST BE A VALID#
              #SPECIFICATION IN THE CONTROL CLAUSE OF CORRESPONDING#
              #RD ENTRY#
  
              CALLADIAG(DNATPOINTER,M66  ); 
              ANALONLYRGRP = 1; 
              #NOTE -#
              #THIS ADVISORY MESSAGE IS NEEDED BECAUSE WHEN#
              #DOING SYNTAX CHECKING ON TYPE CLAUSE FOR A#
              #TYPE CH OR CF, THE USER WILL RECEIVE A MESSAGE#
              #ABOUT A BAD CONTROL-ID ONLY IF IT WAS UNDEFINED# 
              #OR IF ITS DNAT-TYPE = ERROR-TYPE. HOWEVER, WHEN# 
              #DOING SYNTAX CHECKING ON THE CONTROL CLAUSE,#
              #THIS CONTROL ITEM MAY HAVE BEEN ELIMINATED AS# 
              #A VALID CONTROL-ITEM FOR ANY OF SEVERAL OTHER# 
              #REASONS.#
              GOTO TC5; 
TC4B: 
              #WHEN CONTROL DATA ITEM APPEARS IN CIDTLINK THEN# 
              IF RWGET(RATYPERGROUP,TYPEINDEX) EQ CH
              THEN
                  BEGIN 
                  IF  RWGET1(CIDTCHOCURD  #CURRCIDTPTR#) EQ 0 
                  THEN
                      BEGIN 
                      RWSET1(CIDTCHOCURD  #CURRCIDTPTR#,1); 
                      GOTO  TC5;
                      END 
                  ELSE
                      GOTO TC4DIAG; 
                  END 
  
              #ELSE, TYPE-R-GROUP = CF# 
  
              IF  RWGET1(CIDTCFOCURD  #CURRCIDTPTR#)  EQ 0
              THEN
                  BEGIN 
                  RWSET1(CIDTCFOCURD  #CURRCIDTPTR#,1); 
                  GOTO TC5; 
                  END 
  
              #ELSE -#
  
TC4DIAG:  
  
              #DIAGNOSTIC (M67  )#
              #AT MOST ONE CH GROUP AND ONE CF GROUP CAN BE SPECIFIED#
              #FOR EACH DATA NAME OR FINAL IN THE CONTROL CLAUSE OF THE#
              #RD ENTRY.# 
              TCDIAGNO = M67  ; 
              TCLINEREF = DNATPOINTER;
              RTTCDIAG; 
              GOTO  TC5;
TC4CHKFINAL:  
              #WHEN RA-CONTROL-ITEM-DNAT-PTR = 0, CHECK TO SEE IF#
              #FINAL WAS SPECIFIED# 
  
              IF RWGET(RACI$FINAL,TYPEINDEX) EQ 1 
              THEN
                  BEGIN 
                  #NOTE- IF RA-CI-IS-FINAL = 0 THEN THERE IS NO#
                  #CI SPECIFICATION, BUT THIS HAS ALREADY BEEN# 
                  #DIAGNOSED IN SYNTAX TABLES#
                  F1CNTRLAUXIN = 2 + RP$AUXPTR(CURRDDNAT);
                  IF RWGET(CONTIDNATPTR,F1CNTRLAUXIN)EQ 0 
                  THEN
                      #FINAL WAS SPECIFIED IN CONTROL CLAUSE# 
                      GOTO TC4C;
                  #ELSE ISSUE A TRIVIAL DIAGNOSTIC -# 
                  #DON"T WANT ANALONLYRGRP SET ON SO WILL NOT CALL# 
                  #RTTCDIAG#
  
  
                  #DIAGNOSTIC (M68  )#
                  #FINAL IN TYPE CLAUSE MUST BE SPECIFIED IN CONTROL# 
                  #CLAUSE OF CORRESPONDING RD ENTRY#
  
                  #IS TRIVIAL DIAG. - ROLF"S WISHES#
                  CALLTDIAG(DNATPOINTER,M68  ); 
TC4C: 
                  IF RWGET(RATYPERGROUP,TYPEINDEX) EQ CH
                  THEN
                      BEGIN 
                      IF CHFRGOCURD EQ 1
                      THEN
                          GOTO TC4DIAG; 
                      #ALREADY HAD A CH-FINAL REPORT GR.# 
                      CHFRGOCURD = 1; 
                      GOTO TC5; 
                      END 
  
                  #ELSE TYPE = CF#
                  IF CFFRGOCURD EQ 1
                  THEN
                      GOTO TC4DIAG; 
                  CFFRGOCURD = 1; 
                  GOTO TC5; 
                  END 
              END 
TC5:  
          #RULE 6.41.3.5# 
          #IN CF, PH, PF, AND RF REPORT GROUPS, SOURCE CLAUSES MUST#
          #NOT REFERENCE ANY OF THE FOLLOWING#
          #A. GROUP DATA ITEMS CONTAINING A CONTROL DATA ITEM#
          #B. DATA ITEMS SUBORDINATE TO A CONTROL DATA ITEM#
          #C. A REDEFINITION OR RENAMING OF ANY PART OF A CONTROL#
          #DATA ITEM# 
          #IN PH AND PF REPORT GROUPS, SOURCE CLAUSES MUST NOT# 
          #REFERENCE CONTROL DATA NAMES. (CF AND RF MAY)# 
  
 #* * * * * * * * *#
 #BEWARE THIS CODE DOESNT WORK BECAUSE IT USES SUB MSEC # 
 #AND BYTE OFFSET AND DOESNT CONCERN ITSELF WITH MAJOR  # 
 #MSEC.  FIXES ARE NEEDED HERE, IN CNTRLCL WHERE CIDT$  # 
 #MSEC IS SET AND OVERLAPPING CONTROLS DETECTED.  ALSO  # 
 #SUBSCRIPTING MUST BE CONSIDERED FOR SOURCE ITEMS.     # 
 #SEE STORAGE OVERLAP ROUTINE IN SET1 OF THE PPARSER.   # 
  
  
          IF CIDTPTRCURRD EQ 0 OR FIRSTF3OR4DE EQ 0 
          THEN
              # NO CONTROL DATA ITEMS#
              GOTO ENDTYPECLRT; 
  
          $TEMP$ = RWGET(RATYPERGROUP,TYPEINDEX); 
          IF $TEMP$ EQ PH 
              OR
              $TEMP$ EQ CF
              OR
              $TEMP$ EQ PF
              OR
              $TEMP$ EQ RF
          THEN
              FOR RGDNATPTR = FIRSTF3OR4DE STEP 1 UNTIL LASTRGDNAT DO 
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR);
              IF $TEMP$ GR 1
                  AND 
                  RWGET(RAFORMAT4BIT,AUXINDEX) EQ 1 
                  AND 
                  RWGET(RASOURCEBIT,AUXINDEX) EQ 1
              THEN
                  BEGIN 
  
                  DISOURCEID = RWGET(RASRCEIDNAT,1 + AUXINDEX); 
                  CURRCIDTPTR = CIDTPTRCURRD; 
                  FOR $DUMMY$ = 0 WHILE RWGET1(CIDTLINK  #CURRCIDTPTR#) 
                      NQ 0 DO 
                      BEGIN 
                      IF OVERLAP(RWGET1(CIDTCONTRLID  #CURRCIDTPTR#), 
                                 DISOURCEID)   EQ   0 
                      THEN
                          GOTO ENDSCIDTLOOP;
                      #ELSE THERE IS OVERLAP -# 
  
                      IF RWGET(RATYPERGROUP,TYPEINDEX) EQ RF
                          OR
                          RWGET(RATYPERGROUP,TYPEINDEX) EQ CF 
                      THEN
                          BEGIN 
                          IF DISOURCEID EQ
                          RWGET1(CIDTCONTRLID  #CURRCIDTPTR#) 
                          THEN
                              GOTO ENDSCIDTLOOP;
                          #IS OK# 
                          GOTO R5VIOLATION; 
                          END 
R5VIOLATION:  
                      TCDIAGNO = M69  ; 
                      TCLINEREF = RGDNATPTR;
                      #INDEX OF SOURCE CL.# 
                      RTTCDIAG; 
  
                      #DIAGNOSTIC (M69  )#
                      #REF. RULE 5 TYPE CLAUSE. SOURCE CLAUSE IN THIS # 
                      #TYPE OF REPORT GROUP MUST NOT REFERENCE THIS   # 
                      #ITEM DUE TO CONTROL DATA ITEM SPECIFICATION.   # 
ENDSCIDTLOOP: 
                      CURRCIDTPTR =  RWGET1(CIDTLINK  #CURRCIDTPTR#); 
                      END 
                  END 
              #IF SOURCE CLAUSE#
              END 
          #SEARCH FOR SOURCE CLAUSES# 
ENDTYPECLRT:  
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EXTRACE("TYPECL ")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
          END #TYPECL#
          TERM
