*DECK DB$MDR2 
USETEXT UTMPTTX 
USETEXT MDBCMTX 
USETEXT MDDEFTX 
      PROC DB$MDR2(TOTALAR,TOTALSS,TOTALRL,TOTALVR);
      BEGIN 
 #
  *   DB$MDR2 - FORMATS AND PRINTS MD CONTENT    PAGE  1
  *   M D SAXE                                   DATE  05/13/76 
  *   L.G. WHITE  FOR CHECKSUM MODS              DATE  08/16/78 
* *   J. G. SERPA - MDU 2.3 ENHANCEMENTS         DATE  07/28/80 
* *   R. L. MCALLESTER - TABLE SEGMENTATION      DATE  05/30/84 
  
  DC  PURPOSE 
  
      FORMATS AND WRITES THE MASTER DIRECTORY CONTENTS REPORT.
  
  DC  ENTRY CONDITIONS
  
      THE AREA DIRECTORY, VERSION DIRECTORY AND INFORMATION TABLES, 
      AREA AND RELATION CHECKSUM LIST, AND SUBSCHEMA DIRECTORY MUST 
      BE IN CORE. 
  
  DC  EXIT CONDITIONS 
  
      THE SCHEMA, VERSION, AREA, RELATION AND SUBSCHEMA NAMES ARE 
      WRITTEN TO THE OUTPUT FILE ALONG WITH CHECKSUMS FOR THE AREAS,
      RELATIONS AND SUBSCHEMAS. VERSION, AREA, RELATION AND SUBSCHEMA 
      COUNTS ARE GIVEN FOR EACH SCHEMA. 
  
  DC  CALLING ROUTINES
  
      DB$M40M - CONTROL ROUTINE FOR THE MD CONTENTS REPORT
  
  DC  CALLED ROUTINES 
  
 #
      XREF
        BEGIN 
 #                                                                     #
        FUNC DB$CDEB C(10);  # CONVERT INTEGER TO DECIMAL - BLANK FILL #
        FUNC DB$COCT C(10);  # CONVERT INTEGER TO OCTAL DISPLAY - ZERO #
        PROC DB$ERMD;        # CRM ERROR EXIT FOR NEW MASTER DIRECTORY #
        ARRAY DB$FTMD;;      # FIT FOR NEW MASTER DIRECTORY            #
        PROC DB$UAWS;        # ADJUST WORK SPACE IN MANAGED MEMORY     #
        PROC DB$UENL;        # ENSURE THAT THERE ARE N LINES ON PAGE   #
        PROC DB$UPRT;        # WRITES WSA TO OUTPUT.                   #
        PROC DB$USHR;        # SHRINK MANAGED MEMORY BLOCK TO ONE WORD #
        PROC DB$WGET;        # WORD ADDRESSABLE GET CALL               #
 #                                                                     #
        END 
 #
  
  DC  NON-LOCAL VARIABLES 
  
# 
  
      ITEM TOTALAR;          # PARAMETER - TOTAL NUMBER OF MD AREAS # 
      ITEM TOTALRL;          # PARAMETER - TOTAL NUMBER OF RELATIONS #
      ITEM TOTALSS;          # PARAMETER - TOTAL NUMBER OF SUBSCHEMAS#
      ITEM TOTALVR;          # PARAMETER - TOTAL NUMBER OF VERSIONS    #
 #                                                                     #
  
      BASED ARRAY MDSCENTRY [0] S;
        BEGIN 
*CALL MDSCDDCLS 
        END 
  
      BASED ARRAY ARDIR [0] S;
        BEGIN 
*CALL MDARDDCLS 
        END 
  
      BASED ARRAY CSTSSTBL [0] S; 
        BEGIN 
*CALL MDSBDDCLS 
        END 
  
      BASED ARRAY VERSDIR [0:0] S;     # VERSION DIRECTORY TABLE       #
        BEGIN 
*CALL MDVDTDCLS              VERSION DIRECTORY TABLE
        END 
  
      BASED ARRAY VERINFO [0:0] S;     # VERSION INFORMATION TABLE     #
        BEGIN 
*CALL MDVITDCLS              VERSION INFORMATION TABLE
        END 
# 
*     LOCAL VARIABLES 
# 
  
      ARRAY SCHEMANAME S (5); 
        ITEM SCNAME C(0,0,50) = ["    S "]; 
      ARRAY SCHDTETME S(5); 
        ITEM SCDTETME C(0,0,50) = ["       CREATION DATE -         TIME 
-     "]; 
      ARRAY VERSIONAME S(5);
        ITEM VRNAME C(0,00,50) = ["     V "]; 
      ARRAY AREANAME S(5);
        ITEM ARNAME C(0,0,50) = ["       A"]; 
      ARRAY RELTNNAME S(5); 
        ITEM RLNAME C(0,0,50) = ["     R"]; 
      ARRAY CHECKSUM S(5);
        ITEM CKSUM C(0,0,50) = ["           CHECKSUM - "];
      ARRAY SUBSCHNAME S(5);
        ITEM SSNAME C(0,0,50) = ["     SB"];
      ARRAY SCHSUMM S (5);
        ITEM SCHSUM C(0,0,50) = ["    SUMMARY FOR "]; 
      ARRAY VERSIONUM S(5); 
        ITEM VRNUM C(0,00,50) = ["       NUMBER OF VERSIONS"];
      ARRAY AREANUM S (5);
        ITEM ARNUM C(0,0,50) = ["       NUMBER OF AREAS"];
      ARRAY RELTNNUM S(5);
        ITEM RELNUM C(0,0,50) = ["       NUMBER OF RELATIONS "];
      ARRAY SUBSCHNUM S (5);
        ITEM SSNUM C(0,0,50) = ["       NUMBER OF SUBSCHEMAS "];
      ARRAY SUBSCDTETME S(5); 
        ITEM SBSCDTETME C(0,0,50) = ["           CREATION DATE -
TIME -       "];
      ARRAY SKIP1LNE S (1); 
        ITEM SK1LNE C(0,0,10) = [" "];
      ARRAY SKIP2LNE S (1); 
        ITEM SK2LNE C(0,0,10) = ["-"];
  
      ITEM ARPTR;            # POINTER USED WHEN STEPPING THRU THE AREA#
                             # LIST.                                   #
      ITEM GETLNG;           # LG IN WRDS OF THE ENTRY TO BE READ.     #
      ITEM GETWA;            # WORD ADDRESS OF THE ENTRY TO BE READ.   #
      ITEM I;                # SCRATCH ITEM                            #
      ITEM J;                # SCRATCH ITEM                            #
      ITEM RELCNT;           # NUMBER OF RELATIONS IN THE SCHEMA       #
      ITEM REMLNG;           # REMAINING LENGTH IN VIT                 #
      ITEM SSPTR;            # POINTER USED WHEN STEPPING THRU THE SUB-#
                             # SCHEMA DIRECTORY.                       #
      ITEM VDPTR;            # POINTER USED WHEN STEPPING THROUGH THE  #
                             # VERSION DIRECTORY                       #
      ITEM VIPTR;            # POINTER USED WHEN STEPPING THROUGH THE  #
                             # VERSION INFORMATION TABLE               #
      ITEM VITINCR;          # INCREMENT IN THE VIT                    #
      DEF LNELNG #50#;       # NUMBER OF CHARACTERS IN A PRINT LINE.   #
  
      BASED ARRAY GETENTRY [0] S;;
  
  
  
  
#     B E G I N   D B $ M D R 2   E X E C U T A B L E   C O D E .      #
  
  
 #
  DC  DESCRIPTION 
  
      SET SCHEMA DIRECTORY BASED ARRAY TO POINT TO ITS APPROPRIATE
      CMM BLOCK.
 #
      P<MDSCENTRY> = B<42,18>SCDRBP + 1;
 #
      STORE THE SCHEMA NAME CONTAINED IN THE SCHEMA DIRECTORY INTO THE
      BUFFER TO BE PRINTED. 
 #
      C<7,30>SCNAME[0] = MDSCNAME[SCHDIRP]; 
 #
      GET THE SCHEMA ID FROM THE SCHEMA DIRECTORY. CONVERT IT FROM
      BINARY TO DISPLAY DECIMAL AND STORE IT INTO THE BUFFER TO BE
      PRINTED.
 #
      C<37,10>SCNAME[0] = DB$CDEB(MDSCIDNT[SCHDIRP],10);
 #
      ENSURE ENOUGH LINES LEFT ON THE PAGE.  OUTPUT SCHEMA NAME LINE. 
 #
      DB$UENL(10);           # ENSURE TEN LINES ARE LEFT ON THE PAGE #
      DB$UPRT(SCHEMANAME,LNELNG); 
 #
      STORE THE SCHEMA CREATION TIME AND DATE.
 #
      C<39,5>SCDTETME[0] = C<0,5>MDSITIME[0]; 
      C<24,5>SCDTETME[0] = C<0,5>MDSIDATE[0]; 
      DB$UPRT(SCHDTETME,LNELNG);
  
 #
      STEP THROUGH THE VERSION LIST. FOR EACH VERSION STEP THROUGH THE
      AREA LIST, AND MOVE THE AREA NAME AND ID OF AREAS WHICH HAVE
      UNIQUE PF INFO FOR THIS VERSION TO THE PRINT BUFFER, THEN WRITE 
      OUT THE BUFFER. 
  
 #
      VDPTR = 0;                    # POINTER INTO THE VDT             #
      P<MDSCENTRY> = SCDRBP + 1;   # SET SCHEMA DIRECTORY TABLE        #
      AREACNT = MDSCNBARS[SCHDIRP]; # NUMBER OF AREAS IN THIS SCHEMA   #
      VERSCNT = MDSCNOVER[SCHDIRP]; # NUMBER OF VERSIONS IN THIS SCHEMA#
  
      GETWA = MDSCWAVD[SCHDIRP] + VERSCNT;  # WORD ADDRESS OF VIT      #
      VITINCR = AREACNT * DFMDVIEN; 
      REMLNG = MDSCNOVER[SCHDIRP] * VITINCR;
      GETLNG = (DFTLCTMAX / VITINCR) * VITINCR;  # MAXIMUM TABLE SIZE  #
      IF GETLNG EQ 0
      THEN
        BEGIN 
        GETLNG = REMLNG;
        END 
      IF GETLNG GR REMLNG          # IF VIT LENGTH IS LESS THAN MAX    #
      THEN                         # REDUCE THE BUFFER SIZE            #
        BEGIN 
        GETLNG = REMLNG;
        END 
      DB$USHR(LOC(VERINFBP)); 
                                   # THE TLC POINTER IS SET BY DB$USHR #
      TLCCT[0] = FALSE;            # TURN OFF TLC CONTROL ON THE VIT   #
      TLCPAD[0] = 0;
      DB$USHR(LOC(VERINFBP)); 
      DB$UAWS(LOC(VERINFBP),GETLNG);  # ADJUST SIZE OF BLOCK FOR VIT   #
      VIPTR = GETLNG;              # CAUSE A TABLE SEGMENT READ        #
      FOR I = 1 STEP 1
       UNTIL VERSCNT
      DO
        BEGIN 
        IF VIPTR GQ GETLNG
        THEN                       # READ A NEW PORTION OF THE TABLE   #
          BEGIN 
          P<GETENTRY> = B<42,18>VERINFBP +1;
          IF GETLNG GR REMLNG      # IF IT IS THE LAST BUFFER          #
          THEN                     # READ ONLY THE REMAINING LENGTH    #
            BEGIN 
            GETLNG = REMLNG;
            END 
          DB$WGET(DB$FTMD,GETENTRY,GETLNG,GETWA,DB$ERMD); 
          VIPTR = 0;
          REMLNG = REMLNG - GETLNG; 
          GETWA = GETWA + GETLNG; 
          END 
        P<VERSDIR> = B<42,18>VERDIRBP + 1;   # POSITION VDT            #
        C<7,7>VRNAME[0] = MDVDTNAME[VDPTR];  # VERSION NAME            #
        DB$UPRT(VERSIONAME,LNELNG);    # PRINT VERSION NAME            #
        ARPTR = 0;                     # POINTER INTO AREA DIRECTORY   #
        FOR J = 1 STEP 1
          UNTIL AREACNT 
        DO
          BEGIN 
          P<ARDIR> = B<42,18>ARDIRBP + 1 + DFMDADCW; # SKIP OVER HEADER#
          P<VERSDIR> = B<42,18>VERDIRBP + 1;         # POSITION VDT    #
          P<VERINFO> = B<42,18>VERINFBP + 1 + VIPTR; # POSITION VIT    #
          IF MDVDTNAME[VDPTR] EQ MDVITNAME[(J-1)*DFMDVIEN]  # IF MATCH #
          THEN
            BEGIN 
            C<10,30>ARNAME[0] = MDADARNM[ARPTR];  # AREA NAME          #
            C<40, 7>ARNAME[0] = DB$CDEB(J, 7);
            DB$UPRT(AREANAME,LNELNG);    # PRINT AREA NAME             #
            P<MDSCCKSUM> = B<42,18>MDCHKSMBP + 1 + 1;  # GET PAST HDR  #
            FOR J = J              # SEARCH CKSUM LIST FOR AREA NAME   #
              WHILE MDELEMNM[0] NQ C<10,30>ARNAME[0]  # IF NAMES DO NOT#
                                                      # MATCH          #
            DO
              BEGIN 
              P<MDSCCKSUM> = LOC(MDSCCKSUM) + DFCKSMSZ; #GET NEXT ENTRY#
              END 
            C<23,10>CKSUM[0] = DB$COCT(B<00,30>MDCKSUM[0],10);
            C<33,10>CKSUM[0] = DB$COCT(B<30,30>MDCKSUM[0],10);
            DB$UENL(2);                # MUST HAVE AT LEAST TWO LINES  #
            DB$UPRT(CHECKSUM,LNELNG);  # PRINT CHECKSUM                #
            END 
          ARPTR = ARPTR + DFMDADEN;    # GET TO NEXT AREA DIR ENTRY    #
          END 
        VDPTR = VDPTR + DFMDVDEN;      # GET TO NEXT VERSION DIR ENTRY #
        VIPTR = VIPTR + VITINCR;       # ADVANCE TO NEXT VERSION INFO  #
        END 
 #
      STEP THRU CSUM LIST PULLING RELTN NAMES AND CSUMS-WRITE TO OUTPUT 
 #
      P<MDSCCKSUM> = B<42,18> MDCHKSMBP + 1;   # PICK UP HEADER WORD #
      RELCNT = MDHDRNUMREL[0];    # TAKE OUT RELATION COUNT # 
      FOR I = 1 STEP 1 UNTIL RELCNT DO
        BEGIN 
        DB$UENL (2);
        P<MDSCCKSUM> = B<42,18> MDCHKSMBP + 
                       DFCKSMSZ * (AREACNT + I-1) + 1 + 1;
        C<10,30> RLNAME[0] = MDELEMNM[0]; 
        C<23,10>CKSUM[0] = DB$COCT(B<00,30>MDCKSUM[0],10);
        C<33,10>CKSUM[0] = DB$COCT(B<30,30>MDCKSUM[0],10);
        DB$UPRT (RELTNNAME,LNELNG); 
        DB$UPRT (CHECKSUM,LNELNG);
        END 
 #
      STEP THROUGH THE MD SUBSCHEMA DIRECTORY, STORING THE SUBSCHEMA
      NAME, CHECKSUM, AND CREATION DATE AND TIME AND WRITING THEM OUT.
 #
      SSPTR = 0;
      P<CSTSSTBL> = B<42,18>CSTDIRBP + 1; 
      CSTDCNT = MDSBNBSB[0];
      FOR I=1 STEP 1 UNTIL CSTDCNT DO 
        BEGIN 
          P<CSTSSTBL> = B<42,18> CSTDIRBP + 1 + 1;         # SUB DRCT#
          C<10,30> SSNAME[0] = MDSBNAME[SSPTR];            # SUB NAME#
          C<23,10>CKSUM[0] = DB$COCT(B<00,30>MDSBCKSM[SSPTR],10); 
          C<33,10>CKSUM[0] = DB$COCT(B<30,30>MDSBCKSM[SSPTR],10); 
          C<27,5> SBSCDTETME[0] = C<0,5> MDSBSSDTE[SSPTR]; # SUB DATE#
          C<42,5> SBSCDTETME[0] = C<0,5> MDSBSSTME[SSPTR]; # SUB TIME#
          DB$UENL(3);                                      # 3 LINES #
          DB$UPRT(SUBSCHNAME,LNELNG);                      # SUB NAME#
          DB$UPRT(CHECKSUM,LNELNG);                        # CHECKSUM#
          DB$UPRT(SUBSCDTETME,LNELNG);                     # DATE/TIM#
          SSPTR = SSPTR + DFCSTSSEN;
        END 
 #
      GENERATE AND WRITE SUMMARY FOR SCHEMA LINE. 
 #
      DB$UPRT(SKIP1LNE,10); 
      P<MDSCENTRY> = SCDRBP +1; 
      C<16,30>SCHSUM[0] = MDSCNAME[SCHDIRP];
      DB$UENL(4); 
      DB$UPRT(SCHSUMM,LNELNG);
  
 #
      GENERATE AND WRITE NUMBER OF VERSIONS LINE. 
 #
      C<30,10>VRNUM[0] = DB$CDEB(VERSCNT,10); 
      DB$UPRT(VERSIONUM,LNELNG);
 #
      GENERATE AND WRITE NUMBER OF AREA LINE. 
 #
      C<30,10>ARNUM[0] = DB$CDEB(AREACNT,10); 
      DB$UPRT(AREANUM,LNELNG);
 #
      WRITE OUT NUMBER OF RELATIONS LINE
 #
      C<30,10>RELNUM[0] = DB$CDEB(RELCNT,10); 
      DB$UPRT (RELTNNUM,LNELNG);
 #
      GENERATE AND WRITE NUMBER OF SUBSCHEMAS.
 #
      C<30,10>SSNUM[0] = DB$CDEB(CSTDCNT,10); 
      DB$UPRT(SUBSCHNUM,LNELNG);
      DB$UPRT(SKIP2LNE,10); 
 #
      INCREMENT THE COUNTERS FOR THE TOTAL SUMMARY. 
 #
      TOTALSS = TOTALSS + CSTDCNT;
      TOTALRL = TOTALRL + RELCNT; 
      TOTALAR = TOTALAR + AREACNT;
      TOTALVR = TOTALVR + VERSCNT;     # ACCUMULATE NUMBER OF VERSIONS #
 #
      SHRINK TABLES TO ONE WORD BLOCKS. 
 #
      DB$USHR(LOC(ARDIRBP));
      DB$USHR(LOC(CSTDIRBP)); 
      DB$USHR(LOC(MDCHKSMBP));
      DB$USHR(LOC(VERDIRBP)); 
      DB$USHR(LOC(VERINFBP)); 
    END 
  TERM; 
