subroutine memory_topology(lstring, location, srcMulti, srcBlock, &
dstMulti,dstBlock, localrc)
!---------------------------------------------------------------------------
! routine checks the whole input string to determine if the memory topology
! consists of a single structured Logically Rectangular block of memory, or
! multiple structured blocks. It also conducts syntax checking on the
! string. Output is through two sets (source and destination) of two
! variables; *Block the number of single contigous blocks of memory, and
! *Multi the number of multiple memory blocks.
!---------------------------------------------------------------------------
! arguments
character(THARN_MAXSTR), intent(in ) :: lstring
integer, intent(in ) :: location(2)
integer, intent( out) :: srcMulti, dstMulti
integer, intent( out) :: srcBlock,dstBlock
integer, intent( out) :: localrc
! local variables
integer :: nsingle, nmult, strlen
! initialize variables
localrc = ESMF_RC_NOT_IMPL
strlen = len(lstring)
srcBlock = 0
srcMulti = 0
dstBlock = 0
dstMulti = 0
!---------------------------------------------------------------------------
! Memory Layout
!---------------------------------------------------------------------------
nmult = set_query(lstring,'()' )
nsingle = set_query(lstring,'[]' )
!---------------------------------------------------------------------------
! check if memory is structured with multiple blocks
!---------------------------------------------------------------------------
if( (nmult >= 4).and.(nsingle >= 4) ) then
!------------------------------------------------------------------------
! check to see if symbols are properly paired on each half of the string
!------------------------------------------------------------------------
if( pattern_match(lstring(1:location(1)), '(', ')') .and. &
pattern_match(lstring(location(2):strlen), '(', ')') .and. &
pattern_match(lstring(1:location(1)), '[', ']') .and. &
pattern_match(lstring(location(2):strlen), '[', ']') ) then
srcBlock = set_query(lstring(1:location(1)),'[' )
srcMulti = set_query(lstring(1:location(1)),'(' )
dstBlock = set_query(lstring(location(2):strlen),'[' )
dstMulti = set_query(lstring(location(2):strlen),'(' )
else
call ESMF_LogSetError(ESMF_FAILURE,msg="symbols not properly paired", &
rcToReturn=localrc)
return
endif
!---------------------------------------------------------------------------
! if memory is single block
!---------------------------------------------------------------------------
elseif( (nmult == 0).and.(nsingle == 4) ) then
!------------------------------------------------------------------------
! check to see if symbols are properly paired on each half of the string
!------------------------------------------------------------------------
if( pattern_match(lstring(1:location(1)), '[', ']') .and. &
pattern_match(lstring(location(1):strlen), '[', ']') ) then
srcBlock = set_query(lstring(1:location(1)),'[' )
dstBlock = set_query(lstring(location(2):strlen),'[' )
else
call ESMF_LogSetError(ESMF_FAILURE,msg="symbols not properly paired", &
rcToReturn=localrc)
return
endif
else ! syntax error
call ESMF_LogSetError( ESMF_FAILURE, msg="symbols not paired properly", &
rcToReturn=localrc)
return
endif
!---------------------------------------------------------------------------
! if I've gotten this far without an error, then the routine has succeeded.
!---------------------------------------------------------------------------
localrc = ESMF_SUCCESS
!---------------------------------------------------------------------------
end subroutine memory_topology