*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