*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 = 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 = LOC(VCBWSA[I]); # SET PTR TO THIS I-TH ENTRY # P = 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 = 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,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