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_