72 lines
1.7 KiB
Fortran
72 lines
1.7 KiB
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
|