*DECK     XSAPPDL 
USETEXT NIPDEF
USETEXT PARAMS
USETEXT SWAPIN
 PRGM XSAPPDL;               # DELINK (NO ACB) SWAPIN ENTRY            #
  
 STARTIMS;
 #
*1DC  XSAPPDL 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        XSAPPDL             E. GEE              77/08/10 
* 
*     2. FUNCTIONAL DESCRIPTION.
*           DELINK ENTRY FROM (NO ACB) SWAPIN CHAIN 
* 
*     3. METHOD USED. 
*          IF ONLY ONE ENTRY IN SWAPIN CHAIN, CLEAR PTRS IN SWAPIN
*          ELSE UPDATE BACKWARD POINTER IN NEXT ENTRY AND 
*               UPDATE FORWARD POINTER IN PREVIOUS ENTRY
* 
*     4. ENTRY PARAMETERS.
*          PARAMS1           ADDRESS OF ENTRY TO DELINK 
* 
*     5. EXIT PARAMETERS. 
*          NONE 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        NIPDEF    OSSIZE    PARAMS    SWAPIN 
* 
*     7. ROUTINES AND OVERLAYS CALLED.
*          XTRACE            RECORD PROCEDURE CALLS 
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION.
* 
*        THIS PROGRAM IS A SECONDARY OVERLAY LOADED BY SUBROUTINE 
*        OVLCALL.  WHEN EXECUTION HAS COMPLETED, A JUMP IS MADE TO
*          LOCATION RJMAIN TO RETURN TO THE CALLING PROGRAM.
* 
*        W A R N I N G - THIS PROGRAM CANNOT EXCEED THE SECONDARY 
*CALL OSSIZE
* 
*        THIS OVERLAY IS CALLED BY XSAPPRC AND HAPFAIL. 
* 
 #
 STOPIMS; 
# 
                    EXTERNAL VARIABLES
# 
 XREF 
   BEGIN
   PROC XTRACE;              # RECORD PROCEDURE CALLS                  #
   LABEL RJMAIN;             # RETURN ADDRESS IN OVLCALL               #
   END
# 
                    INTERNAL VARIABLES
# 
 ITEM NEXT;                  # ADDR OF NEXT ENTRY IN SWAPIN CHAIN      #
 ITEM PREV;                  # ADDR OF PREVIOUS ENTRY IN SWAPIN CHAIN  #
 ITEM SENTRY;                # ADDR OF SWAPIN ENTRY TO DELETE          #
  
#**********************************************************************#
  
      BEGIN 
  
      CONTROL IFEQ DEBUG,1; 
        XTRACE("APPDL") ; 
      CONTROL FI; 
  
      SENTRY = PARAMS1;      # ADDR OF SWAPIN ENTRY TO DELETE          #
      P<SWPIE> = SENTRY;
      NEXT = SWPINFP[0];     # ADDR OF NEXT ENTRY IN SWAPIN CHAIN      #
      PREV = SWPINBP[0];     # ADDR OF PREVIOUS ENTRY IN SWAPIN CHAIN  #
# 
      CHECK IF ONLY ONE ENTRY IN SWAPIN CHAIN 
# 
      IF SWAPINFP EQ SWAPINBP 
      THEN                   # ONLY ONE ENTRY IN CHAIN                 #
        BEGIN 
        SWAPINFP = 0;        # ZERO SWAPIN CHAIN FORWARD PTR           #
        SWAPINBP = 0;        # ZERO SWAPIN CHAIN BACKWARD PTR          #
        END 
      ELSE                   # MORE THAN ONE ENTRY IN CHAIN SO DELINK  #
# 
      UPDATE BACKWARD PTR IN NEXT ENTRY 
# 
        BEGIN 
        IF NEXT EQ LOC(SWAPINFP)
        THEN                 # ENTRY TO DELETE IS LAST ONE IN CHAIN    #
          SWAPINBP = PREV;   # UPDATE SWAPIN BACKWARD PTR              #
        ELSE
          BEGIN 
          P<SWPIE> = NEXT;
          SWPINBP[0] = PREV; # UPDATE BACKWARD PTR OF NEXT ENTRY       #
          END 
# 
        UPDATE FORWARD POINTER IN PREVIOUS ENTRY
# 
        IF PREV EQ LOC(SWAPINBP)
        THEN                 # ENTRY TO DELETE IS FIRST ONE IN CHAIN   #
          SWAPINFP = NEXT;   # UPDATE SWAPIN FORWARD PTR               #
        ELSE
          BEGIN 
          P<SWPIE> = PREV;
          SWPINFP[0] = NEXT; # UPDATE FORWARD PTR OF PREVIOUS ENTRY    #
          END 
        END 
      GOTO RJMAIN;           # RETURN TO CALLING PROGRAM               #
      END 
TERM
