*DECK LINECL
USETEXT DNTEXT
USETEXT RPTEXT
PROC  LINECL; 
          BEGIN 
  
          #LINE NUMBER ROUTINE# 
          #*# 
          #THIS ROUTINE#
          #- DOES ANALYSIS ON ONE REPORT GROUP WITH RESPECT TO# 
          #SYNTAX RULES IN SECTION 6.27.3  ON THE LINE NUMBER#
          #CLAUSE#
          #NOTE#
          #RULE 2 OF 6.27.3 WAS ALREADY CHECKED UNDER 6.13.3.9# 
          #OF  FORMATS$ANAL RT.#
          #RULE 7 OF 6.27.3 HAS ALSO BEEN TAKEN CARE OF BY THE# 
          #FORMATS$ANAL RT  WHICH WENT THRU THE DNAT ENTRIES# 
          #AND MARKED THE PRINTABLE ITEMS AS SUCH.  # 
          #PART OF RULE 6.27.3.1 REFERS TO PAGE CLAUSE RULE#
          #6.30.3.8-  ALL OF  THESE RULES ARE COVERED BY/#
          #INCLUDED IN  THE PRESENTATION RULES FOR EACH#
          #REPORT GROUP - AND THE ACTUAL ANALYSIS WILL BE#
          #DONE THERE.# 
          ITEM
                 PLTPTR       I,
                 RGDNATPTR    I,
                 AUXINDEX     I,
                 LNVALUE      I,
                 LNVINDEX     I,
                 LASTABSDNAT  I,
                 ABSVALUE     I,
                 PAGEAUXINDX  I,
                 ALNCOUNTER   I,
                 TYPEINDEX    I,
                 RELEXIST     I,
                 ABSEXIST     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 GETSET
*CALL PLT1
*CALL PLTVALS 
*CALL TABLNAMES 
  
  
          CONTROL EJECT;
  
  
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EPTRACE("LINECL ")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
  
          #RULE 6.27.3.1, PART A# 
          #LINE NUMBER INTEGER MUST BE AN UNSIGNED NON-ZERO INTEGER#
          #AND MUST NOT EXCEED 3 SIGNIFICANT DIGITS IN LENGTH.# 
          FOR RGDNATPTR = DNATPOINTER STEP 1 UNTIL LASTRGDNAT DO
              BEGIN 
  
              #NOTE  BOTH LEVEL-01-ENTRY AND FORMAT-3-4-ENTRY#
              #HAVE   RA-LINE-NUMBER-PLT-PTR# 
              #AND RA-KIND-OF LINE-NUMBER#
  
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF RWGET(RALINENUMPLT,AUXINDEX)    NQ  0
              THEN
                  BEGIN 
                  PLTPTR = RWGET(RALINENUMPLT,AUXINDEX);
                  IF GETQ(PL$TYPE,PLT$,PLTPTR) NQ PLTUNSGNILIT
                  THEN
                      GOTO LAB1;
                  LNVALUE = PLTCNVRT(PLTPTR); 
                  IF LNVALUE EQ 0 OR LNVALUE GQ 1000
                  THEN
                      BEGIN 
LAB1: 
                      ANALONLYRGRP = 1; 
                      CALLDDIAG(RGDNATPTR,49);
                      END 
                  END 
LN1STDOEND: 
              END 
  
          #RULE 6.27.3.1. PART B# 
          #NO LINE NUMBER INTEGER MAY BE SPECIFIED IN SUCH A WAY AS#
          #TO CAUSE ANY LINE OF A REPORT GROUP TO BE PRESENTED OUT-#
          #SIDE OF THE VERTICAL SUBDIVISION OF THE PAGE DESIGNATED# 
          #FOR THAT REPORT GROUP TYPE, AS DEFINED BY THE PAGE#
          #CLAUSE.  SEE RULE 6.30.3.8A-8F, WILL ANALYZE # 
          # ACCORDING TO   #
          #REPORT GROUP TYPE)#
          #NOTE- THESE RULES ARE ALL COVERED BY/INCLUDED IN THE#
          #PRESENTATION RULES FOR EACH REPORT GROUP AND ANALYSIS# 
          #WILL BE DONE THERE#
  
  
          #RULE 6.27.3.3# 
          #WITHIN A GIVEN REPORT GROUP, ALL ABSOLUTE LINE NUMBER# 
          #CLAUSES MUST PRECEDE ALL RELATIVE LINE NUMBER CLAUSES# 
  
          RELEXIST = 0; 
          ABSEXIST = 0; 
          FOR RGDNATPTR = DNATPOINTER STEP 1 UNTIL LASTRGDNAT DO
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF RWGET(RALINENUMPLT,AUXINDEX) NQ 0
              THEN
                  BEGIN 
                  IF RWGET(RAKINDLINENO,AUXINDEX) EQ ABSOLUTE 
                      OR
                      RWGET(RAKINDLINENO,AUXINDEX) EQ NEXTPAGE
                  THEN
                      BEGIN 
                      ABSEXIST = 1; 
                      LASTABSDNAT = RGDNATPTR;
                      END 
  
                  #ELSE- MUST BE RELATIVE SO# 
  
                  RELEXIST = 1; 
                  END 
              END 
          IF ABSEXIST EQ 0
              OR
              RELEXIST EQ 0 
          THEN
              GOTO  LNRULE4;
  
          #ELSE IF ARE BOTH ABSOLUTE AND RELATIVE LINE NUMBERS# 
          #EXIST, PROCEED#
  
          FOR RGDNATPTR = DNATPOINTER STEP 1 UNTIL LASTRGDNAT DO
              BEGIN 
              AUXINDEX    = RP$AUXPTR(RGDNATPTR); 
              IF RWGET(RALINENUMPLT,AUXINDEX) NQ 0
                  AND 
                  RWGET(RAKINDLINENO,AUXINDEX) EQ RELATEVE
              THEN
                  BEGIN 
                  IF RGDNATPTR GR LASTABSDNAT 
                  THEN
                      GOTO LNRULE4; 
                  #KNOW THAT THIS RELATIVE AND# 
                  #ANY OTHERS THAT EXIST FOLLOW THE LAST# 
                  #ABSOLUTE LINE NUMBER#
  
  
                  #ELSE DIAGNOSTIC (WILL BE 1 ISSUED FOR EACH ILLEGAL#
                  #RELATIVE LN  ENCOUNTERED)# 
  
                  #DIAGNOSTIC#
                  #A RELATIVE LINE NUMBER CLAUSE MAY NOT PRECEDE ANY #
                  #ABSOLUTE # 
                  #LINE NUMBER CLAUSE WITHIN A GIVEN REPORT GROUP#
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,50);
                  #RETURN TO LOOK FOR ANOTHER ILLEGAL RELATIVE# 
                  END 
              END 
LNRULE4:  
  
          #RULE 6.27.3.4# 
          #WITHIN A GIVEN REPORT GROUP, SUCCESSIVE ABSOLUTE LINE# 
          #NUMBER CLAUSES MUST SPECIFY INTEGERS THAT ARE IN#
          #ASCENDING ORDER# 
  
          IF ABSEXIST EQ 0
              #IF ARE NO ABSOLUTE LN"S# 
          THEN
              GOTO LNRULE5; 
          ABSVALUE = 0; 
          FOR RGDNATPTR = DNATPOINTER STEP 1 UNTIL LASTRGDNAT DO
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF RWGET(RALINENUMPLT,AUXINDEX) NQ 0
              THEN
                  BEGIN 
                  IF RWGET(RAKINDLINENO,AUXINDEX) EQ NEXTPAGE 
                      OR
                      RWGET(RAKINDLINENO,AUXINDEX) EQ ABSOLUTE
                  THEN
                      BEGIN 
                      LNVALUE = PLTCNVRT(RWGET(RALINENUMPLT,
                                         AUXINDEX));
                      #CALCULATE VALUE OF PLT-# 
                      #STRING FOR LINE NUMBER INTEGER#
                      IF  ABSVALUE  LS LNVALUE
                      THEN
                          BEGIN 
                          ABSVALUE  =  LNVALUE; 
                          GOTO  ABSVEND;
                          END 
  
                      #ELSE - ERROR#
  
  
                      #DIAGNOSTIC#
                      #WITHIN A GIVEN REPORT GROUP, SUCCESSIVE ABSOLUTE#
                      #LINE # 
                      #NUMBER CLAUSES MUST SPECIFY INTEGERS THAT ARE IN#
                      #ASCENDING ORDER# 
  
                      ANALONLYRGRP = 1; 
                      CALLDDIAG(RGDNATPTR,51);
                      END 
                  END 
ABSVEND:  
              END 
LNRULE5:  
  
          #RULE 6.27.3.5# 
          #IF PAGE CLAUSE IS OMITTED, ONLY RELATIVE LINE NUMBER#
          #CLAUSES CAN BE SPECIFIED IN A REPORT GROUP DESCRIPTION#
  
          IF RDOCURDSWTCH EQ 0
          THEN
              GOTO LNRULE6; 
          #IS NO VALID CURRDDNAT# 
          PAGEAUXINDX = 1 + RP$AUXPTR(CURRDDNAT); 
          IF RWGET(PAGELIMITBIT,PAGEAUXINDX)  EQ   0
              AND 
              ABSEXIST EQ 1 
          THEN
              BEGIN 
  
              #DIAGNOSTIC#
              #IF PAGE CLAUSE IS OMITTED IN A GIVEN RD, ONLY RELATIVE#
              #LINE NUMBER CLAUSES CAN BE SPECIFIED IN A REPORT GROUP#
              #WITHIN THAT RD.# 
              ANALONLYRGRP = 1; 
              CALLDDIAG(DNATPOINTER,52);
              END 
LNRULE6:  
  
          #RULE 6.27.3.6# 
          #WITHIN A GIVEN REPORT GROUP, A NEXT PAGE PHRASE CAN# 
          #APPEAR ONLY ONCE AND, IF PRESENT,  MUST BE IN THE FIRST# 
          #LINE NUMBER CLAUSE IN THAT REPORT GROUP DESCRIPTION.X# 
          #A LINE NUMBER CLAUSE WITH NEXT PAGE PHRASE CAN APPEAR# 
          #ONLY IN DESCRIPTION OF BODY GROUPS AND IN A REPORT#
          #FOOTING REPORT GROUP.# 
          ALNCOUNTER = 0; 
          FOR RGDNATPTR = DNATPOINTER  STEP 1 UNTIL LASTRGDNAT DO 
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF RWGET(RALINENUMPLT,AUXINDEX) EQ  0 
              THEN
                  TEST RGDNATPTR; 
              ALNCOUNTER = ALNCOUNTER + 1;
              IF RWGET(RAKINDLINENO,AUXINDEX)NQ NEXTPAGE
              THEN
                  TEST RGDNATPTR; 
              IF ALNCOUNTER EQ 1
              THEN
                  GOTO CRGTYPE; 
  
              #ELSE ERROR-# 
  
  
              #DIAGNOSTIC#
              #A NEXT PAGE PHRASE CAN APPEAR ONLY ONCE IN A  REPORT#
              #GROUP, AND IF PRESENT MUST BE IN THE FIRST LINE NUMBER#
              #CLAUSE.# 
              ANALONLYRGRP = 1; 
              CALLDDIAG(RGDNATPTR,53);
CRGTYPE:  
              #NOTE-IF DNAT-LEVEL(DNATPOINTER NOT= 1, THEN ALREADY# 
              #ANALONLYRGRP =1# 
  
              TYPEINDEX = RP$AUXPTR(DNATPOINTER); 
              IF RWGET(RATYPERGROUP,TYPEINDEX)  EQ RH 
                  OR
                  RWGET(RATYPERGROUP,TYPEINDEX) EQ  PH
                  OR
                  RWGET(RATYPERGROUP,TYPEINDEX) EQ  PF
              THEN
                  BEGIN 
  
                  #DIAGNOSTIC#
                  #LINE NUMBER CLAUSE WITH NEXT PAGE PHRASE CAN APPEAR# 
                  #ONLY IN DESCRIPTION OF BODY GROUPS AND IN A REPORT#
                  #FOOTING REPORT GROUP#
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,54);
                  END 
              #SECTION FOR INVALID TYPE REPORT GROUP# 
              END 
          #LOOP FOR CHECKING EACH DNAT# 
  
          #RULE 6.27.3.8# 
          #THE FIRST LINE NUMBER CLAUSE SPECIFIED WITHIN A PAGE#
          #FOOTING REPORT GROUP MUST BE AN ABSOLUTE LINE NUMBER#
          #CLAUSE.# 
          IF RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER)) EQ PF 
          THEN
              FOR RGDNATPTR = DNATPOINTER STEP 1 UNTIL LASTRGDNAT DO
              BEGIN 
              IF RWGET(RALINENUMPLT,RP$AUXPTR(RGDNATPTR)) 
                  NQ 0
              THEN
                  GOTO  R8ABS;
              END 
          GOTO ENDLNRT; 
R8ABS:  
          IF RWGET(RAKINDLINENO,RP$AUXPTR(RGDNATPTR)) 
              NQ  ABSOLUTE
          THEN
              BEGIN 
  
              #DIAGNOSTIC#
              #FIRST LINE NUMBER CLAUSE SPECIFIED WITHIN A PAGE FOOTING#
              #REPORT GROUP MUST BE AN ABSOLUTE LINE NUMBER CLAUSE# 
  
              ANALONLYRGRP  = 1;
              CALLDDIAG(RGDNATPTR,55);
              END 
ENDLNRT:  
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EXTRACE("LINECL ")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
          END #LINECL#
          TERM
