!= 螟画焚縺ｮ蜃ｺ蜉帶ュ蝣ｱ縺ｮ蜑企勁
!= Delete output information of a variable
!
! Authors::   Yasuhiro MORIKAWA
! Version::   $Id: hstnmlinfodelete.f90,v 1.1 2009-05-11 15:15:15 morikawa Exp $
! Tag Name::  $Name:  $
! Copyright:: Copyright (C) GFD Dennou Club, 2007-2009. All rights reserved.
! License::   See COPYRIGHT[link:../../../COPYRIGHT]
!
  recursive subroutine HstNmlInfoDelete( gthstnml, &
    & name, &
    & err )
    !
    ! 螟画焚縺ｮ蜃ｺ蜉帶ュ蝣ｱ繧貞炎髯､縺励∪縺�.
    !
    ! 縺ｪ縺�, 荳弱∴繧峨ｌ縺� *gthstnml* 縺� HstNmlInfoCreate 縺ｫ繧医▲縺ｦ蛻晄悄險ｭ螳�
    ! 縺輔ｌ縺ｦ縺�↑縺��ｴ蜷�, 繝励Ο繧ｰ繝ｩ繝�縺ｯ繧ｨ繝ｩ繝ｼ繧堤匱逕溘＆縺帙∪縺�.
    !
    ! Delete output information of a variable.
    !
    ! If *gthstnml* is not initialized by "HstNmlInfoCreate" yet,
    ! error is occurred.
    !
    use gtool_history_nmlinfo_types, only: GTHST_NMLINFO, GTHST_NMLINFO_ENTRY
    use gtool_history_nmlinfo_internal, only: ListSearch
    use gtool_history_nmlinfo_internal, only: name_delimiter
    use dc_trace, only: BeginSub, EndSub, DbgMessage
    use dc_string, only: PutLine, Printf, Split, StrInclude, StoA, JoinChar
    use dc_present, only: present_and_not_empty, present_and_true
    use dc_types, only: DP, STRING, TOKEN, STDOUT
    use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EARGLACK, USR_ERRNO, HST_ENOTINDEFINE
    implicit none
    type(GTHST_NMLINFO), intent(inout):: gthstnml
    character(*), intent(in):: name
                              ! 螟画焚蜷�.
                              !
                              ! 蜈磯�ｭ縺ｮ遨ｺ逋ｽ縺ｯ辟｡隕悶＆繧後∪縺�.
                              !
                              ! "Data1,Data2" 縺ｮ繧医≧縺ｫ繧ｫ繝ｳ繝槭〒蛹ｺ蛻�▲縺ｦ隍�焚
                              ! 縺ｮ螟画焚繧呈欠螳壹☆繧九％縺ｨ縺悟庄閭ｽ縺ｧ縺�.
                              !
                              ! Variable identifier.
                              !
                              ! Blanks at the head of the name are ignored.
                              !
                              ! Multiple variables can be specified
                              ! as "Data1,Data2". Delimiter is comma.
                              !
    logical, intent(out), optional:: err
                              ! 萓句､門�逅�畑繝輔Λ繧ｰ.
                              ! 繝�ヵ繧ｩ繝ｫ繝医〒縺ｯ, 縺薙�謇狗ｶ壹″蜀�〒繧ｨ繝ｩ繝ｼ縺�
                              ! 逕溘§縺溷�ｴ蜷�, 繝励Ο繧ｰ繝ｩ繝�縺ｯ蠑ｷ蛻ｶ邨ゆｺ�＠縺ｾ縺�.
                              ! 蠑墓焚 *err* 縺御ｸ弱∴繧峨ｌ繧句�ｴ蜷�,
                              ! 繝励Ο繧ｰ繝ｩ繝�縺ｯ蠑ｷ蛻ｶ邨ゆｺ�○縺�, 莉｣繧上ｊ縺ｫ
                              ! *err* 縺ｫ .true. 縺御ｻ｣蜈･縺輔ｌ縺ｾ縺�.
                              !
                              ! Exception handling flag.
                              ! By default, when error occur in
                              ! this procedure, the program aborts.
                              ! If this *err* argument is given,
                              ! .true. is substituted to *err* and
                              ! the program does not abort.

    !-----------------------------------
    !  菴懈･ｭ螟画焚
    !  Work variables
    type(GTHST_NMLINFO_ENTRY), pointer:: hptr =>null()
    type(GTHST_NMLINFO_ENTRY), pointer:: hptr_prev =>null()
    type(GTHST_NMLINFO_ENTRY), pointer:: hptr_next =>null()
    character(TOKEN), pointer:: varnames_array(:) =>null()
    integer:: i, vnmax
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'HstNmlInfoDelete'
  continue
    call BeginSub( subname, &
      & fmt = '@name=%c', &
      & c1 = trim( name ) )
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  蛻晄悄險ｭ螳壹�繝√ぉ繝�け
    !  Check initialization
    !-----------------------------------------------------------------
    if ( .not. gthstnml % initialized ) then
      stat = DC_ENOTINIT
      cause_c = 'GTHST_NMLINFO'
      goto 999
    end if

    if ( .not. gthstnml % define_mode ) then
      stat = HST_ENOTINDEFINE
      cause_c = 'Delete'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  隍�焚縺ｮ螟画焚繧貞炎髯､縺吶ｋ蝣ｴ蜷�
    !  Delete multiple variables
    !-----------------------------------------------------------------
    if ( present_and_not_empty(name) ) then
      if ( index(name, name_delimiter) > 0 ) then
        call DbgMessage( 'multiple entries (%c) will be deleted', c1 = trim(name) )
        call Split( str = name, sep = name_delimiter, & ! (in)
          & carray = varnames_array )                   ! (out)
        vnmax = size( varnames_array )

        do i = 1, vnmax
          call HstNmlInfoDelete( &
            & gthstnml = gthstnml, &      ! (inout)
            & name = varnames_array(i), & ! (in)
            & err = err )                 ! (out)
          if ( present_and_true( err ) ) then
            deallocate( varnames_array )
            stat = USR_ERRNO
            goto 999
          end if
        end do
        deallocate( varnames_array )
        goto 999
      end if
    end if

    !-----------------------------------------------------------------
    !  *gthstnml* 縺ｮ諠��ｱ繧貞炎髯､.
    !  Delete information in *gthstnml*
    !-----------------------------------------------------------------
    hptr => gthstnml % gthstnml_list
    call ListSearch( gthstnml_list = hptr, & ! (inout)
      &              name = name, &          ! (in)
      &              previous = hptr_prev, & ! (out)
      &              next = hptr_next )      ! (out)

    if ( .not. associated( hptr ) ) goto 999
    if ( ( trim(hptr % name) /= '' ) .and. associated( hptr_prev ) ) then
      call DbgMessage( 'entry (%c) is deleted', c1 = trim( adjustl( name ) ) )
      hptr_prev % next => hptr_next
      deallocate( hptr )
    end if

    !-----------------------------------------------------------------
    !  邨ゆｺ��逅�, 萓句､門�逅�
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError( stat, subname, err, cause_c )
    call EndSub( subname )
  end subroutine HstNmlInfoDelete