*DECK COLMNCL 
USETEXT DNTEXT
USETEXT RPTEXT
PROC  COLMNCL;
          BEGIN 
  
          #COLUMN NUMBER ROUTINE# 
          #*# 
          #THIS ROUTINE#
          #- DOES ANALYSIS ON ONE REPORT GROUP WITH RESPECT TO# 
          #SYNTAX RULES IN SECTION 6.18.3 ON THE COLUMN NUMBER# 
          #CLAUSE#
          #NOTE -#
          #REF. 6.18.3 RULE 2#
          #A COLUMN CLAUSE APPEARING IN THE DESCRIPTION OF ANY# 
          #ENTRY WOULD CAUSE A SYNTAX RT TO SET THE FORMAT-4# 
          #BIT ON IN THE DNAT/AUX ENTRY ASSOCIATED WITH THAT# 
          #REPORT ITEM.THUS THIS RULE 2 HAS ALREADY BEEN TAKEN CARE OF #
          #BY THE PROCESSING OF RULE 6.13.3.10.C  BY THE# 
          #FORMATS$ANAL RT. - AND NONE WILL BE DONE HERE# 
  
  
          #DECLARATIONS FOR COLUMN NUMBER RT# 
  
          ITEM
                 PLTPTR       I,
                 CNVALUE      I,
                 INDLNREF     I,
                 RGDNATPTR    I,
                 AUXINDEX     I,
                 BLNDNAT      I,
                 ELNINDEX     I,
                 LASTDENTRYCL I,
                 PREVCOLNO    I,
                 NEWCOLNO     I,
                 ACNINDEX     I,
                 CAUXINDEX    I,
                 APIINDEX     I,
                 APIAUXINDEX  I,
                 RANGECURITEM 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 PLT1
*CALL PLTVALS 
*CALL TABLNAMES 
  
  
  
          CONTROL EJECT;
          # INTERNAL PROCEDURE NUMBER THE FIRST # 
PROC CNDIAG2; 
          BEGIN 
          #INDLNREF CONTAINS DNAT INDEX TO BE USED# 
          #IN PICKING UP SOURCE CODE LINE NUMBER REFERENCE# 
  
          #WITHIN A GIVEN PRINT LINE, THE PRINTABLE ITEMS MUST BE#
          #DEFINED IN ASCENDING COLUMN NUMBER ORDER SUCH THAT EACH# 
          #CHARACTER DEFINED OCCUPIES A UNIQUE POSITION.# 
          ANALONLYRGRP =  1;
          CALLDDIAG(INDLNREF,57); 
          END #CNDIAG2# 
          CONTROL EJECT;
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EPTRACE("COLMNCL")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
  
          #RULE 6.18.3.1# 
          #COLUMN NUMBER INTEGER MUST BE AN UNSIGNED NON-ZERO INTEGER#
  
          IF FIRSTF3OR4DE EQ 0 THEN 
              GOTO ENDCOL;
          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 
                  PLTPTR = RWGET(RACOLNUMPLT,AUXINDEX); 
                  IF GETQ(PL$TYPE,PLT$,PLTPTR) NQ PLTUNSGNILIT
  
                  THEN
                      GOTO LAB2;
                  IF PLTCNVRT(PLTPTR) EQ 0
                  THEN
                      BEGIN 
LAB2: 
                      ANALONLYRGRP = 1; 
                      CALLDDIAG(RGDNATPTR,56);
                      END 
                  END 
CN1STDOEND: 
              END 
  
          #RULE 6.18.3.3# 
          #WITHIN A GIVEN PRINT LINE, THE PRINTABLE ITEMS MUST BE#
          #DEFINED IN ASCENDING COLUMN NUMBER ORDER SUCH THAT EACH# 
          #CHARACTER DEFINED OCCUPIES A UNIQUE POSITION.# 
          FOR RGDNATPTR = DNATPOINTER STEP 1 UNTIL LASTRGDNAT DO
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF RWGET(RALINENUMPLT,AUXINDEX) EQ  0 
              THEN
                  TEST RGDNATPTR; 
              #SAVE DNAT INDEX   OF BEGINNING OF THIS NEW  PRINT# 
              #LINE#
              BLNDNAT = RGDNATPTR;
              #NEXT DETERMINE  WHICH  DNAT MARKS THE END OF THIS# 
              #PRINT LINE#
  
              FOR ELNINDEX = (BLNDNAT + 1) STEP 1 UNTIL LASTRGDNAT DO 
                  BEGIN 
                  IF RWGET(RALINENUMPLT,RP$AUXPTR(ELNINDEX))
                      NQ  0 
                  THEN
                      BEGIN 
                      LASTDENTRYCL = ELNINDEX - 1;
                      GOTO  C6183;
                      END 
                  END 
  
              #ELSE IF DIDNT FIND ANOTHER LINE NUMBER SPEC.#
  
              LASTDENTRYCL =  LASTRGDNAT; 
C6183:  
              PREVCOLNO = 0;
              FOR ACNINDEX = BLNDNAT  STEP 1 UNTIL
                  LASTDENTRYCL DO 
                  BEGIN 
                  CAUXINDEX = RP$AUXPTR(ACNINDEX);
                  #WILL EXAMINE  ALL DNAT ENTRIES WITHIN THE RANGE OF#
                  #THIS PRINT LINE  TO DETERMINE IF PRINTABLE ITEMS ARE#
                  #DEFINED IN ASCENDING COLUMN NUMBER ORDER#
  
                  $TEMP$ = GETQ(DN$LEVEL,DNAT$,ACNINDEX); 
                  IF $TEMP$ EQ 1
                                OR
                      RWGET(RAFORMAT4BIT,CAUXINDEX) EQ 0
                      OR
                      RWGET(RAPRINTABLEB,CAUXINDEX) EQ 0
                  THEN
                      TEST ACNINDEX;
                  PLTPTR = RWGET(RACOLNUMPLT,CAUXINDEX);
                  CNVALUE = PLTCNVRT(PLTPTR); 
                  #CALCULATE VALUE OF COLUMN# 
                  #NUMBER#
                  IF CNVALUE  GR PREVCOLNO
                  THEN
                      GOTO C6183B;
  
                  #ELSE -  ERROR  NOT IN ASCENDING COLUMN NUM. ORDER# 
  
                  INDLNREF = ACNINDEX;
                  #PARAMETER# 
                  CNDIAG2;
                  GOTO  CN2NDDOEND; 
                  #GO TO LOOK AT NEXT DNAT# 
                  #ENTRY IN THIS LINE#
C6183B: 
  
                  #NOTE-# 
                  #IF COLUMN NUMBERS ARE IN ASCENDING ORDER THEN #
                             #DETERMINE # 
                  #IF EACH CHARACTER DEFINED OCCUPIES A UNIQUE POSITION#
  
  
                  #FIRST DETERMINE IF THE ITEM AT ACNINDEX WAS THE LAST#
                  #PRINTABLE ITEM IN THIS LINE IF SO GO TO LINELENGTHCK#
  
                  IF ACNINDEX EQ LASTDENTRYCL 
                  THEN
                      GOTO LINELENGTHCK;
                  FOR APIINDEX = (ACNINDEX +1) STEP 1 UNTIL 
                      LASTDENTRYCL DO 
                      BEGIN 
                      APIAUXINDEX = RP$AUXPTR(APIINDEX);
                      $TEMP$ = GETQ(DN$LEVEL,DNAT$,APIINDEX); 
                      IF $TEMP$ GR 1
                          AND 
                          RWGET(RAFORMAT4BIT,APIAUXINDEX) EQ 1
                          AND 
                          RWGET(RAPRINTABLEB,APIAUXINDEX) EQ 1
                      THEN
                          GOTO  CHKUNIQUEPOS; 
                      END 
                  GOTO LINELENGTHCK;
                  #IF DID NOT FIND ANOTHER# 
                  #PRINTABLE ITEM#
CHKUNIQUEPOS: 
                  NEWCOLNO  =     CNVALUE;
                  CNVALUE = PLTCNVRT(RWGET(RACOLNUMPLT,APIAUXINDEX)); 
                  #CONVERT COL.NO. OF NEXT PRINTABLE# 
                  #ITEM#
                  RANGECURITEM  = NEWCOLNO   + GETQ(DN$ITMLEN,DNAT$,
                                                 ACNINDEX); 
                  #(PIC LENGTH)#
                  IF RANGECURITEM GR CNVALUE
                  THEN
                      BEGIN 
                      INDLNREF = ACNINDEX;
                      CNDIAG2;
                      #NOT ENOUGH ROOM BETWEEN COLUMN NUMB"S# 
                      #FOR SIZE (PIC) OF ITEM DEFINED#
                      END 
                  PREVCOLNO = NEWCOLNO; 
                  GOTO CN2NDDOEND;
                  #GO TO LOOK FOR NEXT PRINTABLE# 
                  #ITEM#
LINELENGTHCK: 
  
                  #AFTER-ALL-REPORT-GROUPS-RT WILL NEED TO KNOW LENGTH #
                  #OF LONGEST PRINT LINE, SO LET COLMNCL SAVE THAT# 
                  #INFORMATION HERE#
  
                  $TEMP$ = CNVALUE+GETQ(DN$ITMLEN,DNAT$,ACNINDEX);
                  IF $TEMP$ GR LNGTHLONGPLE 
                  THEN
                      LNGTHLONGPLE = $TEMP$;
  
                  #IF COL. NO. + PIC LENGTH > 137, PUT OUT ADVISORY#
                  #MESSAGE# 
  
                  IF $TEMP$ GR 137
                  THEN
                      BEGIN 
                      #ERROR - OR ADVISORY MESSAGE# 
  
                      #DIAGNOSTIC#
                      #WARNING - DESCRIPTION OF PRINT LINE  EXCEEDS 136#
                                 #CHARACTERS #
  
                      CALLADIAG(RGDNATPTR,58);
                      GOTO CNLNLOOKEND; 
                      #LOOK FOR NEXT LINE NUMBER# 
                      #CLAUSE#
                      END 
CN2NDDOEND: 
                  END 
              #OF LOOP LOOKING FOR A PRINTABLE ITEM WITHIN# 
              #A PRINT LINE#
CNLNLOOKEND:  
              END 
          #OF LOOKING FOR LINE NUMBER#
ENDCOL: 
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EXTRACE("COLMNCL")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
          END #COLMNCL# 
          TERM
