Returns the starting index of the ‘occurrence’th occurrence of substring ‘pattern’ in input ‘string’ Returns an integer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| character(len=*), | intent(in) | :: | string | |||
| character(len=*), | intent(in) | :: | pattern | |||
| integer, | intent(in), | optional | :: | occurrence | ||
| logical, | intent(in), | optional | :: | consider_overlapping |
| 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 |
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