*DECK F$ANALY 
USETEXT DNTEXT
USETEXT RPTEXT
PROC F$ANALY; 
          BEGIN 
          ITEM
                 RGDNATPTR    I,
                 AUXINDEX     I,
                 CURINDEX     I,
                 NXTINDEX     I,
                 BACKUPPTR    I,
                 BUAUXINDEX   I,
                 SPDNATPTR    I,
                 CSDNATPTR    I,
                 SPAUXINDEX   I;
  
  
          ITEM   $TEMP$,
                $DUMMY$;
  
          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 DNATVALS
*CALL GETSET
*CALL TABLNAMES 
          CONTROL EJECT;
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EPTRACE("F$ANALY")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
  
          #FIRST BUILD ANOTHER ENTRY INTO  CDILINK TABLE IF POSSIBLE# 
  
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,DNATPOINTER);
          IF $TEMP$  EQ 1 
              AND 
              RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER)) NQ  0
          THEN
              BEGIN 
              GETNEXT(CDILINK); 
              NUMRDCDINTRY = NUMRDCDINTRY + 1;
              RWSET1(CDIREPORTGRP  #CURRRDCDIPTR#,DNATPOINTER); 
              $TEMP$ = RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER));
              RWSET1(CDI$RG$TYPE  #CURRRDCDIPTR#,$TEMP$); 
              RWSET1(CDIBEGINCIDT  #CURRRDCDIPTR#,CIDTPTRCURRD);
              RWSET1(CDIENDCIDT  #CURRRDCDIPTR#,ENDCIDTCURRD);
              #NOTE-# 
              #THESE LAST 2 ENTRIES WILL BE  = 0  IF THERE ARE# 
              #NO VALID CONTROL DATA ITEMS FOR THIS RD (OTHER#
              #THAN POSSIBLY "FINAL"# 
  
              END 
  
          #*  SECTION FOR  6.13.3.3#
  
          RGDNATPTR = DNATPOINTER;
          LASTRGDNAT = RGDNATPTR; 
          #WILL BUMP RGDNATPTR DURING REPORT GROUP ANALYSIS SO# 
          #DNATPOINTER CAN REMAIN POINTING TO HEAD OF REPORT GROUP# 
  
          FNDLSTRSDNAT = 0; 
          #INITIALIZE SWITCH# 
  
           IF RGDNATPTR GQ LSTRSDNATIND 
          THEN
              BEGIN 
              FNDLSTRSDNAT = 1; 
              FIRSTF3OR4DE = RGDNATPTR; 
              GOTO SSBERR;
              END 
          IF  GETQ(DN$LEVEL,DNAT$,RGDNATPTR) EQ 1 
          THEN
              RGDNATPTR = RGDNATPTR + 1;
          #IF LEVEL-NO. NOT=  01 WAS A USER ERROR THAT WAS# 
          #DIAGNOSED BY SYNTAX TABLES - SO FOR NOW, WILL ASSUME#
          #THIS IS A FORMAT 3 OR 4  ENTRY#
  
FALOOP024849: 
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR);
          IF $TEMP$   LS 2
              OR
              $TEMP$   GR 48
          THEN
              GOTO TEST49ORERR; 
INRANGE:  
          LASTRGDNAT = RGDNATPTR; 
          #SAVE INDICATION OF WHERE THIS REPORT GROUP ENDS# 
  
          IF  RGDNATPTR EQ LSTRSDNATIND 
          THEN
              BEGIN 
              FNDLSTRSDNAT = 1; 
              GOTO S61334;
              END 
  
          #ELSE#
  
          RGDNATPTR = RGDNATPTR + 1;
TST01RD:  
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR);
          IF   $TEMP$  EQ  1
              OR
              $TEMP$  EQ  RDDESCR 
          THEN
              BEGIN 
              UPDATE4DNATP = RGDNATPTR; 
              GOTO S61334;
              END 
  
          #ELSE#
  
          GOTO FALOOP024849;
  
          #END OF FALOOP024849# 
  
  
          #TEST FOR A LEVEL 49 WITH FORMAT 4# 
          #ELSE KNOW HAVE AN ERROR CONDITION# 
  
TEST49ORERR:  
          AUXINDEX = RP$AUXPTR(RGDNATPTR);
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR);
          IF $TEMP$ EQ 49 
              AND 
              RWGET(RAFORMAT4BIT,AUXINDEX)  EQ 1
          THEN
              GOTO  INRANGE;
  
          #ELSE IS A USER ERROR#
  
          #DIAGNOSTIC -#
          #LEVEL NUMBER IN FORMAT 3 MUST BE INTEGER BETWEEN 02 AND# 
          #48, OR BETWEEN 02 AND 49 FOR FORMAT 4# 
  
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR);
          IF $TEMP$ EQ 1  OR
              $TEMP$ EQ RDDESCR 
          THEN
              GOTO TST01RD; 
          GOTO INRANGE; 
          #SUB-SECTION FOR  6.13.3.4 A# 
S61334: 
          RGDNATPTR = DNATPOINTER;
          IF  GETQ(DN$LEVEL,DNAT$,RGDNATPTR)  NQ   1
          THEN
              GOTO  ER4A; 
          AUXINDEX =  RP$AUXPTR(RGDNATPTR); 
          IF  RWGET(RATYPERGROUP,AUXINDEX) EQ 0 
          THEN
              GOTO  ER4A; 
          IF RWGET(RATYPERGROUP,AUXINDEX) EQ 8
          THEN
              #TYPE CLAUSE APPEARED, BUT WAS NOT VALID# 
          GOTO ER24A; 
  
          #4A IS OK#
  
CONT4A: 
          FIRSTF3OR4DE  = RGDNATPTR + 1;
          GOTO  SUBSECB;
ER4A: 
  
          #IF DNAT-LEVEL  = 1  AND/OR  THERE IS NO TYPE CLAUSE# 
          #THEN IS A USER ERROR#
  
          #DIAGNOSTIC -#
          #FIRST ENTRY THAT DESCRIBES A REPORT GROUP MUST BE A# 
          #FORMAT 2 ENTRY  AND  TYPE CLAUSE MUST BE INCLUDED# 
  
          CALLDDIAG(RGDNATPTR,025); 
ER24A:  
          ANALONLYRGRP = 1; 
          GOTO  CONT4A; 
SUBSECB:  
          #SUBSECTION  FOR  6.13.3.4 B# 
          IF
              GETQ(DN$LEVEL,DNAT$,FIRSTF3OR4DE)  GR   1 
               AND GETQ(DN$LEVEL,DNAT$,FIRSTF3OR4DE) NQ RDDESCR 
          THEN
              GOTO SUBSECC; 
          #4B IS OK#
SSBERR: 
  
          #ELSE  ERROR# 
          ANALONLYRGRP  = 1;
  
          #DIAGNOSTIC -#
          #NO FORMAT 3 OR 4 ENTRY SUBORDINATE TO A FORMAT 2#
          #ENTRY# 
  
          CALLDDIAG(FIRSTF3OR4DE,026);
          FIRSTF3OR4DE = 0; 
          GOTO TENFENDOFDO; 
SUBSECC:  
          #SUBSECTION  FOR 6.13.3.4 C#
          FOR RGDNATPTR = FIRSTF3OR4DE STEP 1 UNTIL (LASTRGDNAT - 1) DO 
              BEGIN 
              AUXINDEX =  RP$AUXPTR(RGDNATPTR); 
              $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR);
              IF $TEMP$   GR 1
                  AND 
                  RWGET(RAFORMAT4BIT,AUXINDEX) EQ 0 
                  #IE. - A FORMAT 3  ENTRY# 
              THEN
                  BEGIN 
                  $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR + 1);
                  IF $TEMP$ GR 1
                      AND 
                      RWGET(RAFORMAT4BIT,RP$AUXPTR(RGDNATPTR + 1)) EQ 1 
                      #IE. - NEXT ENTRY IS A FORMAT 4 ENTRY#
                  THEN
                      GOTO COKTHISTIME; 
                  ELSE
                      BEGIN 
                      #USER ERROR  W.R.T.  6.13.3.4 C#
                      ANALONLYRGRP = 1; 
  
                      #DIAGNOSTIC -#
                      #AT LEAST ONE FORMAT 4 ENTRY MUST BE IMMEDIATELY# 
                      #SUBORDINATE TO A FORMAT 3 ENTRY# 
  
                      CALLDDIAG(RGDNATPTR + 1,027); 
                      END 
                  END 
COKTHISTIME:  
              END 
          #SUBSEC-D#
          #SUBSECTION FOR  6.13.3.4 D#
  
          #FORMAT 4 ENTRIES MUST BE ELEMENTARY.NOTE -#
          #IN DETERMINING WHAT IS "ELEMENTARY",THE RELATIONSHIP#
          #OF FORMAT 4 ENTRIES TO ONE ANOTHER AND TO FORMAT 3#
          #ENTRIES WILL BE GIVEN  PRIORITY OVER LEVEL NUMBERS#
          #ALONE# 
          #IN THE FRAMEWORK  OF COMPARING THE CURRENT DNAT ENTRY# 
          #WITH THE NEXT DNAT ENTRY#
          #IF CURRENT ENTRY IS A FORMAT 4#
          #THEN#
          #IF NEXT ENTRY IS A FORMAT 4# 
          #THE LEVEL NUMBERS IN THE 2 ENTRIES MUST BE EQUAL#
          #BUT# 
          #IF NEXT ENTRY IS A FORMAT 3 THEN LEVEL NUMBER IN#
          #NEXT ENTRY MUST <(NUMERICALLY) LEVEL NUMBER IN#
          #CURRENT ENTRY.#
          # TAKE CARE OF LAST ITEM FIRST #
          $TEMP$ = RWGET(RAFORMAT4BIT,RP$AUXPTR(LASTRGDNAT)); 
          RWSET(RAELEMITEMBT,RP$AUXPTR(LASTRGDNAT),$TEMP$); 
          IF FIRSTF3OR4DE EQ LASTRGDNAT 
          THEN
              GOTO S61336;
          FOR RGDNATPTR = FIRSTF3OR4DE  STEP 1 UNTIL (LASTRGDNAT - 1) DO
              BEGIN 
              CURINDEX = RP$AUXPTR(RGDNATPTR);
              IF  RWGET(RAFORMAT4BIT,CURINDEX) EQ 0 
              THEN
                  GOTO END4DLOOP; 
  
              #ELSE IF CURRENT ENTRY IS A FORMAT 4 ENTRY  THEN-#
  
              NXTINDEX = RP$AUXPTR(RGDNATPTR + 1);
              IF RWGET(RAFORMAT4BIT,NXTINDEX) EQ 1
              THEN
                  #NEXT ENTRY IS ALSO A FORMAT 4# 
                  BEGIN 
                 $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR); 
                  IF $TEMP$ NQ
                      GETQ(DN$LEVEL,DNAT$,RGDNATPTR + 1)
                  THEN
                  #ELSE  IS AN ERROR  -#
  
                  #REGARDLESS OF WHETHER THE LEVEL-NUMBER OF THE# 
                  #NEXT ENTRY IS < OR >  THE  LEVEL NUMBER OF THE#
                  #CURRENT FORMAT 4 ENTRY, WILL CONSIDER THE ERROR# 
                  #A MINOR ONE AT THIS POINT -(EG.- A PROBABLE KEY# 
                  #PUNCH ERROR)  THEN - IF THE USER REALLY HAS# 
                  #TRIED TO MAKE A FORMAT-4 ENTRY SUBORDINATE TO# 
                  #ANOTHER FORMAT-4 ENTRY, HE WILL GET SERIOUS# 
                  #DIAGNOSTICS WHEN IT COMES TO LINE/COLUMN NUMBER# 
                  #ANALYSIS AND THE REPORT GROUP WILL BE PUT INTO # 
                  #AN ANALYSIS-ONLY STATUS.#
RULE4DERROR:  
  
                  #DIAGNOSTIC -#
                  #LEVEL NUMBER IN ERROR  CAUTION-FORMAT 4 ENTRIES MUST#
                  #BE ELEMENTARY# 
  
                       CALLTDIAG(RGDNATPTR+1,028);
                   IF $TEMP$ GQ 
                       GETQ(DN$LEVEL,DNAT$,RGDNATPTR + 1) THEN
                       BEGIN
                       #ALL IS OK#
                       RWSET(RAELEMITEMBT,CURINDEX,1);
                       GOTO END4DLOOP;
                       END
                  END 
  
              #ELSE -#
              #IF NEXT ENTRY IS A FORMAT 3 ENTRY - THEN LEVEL NUMBER# 
              #IN THE NEXT ENTRY MUST BE NUMERICALLY < THE LEVEL# 
              #NUMBER IN THE CURRENT FORMAT 4 ENTRY, ELSE THERE IS# 
              #AN ERROR#
  
              $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR + 1 ); 
              IF $TEMP$ LS
                  GETQ(DN$LEVEL,DNAT$,RGDNATPTR)
              THEN
                  BEGIN 
                  #ALL IS OK# 
                  RWSET(RAELEMITEMBT,CURINDEX,1); 
                  GOTO END4DLOOP; 
                  END 
  
              #ELSE IS AN ERROR -#
  
              #EVEN IF LEVEL NUMBERS ARE =, WILL SAY THERE IS#
              #AN ERROR BECAUSE THE NEXT ENTRY IS A FORMAT 3# 
              #AND NOT A FORMAT 4#
              #IF LEVEL IN NEXT IS NUM. > LEVEL IN CURRENT, IS# 
              #A PROBABLE KEY PUNCH ERROR - WILL GIVE SAME# 
              #DIAGNOSTIC#
  
              CALLTDIAG(RGDNATPTR+1,002); 
               RWSET(RAELEMITEMBT,CURINDEX,1); # SET ITEM ELEMENTARY   #
END4DLOOP:  
              END 
  
          #*  SECTION FOR 6.13.3.6# 
  
S61336: 
  
          #FORMAT 3 ENTRY MUST CONTAIN AT LEAST  A LINE NUMBER# 
          #CLAUSE  OR A USAGE CLAUSE# 
  
          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 0
                  #IE.- A FORMAT 3  ENTRY#
  
              THEN
                  BEGIN 
                  IF
                      #FORMAT-3-4-ENTRY.# 
                      RWGET(RA1LINENOPLT,AUXINDEX)
                      NQ  0 
                  THEN
                      GOTO OK6; 
                  IF
                      #FORMAT-3-4-ENTRY.# 
                      RWGET(RAUSAGEBIT,AUXINDEX)  EQ 1
                  THEN
                      GOTO OK6; 
  
                  #ELSE -  IS ERROR#
  
  
                  #DIAGNOSTIC -#
                  #A FORMAT 3 ENTRY MUST CONTAIN AT LEAST ONE#
                  #OPTIONAL CLAUSE# 
  
                  CALLTDIAG(RGDNATPTR,029); 
                  END 
OK6:  
              END 
  
          #*  SECTION  FOR 6.13.3.7#
  
          #S-6133-7#
          #RULE 7#
          #IF A DATA NAME IS PRESENT IN A FORMAT 3 ENTRY, IT MAY# 
          #BE USED ONLY TO QUALIFY A SUMCOUNTER REFERENCE.# 
          #NOTE-(IF A SUMCOUNTER IS QUALIFIED, SSCANNER   # 
          #WILL TO THE       #
          #QUALIFYING)# 
          #WILL SET DNAT-REPORT-ITEM BIT ON IN EVERY FORMAT-3 ITEM# 
          #TO MARK IT AS A DNAT ENTRY THAT HAS VERY LIMITED REFER-# 
          #ENCE POSSIBILITIES THIS WILL BE KNOWN TO RPARSER,# 
          #EG.RULE 6.39.3, AND TO PPARSER.   #
          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 0 
                  #IE.- A FORMAT-3 ENTRY# 
  
              THEN
                  SET(DN$RITEM,DNAT$,RGDNATPTR,1);
              END 
  
          #*  SECTION  FOR 6.13.3.8#
  
          #S-6133-8#
          #RULE 8A# 
          #IF USAGE CLAUSE APPEARS IN A FORMAT-4 ENTRY, THAT ENTRY# 
          #MUST DEFINE A PRINTABLE ITEM#
  
          #NOTE-# 
          #SINCE ANALYSIS OF A NUMBER OF RULES REQUIRE THE# 
          #DETERMINATION OF WHETHER OR NOT AN ITEM IS PRINTABLE,# 
          #WILL FIRST RUN THRU THE REPORT GROUP AND MARK EACH#
          #ITEM THAT IS PRINTABLE -#
          #AND THEN DO ANALYSIS OF RULE 8A# 
  
  
          #DETERMINE WHICH REPORT GROUP ITEMS ARE PRINTABLE#
  
          #WILL SET PRINTABLE ITEM BIT ON  IF#
          #- IS A COLUMN NUMBER CLAUSE# 
          #AND# 
          #- ITEM IS ELEMENTARY (AS INTERPRETED BY 6.13.3.4D)#
          #AND# 
          #- ITEM HAS A PICTURE CLAUSE# 
          #AND# 
          #- ITEM HAS A LINE NUMBER CLAUSE OR ELSE# 
          #IS SUBORDINATE TO A LINE NUMBER CLAUSE#
  
          FOR RGDNATPTR = FIRSTF3OR4DE STEP 1 UNTIL LASTRGDNAT DO 
              BEGIN 
              AUXINDEX =  RP$AUXPTR(RGDNATPTR); 
              IF
                  RWGET(RACOLNUMPLT,AUXINDEX)EQ 0 
                  OR
                  RWGET(RAELEMITEMBT,AUXINDEX)EQ 0
                  OR
                  RWGET(RAPICBIT,AUXINDEX)EQ 0
              THEN
                  GOTO  ENDPIDO;
  
              #ITEM NOT PRINTABLE#
              #ELSE -#
              IF RWGET(RA1LINENOPLT,AUXINDEX) NQ 0
              THEN
                  GOTO ITEMPRINABLE;
  
              #IF LINE NUMBER IS NOT SPECIFIED IN THIS ENTRY# 
              #MUST CHECK TO SEE IF IT IS SUBORDINATE TO AN#
              #ENTRY THAT HAS A LINE NUMBER SPECIFIED#
  
              BACKUPPTR = RGDNATPTR;
BACKUPDPLOOP: 
              BACKUPPTR = BACKUPPTR - 1;
              BUAUXINDEX = RP$AUXPTR(BACKUPPTR);
              $TEMP$ = GETQ(DN$LEVEL,DNAT$,BACKUPPTR);
                  IF $TEMP$   GR  1 
                  AND 
                  RWGET(RAFORMAT4BIT,BUAUXINDEX)EQ 0
                  #IF A FORMAT 3 ENTRY-#
              THEN
                  BEGIN 
                  IF RWGET(RA1LINENOPLT,BUAUXINDEX) NQ 0
                  THEN
                      GOTO ITEMPRINABLE;
                  ELSE
                      GOTO CHKBULOOP; 
                  END 
              IF GETQ(DN$LEVEL,DNAT$,BACKUPPTR) EQ  1 
                  #IF A FORMAT 2 ENTRY-#
              THEN
                  BEGIN 
                  IF RWGET(RA1LINENOPLT,BUAUXINDEX) NQ 0
                  THEN
                      GOTO ITEMPRINABLE;
  
                  #ELSE -#
  
                  IF BACKUPPTR  EQ DNATPOINTER
                  THEN
                      GOTO  S61338B;
                  ELSE
                      GOTO  BACKUPDPLOOP; 
                  END 
              ELSE
                  GOTO  CHKBULOOP;
ITEMPRINABLE: 
              #IF ITEM IS PRINTABLE, WILL SET BIT ON THAT#
              #MARKS IT AS "PRINTABLE"# 
  
              RWSET(RAPRINTABLEB,AUXINDEX,1); 
              GOTO ENDPIDO; 
CHKBULOOP:  
              IF BACKUPPTR  GR DNATPOINTER
              THEN
                  GOTO BACKUPDPLOOP;
ENDPIDO:  
              END 
          #OF DETERMINING IF ITEM IS PRINTABLE# 
  
          #NOW CHECK RULE 8A# 
  
          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 
                  #IE.- A FORMAT-4  ENTRY#
  
                  AND 
                  RWGET(RAUSAGEBIT,AUXINDEX) EQ 1 
              THEN
                  BEGIN 
                  IF RWGET(RAPRINTABLEB,AUXINDEX)EQ 1 
                  THEN
                      GOTO END8ADO; 
  
                  #ELSE  -  ERROR#
  
  
                  #DIAGNOSTIC#
                  #IF USAGE CLAUSE APPEARS IN A FORMAT 4 ENTRY, THAT# 
                  #ENTRY MUST DEFINE A PRINTABLE ITEM#
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,030); 
                  END 
END8ADO:  
              END 
S61338B:  
  
          #RULE 8B# 
          #IF USAGE CLAUSE APPEARS IN A FORMAT 2 OR 3 ENTRY, AT LEAST#
          #ONE SUBORDINATE ENTRY MUST DEFINE A  PRINTABLE ITEM# 
  
          FOR RGDNATPTR =  DNATPOINTER  STEP 1 UNTIL
              LASTRGDNAT DO 
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF  RWGET(RAUSAGEBIT,AUXINDEX) EQ 0 
              THEN
                  GOTO  END8BDO;
  
              #ELSE#
              IF GETQ(DN$LEVEL,DNAT$,RGDNATPTR) EQ  1 
                  #IF A FORMAT-2 ENTRY-#
              THEN
                  GOTO  SUBORDPRINT;
             $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR); 
                  IF $TEMP$ 
   GR  1
                  AND 
                  RWGET(RAFORMAT4BIT,AUXINDEX)EQ 0
                  #IF A FORMAT-3 ENTRY-#
              THEN
                  GOTO  SUBORDPRINT;
              ELSE
                  GOTO  END8BDO;
SUBORDPRINT:  
              IF RGDNATPTR EQ LASTRGDNAT
              THEN
                  GOTO ERR8B; 
              FOR SPDNATPTR = (RGDNATPTR + 1) STEP 1 UNTIL
                  LASTRGDNAT DO 
                  BEGIN 
                  SPAUXINDEX = RP$AUXPTR(SPDNATPTR);
                  IF RWGET(RAPRINTABLEB,SPAUXINDEX) EQ 1
                  THEN
                      GOTO END8BDO; 
                  ELSE
                      IF SPDNATPTR  NQ  LASTRGDNAT
                  THEN
                      GOTO ENDSISPDO; 
  
                  #IF SPDNATPTR =  LASTRGDNAT  -# 
  
ERR8B:  
  
                  #DIAGNOSTIC -#
                  #IF THE USAGE CLAUSE APPEARS IN A FORMAT 2 OR 3 ENTRY#
                  #AT LEAST   # 
                  #ONE SUBORDINATE ENTRY MUST DEFINE A PRINTABLE ITEM.# 
                  CALLTDIAG(RGDNATPTR,031); 
                  GOTO END8BDO; 
ENDSISPDO:  
                  END 
END8BDO:  
              END 
  
          #*  SECTION FOR  6.13.3.9#
  
          #S-6133-9#
  
  
          #RULE 9#
          #AN ENTRY THAT CONTAINS A LINE NUMBER CLAUSE MUST NOT#
          #HAVE A SUBORDINATE ENTRY THAT ALSO CONTAINS A LINE#
          #NUMBER CLAUSE# 
  
          #NOTE -#
          #WILL BASE THE LOGIC OF THIS MODULE ON THE RELATIONSHIP#
          #OF FORMAT 2,3, AND 4 ENTRIES RATHER THAN ON LEVEL# 
          #NUMBERS# 
  
          IF  GETQ(DN$LEVEL,DNAT$,DNATPOINTER)  NQ 1
          THEN
              GOTO  LOOKFORF3;
          #WAS A USER ERROR SO CONTINUE#
          #WITH A FOLLOWING SECTION#
          IF RWGET(RALINENUMPLT,RP$AUXPTR(DNATPOINTER)) EQ 0
          THEN
              GOTO  LOOKFORF3;
  
          #IF FORMAT-2 ENTRY HAS LINE NUMBER SPECIFICATION# 
          #THEN NO MORE LINE NUMBERS ARE ALLOWED IN THIS# 
          #REPORT GROUP#
  
          FOR RGDNATPTR = FIRSTF3OR4DE STEP 1 UNTIL (LASTRGDNAT - 1) DO 
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF RWGET(RA1LINENOPLT,AUXINDEX) NQ 0
              THEN
                  BEGIN 
                  ANALONLYRGRP  = 1;
  
                  #DIAGNOSTIC -   SERIOUS#
                  #LINE NUMBER CLAUSE IS IN AN ENTRY SUBORDINATE TO#
                  #ANOTHER ENTRY THAT CONTAINS A LINE NUMBER CLAUSE#
  
                  CALLDDIAG(RGDNATPTR,032); 
                  END 
              END 
LOOKFORF3:  
          FOR RGDNATPTR = FIRSTF3OR4DE STEP 1 UNTIL (LASTRGDNAT - 1) DO 
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
             $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR); 
                  IF $TEMP$ 
   GR 1 
                  AND 
                  RWGET(RAFORMAT4BIT,AUXINDEX) EQ 0 
                  #IE.-  A FORMAT-4  ENTRY# 
  
                  AND 
                  RWGET(RA1LINENOPLT,AUXINDEX) NQ  0
              THEN
                  FOR CSDNATPTR = (RGDNATPTR+1) WHILE 
                   $TEMP$ NQ GETQ(DN$LEVEL,DNAT$,CSDNATPTR) 
                   AND CSDNATPTR NQ (LASTRGDNAT+1) DO 
                  BEGIN 
                  IF RWGET(RA1LINENOPLT,RP$AUXPTR(CSDNATPTR)) NQ  0 
                  THEN
                      BEGIN 
                      ANALONLYRGRP = 1; 
  
                      #DIAGNOSTIC -   (SERIOUS)#
                      #SAME AS ONE JUST ABOVE#
  
                      CALLDDIAG(CSDNATPTR,032); 
                      END 
                  IF CSDNATPTR  EQ  LASTRGDNAT
                  THEN
                      GOTO S613310; 
                  CSDNATPTR = CSDNATPTR + 1;
                  END 
              END 
  
          #*  SECTION FOR 6.13.3.10#
  
S613310:  
  
          #RULE 10A#
          #A GROUP-INDICATE CLAUSE MAY APPEAR ONLY IN A TYPE# 
          #DETAIL REPORT GROUP# 
  
          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 
                  #IE- A FORMAT-4  ENTRY# 
  
                  AND 
                  RWGET(RAGROUPBIT,AUXINDEX) EQ 1 
              THEN
                  BEGIN 
                  $TEMP$ = GETQ(DN$LEVEL,DNAT$,DNATPOINTER);
                  IF $TEMP$ EQ 1
                      AND 
                      RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER)) EQ DE
                  THEN
                      GOTO CONTINU10; 
  
                  #ELSE-# 
  
                  #DIAGNOSTIC#
                  #A GROUP-INDICATE CLAUSE MAY APPEAR ONLY IN A TYPE# 
                  #DETAIL REPORT GROUP# 
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,033); 
                  END 
CONTINU10:  
              END 
  
          #RULE 10B#
          #A SUM CLAUSE MAY APPEAR ONLY IN A TYPE CONTROL FOOTING#
          #REPORT GROUP#
  
          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 
                  #IE.- A FORMAT-4 ENTRY# 
  
                  AND 
                  RWGET(RASUMBIT,AUXINDEX) EQ 1 
              THEN
                  BEGIN 
                  $TEMP$ = GETQ(DN$LEVEL,DNAT$,DNATPOINTER);
                  IF $TEMP$  EQ  1
                      AND 
                      RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER)) EQ CF
                  THEN
                      GOTO B10CONTINUE; 
  
                  #ELSE-# 
  
                  #DIAGNOSTIC -#
                  #A SUM CLAUSE MAY APPEAR ONLY IN A  CONTROL FOOTING#
                  #REPORT GROUP#
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,034); 
                  END 
B10CONTINUE:  
              END 
  
          #* *   RULE 10C#
          #AN ENTRY THAT CONTAINS A COLUMN NUMBER CLAUSE BUT NO LINE# 
          #NUMBER CLAUSE MUST BE SUBORDINATE TO AN ENTRY THAT#
          #CONTAINS A LINE NUMBER CLAUSE# 
  
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,DNATPOINTER);
                  IF $TEMP$  EQ 1 
              AND 
              RWGET(RALINENUMPLT,RP$AUXPTR(DNATPOINTER))
              NQ  0 
          THEN
              GOTO  FA10D;
          #BECAUSE ANY ITEM WOULD BE# 
          #SUBORDINATE TO THIS# 
          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 
                  #IE. - A FORMAT-4 ENTRY#
  
                  AND 
                  RWGET(RACOLNUMPLT,AUXINDEX) 
                  NQ  0 
              THEN
                  BEGIN 
                  IF RWGET(RA1LINENOPLT,AUXINDEX)EQ 0 
                  THEN
                      BEGIN 
                      BACKUPPTR  = RGDNATPTR; 
TENCBACKUPLP: 
                      BACKUPPTR = BACKUPPTR - 1;
                      BUAUXINDEX = RP$AUXPTR(BACKUPPTR);
                      $TEMP$ = GETQ(DN$LEVEL,DNAT$,BACKUPPTR);
                  IF $TEMP$   GR 1
                          AND 
                          RWGET(RAFORMAT4BIT,BUAUXINDEX)EQ 0
                          #IE. -A FORMAT-3 ENTRY# 
                          AND 
                          RWGET(RA1LINENOPLT,BUAUXINDEX)
                          NQ 0
                      THEN
                          GOTO  TENCENDOFDO;
  
                      #DIAGNOSTIC -#
                      #AN ENTRY THAT CONTAINS COLUMN NUMBER CLAUSE BUT# 
                      #NO LINE #
                      #NUMBER CLAUSE MUST BE SUBORDINATE TO AN ENTRY# 
                      #THAT CONTAINS A LINE NUMBER CLAUSE#
  
                      $TEMP$ = GETQ(DN$LEVEL,DNAT$,BACKUPPTR);
                  IF $TEMP$  EQ 1 
                          #IE.- A FORMAT-2 ENTRY# 
  
                          AND 
                          RWGET(RALINENUMPLT,RP$AUXPTR(BACKUPPTR)) NQ 0 
                      THEN
                          GOTO TENCENDOFDO; 
                      IF RWGET(RAFORMAT4BIT,BUAUXINDEX) EQ 1
                          #(IE.- NOT A FORMAT 3 ENTRY)# 
                          AND 
                          BACKUPPTR NQ DNATPOINTER
                      THEN
                          GOTO  TENCBACKUPLP; 
                      #IE.- IF HAVE ENCOUNTERED A FORMAT 3 ENTRY# 
                      #AND FOUND NO LEGAL LINE NUM. YET, THEN#
                      #PUT OUT  DIAGNOSTIC.#
                      ANALONLYRGRP = 1; 
                      CALLDDIAG(RGDNATPTR,035); 
                      END 
                  END 
TENCENDOFDO:  
              END 
  
          #* *   RULE 10D      (REF. FORMAT 4)# 
          #IF DATA-NAME-1 IS SPECIFIED, IT MAY BE REFERENCED ONLY#
          #IF THE ENTRY DEFINES A SUM COUNTER#
  
  
          #WILL SET DNAT-REPORT-ITEM BIT ON IN THE DNAT TO MARK#
          #EVERY REPORT ITEM AS ONE THAT HAS VERY LIMITED#
          #REFERENCE POSSIBILITIES --THUS WILL BE KNOWN TO# 
          #R$PARSER AND TO P-PARSER#
  
FA10D:  
          FOR RGDNATPTR = DNATPOINTER STEP 1 UNTIL LASTRGDNAT DO
              BEGIN 
                  SET(DN$RITEM,DNAT$,RGDNATPTR,1);
              END 
          #NOTE-# 
          #ALTHOUGH RULE SPECIFIES ONLY FORMAT-4# 
          #WILL SET BIT ON IN ALL, AS FORMAT-3 ENTRIES# 
          #WERE SET UNDER 6.13.3.7(THAT CODE COULD BE#
          #ELIMINATED LATER) AND THE FORMAT-2 ENTRY#
          #NEEDS TO BE MARKED TOO.# 
  
          #RULE 10E#
          #IN FORMAT 4   A LINE NUMBER CLAUSE MUST NOT BE THE ONLY# 
          #CLAUSE SPECIFIED#
  
          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 
                  #IE.- A FORMAT-4  ENTRY#
  
                  AND 
                  RWGET(RA1LINENOPLT,AUXINDEX)
                  NQ 0
              THEN
                  BEGIN 
                  IF
                      RWGET(RABLANKBIT,AUXINDEX)  EQ 1
                      OR
                      RWGET(RAGROUPBIT,AUXINDEX)  EQ 1
                      OR
                      RWGET(RAJUSTFIDBIT,AUXINDEX) EQ 1 
                      OR
                      RWGET(RAPICBIT,AUXINDEX) EQ 1 
                      OR
                      RWGET(RASOURCEBIT,AUXINDEX) EQ 1
                      OR
                      RWGET(RASUMBIT,AUXINDEX) EQ 1 
                      OR
                      RWGET(RAVALUEBIT,AUXINDEX) EQ 1 
                      OR
                      RWGET(RAUSAGEBIT,AUXINDEX) EQ 1 
                  THEN
                      GOTO TENEENDOFDO; 
  
                  #ELSE -#
  
  
                  #DIAGNOSTIC -#
                  #IN A FORMAT-4 ENTRY A LINE NUMBER CLAUSE MUST NOT BE#
                  #THE ONLY CLAUSE SPECIFIED# 
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,036); 
                  END 
TENEENDOFDO:  
              END 
  
          #RULE 10F#
          #IN FORMAT-4, AN ENTRY THAT CONTAINS A VALUE CLAUSE#
          #MUST ALSO HAVE A COLUMN CLAUSE#
  
          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 
                  #IE. - A FORMAT-4 ENTRY -#
  
                  AND 
                  RWGET(RAVALUEBIT,AUXINDEX) EQ 1 
              THEN
                  BEGIN 
                  IF RWGET(RACOLNUMPLT,AUXINDEX)
                      NQ 0
                  THEN
                      GOTO   TENFENDOFDO; 
  
                  #ELSE -#
  
  
                  #DIAGNOSTIC-# 
                  #IN FORMAT 4, AN ENTRY THAT CONTAINS A VALUE CLAUSE#
                  #MUST ALSO HAVE A COLUMN NUMBER CLAUSE# 
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,037); 
                  END 
TENFENDOFDO:  
              END 
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EXTRACE("F$ANALY")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
  
  
          END #F$ANALY# 
          TERM
