*DECK DB$SR75 
USETEXT MDBCMTX 
USETEXT MD10CTX 
USETEXT UTMPTTX 
      PROC DB$SR75; 
      BEGIN 
 #
* *   DB$SR75 - CLEAR ALL -AREA CHANGED- FLAGS   PAGE  1
* *   G. F. KENDALL                              DATE  08/10/79 
* *   R. L. MCALLESTER  - TABLE SEGMENTATION     DATE  05/30/84 
* 
* DC  PURPOSE 
* 
*     SET TO FALSE THE FLAG THAT INDICATES THIS AREA HAS BEEN SEEN IN A 
*     CHANGE CLAUSE, FOR ALL AREAS IN THIS SCHEMA.
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     AREACNT  - NUMBER OF ENTRIES IN THE AREA DIRECTORY
*     VERINFBP - ADDRESS OF THE BLOCK FOR VERSION INFORMATION 
*     VERSCNT  - NUMBER OF ENTRIES IN THE VERSION DIRECTORY 
* 
* DC  EXIT CONDITIONS 
* 
*     -AREA CHANGED- FLAGS FOR ALL AREAS IN THIS SCHEMA HAVE BEEN SET 
*     TO FALSE. 
*     RETURN TO DB$NO.
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX - SYNTAX CRACKER
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$NO;       # SYNTAX TABLE DRIVER NO RETURN           #
      XREF PROC DB$RNRD;     # RANDOM READ                             #
      XREF PROC DB$RNRW;     # RANDOM REWRITE                          #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
# 
      XREF ARRAY DB$RNFT;;         # FET FOR RANDOM I/O                #
  
      BASED ARRAY VERINFO [0:0] S(DFMDVIEN);  # VERSION INFO TABLE     #
        BEGIN 
*CALL MDVITDCLS              VERSION INFORMATION TABLE
        END 
# 
* 
* DC  DESCRIPTION 
* 
*     SET FLAGS TO INDICATE THAT ALL AREAS IN THIS SCHEMA HAVE NOT BEEN 
*     SEEN IN A CHANGE CLAUSE BEFORE WRITING AREA DIRECTORY TO NEW MD.
*     DONE SO THAT ALL AREAS START OFF UNCHANGED WHEN MD IS READ NEXT 
*     TIME BY MDU.
* 
 #
  
#     LOCAL VARIBLES                                                   #
  
      ITEM BUFLOC;                 # BUFFER LOCATION FOR I/O           #
      ITEM INDEX   I;              # INDEX INTO AREA DIRECTORY         #
      ITEM LENGTH;                 # LENGTH FOR RANDOM I/O             #
      ITEM LIMIT;                  # LIMIT OF -FOR- LOOP               #
      ITEM NEXTSEG;                # NEXT SEGMENT TO BE LOADED         #
      ITEM ORIGSEG;                # ORIGINAL SEGMENT                  #
      ITEM PITLENG I;              # LENGTH OF THE PIT                 #
      ITEM PRUNUM;                 # PRU NUMBER FOR RANDOM I/O         #
  
  
  
  
#     B E G I N   D B $ S R 7 5   E X E C U T A B L E   C O D E .      #
  
  
# 
*     CLEAR THE AREA CHANGED FLAGS IN THE VERSION INFORMATION TABLE 
*     (VIT).
# 
      P<TLC> = B<42,18>VERINFBP;
      P<VERINFO> = P<TLC> + TLCHLEN[0]; 
      LIMIT = (AREACNT * VERSCNT) -1; 
      ORIGSEG = TLCDSOR[0]; 
      FOR INDEX = 1 STEP 1 UNTIL LIMIT
      DO
        BEGIN 
        MDVITARCHF[0] = FALSE;
        P<VERINFO> = LOC(VERINFO) + DFMDVIEN; 
  
        IF ORIGSEG NQ 0           # IF THERE ARE ANY DISK SEGMENTS     #
          AND LOC(VERINFO) 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;
            END 
          IF NEXTSEG EQ ORIGSEG    # IF THE NEXT IS THE ORIGINAL       #
          THEN                     # ALL SEGMENTS HAVE BEEN DONE       #
            BEGIN                  # EXCEPT THE BUILD SEGMENT          #
            P<VERINFO> = LOC(TLC) + TLCHLEN[0] + TLCBSBW[0];
            ORIGSEG = 0;
            TEST INDEX;            # CONTINUE IN THE BUILD SEGMENT     #
  
            END 
                                   # SWAP IN THE NEXT SEGMENT          #
  
          BUFLOC = LOC(TLC) + TLCHLEN[0] + TLCDSBW[0];
          P<VERINFO> = BUFLOC;
  
                                   # REWRITE THE RESIDENT SEGMENT      #
          LENGTH = TLCSLEN[TLCDSOR[0]]; 
          PRUNUM = TLCSPRU[TLCDSOR[0]]; 
          TLCDSMF[0] = FALSE; 
          DB$RNRW(LOC(DB$RNFT),BUFLOC,LENGTH,PRUNUM); 
  
                                   # 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];
  
          TLCDSMF[0] = TRUE;       # DISK SEGMENT MODIFIED FLAG        #
          END 
        END 
# 
*     CLEAR THE AREA CHANGED FLAGS IN THE PERMANENT FILE INFORMATION
*     TABLE (PIT).
# 
      P<TLC> = B<42,18>PITBP; 
      P<PFINFO> = B<42,18>PITBP + TLCHLEN[0]; 
      PITLENG = MDPITTOTENT[0]; 
      P<PFINFO> = LOC(PFINFO) + DFPITHDR; 
      ORIGSEG = TLCDSOR[0]; 
      FOR INDEX = 1 STEP 1 UNTIL PITLENG
      DO
        BEGIN 
        MDPITCHGF[0] = FALSE; 
        P<PFINFO> = LOC(PFINFO) + DFMDPITEN;
  
        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;
            END 
          IF NEXTSEG EQ ORIGSEG    # IF THE NEXT IS THE ORIGINAL       #
          THEN                     # ALL SEGMENTS HAVE BEEN DONE       #
            BEGIN                  # EXCEPT THE BUILD SEGMENT          #
            P<PFINFO> = LOC(TLC) + TLCHLEN[0] + TLCBSBW[0]; 
            ORIGSEG = 0;
            TEST INDEX;            # CONTINUE IN THE BUILD SEGMENT     #
  
            END 
                                   # SWAP IN THE NEXT SEGMENT          #
  
          BUFLOC = LOC(TLC) + TLCHLEN[0] + TLCDSBW[0];
          P<PFINFO> = BUFLOC; 
  
                                   # REWRITE THE RESIDENT SEGMENT      #
          LENGTH = TLCSLEN[TLCDSOR[0]]; 
          PRUNUM = TLCSPRU[TLCDSOR[0]]; 
          TLCDSMF[0] = FALSE; 
          DB$RNRW(LOC(DB$RNFT),BUFLOC,LENGTH,PRUNUM); 
  
                                   # 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];
  
          TLCDSMF[0] = TRUE;       # DISK SEGMENT MODIFIED FLAG        #
          END 
        END 
      DB$NO;
  
      END   # DB$SR75 # 
      TERM
