*DECK DB$SR74 
USETEXT MDBCMTX 
USETEXT MD10CTX 
USETEXT UTMPTTX 
      PROC DB$SR74; 
      BEGIN 
 #
* *   DB$SR74 - IS THIS A NON-DUP CHANGE AREA    PAGE  1
* *   G. F. KENDALL                              DATE  08/10/79 
* 
* DC  PURPOSE 
* 
*     RETURN YES IF AREA HAS NOT ALREADY BEEN CHANGED, ELSE RETURN NO 
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     ARDIRBP - ADDRESS OF BLOCK HEADER WORD OF AREA DIRECTORY
*     AREACNT - NUMBER OF ENTRIES IN AREA DIRECTORY 
*     AREANAM - NAME OF THE AREA TO BE TESTED 
*     VERINFBP- ADDRESS OF VERSION INFORMATION TABLE
*     VERSORD - ORDINAL OF VERSION BEING REFERENCED 
* 
* DC  EXIT CONDITIONS 
* 
*     IF AREA HAS NOT BEEN CHANGED
*       AREAORD IS SET TO THE ORDINAL OF THE AREA TO BE CHANGED,
*       AREA CHANGED FLAG IS SET TO TRUE, 
*       AND RETURN IS TO DB$YES.
*     IF AREA HAS BEEN CHANGED, DIAGNOSTIC 152 IS ISSUED AND RETURN IS
*       TO DB$NO. 
*     IF AREA IS NOT FOUND, DIAGNOSTIC 141 IS ISSUED AND RETURN IS TO 
*       DB$NO.
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX - SYNTAX CRACKER
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$DIAG;     # ISSUE DIAGNOSTIC MESSAGE                #
      XREF PROC DB$NO;       # SYNTAX TABLE DRIVER NO RETURN           #
      XREF PROC DB$UAOS;     # ADJUST OFFSET FOR SWAPPED OUT SEGMENTS  #
      XREF PROC DB$YES;      # SYNTAX TABLE DRIVER YES RETURN          #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
# 
      BASED ARRAY MDARDIR S(DFMDADEN);  # AREA DIRECTORY               #
        BEGIN 
*CALL MDARDDCLS 
        END 
  
      BASED ARRAY VERINFO [0:0] S(DFMDVIEN);  # VERSION INFO TABLE     #
        BEGIN 
*CALL MDVITDCLS              VERSION INFORMATION TABLE
        END 
  
# 
* 
* DC  DESCRIPTION 
* 
*     ANSWERS THE QUESTION  IS THIS A NON-DUPLICATE CHANGE ON THIS AREA.
*     LOOKS THRU AREA DIRECTORY ENTRIES UNTIL AN ENTRY IS FOUND WITH THE
*     SAME NAME THAT-S IN AREANAM, OR UNTIL END OF TABLE IS REACHED.
*     IF A MATCH IS FOUND, HAS THIS AREA ALREADY BEEN CHANGED.
*       IF IT HAS, ISSUE A DIAGNOSTIC AND RETURN NO.
*       IF IT HAS NOT, RETURN YES.
*     IF NO MATCHING ENTRY WAS FOUND, ISSUE A DIAGNOSTIC AND RETURN NO. 
* 
 #
  
#     LOCAL VARIABLES                                                  #
  
      ITEM INDEX I;          # INDEX INTO AREA DIRECTORY               #
      ITEM OFFSET;           # OFFSET INTO VERSION INFORMATION TABLE   #
  
  
  
  
#     B E G I N   D B $ S R 7 4   E X E C U T A B L E   C O D E .      #
  
  
      P<MDARDIR> = ARDIRBP + 1 + DFMDADCW;
      P<TLC> = VERINFBP;
      OFFSET = (VERSORD - 1) * DFMDVIEN * AREACNT;
      DB$UAOS(OFFSET);
      P<VERINFO> = P<TLC> + TLCHLEN[0] + OFFSET;
      FOR INDEX = 0 STEP 1
        WHILE INDEX LS AREACNT
      DO
        BEGIN 
        IF MDADARNM[INDEX] EQ AREANAM 
        THEN                 # SEARCHED FOR AREA HAS BEEN FOUND        #
          BEGIN 
          AREAORD = INDEX + 1;     # STORE AREA ORDINAL                #
          IF MDVITARCHF[INDEX]     # IF AREA HAS ALREADY BEEN CHANGED  #
          THEN
            BEGIN 
            DB$DIAG(152,AREANAM);  # ISSUE DIAGNOSTIC                  #
            DB$NO;
            END 
          ELSE
            BEGIN 
            MDVITARCHF[INDEX] = TRUE;  # SET AREA HAS BEEN CHANGED FLAG#
            IF OFFSET LS TLCBSBW[0] 
              AND TLCHLEN[0] GR DFTLCHL 
            THEN
              BEGIN 
              TLCDSMF[0] = TRUE;   # SET DISK SEGMENT MODIFIED FLAG    #
              END 
            DB$YES; 
            END 
          END 
        END 
  
#     IF THIS CODE IS EXECUTED, THE SEARCHED FOR AREA WAS NOT FOUND    #
  
      DB$DIAG(141,AREANAM); 
      DB$NO;
      END   # DB$SR74  #
      TERM
