*DECK     NVFVFSD 
USETEXT    TEXTNVF
USETEXT    TEXTSS 
USETEXT    TXTANVF
USETEXT    TXVCBNV
PROC NVFVFSD; 
#     TITLE NVFVFSD - FILTER SERIAL-SEARCH DATA BLOCK.                 #
  
      BEGIN    # NVFVFSD #
# 
**    NVFVFSD - FILTER SERIAL-SEARCH DATA BLOCK.
* 
*     A. LIM.    82/04/21.
*     C. BRION   83/05/10.
* 
*     THIS PROCEDURE-S MAIN FUNCTION IS TO FILTER THE DATA BLOCK
*     (RETURNING FROM READING THE VCB FILE) ACCORDING TO A GIVEN
*     SET OF VALUES IN ACTIVE-VCB-SERIAL-SEARCH TABLE *AVST*. 
*     IT IS CALLED INTO EXECTION BY:    *NVFVDCD* 
* 
*     ENTRY    VCB DATA BLOCK IN *VCBWSA* DEFINED IN *TXVCBNV*. 
*              THE ORIGINAL VCB SERIAL-SEARCH REQUEST WITH ADDITIONAL 
*              INFORMATIONS IN *AVST*.
* 
*     EXIT     VCB DATA BLOCK FILTERED AND ENTRY(IES) MADE INTO VCB 
*              SERIAL-SEARCH DATA QUEUE *VCBSSQ*. 
*              VARIOUS FLAGS AND COUNT IN *AVST* GET UPDATED. 
*              IF NO MORE READ BLOCKS OUTSTANDING, INTERRUPT
*              CELL FOR *NVFVPSR* TRIGGERRED. 
* 
*     METHOD   DECREMENT READ-SS-COUNT IN *AVST*. 
*              FOR EACH VCB ENTRY IN THE VCB DATA BLOCK, IF IT MATCHES
*              A GIVEN SET OF VALUES, AN ENTRY IS MADE INTO *VCBSSQ*, 
*              AND IF SEARCH FOR A SINGLE ENTRY, THEN WE ARE DONE.
*              IF READ-SS-COUNT EQUAL ZERO (NO READ BLOCKS OUTSTANDING) 
*              INCREMENT INTERRUPT *INVPSR* TO TRIGGER *NVFVPSR*. 
# 
  
  
# 
****  PROC NVFVFSD XREF LIST
# 
      XREF
        BEGIN 
        PROC NVFURDS;        # REQUEST VCB DATA STATUS                 #
        PROC SSTAQE;         # SS- ACCEPT A QUEUE ENTRY                #
        END 
# 
****
# 
  
  
      ITEM DONE       B;     # LOOP EXIT VARIABLE                      #
      ITEM I          I;     # LOOP INDUCTION VARIABLE                 #
      ITEM STATIS     B;     # STATUS OF DATA IN VCB ENTRY             #
      ITEM VALUE      U;     # VALUE OF WORDP-TH WORD IN VCB ENTRY     #
      ITEM AORD       U;     # AST ORDINAL OF AST ENTRY                #
  
  
# 
**    TVENTRY - TEMPLATE FOR A VCB ENTRY IN A WORD ADDRESSABLE BASE.
* 
*     TVENTRY IS A BASED ARRAY FOR A VCB ENTRY THAT CAN BE ADDRESSED
*     IN A SINGLE WORD BASE.
# 
      BASED ARRAY TVENTRY[01:VBESIZ$] S(1); 
        BEGIN 
        ITEM TVE$WORD   U(00,00,60);   # FULL WORD REFERENCE           #
        END 
  
  
CONTROL EJECT;
  
      WCB$WORD[0] = 0;       # CLEAR WC WORD 0                         #
      WCB$WC[0] = VSSQSIZ$ + 2;    # PRESET COUNT TO VCBSSQ ENTRY SIZE #
      ABH$WORD[0] = 0;       # CLEAR ABH WORD 0 (IT IS IMMATERIAL)     #
      FOR I = 0 STEP 1 UNTIL NMSGBUF$/2 
      DO
        BEGIN                # CLEAR FIRST HALF OF MSGBUF              #
        MSG$WORD[I] = 0;
        END 
      P<TVCBSSQ> = LOC(MSGBUF[0]);  # PT VCB SS DATA TEMPLATE AT MSGBUF#
      AVS$RSSCNT[0] = AVS$RSSCNT[0] - 1;  # DECREMENT READ SS CNT      #
      IF NOT ((AVS$MTCHF[0] AND AVS$SGLEF[0]) OR ABORTCMDF) 
      THEN
        BEGIN                # NOT DONE SEARCH AND NO ABORT, FILTER BLK#
        DONE = FALSE; 
        FOR I = 1 STEP 1 WHILE     (I LQ VBMXENTRY$)
                               AND (NOT DONE) 
        DO
          BEGIN              # LOOP TIL ALL ENTRIES FILTERED OR DONE   #
          P<TVENTRY> = LOC(VCBWSA[I]); # SET PTR TO THIS I-TH ENTRY    #
          P<VCBBUF> = LOC(VCBWSA[I]); 
          NVFURDS(VCB$VCB[0],STATIS);  # DETERMINE STATUS OF DATA      #
          IF NOT STATIS 
          THEN               # IF VCB DATA IS O.K.                     #
            BEGIN 
            VALUE = TVE$WORD[AVS$WORDP[0]+1];#EXTRACT WD CONTAINS VALUE#
            VALUE = VALUE LAN AVS$MASK[0];  # MASK OFF VALUE           #
            IF VALUE EQ AVS$VALUE[0]
            THEN
              BEGIN          # ENTRY MATCH ON WHAT-S REQUESTED         #
              AVS$MTCHF[0] = TRUE;     # SET MATCH FLAG IN AVST        #
              P<VCBBUF> = LOC(VCBWSA[I]);# SET VCB ENTRY PTR           #
              TSS$TN[0] = VCB$TN[0];     # BUILD VCBSSQ ENTRY          #
              TSS$DT[0] = VCB$DT[0];
              TSS$SWAPAN[0] = VCB$SWAPAN[0];
              TSS$UWORD[0] = VCB$UWORD[0];
              TSS$LTIME[0] = VCB$CTIME[0];
              TSS$CATIME[0] = VCB$STIME[0]; 
              TSS$AACN[0] = VCB$AACN[0];
# 
*     USING THE APPLICATION NUMBER, LOCATE AST ENTRY FOR NAME.
# 
              FOR AORD=0 STEP 1 WHILE 
                ((AORD LS (ASTLNGTH/ASTSIZ$)) AND 
                (TSS$SWAPAN[0] NQ AST$AN[AORD]))
              DO
                BEGIN 
                END 
              TSS$SWAPNM[0] = AST$PANAM[AORD];
              SSTAQE(P<VCBSSQ>,WCBUF[0],ABHBUF[0],MSGBUF[0]); 
              IF AVS$SGLEF[0] 
              THEN
                BEGIN 
                DONE = TRUE; # SINGLE ENTRY AND MATCH, DONE            #
                END 
              END 
            END 
          END 
        END 
  
# 
*     HERE IF 1) DONE SERIAL SEARCH, OF 
*             2) ABORT  (HOP/BRK OR HOP/END), OR
*             3) DONE FILTER A DATA BLOCK.
# 
  
      IF AVS$RSSCNT[0] EQ 0 
      THEN
        BEGIN                # NO READ BLOCKS OUTSTANDING              #
        INVPSR = INVPSR + 1; # INCREMENT INTERRUPT TO TRIGGER *NVFVPSR*#
        END 
  
      END    # NVFVFSD #
  
TERM
