Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(string), | intent(in) | :: | self | |||
character(len=*), | intent(in) | :: | substring | |||
logical, | intent(in), | optional | :: | ignore_isolated |
elemental function scount(self, substring, ignore_isolated) result(No) !< Count the number of occurences of a substring into a string. !< !< @note If `ignore_isolated` is set to true the eventual "isolated" occurences are ignored: an isolated occurrences are those !< occurrences happening at the start of string (thus not having a left companion) or at the end of the string (thus not having a !< right companion). !< !<```fortran !< type(string) :: astring !< logical :: test_passed(4) !< astring = ' Hello World ! ' !< test_passed(1) = astring%count(substring=' ')==10 !< astring = 'Hello World ! ' !< test_passed(2) = astring%count(substring=' ', ignore_isolated=.true.)==6 !< astring = ' Hello World !' !< test_passed(3) = astring%count(substring=' ', ignore_isolated=.true.)==6 !< astring = ' Hello World ! ' !< test_passed(4) = astring%count(substring=' ', ignore_isolated=.true.)==8 !< print '(L1)', all(test_passed) !<``` !=> T <<< class(string), intent(in) :: self !< The string. character(*), intent(in) :: substring !< Substring. logical, intent(in), optional :: ignore_isolated !< Ignore "isolated" occurrences. integer :: No !< Number of occurrences. logical :: ignore_isolated_ !< Ignore "isolated" occurrences, local variable. integer :: c1 !< Counter. integer :: c2 !< Counter. No = 0 if (allocated(self%raw)) then if (len(substring)>len(self%raw)) return ignore_isolated_ = .false. ; if (present(ignore_isolated)) ignore_isolated_ = ignore_isolated c1 = 1 do c2 = index(string=self%raw(c1:), substring=substring) if (c2==0) return if (.not.ignore_isolated_) then No = No + 1 else if (.not.((c1==1.and.c2==1) .or. (c1==len(self%raw)-len(substring)+1))) then No = No + 1 endif endif c1 = c1 + c2 - 1 + len(substring) enddo endif endfunction scount