*DECK CBSIZE
USETEXT TSBTBL                                                          004610
      PROC CBSIZE;
      BEGIN 
  
#**********************************************************************#
#                                                                      #
#         C B S I Z E  --  SUBSCHEMA ITEM SIZE AND LOCATION.           #
#                                                                      #
# PROGRAMMER               C C CHOW              9/74                  #
#                                                                      #
# PURPOSE   TO UPDATE THE ITEM ENTRIES UNDER A GIVEN RECORD ENTRY IN   #
#         THE SUBSCHEMA INDICATING POSITION AND ACTRAL SIZE OF EACH    #
#         DATA ITEM WITHIN ITS DOMINANT REPEATING GROUP ITEM OR RECORD.#
#                                                                      #
# ENTRY     THE WHOLE SUBSCHEMA IS IN CORE.                            #
#           XREFED ITEM "FIRSTWORD" = ABS ADDRESS OF SUBSCHEMA IN CORE.#
#           XREFED ITEM "RECPTR"    = LOC OF CURRENT RECORD ENTRY      #
#                                     WITHIN SYBSCHEMA.                #
#         IN RECORD ENTRY:                                             #
#           SBRECNXITEMP = OFFSET TO 1ST ITEM ENTRY.                   #
#         IN EACH ITEM ENTRY:                                          #
#           SBITMLEVEL   = ITEM LEVEL NUMBER.  2 - 49, 66, 88.         #
#           SBITMNEXTP   = OFFSET PTR TO NEXT ENTRY. 0 IF NO MORE.     #
#           SBITMDBCLASS = DATA CLASS:  0,1,3,4,12,13,14.              #
#           SBITMOCCURP  = OFFSET PTR TO "OCCURS" INFO.  0 IF NONE.    #
#           SBITMDOMADR  = DOMINANT ENTRY ADDR RELATIVE TO SUBSCHEMA.  #
#                          0 IF NO DOMINANT ITEM.                      #
#           SBITMREDEFFG = TRUE IF ITEM IS "REDEFINE".                 #
#           SBITMSYNC    = TRUE IF "SYNC" SPECIFIED.                   #
#           SBITMSYNCLFT = TRUE IF "SYNC LEFT".                        #
#           SBITMHIBNDS  = HIGH BOUND FOR "OCCURS" IF SPECIFIED.       #
#           SBITMUSESIZE = LENGTH OF DATA ITEM IN CHARS. REQUIRED FOR  #
#                          ELEMENTARY ITEMS AND VECTORS.               #
#                                                                      #
# EXIT      POSITION AND SIZE FIELDS IN ALL ITEM ENTRIES HAVE BEEN SET.#
#         ALSO SET IS RECORD SIZE FIELD IN RECORD ENTRY.               #
#         IN RECORD ENTRY:                                             #
#           SBRECLENGTH  = RECORD LENGTH IN CHARS.                     #
#         IN EACH ITEM ENTRY:                                          #
#           SBITMBWP     = WORD POSITION OF DATA ITEM RELATIVE TO      #
#                          DOMINANT REPEATING GROUP.                   #
#           SBITMBBP     = BIT POSITION OF DATA ITEM RELATIVE TO       #
#                          DOMINANT REPEATING GROUP.                   #
#           SBITMUSESIZE = LENGTH OF ITEM IN CHARS.                    #
#                                                                      #
# ASSUME    ANY ILLEGAL LEVEL NUMBERING OF DATA ITEMS WOULD HAVE BEEN  #
#         DETECTED BEFORE "CBSIZE" IS CALLED. INVOLVED ENTRIES WOULD   #
#         HAVE BEEN OMITTED BY RELINKING REMAINING ENTRIES.            #
#           ALL ITEMS THAT ARE OF LEVEL 66 OR 88, AND THOSE THAT ARE   #
#         "REDEFINE", WILL BE IGNORED.                                 #
#           IF "CBSIZE" IS CALLED, THERE WILL AT LEAST BE ONE ITEM IN  #
#         THE RECORD.                                                  #
#           "CBSIZE" WILL NOT SET "DATA-TYPE" FIELD IN ITEM ENTRIES,   #
#         NOR WILL IT LOOK AT IT.                                      #
#           "CBSIZE" WILL NOT IDENTIFY ANY ERROR.                      #
#           ITEM BWP AND BBP ARE SET AS DESIRED BY CDCS 1.0 RECORD     #
#         MAPPER.                                                      #
#                                                                      #
# TABLE     LEVELINFO - A 50 WORD (1 FOR EACH ITME LEVEL 1 - 49, AND 1 #
#         FOR LEVEL 0 FOR INTERNAL USE) TABLE WHICH CONTAINS:          #
#           1. WAJ    - A FLAG TO INDICATE IF CURRENT ITEM GROUP OF    #
#                       EACH LEVEL NEEDS WORD ADJUSTMENT AND HAS TO    #
#                       HAVE A CHAR SIZE OF MULTIPLE OF 10.            #
#           2. RGROUP - A FLAG TO INDICATE IF CURRENT ITEM OF EACH     #
#                       LEVEL IS REPEATING GROUP.                      #
#           3. DOMLVL - LEVEL NUMBER OF DOMINANT ITEM OF EACH LEVEL"S  #
#                       CURRENT ITEM.                                  #
#           4. POS    - POSITION (IN CHARS) OF CURRENT ITEM OF EACH    #
#                       LEVEL RELATIVE TO START OF RECORD.             #
#           5. ACCUM  - ACCUMULATED SIZE OF CURRENT ITEM GROUP IN EACH #
#                       LEVEL.                                         #
#                                                                      #
# METHOD    STARTING FROM THE 1ST ONE, THE ITEM ENTRIES ARE SCANNED    #
#         SEQUENTIALLY ONE BY ONE.                                     #
#           AS EACH ENTRY IS SCANNED, TABLE "LEVLEINFO" IS UPDATED,    #
#         AND THE BWP AND BBP FIELDS IN THE ENTRY ARE SET BASED ON     #
#         "ACCUM" FIELD FOR ITS LEVEL IN THE TABLE. (WORD ADJUSTMENT   #
#         ALSO HAS TO BE CHECKED.) THE BWP AND BBP ARE SET RELATIVE    #
#         TO EACH ITEM"S DOMINANT REPEATING GROUP, AND IF ONE"S        #
#         DOMINANT ITEM IS A NON-REPEATING GROUP, ITS BWP/BBP IS       #
#         OBTAINED BY ADDING ITS POSITION WITHIN THIS NON-REPEATING    #
#         GROUP TO THE BWP/BBP OF THIS SAME NON-REPEATING GROUP.       #
#           AS A TYPE FIXED/FLOAT ITEM (INTERNALLY 60 OR 120 BITS WORD #
#         ALIGNED) OR A SYNC ITEM (ALWAYS STARTING A NEW WORD) IS      #
#         ENCOUNTERED, ITEM POSITIONING WILL BE ADJUSTED BASED ON      #
#         "POS" AND "ACCUM" FIELDS IN THE TABLE TO ACHIEVE WORD        #
#         ALIGNMENT, SINCE THE NEXT AVAILABLE POSITION IS ALWAYS THE   #
#         ACCUMULATED LENGTH OF CURRENT ITEM LEVEL ADDED TO BEGINNING  #
#         POSITION OF ITS DOMINANT ITEM.                               #
#           WHEN THE END OF A GROUP IS REACHED, "CBSIZE" WILL GO BACK  #
#         TO THE DOMINANT GROUP ENTRY AND SET ITS ITEM SIZE FIELD BASED#
#         ON THE ACCUMULATED LENGTH OF ITS SUBORDINATE LEVEL, WORD     #
#         ADJUSTING IF NECESSARY.                                      #
#           AFTER PROCESSING ALL THE ITEM ENTRIES, THE RECORD SIZE     #
#         FIELD IN THE RECORD ENTRY WILL BE SET TO ACCUMULATED LENGTH  #
#         OF OUTERMOST LEVEL.                                          #
#                                                                      #
# ITEMS     LVL - LEVEL NUMBER OF CURRENT ITEM.                        #
#           DLVL - LEVEL NUMBER OF DOMINANT ITEM OF CURRENT ITEM.      #
#           PLVL - LEVEL NUMBER OF LAST PROCESSED ITEM OF SIGNIFICANCE.#
#           NXTAVAIL - NEXT AVAILABLE POSITION RELATIVE TO RECORD.     #
#                                                                      #
# PROC    PRESET PLVL, POS[0], ACCUM[0] TO 0.                          #
#         ACCESS 1ST ITEM ENTRY. SET LVL.                              #
#         IF LEVEL 66 OR 88 OR REDEFINE, GET NEXT ENTRY.               #
#         IF LVL GR PLVL:                                              #
#           CURRENT ITEM IS SUBORDINATE TO LAST ITEM.                  #
#           NXTAVAIL = POS[PLVL].                                      #
#           IF WORD ADJUSTMENT NEEDED, UPDATE ACCUM[PLVL].             #
#           SET POS[LVL] TO PLACEMENT POSITION RELATIVE TO RECORD.     #
#           SET BWP AND BBP TO 0.                                      #
#           UPDATE BWP/BBP IF DOMINANT GROUP NON-REPEATING.            #
#           CHECK FOR SYNCHRONIZATION AND UPDATE BWP/BBP IF NECESSARY. #
#           SET ACCUM[LVL] TO ACCUMULATED SIZE SO FAR.                 #
#         IF LVL EQ PLVL:                                              #
#           NXTAVAIL=POS[DLVL]+ACCUM[LVL].                             #
#           IF WORD ADJUSTMENT NEEDED, UPDATE ACCUM[LVL].              #
#           UPDATE BWP/BBP IF DOMINANT GROUP NON-REPEATING.            #
#           CHECK FOR SYNCHRONIZATION AND UPDATE BWP/BBP IF NECESSARY. #
#           SET POS[LVL] TO PLACEMENT POSITION RELATIVE TO RECORD.     #
#           SET ACCUM[LVL] TO ACCUMULATED SIZE SO FAR.                 #
#         IF LVL LS PLVL:                                              #
#           LAST GROUP HAS ENDED.                                      #
#           GO BACK AND SET SIZE OF THE DOMINANT GROUP.                #
#           UPDATE CORRESPONDING "ACCUM".                              #
#           REPEAT UP TO AND INCLUDING GROUP OF CURRENT ITEM LEVEL.    #
#           CONTINUE WITH PROCEDURE FOR "LVL EQ PLVL".                 #
#           TREAT THIS LAST DOMINANT ITEM AS PRIOR ITEM.               #
#         ACCESS NEXT ITEM ENTRY AND REPEAT PROCESS.                   #
#         WHEN NO MORE ITEM ENTRY, SET RECORD LENGTH IN RECORD ENTRY.  #
#                                                                      #
#**********************************************************************#
  
      DEF CALL # #; 
      DEF ITMFIXWDS #6#;     # FIXED HEADER WORDS IN ITEM ENTRY        #
      DEF RECFIXWDS #5#;     # FIXED HEADER WORDS IN RECORD ENTRY      #
      XREF ITEM SBSCHMA;      # FWA OF SUB-SCHEMA IN CORE.             #
      XREF PROC CONVLNENBR;  # CONVERTS THE BINARY LINE NUMBER PASSED  #
                             # AS A PARAMETER INTO DISPLAY DECIMAL.    #
      XREF PROC DIAGDL;  # ERROR PROCESSING ROUTINE.                   #
      XREF ITEM FIRSTWORD;   #FWA OF SUBSCHEMA IN CORE.                #
      XREF ITEM NBRLINE;   # SOURCE LINE NUMBER IN DISPLAY CODE OF THE #
                           # CURRENT INPUT RECORD.                     #
      XREF ITEM RECPTR;      #PTR TO CURRENT RECORD ENTRY WITHIN SUBSC.#
      XREF ITEM REDEFLEVEL;  # LEVEL NUMBER OF ITEM ENTRY BEING REDEF. #
      XREF ITEM REDEFPTR;    # WORD ADR OF 1ST REDEFINE ENTRY.         #
      XREF ITEM REDEFSIZE;   # TOTAL SIZE OF REDEFINE ENTRIES.         #
  
      ARRAY LEVELINFO[0:49];           #LEVEL INFORMATION TABLE.       #
        BEGIN 
        ITEM LEVELWRD U(0,0,60);   # USED WHEN ZEROING OUT AN ENTRY    #
        ITEM WAJ B(0,0,1);   #TRUE IF WORD ADJUSTMENT HAS TO BE DONE
                              FOR CURRENT LEVEL ITEM GROUP, AND GROUP 
                              SIZE HAS TO BE A MULTIPLE OF 10.         #
        ITEM RGROUP B(0,1,1);          #TRUE IF ITEM IS REPEAT GROUP.  #
        ITEM DOMLVL U(0,2,6);          #DOMINANT LEVEL OF CURRENT LEVEL 
                                        ITEM.                          #
        ITEM POS U(0,8,26);  #POSITION OF CURRENT ITEM IN LEVEL 
                              RELATIVE TO START OF RECORD (IN CHARS).  #
        ITEM ACCUM U(0,34,26);         #SIZE ACCUMULATED IN LEVEL UP TO 
                                        CURRENT ITEM.                  #
        END 
  
                                                                        004630
# DECLARATIONS BETWEEN $BEGIN AND $END BLOCKS ARE SATISFIED BY SYMPL   #004640
# TEXTS AS INDICATED IN THE USETEXT DIRECTIVE.                         #004650
                                                                        004660
      $BEGIN     # SYMPL TEXT * TSBTBL * USED                          #004670
                                                                        004680
      ARRAY CBWORKBUF [0] S(1);        # SUBSCHEMA TABLE ENTRIES       #004690
        BEGIN 
*CALL SBRHDDCLS 
*CALL SBIHDDCLS 
*CALL SBIOCDCLS 
        END 
                                                                        004720
      $END                                                              004730
  
      ITEM DLVL;             #DOMINANT LEVEL OF CURRENT ITEM.          #
      ITEM DOMLEVEL;         # USED TO INDICATE WHEN THE PROCEDURE     #
                             # SETDOMINANT SHOULD STOP CHANNING BACK   #
      ITEM I;                #LOOP VARIABLE.                           #
      ITEM INCR;             #LENGTH IN CHARS SACRIFICED DUE TO WORD
                              ADJUSTMENT WITH DATA.                    #
      ITEM ITMENTLOC;        #FOR SAVING CURRENT ITEM ENTRY BASED ADDR.#
      ITEM ITMSIZE;          #ITEM SIZE.                               #
      ITEM LVL;              #LEVEL OF CURRENT ITEM.                   #
      ITEM NXTAVAIL;         #NEXT AVAILABLE POSITION RELATIVE TO 
                              RECORD FOR DATA PLACEMENT.               #
      ITEM PLOC;             #PRIOR SIGNIFICANT ITEM LOCATION.         #
      ITEM PLVL;             #LEVEL OF LAST PROCESSED ITEM.            #
      ITEM UPDATEDBBP;       #SAVE VALUE WHILE UPDATING ITEM BBP.      #
      CONTROL EJECT;
  
# INITIALIZE......                                                     #
  
      FOR I=1 STEP 1 UNTIL 49 DO
        LEVELWRD[I] = 0;
      POS[0]=0; 
      ACCUM[0]=0; 
      RGROUP[0]=TRUE;        #TREAT RECORD LEVEL AS REPEATING GROUP.   #
      PLVL=0;                #NOTE: THERE IS NO LEVEL 0 ITEM. WE CAN
                              ASSUME LEVEL 0 TO BE DOMINANT LEVEL OF
                              ALL ITEMS.                               #
      IF REDEFLEVEL GR 0 THEN 
        BEGIN 
        LVL = REDEFLEVEL; 
        P<CBWORKBUF> = SBSCHMA + REDEFPTR;                              004790
        GOTO REDEFPRCES;
        END 
  
# ACCESS RECORD ENTRY.                                                 #
  
      P<CBWORKBUF> = SBSCHMA + RECPTR;  # FWA OF RECORD ENTRY          #004750
  
# ACCESS 1ST ITEM ENTRY.                                               #
  
      P<CBWORKBUF>=LOC(CBWORKBUF)+SBRECNXITEMP[0];                      004770
      LVL=SBITMLEVEL[0];
  
# PROCESS CURRENT ITEM ENTRY.                                          #
  
PROCESSITEM:                 #PROCESS ITEM.                            #
      IF SBITMREDEFFG[0] THEN # REDEFINES ITEM                         #
        GOTO GETNXTENTRY;    #IGNORE CURRENT ENTRY AND GOTO NEXT ONE.  #
  REDEFPRCES:   #   # 
      IF LVL GR 49 THEN      # LEVEL 66 OR 88 , IGNORE CURRENT ENTRY   #
        GOTO GETNXTENTRY;        # AND GOTO NEXT ONE.                  #
      IF LVL GR PLVL THEN    #YES - CURRENT ITEM IS SUBORDINATE TO LAST 
                                    PROCESSED ITEM.                    #
        BEGIN 
        DLVL=PLVL;
        DOMLVL[LVL]=DLVL; 
        NXTAVAIL=POS[DLVL];  #NEXT AVAIL POSITION FOR ITEM PLACEMENT.  #
        CALL CHECKWRDADJ;    #CHECK WORD ADJUSTMENT FOR CURRENT ITEM.  #
        ACCUM[DLVL]=ACCUM[DLVL]+INCR;  #IF WORD ADJUSTMENT NEEDED, SIZE 
                                        OF DOMINANT ITEM INCREASES BY 
                                        ADJUSTED LENGTH.               #
        ACCUM[LVL]=0;        #CURRENT SIZE FOR CURRENT LEVEL IS 0.     #
        END 
      ELSE
        BEGIN 
        IF LVL LS PLVL THEN  #YES - PRIOR ITEM GROUP HAS ENDED. HAS TO
                                    GO BACKWARD TO SET DOMINANT GROUPS.#
          BEGIN 
          I = SBITMDOMADR[0] + SBSCHMA;                                 004810
          ITMENTLOC = LOC(CBWORKBUF); # SAVE BASED ADDR OF ITEM ENTRY  #004820
          IF I NQ (RECPTR + SBSCHMA) THEN                               004830
            BEGIN                                                       004840
            P<CBWORKBUF> = I;                                           004850
            DLVL = SBITMLEVEL[0];                                       004860
            END                                                         004870
          ELSE                                                          004880
            DLVL = 0;                                                   004890
            P<CBWORKBUF> = PLOC;      # ACCESS PRIOR ENTRY             #004900
            LVL = SBITMLEVEL[0];                                        004910
            DOMLEVEL = DLVL;                                            004920
            CALL SETDOMINANT;         # GO BACKWARD AND SET SIZES OF   #004930
                                      # DOMINANT GROUPS TO THE SUMMED  #004940
                                      # UP SIZES.                      #004950
            P<CBWORKBUF> = ITMENTLOC; # GET BACK TO CURRENT NEW ITEM.  #004960
            LVL = SBITMLEVEL[0];                                        004970
            DOMLVL[LVL] = DLVL;                                         004980
          END                #NOW WILL CONTINUE AS IF CURRENT ITEM IS 
                              SAME LEVEL AS PRIOR ITEM.                #
  
# CURRENT ITEM IS SAME LEVEL AS LAST PROCESSED ITEM.                   #
  
        NXTAVAIL=POS[DLVL]+ACCUM[LVL]; #NEXT AVAIL POSITION FOR ITEM
                                        PLACEMENT RELATIVE TO RECORD.  #
        CALL CHECKWRDADJ;    #CHECK FOR WORD ADJUSTMENT.               #
        ACCUM[LVL]=ACCUM[LVL]+INCR;    #INCLUDE ADJUSTED LENGTH IN
                                        CURRENT ITEM SIZE.             #
        END 
  
      POS[LVL]=NXTAVAIL+INCR; #POSITION OF CURRENT ITEM REL TO RECORD. #
  
      IF REDEFLEVEL EQ 0 THEN 
        CALL SETBWPBBP;  # SET BBP AND BWP IN CURRENT ITEM ENTRY.      #
  
      ITMSIZE=SBITMUSESIZE[0];
      IF ITMSIZE NQ 0 THEN             #YES - ITEM NOT A GROUP.        #
        BEGIN 
        IF SBITMSYNC[0] THEN           #YES - ITEM IS SYNCHRONIZED.    #
          BEGIN 
          IF NOT SBITMSYNCLFT[0] THEN  #YES - SYNCHRONIZED RIGHT.      #
  
# UPDATE BBP, AND BWP IF NECESSARY, TO ACCOUNT FOR SYNC RIGHT.         #
  
            BEGIN 
            UPDATEDBBP =SBITMBBP[0]+((ITMSIZE+9)/10*10-ITMSIZE)*6;
            IF UPDATEDBBP  GQ 60 THEN 
              BEGIN 
              SBITMBBP[0]=UPDATEDBBP -60; 
              SBITMBWP[0]=SBITMBWP[0]+1;
              END 
            ELSE
              SBITMBBP[0]=UPDATEDBBP; 
            END 
  
          ITMSIZE=(ITMSIZE+9)/10*10;   #ROUND TO NEAREST MULTIPLE 10.  #
          END 
  
# UPDATE "ACCUM" IN TABLE "LEVELINFO" TO INCLUDE CURRENT ITEM.         #
  
        IF SBITMOCCURP[0] EQ 0 THEN    #YES - ITEM IS ELEMENTARY ITEM. #
          ACCUM[LVL]=ACCUM[LVL]+ITMSIZE;
        ELSE                 #ITEM IS A VECTOR.                        #
          ACCUM[LVL]=ACCUM[LVL]+ITMSIZE*SBITMHIBNDS[SBITMOCCURP[0]];
  
        END 
      ELSE                   #ITEM IS A GROUP.                         #
        BEGIN 
  
# IDENTIFY REPEATING GROUP OR NON-REPEATING GROUP.                     #
  
        IF SBITMOCCURP[0] EQ 0 THEN    #YES - NON-REPEATING GROUP.     #
          RGROUP[LVL]=FALSE;
        ELSE
          RGROUP[LVL]=TRUE; 
        END 
  
      PLVL=LVL; 
      PLOC = LOC(CBWORKBUF);                                            005000
  
# PROCESSING OF CURRENT ITEM FINISHED. CONTINUE WITH NEXT, IF ANY.     #
  
GETNXTENTRY:                 #LOCATE AND ACCESS NEXT ENTRY.            #
      IF SBITMNEXTP[0] NQ 0 THEN       #YES - MORE ITEM ENTRIES FOLLOW.#
        BEGIN 
        P<CBWORKBUF> = LOC(CBWORKBUF)+SBITMNEXTP[0]; # ACCESS NEXT ENTR#005020
        LVL=SBITMLEVEL[0];
        IF REDEFLEVEL GR 0 THEN 
          BEGIN 
          IF REDEFLEVEL LS LVL THEN 
            GOTO REDEFPRCES;
          END 
        ELSE
          GOTO PROCESSITEM;  # GO BACK AND REPEAT SAME PROCESS.        #
        END 
  
# ALL ITEM ENTRIES ARE PROCESSED. GO BACK AND SET DOMINANT GROUP SIZES,#
# AND THEN SET RECORD SIZE.                                            #
  
      P<CBWORKBUF> = PLOC;         # GET BACK TO LAST PROCESSED ENTRY  #005040
      LVL=SBITMLEVEL[0];
      DOMLEVEL = 0; 
      CALL SETDOMINANT; 
      IF REDEFLEVEL GR 0 THEN 
        REDEFSIZE = ACCUM[LVL]; 
      ELSE                                                              005060
        BEGIN                                                           005070
        P<CBWORKBUF> = SBSCHMA + RECPTR; # POINT TO RECORD ENTRY       #005080
        SBRECLENGTH[0] = ACCUM[LVL];  # SET RECORD LENGTH IN REC ENTRY.#
        END 
      RETURN; 
      CONTROL EJECT;
  
#**********************************************************************#
#                                                                      #
#         C H E C K W R D A D J  --  CHECK WORD ADJUSTMENT.            #
#                                                                      #
# PURPOSE   CHECK IF WORD ADJUSTMENT NEEDS TO BE DONE FOR CURRENT ITEM #
#         AND BY HOW MUCH.                                             #
#                                                                      #
# ENTRY     BASED ARRAY "CBWORKBUF" CONTAINS CURRENT ITEM ENTRY.       #005100
#           NXTAVAIL = NEXT AVAILABLE POSITION RELATIVE TO START OF    #
#                      RECORD FOR DATA PLACEMENT.                      #
#                                                                      #
# EXIT      IF WORD ADJUSTMENT IS NECESSARY, "WAJ" BIT IN TABLE        #
#         "LEVELINFO" FOR ALL DOMINANT REPEATING GROUPS (IF ANY) OF    #
#         CURRENT ITEM WOULD HAVE BEEN SET.                            #
#           INCR = LENGTH IN CHARS SACRIFICED FOR WORD ADJUSTMENT.     #
#                  0 IF NO ADJUSTMENT NEEDED.                          #
#                                                                      #
# METHOD    WORD ADJUSTMENT IS NEEDED IF CURRENT ITEM (OR IF CURRENT   #
#         ITEM IS A REPEATING GROUP, THE 1ST ITEM OF ITS SUBORDINATES, #
#         AND IF THIS 1ST ITEM IS A REPEATING GROUP, THIS REPEATING    #
#         GROUP"S 1ST ITEM,......ETC.) IS OF CLASS 12 TO 14 OR IF ITEM #
#         IS SYNCHRONIZED.                                             #
#           THE ADJUSTING LENGTH IS THE DISPLACEMENT FROM CURRENT      #
#         AVAILABLE POSITION TO THE NEXT WHOLE WORD.                   #
#                                                                      #
# PROC      IF CURRENT ITEM IS A REPEATING GROUP, ACCESS NEXT ITEM     #
#         ENTRY (WHICH WILL BE ITS 1ST SUBORDINATE ITEM), AND THE NEXT #
#         IF NECESSARY, UNTIL AN ELEMENTARY ITEM OR VECTOR (AN ENTRY   #
#         WITH SIZE FIELD NON-ZERO) IS REACHED.                        #
#           CHECK IF ITEM CLASS GQ 12 OR IF ITEM IS SYNCHRONIZED. IF   #
#         SO, WORD ADJUSTMENT NEEDED. CALCULATE ADJUSTING LENGTH BASED #
#         ON "NXTAVAIL", AND SET "INCR" TO IT. SET "WAJ" BIT IN TABLE  #
#         "LEVELINFO" FOR ALL LEVELS OF REPEATING GROUPS DOMINANT OVER #
#         CURRENT ITEM.                                                #
#           IF WORD ADJUSTMENT NOT REQD, SET "INCR" TO 0.              #
#                                                                      #
#**********************************************************************#
  
      PROC CHECKWRDADJ;      #CHECK WORD ADJUSTMENT.                   #
      BEGIN 
  
      ITEM SAVEDBADDR;       #FOR SAVING BASED ADDRESS OF ITEM ENTRY.  #
  
      INCR=0;                #PRESET TO 0.                             #
      SAVEDBADDR=LOC(CBWORKBUF);   # SAVE ITEM ENTRY BASED ADDRESS.    #005120
      FOR I = 0 WHILE (SBITMUSESIZE[0] EQ 0 AND SBITMNEXTP[0] NQ 0) DO
                   # ACCESS NEXT ENTRIES UNTIL ELEMENTARY ITEM #
        P<CBWORKBUF>=LOC(CBWORKBUF)+SBITMNEXTP[0];                      005140
      IF SBITMSYNC[0] OR SBITMDBCLASS[0] GQ 10 THEN 
                             #YES - WORD ADJUSTMENT NEEDED.            #
        BEGIN 
        INCR=(NXTAVAIL+9)/10*10-NXTAVAIL; 
  
# SET "WAJ" BIT FOR ALL LEVELS ABOVE CURRENT NEW ENTRY LEVEL.          #
  
        I=DOMLVL[LVL];
CHKDOMLVL0:                  #CHECK DOMINANT LEVEL FOR 0.              #
        IF I NQ 0 THEN
          BEGIN 
          WAJ[I]=RGROUP[I];  #ONLY REPEATING GROUP NEEDS ADJUSTING.    #
          I=DOMLVL[I];
          GOTO CHKDOMLVL0;
          END 
  
        END 
      P<CBWORKBUF>=SAVEDBADDR;                                          005160
      END 
      CONTROL EJECT;
  
#**********************************************************************#
#                                                                      #
#         S E T B W P B B P  --  SET BWP AND BBP.                      #
#                                                                      #
# PURPOSE   SET BWP AND BBP FIELDS IN CURRENT ITEM ENTRY.              #
#                                                                      #
# ENTRY     BASED ARRAY "SBITMENT" CONTAINS CURRENT ITEM ENTRY.        #
#                                                                      #
# EXIT      BWP AND BBP FIELDS IN CURRENT ITEM ENTRY ARE SET RELATIVE  #
#         TO DOMINANT REPEATING GROUP OR RECORD. BUT IF ITEM IS SYNC   #
#         RIGHT, FUTURE ADJUSTMENT MAY BE NEEDED.                      #
#                                                                      #
# METHOD    IF DOMINANT ITEM OF CURRENT ITEM IS A REPEATING GROUP,     #
#         BWP/BBP EQUALS ACCUM[LVL] (ACCUMULATED LENGTH OF CURRENT     #
#         LEVEL SO FAR).                                               #
#           IF IT IS A NON-REPEATING GROUP, IT WILL BE THE SUM OF      #
#         ACCUM[LVL] AND BWP/BBP OF THE DOMINANT GROUP, THE LATTER TO  #
#         BE FOUND THE SAME WAY.                                       #
#                                                                      #
# PROC    BEGINPOS = ACCUM[LVL].                                       #
#         LEVEL = LVL.                                                 #
#         IF DOMLVL[LEVEL] NOT A REPEATING GROUP:                      #
#           LEVEL = DOMLVL[LEVEL].                                     #
#           BEGINPOS = BEGINPOS+ACCUM[LEVEL].                          #
#           REPEAT IF LOOP.                                            #
#         SET BWP/BBP FROM "BEGINPOS".                                 #
#                                                                      #
#**********************************************************************#
  
      PROC SETBWPBBP;        #SET BWP AND BBP.                         #
      BEGIN 
  
      ITEM BEGINPOS;         #BEGINNING POSITION OF ITEM RELATIVE TO
                              DOMINANT REPEATING GROUP.                #
      ITEM LEVEL;            #ITEM LEVEL.                              #
  
      BEGINPOS=ACCUM[LVL];
      LEVEL=LVL;
      FOR I=I WHILE NOT RGROUP[DOMLVL[LEVEL]] DO
        BEGIN 
        LEVEL=DOMLVL[LEVEL];
        BEGINPOS=BEGINPOS+ACCUM[LEVEL]; 
                             #FOR ITEMS SUBORDINATE TO NON-REPEATING
                              GROUP, POSITION IS RELATIVE TO DOMINANT 
                              REPEATING GROUP.                         #
        END 
  
# SET BEGINNING WORD AND BIT POSITION IN CURRENT ITEM ENTRY.           #
  
      SBITMBWP[0]=BEGINPOS/10;
      SBITMBBP[0]=(BEGINPOS-SBITMBWP[0]*10)*6;
  
      END 
      CONTROL EJECT;
  
#**********************************************************************#
#                                                                      #
#         S E T D O M I N A N T  --  SET DOMINANT GROUP SIZES.         #
#                                                                      #
# PURPOSE   GO BACKWARD IN RECORD/ITEM ENTRY AND SET ITEM SIZES IN     #
#         GROUPS DOMINANT OVER LAST ACCESSED ITEM UNTIL AND INCLUDING  #
#         GROUP ITEM OF CURRENT ITEM LEVEL.                            #
#                                                                      #
# ENTRY     BASED ARRAY "SBITMENT" CONTAINS SUBORDINATE ITEM ENTRY THE #
#         DOMINANT GROUPS OF WHICH ARE TO BE ACCESSED AND SET.         #
#           DLVL = DOMINANT LEVEL OF CURRENT NEW ITEM (THE ONE TO BE   #
#                  PROCESSED AFTER "SETDOMINANT").                     #
#                                                                      #
# EXIT      DOMINANT GROUP SIZES THAT ARE SET-ABLE HAVE BEEN SET.      #
#           ON EXIT, THE LAST DOMINANT ITEM ACCESSED WILL BE TREATED   #
#         AS LAST ACCESSED ENTRY (NOTE THAT ITS LEVEL NUMBER WILL      #
#         EQUAL THAT OF CURRENT NEW ITEM ENTRY.) WHEN PROCESS CONTINUES#
#         WITH "CBSIZE".                                               #
#                                                                      #
# METHOD    DOMINANT ITEM ENTRIES COULD BE ACCESSED THRU POINTER IN    #
#         THE SUBORDINATE ENTRIES. THE SIZE OF EACH DOMINANT ITEM IS   #
#         THE ACCUMULATED LENGTH IN ITS SUBORDINATE LEVEL. THE         #
#         ACCUMULATED LENGTH IN THIS DOMINANT LEVEL WILL INCLUDE THE   #
#         NUMBER OF OCCURRENCES OF THIS ITEM. ALSO, THE "WAJ" BIT IN   #
#         TABLE "LEVELINFO" WILL TELL WHETHER THE ITEM SIZE HAS TO BE  #
#         A MULTIPLE OF 10 FOR WORD ADJUSTMENT PURPOSE.                #
#                                                                      #
# PROC      ACCESS DOMINANT ENTRY OF LAST ENTRY, AND SET "LVL".        #
#           IF WAJ[LVL] IS SET, ADJUST ACCUMULATED LENGTH OF ITS       #
#         SUBORDINATE LEVEL TO GIVE THE NEAREST MULTIPLE OF 10.        #
#           SET SIZE OF THIS DOMINANT ITEM TO THE SUBORDINATE LEVEL    #
#         ACCUMULATED LENGTH.                                          #
#           UPDATE ACCUMULATED LENGTH OF THIS DOMINANT ITEM LEVEL.     #
#           IF THIS DOMINANT ITEM LEVEL IS STILL GREATER THAN THAT OF  #
#         CURRENT NEW ITEM, REPEAT PROCESS UNTIL AN EQUALLED LEVEL IS  #
#         REACHED.                                                     #
#                                                                      #
#**********************************************************************#
  
      PROC SETDOMINANT;      #SET DOMINANT GROUP ENTRIES.              #
      BEGIN 
      IF DOMLVL[LVL] EQ DOMLEVEL THEN 
        BEGIN 
        IF DOMLEVEL NQ 0 THEN 
           STOREDOMIN;
          RETURN; 
        END 
      FOR I=0 WHILE DOMLVL[LVL] NQ DOMLEVEL DO # GO BACKWARD AND SET
                                             DOMINANT GROUPS UP TO AND
                                             INCLUDING CURRENT LEVEL.  #
        STOREDOMIN; 
      RETURN; 
    END 
  PROC STOREDOMIN;
        BEGIN 
        PLVL=LVL; 
      P<CBWORKBUF>=SBSCHMA+SBITMDOMADR[0];                              005180
                             #ACCESS DOMINANT GROUP ENTRY.             #
        LVL=SBITMLEVEL[0];
        IF WAJ[LVL] THEN     #YES - SIZE OF GROUP HAS TO BE MULTPLE 10.#
          BEGIN 
          ACCUM[PLVL]=(ACCUM[PLVL]+9)/10*10;     #ADJUST TO MULT OF 10.#
          WAJ[LVL]=FALSE; 
          END 
      IF REDEFLEVEL EQ 0 THEN 
        BEGIN 
        SBITMUSESIZE[0] = ACCUM[PLVL]; # SET ITEM SIZE IN CURRENT 
                                        DOMINANT ITEM ENTRY.           #
        END 
  
# UPDATE "ACCUM" FOR CURRENT LEVEL.                                    #
  
        IF SBITMOCCURP[0] EQ 0 THEN    #YES - NON-REPEATING GROUP.     #
          ACCUM[LVL]=ACCUM[LVL]+ACCUM[PLVL];
        ELSE                 #REPEATING GROUP.                         #
          ACCUM[LVL]=ACCUM[LVL]+ACCUM[PLVL]*SBITMHIBNDS[SBITMOCCURP[0]];
  
       RETURN;
        END 
  
  
      END   #CBSIZE#
      TERM
