Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=*), | intent(in) | :: | string | |||
character(len=*), | intent(in) | :: | tok |
integer function index_ (string,tok) !------------------------------------------------------------------------- ! !ROUTINE: index_ Extension of the Fortran 77 intrinsic "index" for ! "string" (input) with length that can exceed 2**15-1 (=MAXLEN). ! ! !DESCRIPTION: Finds the starting location = "index_", of the first character in "tok" ! within "string", where string is of "arbitrary" length. If tok occurs more than ! once in "string", then the value of index_ is based on the first occurrence of "tok". ! ! !CALLING SEQUENCE: ! ! index_( string,tok ) ! ! !INPUT PARAMETERS: ! character(len=*), intent(in) :: string, tok ! !------------------------------------------------------------------------- integer :: idx, i, n, nlen, lt, ibot, itop integer, parameter :: MAXLEN = 32767 ! max size of signed 2-byte integer n = len(string) ! length of string lt = len(tok) ! length of token tok i = 1 ! initialize loop index nlen = MAXLEN-lt ! index requires len(sting)+len(tok)<=MAXLEN itop = min(nlen,n) ! top of string to index ibot = 1 ! bottom of string idx = index(string(ibot:itop),tok) ! set for good, if itop=n (<=MAXLEN) do while(idx .eq. 0 .and. itop < n) i = i+1 itop = min(i*MAXLEN-lt,n) ! subtract lt to find tok at bdry ibot = max(1,itop+1-nlen) ! bottom of string to index idx = index(string(ibot:itop),tok) ! idx>=0, since itop-ibot<=MAXLEN end do index_ = idx ! case where idx = 0, or (i=1 & idx > 0) if(idx > 0) index_ = idx - 1 + ibot end function index_