.TITLE GETSIZ .IDENT /V01/ .SBTTL DESCRIPTION ; ; ; COMPONENT: GETSIZ ; ; DATE: 31-OCT-79 ; ; AUTHOR: GR JOHNSON ; BATTELLE NORTHWEST ; P O BOX 999 ; RICHLAND WA 99352 ; ; SOURCE: MACRO-11 ; ; CALLER: FORTRAN IV-PLUS ; ; CALLING SEQUENCE: ; ; IBLKS = GETSIZ(LUN,FILSPEC,[ISW]) ; ; IBLKS = INTEGER OR INTEGER*4 VARIABLE TO RECEIVE THE TOTAL ; NUMBER OF BLOCKS ALLOCATED TO THE SPECIFIED FILE(S). ; ; LUN = INTEGER CONTAINING THE LOGICAL UNIT NUMBER TO BE ; USED BY GETSIZ. ; ; FILSPEC = VARIABLE, ARRAY, OR LITERAL SPECIFYING THE ; FILE(S) TO BE SCANNED. THE FILE SPECIFICATION ; MAY CONTAIN "WILD-CARD" SPECIFIERS. ; ; ISW = VARIABLE TO RECEIVE THE INTEGER STATUS WORD. ; ; 00 = SUCCESS. FILE NOT FOUND. ; ; +NN = SUCCESS. NN FILES FOUND. ; ; -01 = ILLEGAL FILE SPECIFICATION ; -26 = DIRECTORY FILE NOT FOUND ; -34 = LUN ALREADY IN USE ; -52 = WILD CARD DIRECTORY NOT ALLOWED ; -96 = INVALID LOGICAL UNIT NUMBER ; ; -NN = OTHER FCS ERROR CODE ; ; ; RESTRICTIONS: ; ; "GETSIZ" MUST BE DECLARED TYPE INTEGER OR INTEGER*4. ; ; ; DESCRIPTION: ; ; "GETSIZ" RETURNS THE TOTAL NUMBER OF BLOCKS ALLOCATED TO THE ; SPECIFIED FILE(S). THE FILE SPECIFICATION MAY INCLUDE "WILD-CARD" ; SPECIFIERS. THE NUMBER OF FILES ACTUALLY SCANNED IS OPTIONALLY RETURNED ; IN THE INTEGER STATUS WORD. ; ; EXAMPLE: ; ; INTEGER*4 GETSIZ,IBLKS ; ; IBLKS = GETSIZ(1,'[1,1]*.*;*',ISW) ; ; .SBTTL SYMBOL DEFINITIONS ; ; ; .PSECT ; .MCALL CSI$,CSI$1,CSI$2 ; .MCALL OTSWA,$AOTS,FBLOCK ; IN [11,40]F4P.MAC .MCALL QIOW$S ; ; CSI$ ; DEFINE CSI OFFSETS OTSWA ; DEFINE OTS OFFSETS FBLOCK ; DEFINE FDB AND FFDB OFFSETS AND BITS ; NB.SDD = NB.SD1!NB.SD2 ; N.STAT "WILD-CARD DIRECTORY" NB.SFN = NB.SNM!NB.STP!NB.SVR ; N.STAT "WILD-CARD FILENAME" ; CSIB: .BLKB C.SIZE ; CSI BLOCK ; RATST: .WORD 0,0 ; QIO IO.RAT STATUS BLOCK ; RATCB: .BYTE -9. ; QIO IO.RAT CONTROL BLOCK .BYTE 10. ; .WORD STBLK ; .BLKW 3 ; ; STBLK: .BLKB 10. ; STATISTICS BLOCK ; BLKSA: .BLKW 2 ; BLOCKS ALLOCATED ; .EVEN ; ; .SBTTL ENTRY POINT -- ACCUMULATE FILE STATISTICS ; ; ; GETSIZ:: ; ; CLR BLKSA ; CLEAR BLOCK COUNT CLR BLKSA+2 ; ; ; SCAN FOR FILESPEC STRING LENGTH MOV 4(R5),R1 ; STRING ADDRESS TO R1 CLR R2 ; CLEAR CHARACTER COUNT 2$: TSTB (R1)+ ; END-OF-STRING? BEQ 4$ ; YES, BRANCH FROM SCAN INC R2 ; NO, INCREMENT CHARACTER COUNT BR 2$ ; AND CONTINUE TO SCAN ; ; VALIDATE AND PARSE FILESPEC 4$: MOV #CSIB,R0 ; CSI BLOCK ADDRESS TO R0 MOV 4(R5),R1 ; STRING ADDRESS TO R1 CSI$1 R0,R1,R2 ; CHECK FILE SPECIFICATION SYNTAX BCS IEBAD ; RETURN ON ERROR CSI$2 R0,OUTPUT ; PARSE FILE SPECIFICATION ; ; TEST LUN / FETCH FDB ADDRESS MOV @2(R5),R2 ; LOGICAL UNIT NUMBER TO R2 BLT IEILU ; RETURN ON ERROR $AOTS ; ADDRESS OF IMPURE OTS SECTION TO R3 CMP W.LUNS(R3),R2 ; COMPARE LUN TO TKB OPTION BLT IEILU ; RETURN ON ERROR CALL $FCHNL ; ADDRESS OF LUN'S FFDB TO R0 BIT #DV.OPN,D.STAT(R0) ; LUN OPEN? BNE IEALN ; YES, RETURN ON ERROR ADD #D.FDB,R0 ; ADDRESS OF LUN'S FDB TO R0 ; ; INITIALIZE LUN'S FNB MOV R0,R1 ; ADDRESS OF LUN'S FDB TO R1 ADD #F.FNB,R1 ; ADDRESS OF LUN'S FNB TO R1 MOV #CSIB+C.DSDS,R2 ; ADDRESS OF DSD TO R2 CLR R3 ; NO DEFAULT FNB CALL .PARSE ; INITIALIZE BCS ERR ; BRANCH ON ERROR ; BITB #CS.NMF,CSIB+C.STAT ; FILENAME SPECIFIED? BNE .+10 ; YES, BRANCH AHEAD BIS #NB.SFN,N.STAT(R1) ; NO, FORCE *.*;* ; ; "FIND" (NEXT) FILE CLR R4 ; CLEAR FILE COUNT NEXT: CALL .FIND ; FETCH FID AND N.NEXT VALUES BCS SUC ; FILE NOT FOUND, RETURN TO CALLER ; ; READ FILE ATTRIBUTES (QIO IO.RAT) QIOW$S #IO.RAT,@2(R5),@2(R5),,#RATST,, ; TSTB RATST ; OPERATION SUCCESSFUL? BLT 2$ ; READ ATTRIBUTES ERROR, BRANCH AHEAD ; ADD STBLK+6,BLKSA ; ACCUMULATE BLOCK TOTALS ADC BLKSA+2 ; ADD STBLK+4,BLKSA+2 ; INC R4 ; INCREMENT FILE COUNT ; 2$: BIT #NB.SFN,N.STAT(R1) ; WILD-CARDS? BNE NEXT ; YES, NEXT FILE ; .SBTTL PROCESS ERRORS AND RETURN TO CALLER ; ; ; SUC: BR RTN ; RETURN WITH ISW = # FILES FOUND ; IEBAD: MOV #IE.BAD,R4 ; FILE SPECIFICATION ERROR BR RTN ; IEILU: MOV #IE.ILU,R4 ; INVALID LUN BR RTN ; IEALN: MOV #IE.ALN,R4 ; LUN ALREADY IN USE BR RTN ; ERR: MOVB F.ERR(R0),R4 ; MISC. ERRORS ; ; RTN: CMPB #3,(R5) ; FOUR ARGUMENTS? BGT 2$ ; NO, RETURN TO CALLER TST 6(R5) ; NULL ARGUMENT? BLT 2$ ; YES, RETURN TO CALLER MOV R4,@6(R5) ; NO, RETURN STATUS 2$: MOV BLKSA,R0 ; LOW ORDER BLOCK COUNT MOV BLKSA+2,R1 ; HIGH ORDER BLOCK COUNT RTS PC ; RETURN TO CALLER .END ;