*DECK DB$MDDF 
USETEXT UTMPTTX 
USETEXT MDDEFTX 
USETEXT MDBCMTX 
      PROC DB$MDDF((PFN),(UNID),(PACK));
  
      BEGIN 
 #
* *   DB$MDDF - DELETE ONE ENTRY FROM PFN TABLE  PAGE  1
* *   J. G. SERPA                                DATE  09/29/80 
* *   R. L. MCALLESTER - TABLE SEGMENTATION      DATE  07/30/84 
* 
* DC  PURPOSE 
* 
*     DELETE ONE PERMANENT FILE ENTRY FROM THE PFN TABLE. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
* 
# 
      ITEM PFN U;            # PERMANENT FILE NAME                     #
      ITEM UNID U;           # PERMANENT FILE USER NUMBER/ID           #
      ITEM PACK U;           # PERMANENT FILE PACK/SET/FAMILY          #
# 
* 
* DC  EXIT CONDITIONS 
* 
*     THE PERMANENT FILE IDENTIFIED BY (PFN, UNID, PACK) HAS BEEN 
*     DELETED FROM THE PFN TABLE. IF THE PF IS NOT FOUND (INTERNAL
*     MD ERROR) EXIT IS TO DB$MABT. 
* 
* DC  CALLING ROUTINES
* 
      DB$MDPR - REPLACE A PFN ENTRY 
*     DB$SR68 - DELETE A VERSION
*     DB$SR52 - CHANGE AREA TO SAME AS MASTER 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$MABT;           # ABORT MDU RUN                     #
      XREF FUNC DB$MDPS B;         # SEARCH PFN - TRUE IF NOT FOUND    #
      XREF PROC DB$UAWS;           # ADJUST WORK SPACE                 #
      XREF PROC DB$USDS;           # SHRINK DISK SEGMENT               #
# 
* 
* DC  NON LOCAL VARIABLES MODIFIED
* 
*     PFUNCT IS DECREMENTED BY ONE. 
* 
* DC  DESCRIPTION 
* 
*     SEARCH THE PFN TABLE FOR AN ENTRY THAT MATCHES PFN, UNID AND PACK.
*     IF IT IS FOUND, DELETE BY WRITING OVER IT WITH SUCCEEDING ENTRIES 
*     IN THE TABLE, AND RETURN TO THE CALLING ROUTINE.
* 
*     IF THE ENTRY THAT IS FOUND HAPPENS TO BE ON A DISK RESIDENT 
*     SEGMENT, THEN IT IS ONLY THAT SEGMENT THAT IS SHORTENED.
 #
  
#     LOCAL ITEMS                                                      #
  
      ITEM XL;                     # INDEX VARIABLE LIMIT              #
      ITEM XS;                     # SAVE INDEX VARIABLE               #
      ITEM XX;                     # INDEX VARIABLE                    #
  
      BASED ARRAY PFNTABLE[0:0] S(1); 
        BEGIN 
*CALL MDPFNDCLS                    PFN TABLE
        END 
  
*CALL MDABTDCLS 
  
  
  
  
#     B E G I N  E X E C U T A B L E  C O D E  F O R  D B $ M D D F    #
  
  
                             # DB$MDPS SEARCHES FOR THE SPECIFIED PFN  #
                             #  IF NOT FOUND, "FALSE" IS RETURNED.     #
  
                             #  IF FOUND, "TRUE" IS RETURNED,          #
                             #  THE SEGMENT CONTAINING IT IS LOADED    #
                             #  AND XX IS A SUBSCRIPT POINTING TO IT.  #
  
      IF NOT DB$MDPS(XX,PFN,UNID,PACK)  # IF NOT FOUND                 #
      THEN                              # ABORT DBMSTRD                #
        BEGIN 
        DB$MABT(DFPFNTAB,PFN);
        END 
  
      P<TLC> = B<42,18>PFUNCBBP;   # POSITION PFN TABLE                #
      P<PFNTABLE> = LOC(TLC) + TLCHLEN[0] + DFMDPFNHD;
      TLCDSWL[0] = TLCDSWL[0] - DFPFUNENT;
      PFUNCNT = PFUNCNT - 1;
  
                             # MOVE IN THE FOLLOWING ENTRIES TO        #
                             # SQUEEZE OUT THE DELETED ENTRY.          #
      XL = TLCDSWL[0] - DFPFUNENT;
      XS = XX;
      FOR XX = XX STEP DFPFUNENT UNTIL XL 
      DO
        BEGIN 
        MDPFN1WRD[XX] = MDPFN1WRD[XX+DFPFUNENT];
        MDPFN2WRD[XX] = MDPFN2WRD[XX+DFPFUNENT];
        MDPFN3WRD[XX] = MDPFN3WRD[XX+DFPFUNENT];
        END 
  
      IF TLCHLEN[0] GR DFTLCHL
      THEN
        BEGIN                # THE PFN IS DISK RESIDENT                #
        XX = TLCDSOR[0];
        TLCDSMF[0] = TRUE;   # SET THE SEGMENT MODIFIED FLAG           #
        TLCSLEN[XX] = TLCDSWL[0]; 
        DB$USDS(PFUNCBBP,XX);      # SHRINK THE DISK SEGMENT           #
        END 
      ELSE
        BEGIN                # THE PFN IS CENTRAL MEMORY RESIDENT.     #
        DB$UAWS(LOC(PFUNCBBP),-DFPFUNENT);
        END 
      END 
      TERM
