stringtool_obj_RemoveExtension Function

private pure function stringtool_obj_RemoveExtension(filename) result(val)

Removes file extension from filename while preserving time in scientific notation and dots in paths.

Type Bound

stringtool_obj

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: filename

File name

Return Value character(len=:), allocatable

Returned string with extension removed


Called by

proc~~stringtool_obj_removeextension~~CalledByGraph proc~stringtool_obj_removeextension stringtool_obj%stringtool_obj_RemoveExtension proc~eulerian_set_readhdf5 eulerian_set%eulerian_set_ReadHDF5 proc~eulerian_set_readhdf5->proc~stringtool_obj_removeextension proc~eulerian_set_writehdf5 eulerian_set%eulerian_set_WriteHDF5 proc~eulerian_set_writehdf5->proc~stringtool_obj_removeextension proc~hdf5_obj_open hdf5_obj%hdf5_obj_Open proc~hdf5_obj_open->proc~stringtool_obj_removeextension proc~marker_set_readhdf5 marker_set%marker_set_ReadHDF5 proc~marker_set_readhdf5->proc~stringtool_obj_removeextension proc~marker_set_writehdf5 marker_set%marker_set_WriteHDF5 proc~marker_set_writehdf5->proc~stringtool_obj_removeextension proc~particle_set_readhdf5 particle_set%particle_set_ReadHDF5 proc~particle_set_readhdf5->proc~stringtool_obj_removeextension proc~particle_set_writehdf5 particle_set%particle_set_WriteHDF5 proc~particle_set_writehdf5->proc~stringtool_obj_removeextension proc~respart_set_readhdf5 ResPart_set%ResPart_set_ReadHDF5 proc~respart_set_readhdf5->proc~stringtool_obj_removeextension proc~respart_set_readhdf5->proc~marker_set_readhdf5 proc~respart_set_setreadfilename ResPart_set%ResPart_set_SetReadFileName proc~respart_set_setreadfilename->proc~stringtool_obj_removeextension proc~respart_set_setwritefilename ResPart_set%ResPart_set_SetWriteFileName proc~respart_set_setwritefilename->proc~stringtool_obj_removeextension proc~respart_set_writehdf5 ResPart_set%ResPart_set_WriteHDF5 proc~respart_set_writehdf5->proc~stringtool_obj_removeextension proc~respart_set_writehdf5->proc~marker_set_writehdf5 proc~silo_obj_init silo_obj%silo_obj_Init proc~silo_obj_init->proc~stringtool_obj_removeextension proc~solid_set_readhdf5 solid_set%solid_set_ReadHDF5 proc~solid_set_readhdf5->proc~stringtool_obj_removeextension proc~solid_set_readhdf5->proc~marker_set_readhdf5 proc~solid_set_writehdf5 solid_set%solid_set_WriteHDF5 proc~solid_set_writehdf5->proc~stringtool_obj_removeextension proc~solid_set_writehdf5->proc~marker_set_writehdf5 proc~xdmf_obj_write xdmf_obj%xdmf_obj_Write proc~xdmf_obj_write->proc~stringtool_obj_removeextension proc~eulerian_set_writesilo eulerian_set%eulerian_set_WriteSILO proc~eulerian_set_writesilo->proc~silo_obj_init proc~particle_set_writesilo particle_set%particle_set_WriteSilo proc~particle_set_writesilo->proc~silo_obj_init proc~respart_set_prepare ResPart_set%ResPart_set_Prepare proc~respart_set_prepare->proc~respart_set_setreadfilename proc~respart_set_prepare->proc~respart_set_setwritefilename proc~respart_set_writesilo ResPart_set%ResPart_set_WriteSILO proc~respart_set_writesilo->proc~silo_obj_init proc~setupcaserespart SetUpCaseResPart proc~setupcaserespart->proc~respart_set_setwritefilename proc~setupcaserespart~2 SetUpCaseResPart proc~setupcaserespart~2->proc~respart_set_setwritefilename proc~setupcaserp SetUpCaseRP proc~setupcaserp->proc~respart_set_setwritefilename proc~setupcaserp~2 SetUpCaseRP proc~setupcaserp~2->proc~respart_set_setwritefilename proc~setupcaserp~3 SetUpCaseRP proc~setupcaserp~3->proc~respart_set_setwritefilename proc~cdifs_obj_preparesolver cdifs_obj_PrepareSolver proc~cdifs_obj_preparesolver->proc~respart_set_prepare interface~cdifs_obj_writeoutputdata cdifs_obj%cdifs_obj_WriteOutputData proc~cdifs_obj_preparesolver->interface~cdifs_obj_writeoutputdata proc~cdifs_obj_writeoutputdata cdifs_obj_WriteOutputData proc~cdifs_obj_writeoutputdata->proc~respart_set_writesilo proc~grans_obj_writeoutputdata grans_obj_WriteOutputData proc~grans_obj_writeoutputdata->proc~respart_set_writesilo program~main main program~main->proc~setupcaserespart program~main~2 main program~main~2->proc~setupcaserp program~main~4 main program~main~4->proc~setupcaserp~2 program~main~6 main program~main~6->proc~setupcaserp~3 program~main~9 main program~main~9->proc~setupcaserespart~2 interface~cdifs_obj_preparesolver cdifs_obj%cdifs_obj_PrepareSolver interface~cdifs_obj_preparesolver->proc~cdifs_obj_preparesolver interface~cdifs_obj_writeoutputdata->proc~cdifs_obj_writeoutputdata interface~grans_obj_writeoutputdata grans_obj%grans_obj_WriteOutputData interface~grans_obj_writeoutputdata->proc~grans_obj_writeoutputdata proc~grans_obj_preparesolver grans_obj_PrepareSolver proc~grans_obj_preparesolver->interface~grans_obj_writeoutputdata interface~grans_obj_preparesolver grans_obj%grans_obj_PrepareSolver interface~grans_obj_preparesolver->proc~grans_obj_preparesolver

Source Code

    pure function stringtool_obj_RemoveExtension(filename) result(val)
      !> Removes file extension from filename while preserving
      ! time in scientific notation and dots in paths.
      character(len=*), intent(in)  :: filename                                !! File name
      character(len=:), allocatable :: val                                     !! Returned string with extension removed
      ! Work variables
      integer :: last_slash
      integer :: i,n
      logical :: is_sci_dot

      val = trim(adjustl(filename))
      n = len(val)

      ! Find last path separator to avoid dots in directory names
      last_slash = index(val, '/', back=.true.)

      ! Scan backwards from the end of the string to find the TRUE extension dot
      do i = n, last_slash + 1, -1
          if (val(i:i) == '.') then

              ! Assume this is NOT a scientific notation dot unless proven otherwise
              is_sci_dot = .false.

              ! Check if this dot is followed by the ES12.4 pattern (e.g., .0000E+01)
              ! The pattern ".0000E+" is 7 characters long.
              if (i + 6 <= n) then
                  if (val(i+1:i+1) >= '0' .and. val(i+1:i+1) <= '9' .and. &
                      (val(i+5:i+5) == 'E' .or. val(i+5:i+5) == 'e') .and. &
                      (val(i+6:i+6) == '+' .or. val(i+6:i+6) == '-')) then
                      is_sci_dot = .true.
                  end if
              end if

              ! If it's a real extension dot (not part of the time string), truncate and exit
              if (.not. is_sci_dot) then
                  val = val(:i-1)
                  return
              end if
          end if
      end do

      return
    end function stringtool_obj_RemoveExtension