*DECK DB$SRDM                                                            JJJ0106
USETEXT UTMPTTX 
USETEXT MD10CTX 
USETEXT MDBCMTX 
USETEXT CUGBATX 
      PROC DB$SRDM; 
      BEGIN                                                              JJJ0106
 #
* *   DB$SRDM - BUILD AIT AND KIT                PAGE  1
  *   M D SAXE                                   DATE  02/05/76 
  *   A. W. LO                                   DATE  05/08/77 
* *   J. G. SERPA - MDU 2.3 ENHANCEMENTS         DATE  07/23/80 
* *   H.S.WOO                                    DATE  04/09/81 
  
  DC  PURPOSE 
  
      DB$SRDM IS A COLLECTION OF SEMANTIC ROUTINES CALLED BY DB$STD TO
      BUILD THE AREA DIRECTORY, AREA INFORMATION AND KEY INFORMATION
      TABLES FOR AN AREA WHEN ITS SYNTAX HAS BEEN COMPLETELY PROCESSED. 
      VARIOUS FIELDS IN THE SCHEMA DIRECTORY TABLE ARE ALSO 
      UPDATED.
  
      REFER TO EACH INDIVIDUAL ROUTINES FOR DETAILED DESCRIPTIONS.
  
  
  DC  CALLED ROUTINES 
# 
  
      XREF FUNC DB$MDPF B;   # VALIDATE PF UNIQUENESS                  #
      XREF PROC DB$DIAG;     # DIAGNOSTIC PROCESSOR                    #
      XREF PROC DB$ERSC;     # OWNCODE ROUTINE FOR ERRORS ON SCHEMA    #
      XREF PROC DB$NO;       # SYNTAX TABLE DRIVER -NO- RETURN         #
      XREF PROC DB$UALC;     # ALLOCATE CMM BLOCK                      #
      XREF PROC DB$UAWS;     # ADJUST WORK SPACE - CMM INTERFACE       #
      XREF PROC DB$WGET;     # GET FROM WORD ADDRESSABLE FILE          #
      XREF PROC DB$YES;      # SYNTAX TABLE DRIVER -YES- RETURN        #
      XREF PROC DE$FTSC;     # FIT                                     #
      XREF PROC DE$NMSC;     # READ SCHEMA ENTRY                       #
  
# 
  DC  CALLING ROUTINES
  
      DB$STD - SYNTAX TABLE DRIVER
  
  DC  NON-LOCAL VARIABLES 
  
      COMMON DECKS - MDDEFDCLS, CUGDFDCLS, MD10CDCLS, MDBCMDCLS,
                     UTMPTDCLS, CUGBADCLS,
  
      SYNTAX HAS BEEN COMPLETELY PROCESSED. 
 #
      XDEF                                                               JJJ0106
        BEGIN                                                            JJJ0106
        PROC DB$SR04;                                                    JJJ0106
        PROC DB$SR06;                                                    JJJ0106
        PROC DB$SR60; 
        PROC DB$SR87; 
        PROC DB$SR94; 
        END                                                              JJJ0106
                                                                         JJJ0106
      CONTROL NOLIST; 
      BASED ARRAY CSTSSTBL [0] S; 
        BEGIN 
*CALL MDSBDDCLS 
        END 
  
      BASED ARRAY ARDIR [0] S(1); 
        BEGIN 
*CALL MDARDDCLS 
        END 
  
      BASED ARRAY ARINFO [0] S(1);
        BEGIN 
*CALL MDARIDCLS 
        END 
  
      ARRAY DDLKEYS [0:DFDLKLEN] S(1);
        BEGIN 
*CALL SCDCKYDCL 
        END 
  
      BASED ARRAY VERINFO [0:0] S(DFMDVIEN);  # VERSION INFO TABLE     #
        BEGIN 
*CALL MDVITDCLS              VERSION INFORMATION TABLE
        END 
  
      BASED ARRAY PCUT [0:0] S(1);  # PRE-CONSTRAINT USE TABLE         #
        BEGIN 
*CALL MDPCTDCLS              PRE-CONSTRAINT USE TABLE 
        END 
  
      CONTROL LIST; 
  
# FOLLOWING DEFS, ITEMS, ARRAYS AND BASED ARRAYS ARE LOCAL TO DB$SRDM  #
  
      DEF DFSCARDC #6#;      # SCHEMA AREA/DATA CONTROL BUFFER WD SIZE #
                             # LARGE ENOUGH FOR AREA HEADER OR DATA    #
                             # CONTROL HEADER OR COMPRESS/DECOMP ENTRY #
  
      ITEM DCADDRES U;       # SCHEMA DATA CONTROL ENTRY WORD ADDRESS  #
      ITEM I;                # SCRATCH CELL.                           #
      ITEM J;                #SCRATCH CELL                             #
      ITEM KEYNDX I = 0;               # INDEX INTO THE KEY INFO TABLE #
      ITEM NMEPTR;           # USED TO REFERENCE THE FIRST WORD OF EACH#
                             # ENTRY IN THE AREA DIRECTORY AND THE AREA#
                             # INFORMATION TABLE                       #
      ITEM PITLENG;          # LENGTH OF THE PERMANENT FILE INFO TABLE #
      ITEM PITOFFSET;        # OFFSET INTO THE PERM FILE INFO TABLE    #
      ITEM WAGET;            # WA WHERE TO GET KEY ENTRIES FROM        #
  
      ARRAY AREANME [0:0] S(1); 
        BEGIN 
          ITEM ARINIT U(0,0,60);   # USED TO ZERO FILL ARRAY.          #
          ITEM ARNMEDA C(0,0,30);  # AREA NAME, LEFT JUSTIFIED WITH    #
                                   # ZERO FILL.                        #
        END 
  
# SCARDCBF ARRAY FOR SCHEMA AREA OR DC HEADER OR COMPRESS/DECOMP ENTRY #
  
      ARRAY SCARDCBF [0:0] P(DFSCARDC);          # SCHEMA AREA/DC BUFF #
  
        BEGIN                                    # SCARDCBF ARRAY      #
  
*CALL SCAHDDCLS 
  
*CALL SCDCHDDCL 
  
        END                                      # SCARDCBF ARRAY      #
  
# SCDCCDAR BASED ARRAY DESCRIBES SCHEMA DATA CONTROL COMP/DECOMP ENTRY #
  
      BASED ARRAY SCDCCDAR;  # SCHEMA DATA CONTROL COMP/DECOMP ENTRY   #
  
        BEGIN                # SCDCCDAR BASED ARRAY                    #
  
*CALL SCDCCDDCL 
  
        END                  # SCDCCDAR BASED ARRAY                    #
  
      BASED ARRAY KEYINFOT [0:0] S(DFMDKITEN);  # KEY INFORMATION TABLE#
        BEGIN 
*CALL MDKITDCLS          KEY INFORMATION TABLE DECLARATIONS 
        END 
  
      BASED ARRAY MDSCENTRY [0:0] S(1);  # SCHEMA DIRECTORY TABLE      #
        BEGIN 
*CALL MDSCDDCLS 
        END 
  
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ S R 0 4 .        #
#                                                                      #
#**********************************************************************#
                                                                         JJJ0106
      PROC DB$SR04;                                                      JJJ0106
        BEGIN                                                            JJJ0106
 #
* *   DB$SRDM                                    PAGE  1
* *   DB$SR04 - BUILD CST/SUBSCHEMA DIRECTORY 
* *   H.S.WOO - JOVEC DESCRIPTION                DATE  04/08/81 
* 
* DC  PURPOSE 
* 
*     BUILD CST/SUBSCHEMA DIRECTORY FOR CURRENT SUBSCHEMA ENTRY 
* 
* DC  ENTRY CONDITIONS
* 
*     CSTDIRBP - BLOCK POINTER FOR CONSTRAINT USE TABLE 
*     FILENAM  - LOCAL FILE NAME
*     SUBNAME  - NAME OF SUBSCHEMA
* 
* DC  EXIT CONDITIONS 
* 
*     IF SUBSCHEMA NAME IS ALREADY SPECIFIED IN THE DIRECTORY, THEN 
*     ISSUE DIAG 108.  OTHERWISE, STORE THE NAME INTO THE TABLE.  EXIT
*     IS TO DB$NO.
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX  -  SYNTAX PROCESSOR
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$UAWS;  # ADJUST WORK SPACE, CMM INTERFACE           #
      XREF PROC DB$DIAG;  # DIAGNOSTIC PROCESSOR                       #
      XREF PROC DB$NO;    # SYNTAX TABLE DRIVER - NO - RETURN          #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
 #
  
  
  
#     B E G I N   D B $ S R 0 4   E X E C U T A B L E   C O D E .      #
  
  
 #
      REQUEST SPACE FOR THE CURRENT SUBSCHEMA ENTRY TO BE BUILT.
 #
      DB$UAWS(LOC(CSTDIRBP),DFCSTSSEN); 
 #
      POINT CST/SUBSCHEMA DIRECTORY BASED ARRAY TO THE BLOCK OF CORE
      IN MANAGED MEMORY (POINT TO THE FIRST ENTRY, SKIP HEADER).
 #
      P<CSTSSTBL> = B<30,30>CSTDIRBP + DFCSTSSHD + 1; 
 #
      SEARCH THRU THE CST/SUBSCHEMA DIRECTORY TO VERIFY NO DUPLICATE
      SUBSCHEMA NAMES.
 #
      FOR I=0 STEP DFCSTSSEN UNTIL (CSTDCNT-1) * DFCSTSSEN DO 
        BEGIN 
          IF MDSBNAME[I] EQ SUBNAME THEN
          BEGIN 
            DB$DIAG(108,SUBNAME); 
            DB$NO;
          END 
        END 
 #
      NAME IS UNIQUE, STORE IT INTO THE CST/SUBSCHEMA DIRECTORY.
 #
      MDSBNAME[I] = SUBNAME;
 #
      STORE SCHEMA FILE ANME, TEMPORARILY USING THE WORD THAT WILL
      EVENTUALLY CONTAIN THE SIZE AND WA OF THE CST.
 #
      MDSBLFN[I] = C<0,7>FILENAM; 
 #
      SET THE CST BUILD FLAG. 
 #
      MDSBINFO[I] = TRUE; 
 #
      INCREMENT CST/SUBSCHEMA COUNTER.
 #
      CSTDCNT = CSTDCNT + 1;
 #
      INITIALIZE TEMPORARY CELL THAT CONTAINS THE SUBSCHEMA NAME. 
 #
      SUBNAME = " ";
 #
      RETURN TO STD.
 #
      DB$NO;
  
        END                                                              JJJ0106
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ S R 0 6 .        #
#                                                                      #
#**********************************************************************#
                                                                         JJJ0106
      PROC DB$SR06;                                                      JJJ0106
        BEGIN                                                            JJJ0106
 #
* *   DB$SRDM                                    PAGE  1
* *   DB$SR06 - BUILD ADT, AIT AND KIT FOR CURRENT AREA 
* *   J.G.SERPA 
* *   H.S.WOO (JOVEC)                            DATE  04/08/81 
* *   BOB MCALLESTER - TABLE SEGMENTATION        DATE  05/30/84 
* 
* DC  PURPOSE 
* 
*     BUILD THE AREA DIRECTORY, AREA INFORMATION AND KEY INFORMATION
*     TABLES FOR THE CURRENT AREA.
* 
* DC  ENTRY CONDITIONS
* 
*     THE SYNTAX FOR THE CURRENT AREA HAS BEEN PROCESSED. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE ADT, AIT AND KIT FOR THE CURRENT AREAS HAVE BEEN BUILT. 
*     RETURN IS VIA DB$NO.
*     IF AREA IS ALREADY SPECIFIED FOR CURRENT SCHEMA, THEN ISSUE 
*     DIAGNOSTIC 108. 
*     IF AREA NAME CANNOT BE LOCATED IN THE SCHEMA DIRECTORY, THEN
*     ISSUE DIAGNOSTIC 141. 
*     IF THE AREA OR INDEX FILE PERMANENT FILE NAME IS NOT UNIQUE 
*     ISSUE DIAGNOSTIC 137. 
*     IF NO INDEX FILE IS SPECIFIED FOR AN AREA AND THE AREA FIT
*     SPECIFIES AN INDEX FILE, ISSUE DIAGNOSTIC 128.
*     IF LOG OPTIONS SELECTED FOR AN AREA INCONSISTENT WITH ITS SCHEMA
*     ISSUE DIAGNOSTIC 140. 
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX - SYNTAX PROCESSOR
* 
* DC  CALLED ROUTINES 
* 
# 
        XREF PROC DB$DIAG;   # DIAGNOSTIC ROUTINE                      #
        XREF PROC DB$ERSC;   # OWNCODE ROUTINE FOR ERROR ON SCHEMA     #
        XREF FUNC DB$MDPF B; # VALIDATE PF UNIQUENESS                  #
        XREF PROC DB$NO;     # SYNTAX TABLE - NO- RETURN               #
        XREF PROC DB$RNRD;   # RANDOM READ                             #
        XREF PROC DB$RNRW;   # RANDOM REWRITE                          #
        XREF PROC DB$UAWS;   # CMM INTERFACE ROUTINE                   #
        XREF PROC DB$WGET;   # GET FROM WORD ADDRESSABLE FILES         #
        XREF PROC DB$YES;    # SYNTAX TABLE -YES- RETURN               #
        XREF PROC DE$FTSC;   # FIT                                     #
        XREF PROC DE$NMSC;   # SCHEMA DIRECTORY ACCESS ROUTINE         #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     ITEMS IN COMMON BLOCKS DB$M10C AND DB$MDBC
# 
      XREF ARRAY DB$RNFT;;   # FET FOR RANDOM I/O                      #
# 
* DC  DESCRIPTIONS
* 
 #
      ITEM ACTENT;                 # ACTIVE ENTRIES IN THE PIT         #
      ITEM BUFLOC;                 # BUFFER LOCATION FOR RANDOM I/O    #
      ITEM BUFOFFSET;              # OFFSET FOR SEGMENTED TABLE        #
      ITEM LENGTH;                 # LENGTH FOR RANDOM I/O             #
      ITEM NEXTSEG;                # NEXT SEGMENT TO BE LOADED         #
      ITEM ORIGSEG;                # SEGMENT ORIGINALLY RESIDENT       #
      ITEM PRUNUM;                 # PRU NUMBER FOR RANDOM I/O         #
      ITEM TOTENT;                 # TOTAL ENTRIES IN THE PIT          #
      ITEM VERSIZE;                # VERSION ENTRY SIZE FOR VIT        #
  
  
  
#     B E G I N   D B $ S R 0 6   E X E C U T A B L E   C O D E .      #
  
  
 #
      VALIDATE AREA PF UNIQUENESS.
 #
      IF NOT DB$MDPF(MDPFINAME[FILETYPE"AREA"], 
               MDPFUNID[FILETYPE"AREA"],MDPFSNPN[FILETYPE"AREA"]) 
      THEN
        BEGIN 
        DB$DIAG(137,MDPFINAME[FILETYPE"AREA"]);  # ISSUE DIAGNOSTIC    #
        END 
 #
      IF AN INDEX PERMANENT FILE HAS BEEN SPECIFIED VALIDATE ITS PF 
      UNIQUENESS. 
 #
      IF MDPFINAME[FILETYPE"INDEX"] NQ 0
      THEN
        BEGIN 
        ARINDEX[0] = TRUE;         # SET INDEX FILE FLAG               #
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"INDEX"],
                 MDPFUNID[FILETYPE"INDEX"],MDPFSNPN[FILETYPE"INDEX"]) 
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"INDEX"]);  # ISSUE DIAGNOSTIC #
          END 
        END 
 #
      RE-INITIALIZE THE DIRECTORY ACCESS ROUTINE BUFFER THAT CONTAINS 
      THE AREA NAME.
 #
      ARINIT[0] = 0;
      ARINIT[1] = 0;
      ARINIT[2] = 0;
 #
      POINT THE AREA DIRECTORY BASED ARRAY TO THE FIRST WORD OF THE AREA
      DIRECTORY TABLE.
 #
      P<ARDIR> = ARDIRBP + DFMDADCW + 1;
 #
      POINT THE AREA INFORMATION BASED ARRAY TO THE FIRST WORD OF THE 
      AREA INFORMANTION TABLE.
 #
      P<ARINFO> = ARINFOBP + 1; 
 #
      SEARCH THRU THE AREA DIRECTORY COMPARING THE CURRENT AREA NAME
 #
      FOR NMEPTR=0 STEP DFMDADEN WHILE AREACNT NQ NMEPTR / DFMDADEN DO
        IF MDADARNM[NMEPTR] EQ AREANAM THEN 
          BEGIN 
            DB$DIAG(108,AREANAM); 
            DB$NO;        # *** ABNORMAL EXIT  ***                     #
          END 
 #
      USING A ZERO-FILLED SCHEMA AREA NAME, CALL THE SCHEMA DIRECTORY 
      ACCESS ROUTINE DE$NMSC TO READ THE HEADER ENTRY FOR THAT AREA.
 #
      C<0,ARNMLEN>ARNMEDA[0] = C<0,ARNMLEN>AREANAM; 
      DE$NMSC(DITARRAY,3,AREANME,ARNMLNW,DFSCARDC,SCARDCBF);
 #
      IF THE AREA ENTRY COULD NOT BE FOUND ISSUE A DIAGNOSTIC MESSAGE.
 #
      IF DASTATE[0] GR 0 THEN 
        BEGIN 
          DB$DIAG(141,AREANAM); 
          DB$NO;
        END 
  
 #
      REQUEST SPACE FOR THE AREA DIRECTORY AND AREA INFORMATION TABLES. 
  
 #
      DB$UAWS(LOC(ARDIRBP),DFMDADEN); 
      DB$UAWS(LOC(ARINFOBP),DFMDAIEN);
  
 #
      ADJUST THE AREA DIRECTORY BASED ARRAY AND AREA INFORMATION BASED
      ARRAY TO POINT TO THE FIRST AVAILABLE WORD. 
 #
      P<ARDIR> = ARDIRBP + DFMDADCW + AREACNT * DFMDADEN + 1; 
      P<ARINFO> = ARINFOBP + AREACNT * DFMDAIEN + 1;
  
 #
      BUILD THE AREA DIRECTORY. 
 #
 #
      STORE LENGTH IN WORDS OF THE AREA NAME. 
 #
      MDADSZAN[0] = ARNMLNW;
 #
      INCREMENT AREA COUNTER TO REFLECT THE CURRENT AREA. 
 #
      AREACNT = AREACNT + 1;
 #
      CHECK IF THE PRE-CONSTRAINT USE TABLE HAS BEEN ALLOCATED. IF IT 
      HAS, MAKE AN ENTRY FOR THIS AREA IN THE PRE-CONSTRAINT USE TABLE. 
 #
      IF PCUTBP NQ 0               # IF PCUT HAS BEEN ALLOCATED        #
      THEN
        BEGIN 
        P<PCUT> = PCUTBP + 1;      # POSITION PRE-CONSTRAINT USE TABLE #
        MDPCUTWA[PCUTNDX] = DAENTAD[0];  # AREA ENTRY WORD ADDRESS     #
        MDPCUTAID[PCUTNDX] = AREACNT;    # AREA ID                     #
        PCUTNDX = PCUTNDX + 1;
        END 
 #
      STORE THE AREA ID AND SET THE NUMBER OF UNIQUE PFNS TO 1. 
 #
      MDADIDNT[0] = AREACNT;
      MDADNPFN[0] = 1;             # NUMBER OF UNIQUE PFNS             #
 #
      STORE AREA NAME.
 #
      MDADARNM[0] = AREANAM;
 #
      BUILD THE AREA INFORMATION TABLE. 
  
      MOVE THE AREA PERMANENT FILE INFORMATION FROM MDPFINFO TO THE 
      AREA INFORMATION TABLE AND THE PERMANENT FILE INFORMATION TABLE.
 #
      MDAIFLAGS[0] = AREAFLAGS[0];     # AREA LEVEL FLAGS              #
      P<GETENTRY> = LOC(MDPFWORD[FILETYPE"AREA"]);
      P<PUTENTRY> = LOC(MDAIARPF[0]); 
      FOR I = 0 STEP 1
        UNTIL DFPFENTLEN - 1
      DO
        BEGIN 
        PUTINT[I] = GETINT[I];
        END 
      P<TLC> = B<42,18>PITBP; 
      P<PFINFO> = B<42,18>PITBP + TLCHLEN[0]; 
      TOTENT = MDPITTOTENT[0];
      PITLENG = MDPITTOTENT[0] * DFMDPITEN; # LENGTH OF PIT            #
      ACTENT = MDPITACTENT[0];
      MDPITACTENT[0] = MDPITACTENT[0] + 1;  # TOTAL ACTIVE ENTRIES     #
      P<PFINFO> = LOC(PFINFO) + DFPITHDR;   # RELOCATE PIT             #
 #
*     SEARCH THE PERMANENT FILE INFORMATION TABLE (PIT) FOR AN ENTRY
*     THAT IS NOT IN USE (MDPITUSEF = FALSE). 
 #
      IF ACTENT LS TOTENT 
      THEN
        BEGIN 
        ORIGSEG = TLCDSOR[0]; 
        PITOFFSET = DFPITHDR; 
        IF ORIGSEG NQ 0 
        THEN
          BEGIN 
          PITOFFSET = DFPITHDR + (TLCDSWL[0] * (ORIGSEG - DFTLCHL));
          END 
        FOR PITOFFSET = PITOFFSET 
          STEP DFMDPITEN           # STEP THROUGH THE PIT UNTIL        #
          WHILE PITOFFSET LQ PITLENG  # THE END OF THE PIT             #
            AND MDPITUSEF[0]       # OR AN AVAILABLE ENTRY IS FOUND    #
        DO
          BEGIN 
          P<PFINFO> = LOC(PFINFO) + DFMDPITEN; # POSITION TO NEXT PIT  #
  
          IF ORIGSEG NQ 0          # IF THERE ARE ANY DISK SEGMENTS    #
            AND LOC(PFINFO) GQ LOC(TLC) 
                + TLCHLEN[0] + TLCDSBW[0] + TLCDSWL[0]
          THEN                    # IT IS THE END OF THIS DISK SEGMENT #
  
            BEGIN                 # DO A CIRCULAR SCAN OF THE SEGMENTS #
            NEXTSEG = TLCDSOR[0] +1;
            IF NEXTSEG EQ TLCHLEN[0]
            THEN                   # AT THE LAST SEGMENT               #
              BEGIN                # GO TO THE FIRST SEGMENT           #
              NEXTSEG = DFTLCHL;
              PITOFFSET = DFPITHDR - DFMDPITEN; 
              END 
            IF NEXTSEG EQ ORIGSEG  # IF THE NEXT IS THE ORIGINAL       #
            THEN                   # ALL SEGMENTS HAVE BEEN SEARCHED   #
              BEGIN                # EXCEPT THE BUILD SEGMENT          #
              P<PFINFO> = LOC(TLC) + TLCHLEN[0] + TLCBSBW[0]; 
              PITOFFSET = DFPITHDR - DFMDPITEN
                            + (TLCDSWL[0] * (TLCHLEN[0] - DFTLCHL));
              ORIGSEG = 0;
              TEST PITOFFSET;      # CONTINUE SCAN IN THE BUILD SEGMENT#
  
              END 
                                   # SWAP IN THE NEXT SEGMENT          #
            BUFLOC = LOC(TLC) + TLCHLEN[0] + TLCDSBW[0];
            P<PFINFO> = BUFLOC; 
            IF TLCDSMF[0]          # IF THE MODIFIED FLAG IS SET       #
            THEN                   # REWRITE THE RESIDENT SEGMENT      #
              BEGIN 
              LENGTH = TLCSLEN[TLCDSOR[0]]; 
              PRUNUM = TLCSPRU[TLCDSOR[0]]; 
              TLCDSMF[0] = FALSE; 
              DB$RNRW(LOC(DB$RNFT),BUFLOC,LENGTH,PRUNUM); 
              END 
                                   # READ IN THE NEW SEGMENT           #
            LENGTH = TLCSLEN[NEXTSEG];
            PRUNUM = TLCSPRU[NEXTSEG];
            DB$RNRD(LOC(DB$RNFT),BUFLOC,LENGTH,PRUNUM); 
            TLCDSOR[0] = NEXTSEG; 
            TLCDSWL[0] = TLCSLEN[NEXTSEG];
            END 
          END 
        IF ORIGSEG NQ 0 
        THEN
          BEGIN 
          TLCDSMF[0] = TRUE;       # SET SEGMENT MODIFIED FLAG         #
          END 
        END 
      ELSE                         # SKIP THE SEARCH, ALL ARE ACTIVE   #
        BEGIN 
        PITOFFSET = PITLENG + DFPITHDR; 
        P<PFINFO> = LOC(TLC) + TLCHLEN[0] + TLCUSED[0]; 
        END 
      BUFOFFSET = LOC(PFINFO) - B<42,18>PITBP;
  
      IF PITOFFSET GQ PITLENG      # IF NO AVAILABLE ENTRY WAS FOUND   #
      THEN
        BEGIN 
        DB$UAWS(LOC(PITBP),DFMDPITEN);       # ALLOCATE SPACE IN PIT   #
        BUFOFFSET = TLCUSED[0] + TLCHLEN[0] - DFMDPITEN;
        P<PFINFO> = B<42,18>PITBP + TLCHLEN[0];  # POINT TO PIT HEADER #
        MDPITTOTENT[0] = MDPITTOTENT[0] + 1;  # UPDATE TOTAL ENTRIES   #
        END 
# 
*     RECOMPUTE THE VIT TABLE LIMITS EACH TIME AN AREA IS ADDED.
# 
      P<TLC> = B<42,18>VERINFBP;
      VERSIZE = AREACNT * DFMDVIEN; 
                                         # DISK SEGMENT WORD LENGTH    #
      TLCDSWL[0] = ((DFTLCTMAX / (VERSIZE *2)) +1) * VERSIZE; 
  
                                         # BUILD SEGMENT BEGINNING WORD#
      TLCBSBW[0] = TLCDSWL[0] +DFVITHDR;
  
                                         # MAXIMUM TABLE LENGTH        #
      TLCTMXL[0] = TLCBSBW[0] + TLCDSWL[0]; 
  
      DB$UAWS(LOC(VERINFBP),DFMDVIEN);  # ADD 1 ENTRY TO THE VIT       #
                                   # SET THE VIT POINTER TO THE ENTRY  #
                                   # JUST ADDED.                       #
      P<VERINFO> = LOC(TLC) + TLCHLEN[0] + TLCUSED[0] - DFMDVIEN; 
      MDVITNAME[0] = "MASTER";     # SET VERSION NAME                  #
      MDVITFOFF[0] = PITOFFSET;    # OFFSET INTO THE PIT               #
      P<PFINFO> = B<42,18>PITBP + BUFOFFSET;  # RESTORE PIT ENTRY PNTR #
      P<ARINFO> = ARINFOBP + 1 + (AREACNT - 1) * DFMDAIEN;
      MDPITFLAGS[0] = AREAFLAGS[0];       # AREA FLAGS                 #
      MDPITUSEF[0] = TRUE;                # ENTRY IN USE               #
      MDPITNOVER[0] = MDPITNOVER[0] + 1;  # NUMBER OF VERSIONS         #
      P<PUTENTRY> = LOC(MDPITPFINFO[0]);
      P<GETENTRY> = LOC(MDAIARPF[0]); 
      FOR I = 0 STEP 1                 # MOVE AREA PF INFO TO PIT      #
        UNTIL DFPFENTLEN - 1
      DO
        BEGIN 
        PUTINT[I] = GETINT[I];
        END 
 #
      MOVE THE INDEX PERMANENT FILE INFORMATION FROM MDPFINFO TO THE
      AREA INFORMATION TABLE AND THE PERMANENT FILE INFORMATION TABLE.
 #
      IF MDPFINAME[FILETYPE"INDEX"] NQ 0  # IF INDEX FILE SPECIFIED    #
      THEN
        BEGIN 
        P<PUTENTRY> = LOC(MDAIIXPF[0]); 
        P<GETENTRY> = LOC(MDPFWORD[FILETYPE"INDEX"]); 
        FOR I = 0 STEP 1           # MOVE INDEX PF TO AIT              #
          UNTIL DFPFENTLEN - 1
        DO
          BEGIN 
          PUTINT[I] = GETINT[I];
          END 
        P<PUTENTRY> = LOC(MDPITXNINFO[0]);
        FOR I = 0 STEP 1           # MOVE INDEX PF INFO TO PIT         #
          UNTIL DFPFENTLEN - 1
        DO
          BEGIN 
          PUTINT[I] = GETINT[I];
          END 
        END 
 #
      USING THE WORD ADDRESS OF THE DATA CONTROL ENTRY FOR THE CURRENT
      AREA FOUND IN SCARDCBF, READ THE DATA CONTROL ENTRY HEADER. 
      THEN USING THE OFFSET TO THE FIT FROM THE START OF THE DATA 
      CONTROL ENTRY, READ THE FIT INTO THE AREA INFORMATION TABLE.
      THE DATA CONTROL ENTRY ADDRESS IN DCADDRES IS USED AGAIN LATER. 
 #
      DCADDRES = SCAREADCNTLA[0];                          # DATA CON#
      DB$WGET(DE$FTSC,SCARDCBF,DFSCARDC,DCADDRES,DB$ERSC); # GET D.C.#
      P<ARINFO> = ARINFOBP + 1 + (AREACNT - 1) * DFMDAIEN; # AREA INF#
      P<PUTENTRY> = LOC(MDAIAFIT[0]);                      # A.I. FIT#
      DB$WGET                                              # GET FIT #
        (DE$FTSC,PUTENTRY,DFFITSIZE,DCADDRES + SCDCFITPTR[0],DB$ERSC);
 #
      READ IN THE KEY INFORMATION FROM THE DATA CONTROL ENTRY, AND
      GENERATE THE KEY INFORMATION TABLE. 
 #
      WAGET = DCADDRES + SCDCALTRKYPT[0];  # WA OF KEY ENTRY           #
      DB$WGET(DE$FTSC,DDLKEYS,DFDLKLEN,WAGET,DB$ERSC);
      P<ARINFO> = ARINFOBP + 1 + (AREACNT - 1) * DFMDAIEN;
      MDAIKTOFF[0] = KEYNDX;       # OFFSET INTO KEY INFORMATION TABLE #
  
#     GENERATE KEY INFORMATION TABLE                                   #
  
      FOR I = 1                    # STEP THRU ALL THE KEY SUBENTRIES  #
        WHILE I NQ 0               # IN THE DATA CONTROL ENTRY         #
      DO
        BEGIN 
        DB$UAWS(LOC(KEYINFOBP),DFMDKITEN);  # ADJUST SPACE FOR KIT     #
        P<KEYINFOT> = KEYINFOBP + 1 + KEYNDX; 
        MDKITPRI[0] = SCDCKEYPRI[1];      # PRIMARY KEY FLAG           #
        MDKITDUP[0] = SCDCKEYDUPS[1] AND NOT SCDCKEYNOT[1]; #DUPLICATES#
        MDKITEMB[0] = SCDCKEYIMBED[1];    # IMBEDDED KEY FLAG          #
        MDKITRGSZ[0] = SCDCKEYGRPSZ[0];   # SIZE OF REPEATING GROUP    #
        MDKITMAXOC[0] = SCDCKEYMAXOC[0];  # MAX NUMBER OF OCCURENCES   #
        MDKITKT[0] = SCDCKEYTYPE[0];      # KEY TYPE                   #
        MDKITBWP[0] = SCDCKEYBWP[1];      # KEY BWP                    #
        MDKITBCP[0] = SCDCKEYBCP[1];      # KEY BCP                    #
        MDKITSIZ[0] = SCDCKEYSIZ[1];      # KEY SIZE                   #
        KEYNDX = KEYNDX + DFMDKITEN;
        I = SCDCKEYNITM[0];               # NEXT KEY POINTER           #
        IF SCDCKEYNITM[0] NQ 0            # IF THERE IS A NEXT KEY     #
        THEN
          BEGIN 
          WAGET = WAGET + SCDCKEYNITM[0]; # WA OF NEXT KEY ENTRY       #
          DB$WGET(DE$FTSC,DDLKEYS,DFDLKLEN,WAGET,DB$ERSC);  # GET KEY  #
          END 
        END 
      P<ARINFO> = ARINFOBP + 1 + (AREACNT - 1) * DFMDAIEN;
      MDAIKTSZ[0] = KEYNDX - MDAIKTOFF[0]; # SIZE OF KEY INFO TABLE    #
 #
      MAKE SURE THAT THE MIP INDEX FILE IS SPECIFIED IN THE FIT IF THERE
      IS AN INDEX CLAUSE SPECIFIED FOR THE AREA IN THE MD.
 #
      P<ARDIR> = ARDIRBP + DFMDADCW +(AREACNT - 1) *DFMDADEN + 1; 
      IF MDAIFITXN[0] EQ 0
        AND MDAIINDX[0] 
      THEN
        BEGIN 
          DB$DIAG(104,AREANAM); 
        END 
      IF MDAIFITXN[0] NQ 0
        AND NOT MDAIINDX[0] 
      THEN
        BEGIN 
        DB$DIAG(128,AREANAM); 
        END 
  
 #
      IF LOGGING WAS SPECIFIED FOR THE CURRENT AREA, BUT APPROPRIATE
      LOG PF INFO WAS NOT SPECIFIED FOR THE SCHEMA, ISSUE A DIAGNOSTIC, 
      AND SET SCFATAL. IF JOURNAL LOG AND/OR TRANSACTION RECOVERY WAS 
      SPECIFIED (CORRECTLY) FOR THE CURRENT AREA, GET THE PRIMARY KEY 
      LENGTH STORED IN THE FIT, ADJUST IT TO THE MULTIPLE OF TEN
      (CHARACTERS) JUST LARGE ENOUGH FOR THIS KEY SIZE, AND ADD THE 
      MAXIMUM RECORD LENGTH TO IT. ADJUST THIS FIGURE UP TO A 
      MULTIPLE OF TEN IF IT IS NOT ALREADY A MULTIPLE OF TEN
      BECAUSE ALL LOG RECORDS MUST END ON WORD BOUNDARIES.
 #
      P<MDSCENTRY> = SCDRBP + 1;
      P<ARDIR> = ARDIRBP + 1 + DFMDADCW + (AREACNT - 1) * DFMDAIEN; 
  
#     CHECK FOR CONSISTENCY BETWEEN APPROPRIATE LOG OPTIONS AND        #
#     APPROPRIATE LOG FILES                                            #
  
      IF ((MDAILGBR[0]               # IF LOG BEFORE IMAGE RECORD      #
          OR MDAILGAR[0])            # OR LOG AFTER IMAGE RECORD       #
          AND NOT MDSCJLFG[SCHDIRP]) # AND NO JOURNAL LOG FILE         #
        OR (MDAILGBB[0]              # OR LOG BEFORE IMAGE BLOCK       #
          AND NOT MDSCQRFG[SCHDIRP]) # AND NO QUICK RECOVERY FILE      #
          THEN                                   # THERE IS AN ERROR #
            BEGIN 
              DB$DIAG(140,AREANAM);              # ISSUE DIAGNOSTIC # 
            END 
      P<MDSCENTRY> = SCDRBP + 1;
      IF MDAILGBR[0]               # IF LOG BEFORE IMAGE RECORD        #
        OR MDAILGAR[0]             # OR LOG AFTER IMAGE RECORD         #
        OR MDSCTRFG[SCHDIRP]       # OR TRANSACTION RECOVERY FILE      #
        THEN                                     # SEE IF NEW MAXIMUM#
          BEGIN 
            I = (MDAIFITKL[0] + 9) / 10;         # KEY LENGTH - WORDS#
            I = (I * 10) + MDAIFITMRL[0] + DFHDRSZ; 
                                                 # JOURNAL LOG RECORD  #
                                                 # LENGTH              #
  
#     IF NEW LOG RECORD IS GREATER THAN THE PREVIOUS ONE,              #
#     REPLACE IT IN THE SCHEMA DIRECTORY TABLE.                        #
  
            IF MDSCMAXLXL[SCHDIRP]     # IF EXTRA LARGE MAXIMUM RECORD #
            THEN
              BEGIN 
              I = (I +79) /160 *2 +1; 
              IF I GR MDSCMAXLOG[SCHDIRP] 
              THEN
                BEGIN 
                MDSCMAXLOG[SCHDIRP] = I;
                                       # SETS MDSCMAXLXL[SCHDIRP] TRUE #
                END 
              END 
            ELSE
              BEGIN 
              IF I GR 32767 
              THEN
                BEGIN 
                MDSCMAXLOG[SCHDIRP] = (I +79) /160 *2 +1; 
                                       # SETS MDSCMAXLXL[SCHDIRP] TRUE #
                END 
              ELSE
                BEGIN 
                IF I GR MDSCMAXLOG[SCHDIRP] 
                THEN
                  BEGIN 
                  MDSCMAXLOG[SCHDIRP] = ((I +9) /10) *10;  # MULT OF 10#
                                       # SETS MDSCMAXLXL[SCHDIRP] FALSE#
                  END 
                IF MDSCMAXLOG[SCHDIRP] LS DFMINMRL
                THEN
                  BEGIN 
                  MDSCMAXLOG[SCHDIRP] = DFMINMRL; 
                  END 
                END 
              END 
          END 
 #
   IF LOG AFTER IMAGE RECORD OPTION IS SPECIFIED THEN INCREMENT THE 
   COUNTER IN SCHEMA DIRECTORY TABLE
 #
      IF MDAILGAR[0]               # IF LOG OPTION IS SPECIFIED        #
      THEN                         # INCREMENT LOG AFTER IMAGE RECORD  #
        BEGIN                      # COUNTER IN SDT                    #
        MDSCNBAFTIM[SCHDIRP] = MDSCNBAFTIM[SCHDIRP] + 1;
        END 
  
 #
      TRANSFER THE DIRECT ACCESS HASH, COMPRESSION, AND DECOMPRESSION 
      DATA BASE PROC ORDINALS TO THE AREA DIRECTORY ENTRY, AS NEEDED. 
 #
      P<ARDIR> = ARDIRBP + 1 + DFMDADCW + (AREACNT - 1) * DFMDADEN; 
      MDADHSOR[0] = SCDCSDAORD[0];               # DIRECT ACCESS HASH#
      MDADSYST[0] = SCDCCDSYSFLG[0];             # TRUE=C/D BY SYSTEM#
      IF SCDCCDTBLPTR[0] GR 0                    # IF COMPRESS/DECOMP#
        THEN                                     # PROCESS C/D ENTRY #
          BEGIN 
            J = SCDCCDTBLENG[0] - 1;             # -1 FOR LOOP FROM 0#
            DB$WGET(DE$FTSC,SCARDCBF,DFSCARDC,   # GET THE C/D ENTRY #
                    DCADDRES + SCDCCDTBLPTR[0],DB$ERSC);   # FROM DDL#
            P<ARDIR> =                           # POINT AREA DIRECT #
              ARDIRBP + 1 + DFMDADCW + (AREACNT - 1) * DFMDADEN;
            FOR I = 0 STEP 1 UNTIL J DO          # STORE C/D ORDINALS#
              BEGIN 
                P<SCDCCDAR> = LOC(SCARDCBF) + I; # POINT COMP/DECOMP #
                IF SCDCCDCMPFLG[0] THEN MDADCMOR[0] = SCDCCDDBPORD[0];
                IF SCDCCDDCMPFG[0] THEN MDADDEOR[0] = SCDCCDDBPORD[0];
              END 
          END 
 #
      PROC DB$SR06 IS THROUGH BUILDING THE AREA DIRECTORY AND AREA
      INFORMATION TABLE ENTRIES FOR THE CURRENT AREA SO EXIT TO DB$NO.
 #
      DB$NO;                 # EXIT TO DB$NO - SYNTAX TABLE DRIVER NO#
  
      END                    # DB$SR06 #
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ S R 6 0 .        #
#                                                                      #
#**********************************************************************#
  
    PROC DB$SR60; 
      BEGIN 
 #
* *   DB$SRDM                                    PAGE  1
* *   DB$SR60 - STORE COUNTS IN THE SDT 
* *   M. D. SAXE                                 DATE  02/02/76 
* *   J. G. SERPA - MDU 2.3 ENHANCEMENTS         DATE  07/23/80 
* *   H.S.WOO                                    DATE  04/08/81 
  
  DC  PURPOSE 
  
      STORE NUMBER OF AREAS, NUMBER OF VERSIONS, LENGTH OF THE KEY
      INFORMATION TABLE AND LENGTH OF THE PERMANENT FILE INFORMATION
      TABLE INTO THE SCHEMA DIRECTORY TABLE.
  
  DC  ENTRY CONDITIONS
  
      AREACNT - NUMBER OF AREAS SPECIFIED IN THE INPUT. 
      ARDIRBP - ADDRESS OF THE AREA DIRCTORY TABLE. 
      KEYNDX  - LENGTH OF THE KEY INFORMATION TABLE.
      PITBP   - ADDRESS OF THE PERMANENT FILE INFORMATION TABLE.
      SCDRBP  - ADDRESS OF THE SCHEMA DIRECTORY TABLE.
      SCHDIRP - INDEX INTO THE CURRENT SDT ENTRY. 
      VERSCNT - NUMBER OF VERSIONS SPECIFIED FOR THE SCHEMA.
  
  DC  EXIT CONDITIONS 
  
      IF THE NUMBER OF AREAS SPECIFIED IN THE MASTER DIRECTORY INPUT IS 
      DIFFERENT FROM THE NUMBER SPECIFIED IN THE SCHEMA, DIAGNOSTIC 134 
      IS ISSUED, AND EXIT IS TO DB$NO.  OTHERWISE, THE NUMBER OF AREAS, 
      NUMBER OF VERSIONS, LENGTH OF THE KEY INFORMATION TABLE AND LENGTH
      OF THE PERMANENT FILE INFORMATION TABLE ARE STORED IN THE SCHEMA
      DIRECTORY TABLE ENTRY FOR THE CURRENT SCHEMA. 
      EXIT IS TO DB$NO. 
  
  DC  CALLING ROUTINES
  
      DB$STD - SYNTAX TABLE DRIVER. 
  
  DC  CALLED ROUTINES 
  
      DB$DIAG - ISSUE DIAGNOSTIC
      DB$NO   - SYNTAX TABLE DRIVER -NO- RETURN 
  
 DC   NON-LOCAL VARIABLES MODIFIED
  
      NONE
 #
  
  
  
#     B E G I N   D B $ S R 6 0   E X E C U T A B L E   C O D E .      #
  
  
      IF AREACNT NQ SCCWNUMAREAS[0]    # IF NUMBER OF AREAS IS         #
      THEN                             # INCONSISTENT                  #
        BEGIN 
        DB$DIAG(134,SCCWNUMAREAS[0]);  # ISSUE DIAGNOSTIC              #
        DB$NO;                         # EXIT                          #
  
        END 
      P<ARDIR> = ARDIRBP + 1;                    # POINT TO AREA DIR #
      MDADNBAR[0] = AREACNT;
      P<TLC> = B<42,18>PITBP;        # POSITION PERM FILE INFO TABLE   #
      P<PFINFO> = B<42,18>PITBP + TLCHLEN[0]; 
      P<MDSCENTRY> = SCDRBP + 1;
      MDSCKITSZ[SCHDIRP] = KEYNDX;     # KEY INFORMATION TABLE SIZE    #
      MDSCNBARS[SCHDIRP] = AREACNT;    # STORE NUMBER OF AREAS IN SDT  #
      MDSCNOVER[SCHDIRP] = VERSCNT;    # STORE NUMBER OF VERSIONS      #
      PITLENG = MDPITTOTENT[0] * DFMDPITEN + DFPITHDR;
      MDSCPITSX[SCHDIRP] = B<33,09>PITLENG; 
      MDSCPITSZ[SCHDIRP] = B<42,18>PITLENG; 
      DB$NO;
  
  
      END 
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ S R 7 8 .        #
#                                                                      #
#**********************************************************************#
  
  
      PROC DB$SR87; 
      BEGIN 
 #
* *   DB$SR87 - VALIDATE EXISTENCE OF AREA       PAGE  1
* *   J. G. SERPA                                DATE 09/26/80
* 
* DC  PURPOSE 
* 
*     VALIDATE THAT THE AREA WHOSE NAME IS IN AREANAM FOR A 
*     NON-MASTER VERSION EXISTS IN THE AREA DIRECTORY TABLE.
* 
* DC  ENTRY CONDITIONS
* 
*     THE AREA DIRECTORY TABLE RESIDES IN CORE. AREANAM CONTAINS THE
*     NAME OF THE AREA TO BE VALIDATED. 
* 
* DC  EXIT CONDITIONS 
* 
*     AREAORD CONTAINS THE ORDINAL OF THE CURRENT AREA IN THE AREA
*     DIRECTORY TABLE.  EXIT IS TO DB$YES IF THE AREA EXISTS. 
*     OTHERWISE, EXIT IS TO DB$NO.
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX - SYNTAX CRACKER (SYNGEN) 
* 
* DC  CALLED ROUTINES 
* 
*     DB$NO  - SYNTAX TABLE DRIVER -NO- RETURN
*     DB$YES - SYNTAX TABLE DRIVER -YES- RETURN 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     AREAORD IN THE (1,0) COMMON.
* 
* DC  DESCRIPTION 
* 
*     THE AREA DIRECTORY TABLE IS SEARCHED FOR AN AREA WHOSE NAME 
*     MATCHES THE ONE IN CURWORD. IF FOUND, ITS ORDINAL IS STORED INTO
*     AREAORD, AND EXIT IS TO DB$YES. IF NOT FOUND, EXIT IS TO DB$NO. 
* 
 #
  
  
  
#     B E G I N  E X E C U T A B L E  C O D E  F O R  D B $ S R 8 7    #
  
  
      FOR AREAORD = 1 STEP 1       # STEP THRU AREA DIRECTORY          #
        UNTIL AREACNT 
      DO
        BEGIN 
        P<ARDIR> = ARDIRBP + 1 + DFMDADCW + (AREAORD - 1) * DFMDADEN; 
        IF MDADARNM[0] EQ AREANAM  # IF NAMES MATCH                    #
        THEN
          BEGIN 
          DB$YES;                  # AREA FOUND, RETURN -YES-          #
  
          END 
        END 
      DB$NO;                       # AREA NOT FOUND                    #
  
      END 
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ S R 9 4 .        #
#                                                                      #
#**********************************************************************#
  
      PROC DB$SR94; 
      BEGIN 
 #
* *   DB$SRDM                                    PAGE  1
* *   DB$SR94 - STORE VERSCNT AND LENGTH OF PIT INTO SDT
* *   J. G. SERPA                                DATE  02/17/81 
* 
* DC  PURPOSE 
* 
*     STORE THE NUMBER OF VERSIONS AND THE LENGTH OF THE PERMANENT
*     FILE INFORMATION TABLE INTO THE SCHEMA DIRECTORY TABLE. 
* 
* DC  ENTRY CONDITIONS
* 
*     PITBP   - ADDRESS OF THE PERMANENT FILE INFORMATION TABLE.
*     SCDRBP  - ADDRESS OF THE SCHEMA DIRECTORY TABLE.
*     SCHDIRP - INDEX INTO THE CURRENT SDT ENTRY. 
*     VERSCNT - NUMBER OF VERSIONS SPECIFIED FOR THIS SCHEMA. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE NUMBER OF VERSIONS AS WELL AS THE LENGTH OF THE PERMANENT 
*     FILE INFORMATION TABLE IN THE SCHEMA DIRECTORY TABLE HAVE BEEN
*     UPDATED.
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX - SYNTAX CRACKER (SYNGEN) 
* 
* DC  CALLED ROUTINES 
* 
*     DB$NO - SYNTAX TABLE DRIVER -NO- RETURN.
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     THE NUMBER OF VERSIONS (VERSCNT) AND THE LENGTH OF THE PERMANENT
*     FILE INFORMATION TABLE HAVE BEEN STORED INTO THE SCHEMA DIRECTORY 
*     TABLE. RETURN IS TO DB$NO.
* 
 #
  
  
  
#     B E G I N   D B $ S R 9 4   E X E C U T A B L E   C O D E .      #
  
  
      P<TLC> = B<42,18>PITBP;        # POSITION PERM FILE INFO TABLE   #
      P<PFINFO> = PITBP + TLCHLEN[0]; 
      P<MDSCENTRY> = SCDRBP + 1;     # POSITION SCHEMA DIR TABLE       #
      MDSCNOVER[SCHDIRP] = VERSCNT;  # NUMBER OF VERSIONS              #
      PITLENG = MDPITTOTENT[0] * DFMDPITEN + DFPITHDR;
      MDSCPITSX[SCHDIRP] = B<33,09>PITLENG; 
      MDSCPITSZ[SCHDIRP] = B<42,18>PITLENG; 
      DB$NO;                         # RETURN TO DB$NO                 #
  
      END 
      END                                                                JJJ0106
      TERM                                                               JJJ0106
