*DECK  DLSIZE 
USETEXT TSCHTBL 
      PROC DLSIZE;
      BEGIN 
  
#**********************************************************************#
#                                                                      #
#         D L S I Z E  --  DDL SCHEMA ITEM SIZE AND LOCATION.          #
#                                                                      #
# PROGRAMMER               C C CHOW              8/74                  #
#                                                                      #
# PURPOSE   TO UPDATE THE ITEM ENTRIES UNDER A GIVEN RECORD ENTRY IN   #
#         THE SCHEMA INDICATING POSITION AND ACTUAL SIZE OF EACH DATA  #
#         ITEM WITHIN ITS DOMINANT GROUP ITEM OR RECORD. ALSO WILL SET #
#         DATA TYPE FIELD IN EACH ENTRY.                               #
#                                                                      #
# ENTRY     XREFED ITEM "RECENTADDR" POINTS TO CURRENT RECORD ENTRY IN #
#         CORE. THE RECORD ENTRY AND ALL ITS ITEM SUB-ENTRIES ARE      #
#         IN CORE IN ONE CONTIGUOUS BLOCK.                             #
#         IN RECORD ENTRY:                                             #
#           SCRECDITMPTR = OFFSET TO 1ST ITEM ENTRY.                   #
#         IN EACH ITEM ENTRY:                                          #
#           SCITEMLEVEL  = ITEM LEVEL NUMBER.  1 - 99.                 #
#           SCITEMPRIORP = OFFSET PTR TO PRIOR ENTRY. 0 FOR 1ST ITEM.  #
#           SCITEMNXTPTR = OFFSET PTR TO NEXT ENTRY. 0 FOR LAST ITEM.  #
#           SCITEMCLASS  = ITEM CLASS:                                 #
#                          0 - ALPHANUMERIC,                           #
#                          1 - ALPHABETIC,                             #
#                          3 - DISPLAY NUMERIC,                        #
#                          4 - DISPLAY FIXED PT,                       #
#                          10 - SIGNED BINARY INTEGER,                 #
#                          12 - UNNORMALIZED FLOATING POINT,           #
#                          13 - FLOATING PT NORMALIZED,                #
#                          14 - DOUBLE PRECISION.                      #
#           SCITEMSIZE   = LENGTH OF DATA ITEM IN CHARACTERS. REQUIRED #
#                          FOR ELEMENTARY ITEMS AND VECTORS. IN CASE   #
#                          OF VECTORS, IT IS SIZE OF EACH OCCURRENCE   #
#                          OF THE ITEM IN THE VECTOR.                  #
#           SCITMDOMPTR  = OFFSET PTR BACKWARD TO DOMINANT ITEM.       #
#                          0 IF ITEM IN OUTERMOST LEVEL.               #
#           SCITMINTVAL  = NUMBER OF OCCURS FOR GROUP ITEM. SET TO     #
#                          MAXIMUM VALUE IN CASE OF DEPENDING ON.      #
#                          0 FOR ELEMENTARY ITEM.                      #
#                                                                      #
# EXIT      POSITION AND SIZE FIELDS IN ALL ITEM ENTRIES HAVE BEEN SET.#
#         ALSO SET IS RECORD SIZE FIELD IN RECORD ENTRY.               #
#         IN RECORD ENTRY:                                             #
#           SCRECLENGTH  = RECORD LENGTH IN CHARS.                     #
#         IN EACH ITEM ENTRY:                                          #
#           SCITEMPBWP   = WORD POSITION OF DATA ITEM RELATIVE TO      #
#                          BEGINNING OF ITS DOMINANT GROUP.            #
#           SCITEMBBP    = BIT POSITION OF DATA ITEM RELATIVE TO       #
#                          BEGINNING OF ITS DOMINANT GROUP.            #
#           SCITEMSIZE   = LENGTH OF DATA ITEM (GROUP) IS CHARS. SET   #
#                          FOR REPEATING GROUP ITEMS.                  #
#           SCITMDATATYP = ITEM DATA TYPE.                             #
#                                                                      #
# ASSUME    ANY ILLEGAL LEVEL NUMBERING OF DATA ITEMS WOULD HAVE BEEN  #
#         DETECTED BEFORE "DLSIZE" IS CALLED. INVOLVED ENTRIES WOULD   #
#         HAVE BEEN OMITTED BY RELINKING REMAINING ENTRIES.            #
#           IF "DLSIZE" IS CALLED, THERE WILL AT LEAST BE ONE ITEM IN  #
#         THE RECORD.                                                  #
#           "DLSIZE" WILL NOT IDENTIFY ANY ERROR.                      #
#                                                                      #
# TABLE     LEVELINFO - A 100 WORD (1 FOR EACH ITEM LEVEL 1 - 99, AND  #
#         1 FOR LEVEL 0 FOR INTERNAL USE) TABLE WHICH CONTAINS:        #
#           1. WAJ    - A FLAG TO INDICATE IF CURRENT ITEM (REPEATING  #
#                       GROUP) OF EACH LEVEL NEEDS WORD ADJUSTMENT AND #
#                       HAS TO HAVE A CHAR SIZE OF MULTIPLE OF 10 (TRUE#
#                       IF IT HAS TYPE FIXED/FLOAT SUBORDINATE ITEMS). #
#           2. DOMLVL - LEVEL NUMBER OF DOMINANT ITEM OF EACH LEVEL"S  #
#                       CURRENT ITEM.                                  #
#           3. POS    - POSITION (IN CHARS) OF CURRENT ITEM OF EACH    #
#                       LEVEL RELATIVE TO START OF RECORD.             #
#           4. 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 "LEVELINFO" 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.)                                     #
#           AS A TYPE FIXED/FLOAT ITEM (INTERNALLY 60 OR 120 BITS WORD #
#         ALIGNED) IS ENCOUNTERED, ITEM POSITIONING WILL BE ADJUSTED   #
#         BASED ON "POS" AND "ACCUM" FIELDS IN THE TABLE, 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, "DLSIZE" 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.                #
#           NXTAVAIL - NEXT AVAILABLE POSITION RELATIVE TO RECORD.     #
#                                                                      #
# PROC    PRESET PLVL, POS[0], ACCUM[0] TO 0.                          #
#         ACCESS 1ST ITEM ENTRY. SET LVL.                              #
#         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.                                      #
#           SET ACCUM[LVL] TO ACCUMULATED SIZE SO FAR.                 #
#         IF LVL EQ PLVL:                                              #
#           NXTAVAIL=POS[DLVL]+ACCUM[LVL].                             #
#           IF WORD ADJUSTMENT NEEDED, UPDATE ACCUM[LVL].              #
#           SET BWP AND BBP TO VALUE ACCUM[LVL].                       #
#           SET POS[LVL] TO PLACEMENT POSITION RELATIVE TO RECORD.     #
#           SET ACCUM[LVL] TO ACCUMULATED SIZE SO FAR.                 #
#         IF LVL LS PLVL:                                              #
#           LAST REPEATING 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.    #
#           TREAT THIS LAST DOMINANT ITEM AS PRIOR ITEM.               #
#           CONTINUE WITH PROCEDURE FOR "LVL EQ PLVL".                 #
#         SET DATA TYPE FIELD IN ENTRY.                                #
#         ACCESS NEXT ITEM ENTRY AND REPEAT PROCESS.                   #
#         WHEN NO MORE ITEM ENTRY, SET RECORD LENGTH IN RECORD ENTRY.  #
#                                                                      #
#**********************************************************************#
  
      DEF CALL # #; 
  
      XREF ITEM RECENTADDR;  #ABS ADDR OF CURRENT RECORD ENTRY IN CORE.#
      XREF ITEM FATALERR; 
      XREF ITEM RECSIZE;     # RECORD SIZE IN CHARACTERS.              #
  
      XREF ARRAY LEVELINFO [0:99];   # LEVEL INFORMATION TABLE #
        BEGIN 
        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 DOMLVL U(0,1,7);          #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 
  
  
      ITEM DLVL;             #DOMINANT LEVEL OF CURRENT ITEM.          #
      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 LVL;              #LEVEL OF CURRENT ITEM.                   #
      ITEM NXTAVAIL;         #NEXT AVAILABLE POSITION RELATIVE TO 
                              RECORD FOR DATA PLACEMENT.               #
      ITEM PLVL;             #LEVEL OF LAST PROCESSED ITEM.            #
      CONTROL EJECT;
  
# LEAVE IF THERE WERE ANY ERRORS IN SCHEMA. . . # 
      IF FATALERR NQ 0
        THEN RETURN;
  
# INITIALIZE......                                                     #
  
      FOR I=1 STEP 1 UNTIL 99 DO
        WAJ[I]=FALSE; 
      POS[0]=0; 
      ACCUM[0]=0; 
      PLVL=0;                #NOTE: THERE IS NO LEVEL 0 ITEM. WE CAN
                              ASSUME LEVEL 0 TO BE DOMINANT LEVEL OF
                              ALL ITEMS.                               #
  
# ACCESS RECORD ENTRY.                                                 #
  
      P<SCWORKBUF> = RECENTADDR;
  
# ACCESS 1ST ITEM ENTRY.                                               #
  
      P<SCWORKBUF> = RECENTADDR + SCRECDITMPTR[0];
      LVL=SCITEMLEVEL[0]; 
  
# PROCESS CURRENT ITEM ENTRY.                                          #
  
PROCESSITEM:                 #PROCESS ITEM.                            #
 # FOR VIRTUAL RESULT ITEM, SET DATA TYPE = 1, NO OTHER PROCESSING     #
    IF SCITMATVTP [0] NQ 0  AND  SCITMAVRESLT [SCITMATVTP[0] ]
      THEN SCITMDATATYP [0] = 1;
    ELSE
    BEGIN 
      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 
          DLVL=DOMLVL[LVL];  #SET DOMINANT LEVEL OF CURRENT NEW ITEM.  #
          ITMENTLOC=LOC(SCWORKBUF); 
          P<SCWORKBUF>=ITMENTLOC-SCITEMPRIORP[0]; #ACCESS PRIOR ENTRY  #
          LVL=SCITEMLEVEL[0]; 
          CALL SETDOMINANT;  #GO BACKWARD AND SET SIZES OF DOMINANT 
                              GROUPS TO THE SUMMED UP SIZES.           #
          P<SCWORKBUF>=ITMENTLOC;      #GET BACK TO CURRENT NEW ITEM.  #
          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. #
  
# SET BEGINNING WORD AND BIT POSITION IN CURRENT ITEM ENTRY.           #
  
      SCITEMPBWP[0]=ACCUM[LVL]/10;
      SCITEMBBP[0]=(ACCUM[LVL]-SCITEMPBWP[0]*10)*6; 
  
      IF SCITEMSIZE[0] NQ 0 THEN       #NO - ITEM IS REPEATING GROUP.  #
        BEGIN 
        IF SCITMINTVAL[0] EQ 0 THEN    #YES - ITEM IS ELEMENTARY ITEM. #
          ACCUM[LVL]=ACCUM[LVL]+SCITEMSIZE[0];   #ADD TO ACCUM SIZE.   #
        ELSE                 #ITEM IS VECTOR.                          #
          ACCUM[LVL]=ACCUM[LVL]+SCITEMSIZE[0]*SCITMINTVAL[0]; 
        END 
      CALL SETDATATYPE;      #SET DATA TYPE FIELD IN ENTRY.            #
    END 
  
# PROCESSING OF CURRENT ITEM FINISHED. CONTINUE WITH NEXT, IF ANY.     #
  
      IF SCITEMNXTPTR[0] NQ 0 THEN     #YES - MORE ITEM ENTRYS FOLLOW. #
        BEGIN 
        PLVL=LVL; 
      P<SCWORKBUF>=LOC(SCWORKBUF)+SCITEMNXTPTR[0]; #ACCESS NEXT ENTRY.# 
        LVL=SCITEMLEVEL[0]; 
        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.                                            #
  
      DLVL=0; 
      CALL SETDOMINANT; 
      P<SCWORKBUF> = RECENTADDR;
      RECSIZE = ACCUM[LVL];  # STORE RECORD LENGTH. # 
      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 "SCITMENT" CONTAINS CURRENT ITEM ENTRY.        #
#           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 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 IS OF CLASS 10   #
#         TO 14 (REPRESENTED BY 60 OF 120 BIT FLOATING PT NUMBER), 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.                   #
#           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 10. IF YES, WORD ADJUSTMENT NEEDED. #
#         CALCULATE ADJUSTING LENGTH BASED ON "NXTAVAIL", AND SET      #
#         "INCR" TO IT. SET "WAJ" BIT IN TABLE "LEVELINFO" FOR ALL     #
#         LEVELS 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(SCWORKBUF);     # SAVE ITEM ENTRY BASED ADDRESS.  #
      FOR I=0 WHILE SCITEMSIZE[0] EQ 0 DO        #ACCESS NEXT ENTRIES 
                                                  UNTIL ELEMENTARY ITM.#
        P<SCWORKBUF>=LOC(SCWORKBUF)+SCITEMNXTPTR[0];
      IF SCITEMCLASS[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]=TRUE;
          I=DOMLVL[I];
          GOTO CHKDOMLVL0;
          END 
  
        END 
      P<SCWORKBUF>=SAVEDBADDR;     #GO BACK TO CURRENT NEW ENTRY.      #
      END 
      CONTROL EJECT;
  
#**********************************************************************#
#                                                                      #
#         S E T D A T A T Y P E  --  SET ITEM DATA TYPE.               #
#                                                                      #
# PURPOSE   SET DATA TYPE FIELD IN CURRENT ITEM ENTRY.                 #
#                                                                      #
# ENTRY     BASED ARRAY "SCITMENT" CONTAINS CURRENT ITEM ENTRY.        #
#                                                                      #
# EXIT      DATA TYPE FIELD IN CURRENT ITEM ENTRY IS SET TO:           #
#             1 - ELEMENTARY ITEM,                                     #
#             2 - REPEATING GROUP,                                     #
#             3 - REPEATING GROUP WITHIN REPEATING GROUP,              #
#             4 - VECTOR,                                              #
#             5 - VECTOR WITHIN REPEATING GROUP,                       #
#             6 - REPEATING GROUP OF VARIABLE DIMENSION,               #
#             7 - VECTOR OF VARIABLE DIMENSION.                        #
#                                                                      #
# METHOD  ELEMENTARY ITEM  - SIZE NON-ZERO AND NO OCCURS.              #
#         REPEATING GROUP  - SIZE 0. NO OCCURS DBI. NO DOMINANT ITEM.  #
#         R.G. WITHIN R.G.  -  SIZE 0. NO OCCURS DBI. HAS DOMINANT ITM.#
#         VECTOR  -  SIZE NON-ZERO. HAS OCCURS BUT NO DBI. NO DOM ITEM.#
#         VECTOR WITHIN R.G.  -  SIZE NON-ZERO. HAS OCCURS BUT NO DBI. #
#                                HAS DOMINANT ITEM.                    #
#         R.G. OF VAR DIM  -  SIZE 0. HAS OCCURS DBI.                  #
#         VECTOR OF VAR DIM  -  SIZE NON-ZERO. HAS OCCURS AND DBI.     #
#                                                                      #
#**********************************************************************#
  
      PROC SETDATATYPE;      #SET ITEM DATA TYPE.                      #
      BEGIN 
      IF SCITEMSIZE[0] EQ 0 THEN       #YES - ITEM IS A GROUP.         #
        BEGIN 
        IF SCITMDIMOCC[0] THEN         #YES - OCCURS DBI SPECIFIED.    #
          SCITMDATATYP[0]=6;           #REPEATING GROUP VAR DIMENSION. #
        ELSE
          BEGIN 
          IF DOMLVL[LVL] EQ 0 THEN     #YES - DOMINANT ITEM.           #
            SCITMDATATYP[0]=2;         #REPEATING GROUP.               #
          ELSE
            SCITMDATATYP[0]=3;         #REPEATING GROUP WITHIN R.G.    #
          END 
        END 
      ELSE
        BEGIN 
        IF SCITMINTVAL[0] EQ 0 THEN    #YES - NO OCCURS CLAUSE.        #
          SCITMDATATYP[0]=1;           #ELEMENTARY ITEM.               #
        ELSE
          BEGIN 
          IF SCITMDIMOCC[0] THEN       #YES - OCCURS DBI SPECIFIED.    #
            SCITMDATATYP[0]=7;         #VECTOR WITH VAR DIMENSION.     #
          ELSE
            BEGIN 
            IF DOMLVL[LVL] EQ 0 THEN   #YES - NO DOMINANT ITEM.        #
              SCITMDATATYP[0]=4;       #VECTOR.                        #
            ELSE
              SCITMDATATYP[0]=5;       #VECTOR WITHIN REPEATING GROUP. #
            END 
          END 
        END 
      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 "SCITMENT" 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 "DLSIZE".                                               #
#                                                                      #
# 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 
      FOR I=0 WHILE DOMLVL[LVL] NQ DLVL DO  #GO BACKWARD AND SET
                                             DOMINANT GROUPS UP TO AND
                                             INCLUDING CURRENT LEVEL.  #
        BEGIN 
        PLVL=LVL; 
      P<SCWORKBUF>=LOC(SCWORKBUF)-SCITMDOMORD[0]; 
                             #ACCESS DOMINANT GROUP ENTRY.             #
        LVL=SCITEMLEVEL[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 
        SCITEMSIZE[0]=ACCUM[PLVL];     #SET ITEM SIZE IN CURRENT
                                        DOMINANT ITEM ENTRY.           #
        ACCUM[LVL]=ACCUM[LVL]+ACCUM[PLVL]*SCITMINTVAL[0]; 
                             #ACCUMULATED LENG OF CURRENT DOMINANT LVL.#
        END 
      END 
  
  
      END   #DLSIZE#
      TERM
