*DECK RMBGTBL 
USETEXT TAREATB 
USETEXT TCMMDEF 
USETEXT TCRMDEF 
USETEXT TEXPRES 
USETEXT TFIT
      PROC RMBGTBL; 
      BEGIN 
  
      XREF PROC GET;               # CRM READ FROM FILE                #
  
      XREF ITEM RA0;               # ITS ADDRESS IS ALWAYS ZERO. IT IS #
                                   # USED TO TERMINATE PARAMETER LISTS #
      XREF ITEM SBSCADD I;         # FWA OF SUBSCHEMA WITHIN SUBSCHEMA #
                                   # LIBRARY                           #
      XREF ITEM TAREA4X;           # POINTER TO AREA TABLE SET BY USE  #
      XREF BASED ARRAY SCHEMAFIT;;
  
      ITEM MAXKEYLEN I;            # LENGTH OF LARGEST KEY IN CHARS    #
  
#----------------------------------------------------------------------#
#                                                                      #
#     NXTATTR                                                          #
#                                                                      #
#     READ NEXT DBI ENTRY FROM CRM SUBSCHEMA INTO ARRAY *DIRECTENTRY*  #
#                                                                      #
#     ON ENTRY                                                         #
#     TAREA4X CONTAINS POINTER TO AREA TABLE.                          #
#     DIRWORDADDR CONTAINS ADDRESS OF LAST DBI ENTRY OR ZERO IF THERE  #
#     WAS NO PREVIOUS DBI ENTRY                                        #
#                                                                      #
#     ON EXIT                                                          #
#     IF DBI IS PRIMARY KEY, KEY TABLE DESCRIBES THE KEY               #
#     ARRAY DIRECTENTRY CONTAINS DBI ENTRY                             #
#     COMMON BLOCK CEXPRES DESCRIBES THE ITEM                          #
#     DIRWORDADDR CONTAINS ADDRESS OF ITEM ENTRY READ OR ZERO IF NO    #
#     MORE ITEMS.                                                      #
#                                                                      #
#----------------------------------------------------------------------#
  
  
      XDEF PROC NXTATTR;
      PROC NXTATTR; 
      BEGIN 
      IF DIRWORDADDR EQ 0          # IF FIRST CALL TO NXTATTR          #
      THEN
        BEGIN 
        MAXKEYLEN = 0;             # INITIALIZE LENGTH OF LARGEST KEY  #
  
        P<AREA$TABLE> = TAREA4X;   # POSITION TO CURRENT AREA          #
        DIRWORDADDR = AT$RECWA;    # WORD ADDR OF FIRST RECORD ENTRY   #
                                   # REQUEST CM FOR KEY TABLE WITH ONE #
                                   # ENTRY                             #
        P<KEY$TBL> = CMM$ALF (3, 0, AT$GROUPID);
        AT$PKEYDPTR[0] = P<KEY$TBL>;  # SAVE ADDRESS OF KEY TABLE      #
        P<FIT> = LOC(AT$AFITPOS);  # SET POINTER TO FIT                #
        AT$MRL = FITMRL;           # MAXIMUM RECORD LENGTH             #
        KT$RECLENC[1] = FITMRL; 
        END 
  
      ELSE
        BEGIN 
        DIRWORDADDR = DIRWORDADDR + NXTPTR[0];  # ADDR OF NEXT ITEM    #
        END 
  
                                   # READ NEXT ITEM DBI ENTRY          #
      GET(SCHEMAFIT, DIRECTENTRY, DIRWORDADDR + SBSCADD, 0, 0, 100,RA0);
      IF NXTPTR[0] EQ 0 
        OR RCTYPE[0] EQ ET$ENDOFAREA  # IF NO ITEM ENTRY READ          #
      THEN
        BEGIN 
        DIRWORDADDR = 0;           # INDICATE NO RECORD READ           #
        P<FIT> = LOC(AT$AFITPOS);  # LOCATE FIT                        #
        FITEMK = NOT AT$KEYEXCL;   # EMBEDDED IF NOT EXCLUDED          #
        IF MAXKEYLEN NQ 0          # IF ANY KEYS ENCOUNTERED           #
        THEN
          BEGIN 
          AT$CURRKEY = AT$NEXTFREE;  # OFFSET TO KEY AREA RELATIVE TO  #
                                     # P<AREA$TABLE>                   #
                                   #COMPUTE OFFSET OF LWA+1 OF KEY AREA#
          AT$NEXTFREE = AT$NEXTFREE + ((MAXKEYLEN + 9) / 10); 
          END 
  
        RETURN; 
        END 
  
      DATATYPE = CLASS[0];         # DATA CLASS, IE INTEGER OR FLOATING#
      DATAWORDADDR = BWP[0];       # BEGINNING WORD POSITION           #
      DATACHARPOS = BBP[0] / 6;    # BEGINNING BIT POSITION            #
      RESULTSIZE = INCPICSIZE[0];  # PICTURE SIZE INCLUDING INSERTS    #
      IF RCTYPE[0] EQ ET$GROUP     # IF GROUP                          #
        OR RCTYPE[0] EQ ET$RECORD  # IF RECORD                         #
      THEN
        BEGIN 
        RESULTSIZE = USESIZE[0];   # INTERNAL SIZE IN CHARACTERS       #
        END 
  
      IF OCCURS[0]                 # IF ITEM ENTRY HAS OCCURRING WORD  #
      THEN
        BEGIN 
        OCCURWORD[0] = OCCURWORD[NAMELGW[0] + 1]; 
                                   # OVERWRITE SAMENAME WORD WITH      #
                                   # OCCURRING INFO BECAUSE SAMENAME   #
                                   # INFO NOT USED AND OCCURRING INFO  #
                                   # IS NOW IN A FIXED POSITION        #
        END 
  
      IF RCTYPE[0] EQ ET$RPTGROUP  # IF REPEATING GROUP                #
        OR RCTYPE[0] EQ ET$RPTRPTGRP  # REPEAT GROUP WITHIN REPEAT GRP #
      THEN
        BEGIN 
        RESULTSIZE = USESIZE[0] / OCCURCOUNT[0];
                                   # INTERNAL SIZE OF ONE OCCURRENCE   #
        END 
  
      DATALENG = USESIZE[0];       # INTERNAL SIZE IN CHARACTERS       #
      IF RCTYPE[0] EQ ET$RECORD    # IF RECORD                         #
        AND ITEMNAME[1] EQ "KEY-FIELD"
      THEN
        BEGIN 
        AT$KEYEXCL = TRUE;         # RECORD NAMED *KEY-FIELD* INDICATES#
                                   # AN EXCLUDED KEY,KEY OUTSIDE RECORD#
        END 
     IF KEYFLAG[0] THEN       #SAVE ATTRIBUTES OF THE KEY#
          BEGIN 
          KT$WPOS[1] = DATAWORDADDR;  # WORD POSITION                  #
          KT$LENGTH[1] = DATALENG;    # LENGTH IN CHARACTERS           #
          KT$CPOS[1] = DATACHARPOS;   # CHARACTER POSITION             #
          KT$TYPE[1] = DATATYPE;      # TYPE                           #
          KT$PICLEN[1] = RESULTSIZE;  # PICTURE SIZE INCLUDING INSERTS #
          KT$DPTLOC[1] = CDPTLOC[0];  # CHAR POSITION OF DECIMAL POINT #
          KT$OVERPUN[1] = SIGN[0];    # SIGN OVERPUNCH FLAG            #
  
#    IF FILE ORGANIZATION IS AK, THE KEY LENGTH AND POSITION WILL BE   #
#    STORED SEPARATELY IN ORDER TO SAVE THE ORIGINAL VALUES FOR LATER  #
#    USE BY CRM. THIS IS DONE BECAUSE QU RESERVES ONE WORD FOR THE KEY #
#    AND ASSUMES THE BEGINNING CHARACTER TO BE 0. HOWEVER, CRM TREATS  #
#    KEYS FOR AK NEW FILES AS 8 CHARACTERS OR LESS RIGHT JUSTIFIED     #
#    WHICH CAUSES THE KEY LENGTH AND POSITION TO VARY.                 #
  
          P<FIT> = LOC(AT$AFITPOS);  # SET POINTER TO FIT              #
          IF FITFO EQ FOAK         # IF FIT THAT IS PASSED FROM DDL    #
                                   # DENOTES THAT THE FILE ORGANIZATION#
                                   # IS ACTUAL KEY                     #
          THEN
            BEGIN 
            KT$ACTKEYLNG[1] = FITKL;  # SAVE KEY LENGTH IN KEY$TBL IN  #
                                      # ORDER TO BE MOVED BACK TO FIT  #
                                      # LATER ON FOR USE BY CRM        #
            KT$ACTKEYPOS[1] = FITKP;  # SAVE KEY LENGTH IN KEY$TBL IN  #
                                      # ORDER TO BE MOVED BACK TO FIT  #
                                      # LATER ON FOR USE BY CRM        #
            END 
          END 
  
      IF KEYFLAG[0]                # IF PRIMARY KEY                    #
        OR ALTERKEYFLG[0]          # IF ALTERNATE KEY                  #
      THEN
        BEGIN 
        IF USESIZE[0] GR MAXKEYLEN  # IF LARGER THAN PREVIOUS LARGEST  #
        THEN
          BEGIN 
          MAXKEYLEN = USESIZE[0];  # SAVE LENGTH OF LARGEST KEY        #
          END 
        END 
  
      RETURN; 
      END                          # END PROC    N X T A T T R         #
      END 
      TERM
