.TITLE LOCFIL ; ; FORTRAN CALLABLE ROUTINE TO LOCATE, DELETE OR UNLOCK FILES. ; WILL RETURN THE FILE ATTRIBUTES IF A BUFFER IS PROVIDED. ; THE PRIVLEDGED TASK FILHDR MUST BE INSTALLED PRIOR TO CALLING ; THE SUBROUTINE. ; ; WRITTEN JULY 1975 R B FRENCH THE BOEING COMPANY ; CONVERTED TO VERSION 6A NOVEMBER 1975 R B FRENCH ; ; CALLING SEQUENCES ; ; TO LOCATE A FILE ; IERR=LOCFIL(FNAME,[NCHAR],[BUFFER]) ; ; TO UNLOCK A FILE ; IERR=IUNLCK(FNAME,[NCHAR],[BUFFER]) ; ; TO DELETE A FILE ; IERR=IDELET(FNAME,[NCHAR]) ; ; FNAME = STRING CONTAINING THE FILENAME ; NCHAR = NUMBER OF CHARACTERS IN FNAME. IF NOT INPUT, OR ; IF A ZERO OR NULL ARGUMENT, FNAME MUST HAVE A ; ZERO BYTE TERMINATOR. ; BUFFER = 4-BYTE BUFFER FOR FILE ATTRIBUTES ; (F.RTYP,F.RATT AND F.RSIZ) ; IERR = ERROR RETURN INDICATOR ; <-1 FCP ERROR ; -1 SYNTAX ERROR IN FNAME ; 0 FILE FOUND (REQUEST DONE, IF UNLOCK OR DELETE) ; 1 FILE NOT FOUND ; 2 FILE NOT LOCKED (UNLOCK ONLY) ; 3 FILE LOCKED, BUT BEING ACCESSED (UNLOCK ONLY) ; .MCALL DIR$,VSDR$,SPND$S,VRCD$,QIOW$,WSIG$S IDELET::INCB BUF ;SET 1ST BYTE OF BUFFER IUNLCK::INCB BUF ;ACCORDING TO ENTRY POINT LOCFIL::CMPB #2,(R5) ;CHECK NUMBER OF ARGUMENTS BEQ 10$ ;TWO ARGUMENTS BGT 30$ ;ONLY ONE ARGUMENT MOVB #1,BUF+1 ;SET INDICATOR TO READ ATTRIBUTES 10$: TST 4(R5) ;CHECK NCHAR BLT 30$ ;BR IF NULL ARG ; MOV @4(R5),R0 ;NUMBER OF CHARACTERS IN R0 BEQ 30$ ;BRANCH IF ZERO MOV R0,BUF+2 ;PUT IT IN BUFFER MOV 2(R5),R1 ;FILENAME ADDRESS IN R1 MOV #BUF+4,R2 ;BUFFER ADDRESS IN R2 20$: MOVB (R1)+,(R2)+ ;MOVE FILENAME INTO BUFFER SOB R0,20$ BR 60$ ; 30$: MOV #30.,R0 ;MAX OF 30. CHARACTERS MOV 2(R5),R1 ;FILENAME ADDRESS IN R1 MOV #BUF+4,R2 ;BUFFER ADDRESS IN R2 40$: MOVB (R1)+,(R2)+ ;MOVE A BYTE BEQ 50$ ;BRANCH IF A ZERO BYTE SOB R0,40$ ;GET ANOTHER MOV #-1,R0 ;ERROR - NO ZERO TERMINATOR BR RETURN 50$: MOV #30.,R1 ;CALCULATE NUMBER OF BYTES SUB R0,R1 MOV R1,BUF+2 ;AND PUT NUMBER IN BUFFER ; 60$: MOVB BUF+1,FLAG ;SAVE FLAG FOR ATTRIBUTES MOV BUF+2,R0 ;PUT NUMBER OF BYTES IN R0 ADD #5,R0 ;ADD HEADER SIZE+1 ASR R0 ;CONVERT TO WORDS MOV R0,VSDR+S.DRBL ;AND PUT IN DPB MOV #3,VRCD+R.VDBL ;SET TO DEFAULT OF 3 WORDS CMP #"$N,BUF+4 ;THIS A USERNAME REQUEST? BNE 52$ ;BRANCH IF NOT MOV #6,VRCD+R.VDBL ;SET TO RECEIVE 6 WORDS. 52$: 61$: DIR$ #VSDR ;SEND THE BUFFER BCC 65$ ;BRANCH IF OK 62$: MOV 0,R0 ;ERROR!! - RETURN THE DSW BR RETURN 65$: DIR$ #VRCD ;RECEIVE THE DATA CMP #1,0 ;RECEIVED DATA? BEQ 70$ ;BRANCH IF DATA THERE WSIG$S ;WAIT FOR EVENT BR 65$ ;GO READ DATA 70$: MOV BUF+4,R0 ;RETURN IN R0 (FUNCTION TYPE RETURN) TST FLAG ;DATA DESIRED? BEQ RETURN ;IF NOT, RETURN MOV 6(R5),R1 ;ADDRESS FOR DATA IN R1 MOV BUF+6,(R1) ;PUT THE ATTRIBUTES IN THE BUFFER MOV BUF+10,2(R1) CMP #6,R.VDBL+VRCD ;SIX WORDS RECEIVED? BNE RETURN ;BRANCH IF NOT MOV BUF+12,4(R1) MOV BUF+14,6(R1) MOV BUF+16,10(R1) MOV BUF+20,12(R1) RETURN: CLR BUF ;CLEAR ENTRY POINT INDICATOR RTS PC BUF: .BLKB 34. FLAG: .WORD 0 VSDR: VSDR$ FILHDR,,,,,BUF,0 VRCD: VRCD$ FILHDR,BUF,3 .END