Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(string), | intent(in) | :: | self | The string. |
||
character(kind=CK,len=*), | intent(in), | optional | :: | sep | Directory separator. |
|
character(kind=CK,len=*), | intent(in), | optional | :: | extension | File extension. |
|
logical, | intent(in), | optional | :: | strip_last_extension | Flag to enable the stripping of last extension. |
Base file name.
Return the base file name of a string containing a file name.
Optionally, the extension is also stripped if provided or the last one if required, e.g.
type(string) :: astring astring = 'bar/foo.tar.bz2' print '(A)', astring%basename(extension='.tar.bz2')//'' ! print "foo" print '(A)', astring%basename(strip_last_extension=.true.)//'' ! print "foo.tar"
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
character(kind=CK,len=:), | public, | allocatable | :: | sep_ | Separator, default value. |
||
integer, | public | :: | pos | Character position. |
|||
character(kind=CK,len=:), | public, | allocatable | :: | temporary | Temporary storage, workaround for GNU bug. |
elemental function basename(self, sep, extension, strip_last_extension)
!---------------------------------------------------------------------------------------------------------------------------------
!< Return the base file name of a string containing a file name.
!<
!< Optionally, the extension is also stripped if provided or the last one if required, e.g.
!<
!<### Example
!<
!<```fortran
!< type(string) :: astring
!< astring = 'bar/foo.tar.bz2'
!< print '(A)', astring%basename(extension='.tar.bz2')//'' ! print "foo"
!< print '(A)', astring%basename(strip_last_extension=.true.)//'' ! print "foo.tar"
!<```
!---------------------------------------------------------------------------------------------------------------------------------
class(string), intent(in) :: self !< The string.
character(kind=CK, len=*), intent(in), optional :: sep !< Directory separator.
character(kind=CK, len=*), intent(in), optional :: extension !< File extension.
logical, intent(in), optional :: strip_last_extension !< Flag to enable the stripping of last extension.
type(string) :: basename !< Base file name.
character(kind=CK, len=:), allocatable :: sep_ !< Separator, default value.
integer :: pos !< Character position.
#ifdef __GFORTRAN__
character(kind=CK, len=:), allocatable :: temporary !< Temporary storage, workaround for GNU bug.
#endif
!---------------------------------------------------------------------------------------------------------------------------------
!---------------------------------------------------------------------------------------------------------------------------------
if (allocated(self%raw)) then
sep_ = UIX_DIR_SEP ; if (present(sep)) sep_ = sep
basename = self
#ifdef __GFORTRAN__
temporary = basename%raw
pos = index(temporary, sep_, back=.true.)
if (pos>0) basename%raw = temporary(pos+1:)
#else
pos = index(basename%raw, sep_, back=.true.)
if (pos>0) basename%raw = self%raw(pos+1:)
#endif
if (present(extension)) then
#ifdef __GFORTRAN__
temporary = basename%raw
pos = index(temporary, extension, back=.true.)
if (pos>0) basename%raw = temporary(1:pos-1)
#else
pos = index(basename%raw, extension, back=.true.)
if (pos>0) basename%raw = basename%raw(1:pos-1)
#endif
elseif (present(strip_last_extension)) then
if (strip_last_extension) then
#ifdef __GFORTRAN__
temporary = basename%raw
pos = index(temporary, '.', back=.true.)
basename%raw = temporary(1:pos-1)
#else
pos = index(basename%raw, '.', back=.true.)
basename%raw = basename%raw(1:pos-1)
#endif
endif
endif
endif
return
!---------------------------------------------------------------------------------------------------------------------------------
endfunction basename