find_char_char Function

private elemental function find_char_char(string, pattern, occurrence, consider_overlapping) result(res)

Returns the starting index of the ‘occurrence’th occurrence of substring ‘pattern’ in input ‘string’ Returns an integer

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: string
character(len=*), intent(in) :: pattern
integer, intent(in), optional :: occurrence
logical, intent(in), optional :: consider_overlapping

Return Value integer


Calls

proc~~find_char_char~~CallsGraph proc~find_char_char find_char_char interface~pic_optional pic_optional proc~find_char_char->interface~pic_optional proc~compute_lps compute_lps proc~find_char_char->proc~compute_lps proc~optional_char optional_char interface~pic_optional->proc~optional_char proc~optional_dp optional_dp interface~pic_optional->proc~optional_dp proc~optional_int32 optional_int32 interface~pic_optional->proc~optional_int32 proc~optional_int64 optional_int64 interface~pic_optional->proc~optional_int64 proc~optional_logical optional_logical interface~pic_optional->proc~optional_logical proc~optional_sp optional_sp interface~pic_optional->proc~optional_sp

Called by

proc~~find_char_char~~CalledByGraph proc~find_char_char find_char_char interface~find find interface~find->proc~find_char_char proc~find_char_string find_char_string interface~find->proc~find_char_string proc~find_string_char find_string_char interface~find->proc~find_string_char proc~find_string_string find_string_string interface~find->proc~find_string_string proc~find_char_string->interface~find proc~find_string_char->interface~find proc~find_string_string->interface~find

Variables

Type Visibility Attributes Name Initial
integer, private :: length_pattern
integer, private :: length_string
integer, private :: lps_array(len(pattern))
integer, private :: occurrence_
integer, private :: p_i
integer, private :: s_i

Source Code

   elemental function find_char_char(string, pattern, occurrence, consider_overlapping) result(res)
      character(len=*), intent(in) :: string
      character(len=*), intent(in) :: pattern
      integer, intent(in), optional :: occurrence
      logical, intent(in), optional :: consider_overlapping
      integer :: lps_array(len(pattern))
      integer :: res, s_i, p_i, length_string, length_pattern, occurrence_

      occurrence_ = pic_optional(occurrence, 1)
      res = 0
      length_string = len(string)
      length_pattern = len(pattern)

      if (length_pattern > 0 .and. length_pattern <= length_string &
          & .and. occurrence_ > 0) then
         lps_array = compute_lps(pattern)

         s_i = 1
         p_i = 1
         do while (s_i <= length_string)
            if (string(s_i:s_i) == pattern(p_i:p_i)) then
               if (p_i == length_pattern) then
                  occurrence_ = occurrence_ - 1
                  if (occurrence_ == 0) then
                     res = s_i - length_pattern + 1
                     exit
                  else if (pic_optional(consider_overlapping, .true.)) then
                     p_i = lps_array(p_i)
                  else
                     p_i = 0
                  end if
               end if
               s_i = s_i + 1
               p_i = p_i + 1
            else if (p_i > 1) then
               p_i = lps_array(p_i - 1) + 1
            else
               s_i = s_i + 1
            end if
         end do
      end if

   end function find_char_char