Boyer-Moore string search: Difference between revisions
Content deleted Content added
m Added a precision in "reverse" function comment. |
Bwana Pete (talk | contribs) No edit summary |
||
Line 268: | Line 268: | ||
<pre>33</pre> |
<pre>33</pre> |
||
</pre> |
|||
=={{header|Fortran}}== |
|||
module bm_str |
|||
implicit none |
|||
private |
|||
public :: bmstr |
|||
! |
|||
! PARAMETER definitions |
|||
! |
|||
integer , private , parameter :: NO_OF_CHARS = 256, SIZEX=256 |
|||
contains |
|||
pure subroutine badcharheuristic(Str,M,Badchar) |
|||
implicit none |
|||
! Dummy arguments |
|||
! |
|||
integer :: M |
|||
integer , dimension(NO_OF_CHARS) :: Badchar |
|||
character(1) , dimension(M) :: Str |
|||
intent (in) M , Str |
|||
intent (out) Badchar |
|||
! |
|||
! Local variables |
|||
! |
|||
integer :: i |
|||
! Code starts here |
|||
Badchar(NO_OF_CHARS) = -1 |
|||
do i = 1 , M |
|||
Badchar(iachar(Str(i))) = i |
|||
enddo |
|||
return |
|||
end subroutine badcharheuristic |
|||
function bmstr(Pat,M,Str,N) result(found) |
|||
implicit none |
|||
! |
|||
! Dummy arguments |
|||
! |
|||
integer :: M |
|||
integer :: N |
|||
character(len=m) :: Pat |
|||
character(len=n) :: Str |
|||
intent (in) M , N , Pat , Str |
|||
! |
|||
! Local variables |
|||
! |
|||
integer , dimension(NO_OF_CHARS) :: badchar |
|||
integer :: found |
|||
integer :: i |
|||
integer :: j |
|||
integer :: s |
|||
! Code starts here |
|||
! |
|||
found = -1 |
|||
if ( (M==0) .OR. (N==0) .OR. (M>N) ) return |
|||
badchar = 0 |
|||
call badcharheuristic(Pat,M,badchar) |
|||
i = 0 |
|||
s = 0 |
|||
do while ( s<=(N-M) ) |
|||
j = M |
|||
do j = m,1,-1 |
|||
if((Pat(j:j) /= Str(s+j:s+j)) )exit ! Leave, the pattern doesn't match. |
|||
enddo |
|||
if ( j < 1 ) then ! Found, let's leave |
|||
found = s + 1 |
|||
return |
|||
endif |
|||
i = badchar(iachar(Str(s+j:s+j))) |
|||
s = s + MAX(1,j-i) |
|||
enddo |
|||
found = -1 |
|||
return |
|||
end function bmstr |
|||
end module bm_str</pre> |
|||
</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |