*DECK     DB$DSFA 
USETEXT CDCSCTX 
      PROC DB$DSFA(AREAFOUND,NUMOFVERS);
      BEGIN 
 #
* *   DB$DSFA -- FIND AREA NAME OR ID            PAGE  1
* *   A W ALLEN                                  DATE  10/19/79 
* *   M. E. STERMER                              DATE  11/19/80 
* 
* DC  PURPOSE 
* 
*     FIND AREA NAME GIVEN ITS ID, OR FIND AREA ID GIVEN ITS NAME.
*     DETERMINE THE NUMBER OF VERSIONS FOR THIS AREA. 
* 
* DC  ENTRY CONDITIONS
* 
*     DB$DSAI - CONTAINS AREA ID, ELSE ZERO.
*     DB$DSAN - CONTAINS AREA NAME, ELSE BLANKS.
*       (ID OR NAME WILL BE SPECIFIED, BUT NOT BOTH)
*     SALX    - ADDRESS OF SCHEMA ENTRY IN SCHEMA ACCESS LIST.
* 
*     PARAMETER 
# 
      ITEM AREAFOUND B;      # OUTPUT PARAMETER, TRUE IF AREA FOUND    #
      ITEM NUMOFVERS I;      # NUMBER OF VERSIONS SHARE THIS AREA      #
# 
* DC  EXIT CONDITIONS 
* 
*     NORMAL EXIT (AREA FOUND)
*       DB$DSAI   = AREA ID 
*       DB$DSAN   = AREA NAME 
*       AREAFOUND = TRUE
*       NUMOFVERS = MDADNPFN[0] 
* 
*     ABNORMAL EXIT (AREA NOT FOUND)
*       DB$DSAI   = SAME AS ENTRY VALUE 
*       DB$DSAN   = SAME AS ENTRY VALUE 
*       AREAFOUND = FALSE 
*       NUMOFVERS = 0 
* 
* DC  CALLING ROUTINES
* 
*     DB$DSNI - FROM DB$DS19, VALIDATION OF SC AND AR PARAMETERS. 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # GENERATE FLOW POINT                     #
      XREF PROC DB$MDER;     # ROUTINE FOR MASTER DIRECTORY I/O ERROR  #
      XREF PROC DB$WGET;     # WORD ADDRESSABLE READ (FOR MASTER       #
                             # DIRECTORY ACCESS)                       #
# 
* DC  DESCRIPTION 
* 
*     1. READ AN AREA DIRECTORY ENTRY FROM THE MASTER DIRECTORY.
*        SAL CONTAINS WORD ADDRESS OF THE SCHEMA'S AREA DIRECTORY ON
*        THE MASTER DIRECTORY.
*     2. IF AREA NAME IS SPECIFIED
*          THEN COMPARE AREA NAMES, SET AREA ID IF FOUND. 
*     3. IF AREA ID IS SPECIFIED
*          THEN COMPARE AREA ID'S, SET AREA NAME IF FOUND.
*     4. REPEAT FROM 1 UNTIL AREA IS FOUND OR UNTIL ALL AREA ENTRIES
*        HAVE BEEN TESTED (FOR THIS SCHEMA).
*     5. RETURN.
* 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
*       SALX     = ADDRESS OF SAL ENTRY 
*       SASCWAAD = WORD ADDRESS OF AREA DIRECTORY ON MD FILE
*       SASCADSZ = NUMBER OF WORDS IN AREA DIRECTORY
# 
      XREF ITEM DB$DSAI I;             # AREA ID                       #
      XREF ITEM DB$DSAN C(30);         # AREA NAME                     #
      XREF ARRAY DB$FTMD ;;            # MASTER DIRECTORY (MD) FIT     #
# 
* DC  LOCAL VARIABLES AND DEF'S 
# 
      ARRAY AREAENTRY [0] S(DFMDADEN); # SPACE FOR ONE AREA            #
                                       # DIRECTORY ENTRY               #
        BEGIN 
*CALL MDARDDCLS 
        END 
      ITEM I I;                        # LOOP INDEX                    #
# 
 #
      CONTROL EJECT;
  
  
#     E X E C U T A B L E   C O D E   F O R   D B $ D S F A            #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DSFA");
      CONTROL ENDIF;
  
        AREAFOUND = FALSE;
        NUMOFVERS = 0;
  
        FOR I = 1 STEP DFMDADEN        # FOR EACH AREA DIRECTORY ENTRY #
          WHILE (I LS SASCADSZ[SALX]) 
            AND NOT AREAFOUND 
        DO
          BEGIN                        # READ NEXT AREA ENTRY FROM MD  #
  
          CONTROL IFGR DFFLOP,0;
            DB$FLOP("DSFA-1");
          CONTROL ENDIF;
  
          DB$WGET(DB$FTMD,AREAENTRY[0],DFMDADEN,SASCWAAD[SALX] + I, 
                  DB$MDER); 
          IF DB$DSAI EQ 0              # IF NO AREA ID GIVEN           #
          THEN
            BEGIN 
            IF DB$DSAN EQ MDADARNM[0]  # THEN COMPARE NAMES            #
            THEN
              BEGIN 
              AREAFOUND = TRUE;        # AREA NAME FOUND               #
              DB$DSAI = MDADIDNT[0];   # SET AREA ID                   #
              NUMOFVERS = MDADNPFN[0]; # SET NUM OF VERSIONS THIS AREA #
              END 
            END 
          ELSE                         # NO AREA NAME IS GIVEN         #
            BEGIN 
            IF DB$DSAI EQ MDADIDNT[0]  # THEN COMPARE ID-S             #
            THEN
              BEGIN 
              AREAFOUND = TRUE;        # AREA ID FOUND                 #
              DB$DSAN = MDADARNM[0];   # SET AREA NAME                 #
              NUMOFVERS = MDADNPFN[0]; # SET NUM OF VERSIONS THIS AREA #
              END 
            END 
          END 
        RETURN; 
      END 
      TERM
