HP OpenVMS Systemsask the wizard |
The Question is: How do I find the Creation/Revision Date/Time for files from within VMS Fortran. The information in Chapter 11 of the Compaq Fortran User Manual for Open VMS provides a start, but as always, the devil is in the detail. The Answer is :
Sample FORTRAN code for getting some RMS attributes
! The subroutine get_create_date_siz gets the RMS CDT, RDT, ALQ and EBK
! fields. You can consult SYS$LIBRARY:FORSYSDEF.TLB entry $XABDATDEF and
! $XABFHCDEF to find the field names of other fields, if you should ever
! need them.
program rms_test
! test program for get_create_date_siz
IMPLICIT NONE
character*80 filename
integer*2 leng
integer*4 cdat(2),rdat(2),status,get_create_date_size
integer*4 alq,siz
character*23 scdat,srdat
print '('' Enter filename: '',$)'
accept 10,filename
10 FORMAT(A80)
status=get_create_date_size(filename,cdat,rdat,alq,siz)
if(status) then
call sys$asctim (,scdat,cdat,)
call sys$asctim (,srdat,rdat,)
print *,filename
print *,' created ',scdat
print *,' revised ',srdat
print *,' ',siz,'/',alq,' blocks'
else
print *,'Error status='
filename=' '
call sys$getmsg (%val(status),leng,filename,,)
print *,filename(1:leng)
endif
end
options /extend_source
integer function get_create_date_size(filename,cdat,rdat,alq,siz)
implicit none
character*(*) filename
integer*4 cdat(2),rdat(2),alq,siz
include '($FABDEF)' ! RMS definitions from FORSYSDEF.TLB
include '($XABDEF)'
include '($XABDATDEF)'
include '($XABFHCDEF)'
include '($XABPRODEF)'
integer status,sys$open,sys$close ! RMS routines
record/fabdef/fab
! the following structure defines an XAB by overlaying the XABDEF, XABDATDEF
! and XABFHCDEF structures. This allows access to the XABDAT and XABFHC fields
! as well as the common XAB fields which are defined only in XABDEF.
STRUCTURE /fullxab/
UNION
MAP
record/xabdef/xab
END MAP
MAP
record/xabdatdef/xabdat
END MAP
MAP
record/xabfhcdef/xabfhc
END MAP
MAP
record/xabprodef1/xabpro
ENDMAP
END UNION
END STRUCTURE
RECORD /fullxab/datxab,fhcxab,proxab ! allocate 3 XABs
call lib$movc5(0,0,0,fab$c_bln,fab) ! Clear FAB
fab.fab$b_bln=fab$c_bln ! set FAB options (see RMS
fab.fab$b_bid=fab$c_bid ! manual for details)
fab.fab$b_fac=fab$m_get
fab.fab$b_shr=fab$m_shrdel+fab$m_shrget+fab$m_shrput+fab$m_shrUPD
fab.fab$l_fop=fab$m_SQO
fab.fab$l_fna=%loc(filename) ! set file name to open
fab.fab$b_fns=len(filename) ! and length of name
fab.fab$l_XAB = %loc(datxab) ! chain to XABDAT
call lib$movc5(0,0,0,XAB$C_DATLEN,datxab) ! Clear XAB as XABDAT
datxab.xab.xab$b_bln=XAB$C_DATLEN ! set length
datxab.xab.xab$b_cod=XAB$C_DAT ! fill as XABDAT
datxab.xab.xab$l_nxt=%LOC(fhcxab) ! chain to XABFHC
call lib$movc5(0,0,0,XAB$C_FHCLEN,fhcxab) ! Clear XAB as XABFHC
fhcxab.xab.xab$b_bln=XAB$C_FHCLEN ! set length
fhcxab.xab.xab$b_cod=XAB$C_FHC ! fill as XABFHC
fhcxab.xab.xab$l_nxt=%LOC(proxab) ! chain to XABFHC
call lib$movc5(0,0,0,XAB$C_PROLEN,proxab) ! Clear XAB as XABPRO
proxab.xab.xab$b_bln=XAB$C_PROLEN ! set length
proxab.xab.xab$b_cod=XAB$C_PRO ! fill as XABPRO
status=sys$open(fab)
if(status) then
CALL lib$movc3(8,datxab.xab.xab$q_rdt,rdat) ! get revision date
CALL lib$movc3(8,datxab.xabdat.xab$q_cdt,cdat)! get creation date
alq=fab.fab$l_alq ! get allocated size
siz=fhcxab.xabfhc.xab$l_ebk ! get used size (=EOF block)
status=sys$close(fab) ! close file
endif
get_create_date_size=status ! return RMS status
return
end
|