soccer jersey forums.silverfrost.com :: View topic - DIRENT@ problem on FTN 8.95.0
forums.silverfrost.com Forum Index forums.silverfrost.com
Welcome to the Silverfrost forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

DIRENT@ problem on FTN 8.95.0

 
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> Support
View previous topic :: View next topic  
Author Message
patrickm



Joined: 21 Jul 2023
Posts: 3

PostPosted: Fri Jul 21, 2023 4:43 pm    Post subject: DIRENT@ problem on FTN 8.95.0 Reply with quote

The example program from the manual:

PROGRAM DIRENT
CHARACTER (LEN=20)::PAT,FILE
INTEGER (KIND=2)::ATTR,DATE,TIME,EC
INTEGER (KIND=3)::SIZE
CALL COUA@('Input directory pattern:')
READ '(A)',PAT
EC=0
DO WHILE(EC == 0)
CALL DIRENT@(PAT,0,FILE,ATTR,DATE,TIME,SIZE,EC)
IF (EC == 0) PRINT '(A,I6,I6,I6,I6)',FILE, ATTR, DATE, TIME, SIZE
!Do not call DIRENT@(PAT2,...) from here
END DO
END PROGRAM DIRENT

Does not work for either x64 or Win32

For x64 I get DIRENT@ is an undefined symbol during linking.
For Win32 the program links OK, but on running there is an error:
In DIRENT@ - dummied out at present
Back to top
View user's profile Send private message
DanRRight



Joined: 10 Mar 2008
Posts: 2833
Location: South Pole, Antarctica

PostPosted: Fri Jul 21, 2023 8:16 pm    Post subject: Reply with quote

Use get_filtered_file@

Extracted from the code :
Code:

title = 'Select File'
path = '.'
file_name = 'a.rtg'
filter_names(1) = 'RTG files'
filters(1) = '*.rtg'
filter_names(2) = 'All files'
filters(2) = '*.*'
number_of_filters = 2
must_exist = .true.

call get_filtered_file@(title, file_name, path, filter_names, filters, number_of_filters, must_exist)

file_nameRTGsel    = file_name



Last edited by DanRRight on Sat Jul 22, 2023 8:40 pm; edited 1 time in total
Back to top
View user's profile Send private message
PaulLaidler
Site Admin


Joined: 21 Feb 2005
Posts: 7935
Location: Salford, UK

PostPosted: Sat Jul 22, 2023 7:54 am    Post subject: Reply with quote

The routine to use is FILES@.

It looks like DIRENT@ is an FTN77 routine that should not be in the FTN95 documentation.
Back to top
View user's profile Send private message AIM Address
JohnCampbell



Joined: 16 Feb 2006
Posts: 2560
Location: Sydney

PostPosted: Sat Jul 22, 2023 8:01 am    Post subject: Reply with quote

Hopefully this post of using files8@ answers some questions
Code:
PROGRAM DIRENT_test

! SUBROUTINE FILES@(PAT, N, NMAX, FILES, ATTR, DATE, TIME, FILE_SIZE)
  integer*2, parameter :: nmax = 1024
  CHARACTER (LEN=128) PAT,FILES(NMAX)
  INTEGER (KIND=2) N, i
  INTEGER (KIND=2) ATTR(NMAX), DATE(NMAX), TIME(NMAX)
!  INTEGER (KIND=3) FSIZE(NMAX)
  REAL    (KIND=2) FSIZE(NMAX)
  integer (KIND=4) jsize
  character :: cattr*6, cdate*10, ctime*8

  CALL COUA@('Input directory pattern:')
  READ '(A)',PAT

  call FILES8@ (PAT, N, NMAX, FILES, ATTR, DATE, TIME, FSIZE)

  DO i = 1,n
    cattr = attr_string (attr(i))
    cdate = date_string (date(i))
    ctime = time_string (time(i))
    jsize = fsize(i)
    write (*,11) i, cattr, cdate, ctime, jsize, trim(FILES(i))
  END DO
  write (*,*) n, ' files located for ', trim(pat)
 11 format (i4, a8, a12, a9, i13, 2x, A)
 
  contains
 
  character*10 function date_string (dos_date)
! http://forums.silverfrost.com/viewtopic.php?t=210&highlight=compressed+date
    character*10 string
    integer*2 dos_date
    integer   date_day, date_month, date_year
    date_day   = ibits(dos_date, 0, 5)
    date_month = ibits(dos_date, 5, 4)
    date_year  = ibits(dos_date, 9, 7) + 1980
    write ( string,fmt="(i2,'/',i2.2,'/',i4)" ) date_day, date_month, date_year
    date_string = string
  end function date_string

  character*8 function time_string (dos_time)
    character*8 string
    integer*2 dos_time
    integer time_second, time_minute, time_hour
    time_second = ibits(dos_time,  0, 5)*2
    time_minute = ibits(dos_time,  5, 6)
    time_hour   = ibits(dos_time, 11, 5)
    write ( string,fmt="(i2,':',i2.2,':',i2.2)" ) time_hour, time_minute, time_second
    time_string = string
  end function time_string

  character*6 function attr_string ( dos_attr )
    use msw32prm
!  http://forums.silverfrost.com/viewtopic.php?t=211&highlight=file+attributes

    character*6 string
    integer*2 dos_attr
    string = ' '
    if (iand(dos_attr, FILE_ATTRIBUTE_DIRECTORY) > 0) string = trim(string) // 'D'  ! " directory"  16
    if (iand(dos_attr, FILE_ATTRIBUTE_HIDDEN)    > 0) string = trim(string) // 'H'  ! " hidden"      2
    if (iand(dos_attr, FILE_ATTRIBUTE_NORMAL)    > 0) string = trim(string) // 'N'  ! " normal"    128
    if (iand(dos_attr, FILE_ATTRIBUTE_READONLY)  > 0) string = trim(string) // 'R'  ! " read only"   1
    if (iand(dos_attr, FILE_ATTRIBUTE_ARCHIVE)   > 0) string = trim(string) // 'A'  ! " archive"    32
    if (iand(dos_attr, FILE_ATTRIBUTE_SYSTEM)    > 0) string = trim(string) // 'S'  ! " system"      4
    if (iand(dos_attr, FILE_ATTRIBUTE_TEMPORARY) > 0) string = trim(string) // 'T'  ! " temporary" 256
    attr_string = string
  end function attr_string

END PROGRAM DIRENT_test
Back to top
View user's profile Send private message
JohnCampbell



Joined: 16 Feb 2006
Posts: 2560
Location: Sydney

PostPosted: Sat Jul 22, 2023 8:20 am    Post subject: Reply with quote

FILES8@ is very useful but a bit quirky, as it supports up to nmax = 2^31-1 files. (Presumably DOS file system is the same)

I have used character (len=256) files(nmax), although larger might be supported, check DOS FILE name limit ?

Not sure why FILES8@ is real*8 size ?

Once you get the hang of pat options, you can scan the whole disk, subject to Windows security restrictions. If a file has a directory attribute, you can then recursively search that tree and off you go.

I use it to search a disk and list all files, eg modified since a certain date.
Note time is given in UTC, which can be difficult to update to local time, especially if the file date/time is near midnight on 1-Jan or worse midnight on 1-Mar
Back to top
View user's profile Send private message
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2390
Location: Yateley, Hants, UK

PostPosted: Sun Jul 23, 2023 11:18 am    Post subject: Reply with quote

Wouldn't it be a great idea if someone went through the documentation for the old FTN77 libraries, identifying which routines still work, which ones don't work, and which ones have been superceded?

Eddie
Back to top
View user's profile Send private message
PaulLaidler
Site Admin


Joined: 21 Feb 2005
Posts: 7935
Location: Salford, UK

PostPosted: Mon Jul 24, 2023 7:20 am    Post subject: Reply with quote

Eddie

I think that DIRENT is exceptional. It is in the export table for salflibc.dll so it was assumed that it had been ported to FTN95 and therefore included in the documentation. It was never implement because FILES@ (or FILES8@) is better.

The documentation is intended to include all relevant routines. Possible exceptions are routines like RS (right shift) that ought to be replaced by Standard Fortran 90 routines and low level routines like LOC and CORE4.
Back to top
View user's profile Send private message AIM Address
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2390
Location: Yateley, Hants, UK

PostPosted: Mon Jul 24, 2023 9:21 am    Post subject: Reply with quote

Hi Paul,

Well, that is (or are) maybe the ones that don't work. What I also suspect is that there are many useful routines in the support for FTN77. Not everyone knows about FTN77, or even that its documentation is online.

Eddie
Back to top
View user's profile Send private message
patrickm



Joined: 21 Jul 2023
Posts: 3

PostPosted: Mon Jul 24, 2023 5:33 pm    Post subject: Reply with quote

Thank you for the suggestions. I have rewritten my program, different from the manual example, to use FILES@, and everything is working now.

Patrick
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> Support All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group