C Purpose :get file name from known File-ID (f,s,v) C OPTIONS /EXTEND_SOURCE CDEC$ NOFREEFORM CDEC$ FIXEDFORMLINESIZE:132 PROGRAM FID2NAME C C========================================= C C Purpose :get file name from known File-ID (f,s,v) C Inputs : DCL foreign command line C FID2NAME/SYMBOL=symbol disk/FID=(f,s,v) C default disk is SYS$DISK: C default symbol is FILE_NAME C C Copyright (C) 2006 Joseph Huber (huber AT mppmu.mpg.de) C This program is free software; you can redistribute it and/or modify C it under the terms of the GNU General Public License as published by C the Free Software Foundation; either version 2 of the License, or C (at your option) any later version. C This program is distributed in the hope that it will be useful, C but WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C========================================= C + C C Update 2007-12-04: make it working for FID>32367 (24 bit numbers) C Declarations. C - IMPLICIT NONE integer fid2name_table !DEC$ if defined (VAX) external fid2name_table !older VAX Fortran !DEC$ else !DEC$ attributes extern :: fid2name_table !DEC$ endif ! include 'FID2NAME_COMMON.FOR' INCLUDE '($libdef)' INCLUDE '($SSdef)' INCLUDE '($STSDEF)' INCLUDE '($IOdef)' INCLUDE '(LIB$ROUTINES)' INCLUDE '(STR$ROUTINES)' INCLUDE '($CLIDEF)' INCLUDE '(CLI$routines)' INCLUDE '($FIDDEF)' CHARACTER*4096 name CHARACTER*48 disk CHARACTER*32 symbol INTEGER i,code,iostat,id INTEGER*2 chan,ll,lld,lln,lls record /FIDDEF/ FID integer iostat_to_status external iostat_to_status integer init_cli_for external init_cli_for integer sys$assign external CLI$_NEGATED C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C Entry Point. C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ll = 0 code = init_cli_for(fid2name_table,'FID2NAME') IF (.NOT.code) CALL exit(code) IF (cli$present('HELP')) THEN PRINT *,' FID2NAME[/SYMBOL=sym][/LOG] [disk:]/FID=(f,s,v)' PRINT *,' Puts the name of the file given by file-ID FID' PRINT *,' into DCL symbol specified by sym.' PRINT *,' Default symbol is FILE_NAME.' PRINT *,' Default disk is SYS$DISK: .' PRINT *,' /LOG: write resulting filespec to SYS$OUTPUT.' Call Exit(1) ENDIF disk='SYS$DISK:' IF (cli$present('P1')) THEN code=cli$get_value('P1',disk,lld) ENDIF call STR$TRIM(disk,disk,lld) symbol = 'FILE_NAME' IF (cli$present('SYMBOL')) THEN code=cli$get_value('SYMBOL',symbol,lls) ENDIF call STR$TRIM(symbol,symbol,lls) FID.FID$W_NUM=1 FID.FID$W_SEQ=1 FID.FID$B_NMX=0 FID.FID$B_RVN=0 IF (cli$present('FID')) THEN code=1 i=1 DO WHILE (code.AND.(i.LE.3)) code=cli$get_value('FID',name,ll) IF (code) THEN READ(name(1:ll),'(I)',err=8000,iostat=iostat) id IF (i .EQ. 1) THEN FID.FID$W_NUM=IAND(id,'FFFF'X) FID.FID$B_NMX=ISHFT(id,-16) ELSE IF (i .EQ. 2) FID.FID$W_SEQ=id IF (i .EQ. 3) FID.FID$B_RVN=id ENDIF ENDIF i=i+1 END DO ENDIF code = LIB$fid_to_name(disk,FID,name,lln) if (code) then code = lib$set_symbol(symbol(1:lls),name(1:lln)) i=CLI$PRESENT('LOG') IF (i.and.(i.ne.%LOC(CLI$_NEGATED))) then i = LIB$PUT_OUTPUT(name(1:lln)) endif endif CALL exit(code) 8000 Call exit(iostat_to_status(iostat)) END