! Copyright (C) GFD Dennou Club, 2000.  All rights reserved.

! --- 属性の列挙 ---

! ある変数 var に付随した属性をすべて取得するにはまず
! attr_rewind(var) を呼び出してから無限ループの中で
! attr_next(var, name, [end]) を呼び出す。name がひとつ
! ひとつの属性名を与える。name が空文字列になったとき、
! すべての属性を探索し終えたことになる。このとき end を
! 与えていればそれが真になることでも判定できる。

! 大域属性は、その名前の先頭に "+" が付加された普通の変数属性で
! あるかのように見える。

subroutine ANVarAttrRewind(var)
    use an_types, only: AN_VARIABLE
    type(AN_VARIABLE), intent(inout):: var
    var%attrid = 0
end subroutine

subroutine ANVarAttrNext(var, name, end)
    use an_types, only: AN_VARIABLE
    use dc_string, only: VSTRING, assignment(=)
    use netcdf_f77
    use dc_url, only: GT_PLUS
    type(AN_VARIABLE), intent(inout):: var
    type(VSTRING), intent(out):: name
    logical, intent(out), optional:: end
    character(len = NF_MAX_NAME):: attrname
    integer:: stat
    if (var%fileid <= 0) goto 999
    if (var%varid <= 0) goto 999

    ! 最初は変数属性の検索
    if (var%attrid >= 0) then
        var%attrid = var%attrid + 1
        stat = NF_INQ_ATTNAME(var%fileid, var%varid, var%attrid, attrname)
        if (stat == NF_NOERR) then
            name = trim(attrname)
            end = .FALSE.
            return
        endif
        var%attrid = -1
    endif

    ! 次は大域属性の検索
    stat = NF_INQ_ATTNAME(var%fileid, NF_GLOBAL, -var%attrid, attrname)
    if (stat == NF_NOERR) then
        var%attrid = var%attrid - 1
        name = GT_PLUS // trim(attrname)
        end = .FALSE.
        return
    endif

999 continue
    end = .TRUE.
    name = ""
    return
end subroutine
