Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=*), | intent(in) | :: | lstring | |||
character(len=*), | intent(in) | :: | lpattern | |||
integer, | intent(inout) | :: | number_hits | |||
integer, | intent(inout) | :: | hit_loc(:) |
subroutine pattern_locate(lstring, lpattern, number_hits, hit_loc) !--------------------------------------------------------------------------- ! Locates all instances of a PATTERN in STRING, placing the location of ! the beginning of the pattern in hit_loc. !--------------------------------------------------------------------------- ! arguments character(len=*), intent(in ) :: lstring character(len=*), intent(in ) :: lpattern integer, intent(inout) :: number_hits integer, intent(inout) :: hit_loc(:) ! local variables integer :: k, klast, ncount integer :: len_string, len_pattern ! initialize variables ncount = 0 len_string = len(lstring) len_pattern = len( trim(adjustL(lpattern) )) !--------------------------------------------------------------------------- ! error check - conduct the search only if the pattern & string are not empty !--------------------------------------------------------------------------- if( (len_pattern > 0) .and. (len_string > 0) ) then klast = 0 !------------------------------------------------------------------------ ! examine the string to find the find the FIRST instance of the pattern !------------------------------------------------------------------------ k = index(lstring(klast+1:len_string), trim(adjustL(lpattern) )) do while( k > 0 ) !--------------------------------------------------------------------- ! if index is nonzero, there is at least one match, increment ! through the string checking for additional matches. !--------------------------------------------------------------------- ncount = ncount + 1 ! count match klast = k + klast ! slide forward in string looking for next match hit_loc(ncount) = klast ! save location of the pattern match k = index(lstring(klast+1:len_string), trim(adjustL(lpattern) )) enddo ! while endif ! if they do not agree something has failed. if (number_hits /= ncount) ncount = 0 ! return value number_hits = ncount !--------------------------------------------------------------------------- end subroutine pattern_locate