ESMF_IO_YAMLContentGet Subroutine

public subroutine ESMF_IO_YAMLContentGet(yaml, keywordEnforcer, content, contentSize, lineCount, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_IO_YAML) :: yaml
type(ESMF_KeywordEnforcer), optional :: keywordEnforcer
character(len=*), intent(out), optional :: content(:)
integer, intent(out), optional :: contentSize
integer, intent(out), optional :: lineCount
integer, intent(out), optional :: rc

Source Code

  subroutine ESMF_IO_YAMLContentGet(yaml, keywordEnforcer, &
    content, contentSize, lineCount, rc)
!
! !ARGUMENTS:
    type(ESMF_IO_YAML)                                  :: yaml
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
    character(len=*),             intent(out), optional :: content(:)
    integer,                      intent(out), optional :: contentSize
    integer,                      intent(out), optional :: lineCount
    integer,                      intent(out), optional :: rc

! !DESCRIPTION:
!     Retrieve the parsed content of a {\tt ESMF\_YAML\_IO} object.
!
!     The arguments are:
!     \begin{description}
!     \item[{yaml}]
!          Output parsed content of this {\tt ESMF\_IO_YAML} object.
!     \item[{content}]
!          A character(1) array that will hold the content. It must be
!          at least of size {\tt contentSize}.
!     \item[{contentSize}]
!          The number of characters of the available content. It should be
!          retrieved first, to properly allocate the {\tt content} array.
!     \item[{lineCount}]
!          The number of lines of the available content. It should be
!          retrieved first, to properly allocate the {\tt content} array.
!     \item[{[rc]}]
!          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
!     \end{description}
!     
!EOPI

    ! local return codes
    integer :: localrc, stat
    ! local variables
    integer :: i, j, k
    integer :: contentLineCount, contentStringLen
    character(len=1), allocatable :: buffer(:)
!
!   ! Assume failure until success
    if (present(rc)) rc = ESMF_RC_NOT_IMPL

    if (present(contentSize)) then
      call c_ESMC_IO_YAMLCSize(yaml, contentSize, localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
        ESMF_CONTEXT, rcToReturn=rc)) return
    end if

    if (present(lineCount)) then
      call c_ESMC_IO_YAMLCLineC(yaml, lineCount, localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
        ESMF_CONTEXT, rcToReturn=rc)) return
    end if

    if (present(content)) then

      ! setup receiving buffer for parsed content
      contentStringLen = len(content(1))
      contentLineCount = size(content)
      allocate(buffer(contentStringLen * contentLineCount), &
        stat=stat)
      if (ESMF_LogFoundAllocError(statusToCheck=stat, &
        msg="Allocation of string buffer.", &
        ESMF_CONTEXT, rcToReturn=rc)) return

      ! initialize buffer
      buffer = ""

      call c_ESMC_IO_YAMLCGet(yaml, buffer, localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
        ESMF_CONTEXT, rcToReturn=rc)) return

      ! convert received content from 1-d to array of strings, delimited by newline characters
      content = ""
      k = 0
      i = 1
      do j = 1, size(buffer)
        if (buffer(j) == achar(0)) exit
        if (buffer(j) == achar(10)) then
            k = 0
            i = i + 1
            if (i > contentLineCount) exit
            cycle
        else
            k = k + 1
            if (k > contentStringLen) cycle
        end if
        content(i)(k:k) = buffer(j)
      end do

      ! release buffer memory
      deallocate(buffer, stat=stat)
      if (ESMF_LogFoundDeallocError(statusToCheck=stat, &
        msg="Free memory associated with string buffer.", &
        ESMF_CONTEXT, rcToReturn=rc)) return

    end if

    ! Return success
    if (present(rc)) rc = ESMF_SUCCESS

  end subroutine ESMF_IO_YAMLContentGet