! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
!   Copyright by The HDF Group.                                               *
!   Copyright by the Board of Trustees of the University of Illinois.         *
!   All rights reserved.                                                      *
!                                                                             *
!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
!   terms governing use, modification, and redistribution, is contained in    *
!   the COPYING file, which can be found at the root of the source code       *
!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
!   If you do not have access to either file, you may request a copy from     *
!   help@hdfgroup.org.                                                        *
! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
!
!
! This file contains FORTRAN interfaces for H5IM functions
!
! NOTES
!
!       _____ __  __ _____   ____  _____ _______       _   _ _______
!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
!                             
!  If you add a new function here then you MUST add the function name to the
!  Windows dll file 'hdf5_hl_fortrandll.def.in' in the hl/fortran/src directory.
!  This is needed for Windows based operating systems.
!

MODULE h5im
  USE, INTRINSIC :: ISO_C_BINDING
  USE h5fortran_types
  USE hdf5
CONTAINS

!-------------------------------------------------------------------------
! Function: h5immake_image_8bit_f
!
! Purpose: Creates and writes an image an 8 bit image
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 05, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5immake_image_8bit_f(loc_id,&
       dset_name,&
       width,&
       height,&
       buf,&
       errcode )

    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER(hsize_t), INTENT(in) :: width              ! width of image
    INTEGER(hsize_t), INTENT(in) :: height             ! height of image
    INTEGER, INTENT(in), DIMENSION(*) :: buf           ! buffer
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                         ! name length

    INTERFACE
       INTEGER FUNCTION h5immake_image_8bit_c(loc_id,namelen,dset_name,width,height,buf) &
            BIND(C,NAME='h5immake_image_8bit_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T, HSIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
         INTEGER(size_t) :: namelen                              ! length of name buffer
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name   ! name of the dataset
         INTEGER(hsize_t), INTENT(in) :: width                   ! width of image
         INTEGER(hsize_t), INTENT(in) :: height                  ! height of image
         INTEGER         , INTENT(in), DIMENSION(*) :: buf       ! buffer
       END FUNCTION h5immake_image_8bit_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5immake_image_8bit_c(loc_id,namelen,dset_name,width,height,buf)
    
  END SUBROUTINE h5immake_image_8bit_f

!-------------------------------------------------------------------------
! Function: h5imread_image_f
!
! Purpose: Reads image data from disk.
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 05, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------
  SUBROUTINE h5imread_image_f(loc_id,&
       dset_name,&
       buf,&
       errcode )

    IMPLICIT NONE
   
    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER, INTENT(inout), DIMENSION(*) :: buf        ! buffer
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                         ! name length

    INTERFACE
       INTEGER FUNCTION h5imread_image_c(loc_id,namelen,dset_name,buf) &
            BIND(C,NAME='h5imread_image_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
         INTEGER(size_t) :: namelen                              ! length of name buffer
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
         INTEGER, INTENT(inout), DIMENSION(*) :: buf             ! buffer
       END FUNCTION h5imread_image_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5imread_image_c(loc_id,namelen,dset_name,buf)
    
  END SUBROUTINE h5imread_image_f

!-------------------------------------------------------------------------
! Function: h5immake_image_24bit_f
!
! Purpose: Creates and writes an image a 24 bit image
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 05, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5immake_image_24bit_f(loc_id,&
       dset_name,&
       width,&
       height,&
       il,&
       buf,&
       errcode )
    
    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER(hsize_t), INTENT(in) :: width              ! width of image
    INTEGER(hsize_t), INTENT(in) :: height             ! height of image
    CHARACTER(len=*), INTENT(in) :: il                 ! interlace
    INTEGER, INTENT(in), DIMENSION(*) :: buf           ! buffer
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    INTEGER(size_t) :: ILEN                                    ! name length
    
    INTERFACE
       INTEGER FUNCTION h5immake_image_24bit_c(loc_id,namelen,dset_name,ILEN,il,width,height,buf) &
            BIND(C,NAME='h5immake_image_24bit_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T, HSIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
         INTEGER(hsize_t), INTENT(in) :: width                   ! width of image
         INTEGER(hsize_t), INTENT(in) :: height                  ! height of image
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: il                      ! interlace
         INTEGER, INTENT(in), DIMENSION(*) :: buf                ! buffer
         INTEGER(size_t) :: namelen                                      ! length of name buffer
         INTEGER(size_t) :: ILEN                                         ! name length
         
       END FUNCTION h5immake_image_24bit_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    ILEN    = LEN(il)
    errcode = h5immake_image_24bit_c(loc_id,namelen,dset_name,ILEN,il,width,height,buf)
    
  END SUBROUTINE h5immake_image_24bit_f

!-------------------------------------------------------------------------
! Function: h5imget_image_info_f
!
! Purpose: Gets information about an image dataset (dimensions, interlace mode
!          and number of associated palettes).
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 05, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5imget_image_info_f(loc_id,&
       dset_name,&
       width,&
       height,&
       planes,&
       interlace,&
       npals,&
       errcode )
    
    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER(hsize_t), INTENT(inout) :: width           ! width of image
    INTEGER(hsize_t), INTENT(inout) :: height          ! height of image
    INTEGER(hsize_t), INTENT(inout) :: planes          ! color planes
    INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
    CHARACTER(len=*), INTENT(inout) :: interlace       ! interlace
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    INTEGER(size_t) :: ILEN                                    ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imget_image_info_c(loc_id,namelen,dset_name,width,height,planes,npals,ILEN,interlace) &
            BIND(C,NAME='h5imget_image_info_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T, HSIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
         INTEGER(hsize_t), INTENT(inout) :: width           ! width of image
         INTEGER(hsize_t), INTENT(inout) :: height          ! height of image
         INTEGER(hsize_t), INTENT(inout) :: planes          ! color planes
         INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(inout) :: interlace       ! interlace
         INTEGER(size_t) :: namelen                                 ! name length
         INTEGER(size_t) :: ILEN                                    ! name length
       END FUNCTION h5imget_image_info_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    ILEN    = LEN(interlace)
    errcode = h5imget_image_info_c(loc_id,namelen,dset_name,width,height,planes,npals,ILEN,interlace)
    
  END SUBROUTINE h5imget_image_info_f

!-------------------------------------------------------------------------
! Function: h5imis_image_f
!
! Purpose: Inquires if a dataset is an image
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 05, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  INTEGER FUNCTION h5imis_image_f(loc_id,&
       dset_name)

    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imis_image_c(loc_id,namelen,dset_name) &
            BIND(C,NAME='h5imis_image_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
         INTEGER(size_t) :: namelen                                      ! length of name buffer
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
       END FUNCTION h5imis_image_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5imis_image_c(loc_id,namelen,dset_name)
    h5imis_image_f = errcode
    
  END FUNCTION h5imis_image_f
  

!-------------------------------------------------------------------------
! Function: h5immake_palette_f
!
! Purpose: Creates and writes a palette
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 06, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5immake_palette_f(loc_id,&
       dset_name,&
       pal_dims,&
       buf,&
       errcode )
    
    IMPLICIT NONE
    
    INTEGER(hid_t),   INTENT(in) :: loc_id                 ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name              ! name of the dataset
    INTEGER(hsize_t), INTENT(in), DIMENSION(*) :: pal_dims ! dimensions
    INTEGER, INTENT(in), DIMENSION(*) :: buf               ! buffer
    INTEGER :: errcode                                     ! error code
    INTEGER(size_t) :: namelen                                     ! name length
    
    INTERFACE
       INTEGER FUNCTION h5immake_palette_c(loc_id,namelen,dset_name,pal_dims,buf) &
            BIND(C,NAME='h5immake_palette_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T, HSIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
         INTEGER(size_t) :: namelen                                      ! length of name buffer
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
         INTEGER(hsize_t), INTENT(in), DIMENSION(*) :: pal_dims  ! dimensions
         INTEGER, INTENT(in), DIMENSION(*) :: buf                ! buffer
       END FUNCTION h5immake_palette_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5immake_palette_c(loc_id,namelen,dset_name,pal_dims,buf)
    
  END SUBROUTINE h5immake_palette_f
  
!-------------------------------------------------------------------------
! Function: h5imlink_palette_f
!
! Purpose: This function attaches a palette to an existing image dataset
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 06, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5imlink_palette_f(loc_id,&
       dset_name,&
       pal_name,&
       errcode )
    
    IMPLICIT NONE
    
    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    CHARACTER(len=*), INTENT(in) :: pal_name           ! palette name
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    INTEGER(size_t) :: ILEN                                    ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name) &
            BIND(C,NAME='h5imlink_palette_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: pal_name           ! palette name
         INTEGER(size_t) :: namelen                                 ! name length
         INTEGER(size_t) :: ILEN                                    ! name length
       END FUNCTION h5imlink_palette_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    ILEN    = LEN(pal_name)
    errcode = h5imlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name)
    
  END SUBROUTINE h5imlink_palette_f
  

!-------------------------------------------------------------------------
! Function: h5imunlink_palette_f
!
! Purpose: This function dettaches a palette to an existing image dataset
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 06, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5imunlink_palette_f(loc_id,&
       dset_name,&
       pal_name,&
       errcode )
    
    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    CHARACTER(len=*), INTENT(in) :: pal_name           ! palette name
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    INTEGER(size_t) :: ILEN                                    ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imunlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name) &
            BIND(C,NAME='h5imunlink_palette_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: pal_name           ! palette name
         INTEGER(size_t) :: namelen                                 ! name length
         INTEGER(size_t) :: ILEN                                    ! name length
       END FUNCTION h5imunlink_palette_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    ILEN    = LEN(pal_name)
    errcode = h5imunlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name)
    
  END SUBROUTINE h5imunlink_palette_f
  
!-------------------------------------------------------------------------
! Function: h5imget_npalettes_f
!
! Purpose: Gets the number of palettes associated to an image
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 05, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5imget_npalettes_f(loc_id,&
       dset_name,&
       npals,&
       errcode )
    
    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imget_npalettes_c(loc_id,namelen,dset_name,npals) &
            BIND(C,NAME='h5imget_npalettes_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T, HSIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
         INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
         INTEGER(size_t) :: namelen                                 ! name length
       END FUNCTION h5imget_npalettes_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5imget_npalettes_c(loc_id,namelen,dset_name,npals)
    
  END SUBROUTINE h5imget_npalettes_f


!-------------------------------------------------------------------------
! Function: h5imget_palette_info_f
!
! Purpose: Get palette information
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 06, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5imget_palette_info_f(loc_id,&
       dset_name,&
       pal_number,&
       dims,&
       errcode )
    
    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id                ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name             ! name of the dataset
    INTEGER, INTENT(in) :: pal_number                     ! palette number
    INTEGER(hsize_t), DIMENSION(*), INTENT(inout) :: dims ! dimensions
    INTEGER :: errcode                                    ! error code
    INTEGER(size_t) :: namelen                                    ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imget_palette_info_c(loc_id,namelen,dset_name,pal_number,dims) &
            BIND(C,NAME='h5imget_palette_info_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T, HSIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                ! file or group identifier
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name             ! name of the dataset
         INTEGER, INTENT(in) :: pal_number                     ! palette number
         INTEGER(hsize_t), DIMENSION(*), INTENT(inout) :: dims ! dimensions
         INTEGER(size_t) :: namelen                                    ! name length
       END FUNCTION h5imget_palette_info_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5imget_palette_info_c(loc_id,namelen,dset_name,pal_number,dims)
    
  END SUBROUTINE h5imget_palette_info_f

!-------------------------------------------------------------------------
! Function: h5imget_palette_f
!
! Purpose: Reads palette
!
! Return: Success: 0, Failure: -1
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 06, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  SUBROUTINE h5imget_palette_f(loc_id,&
       dset_name,&
       pal_number,&
       buf,&
       errcode )
    
    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER, INTENT(in) :: pal_number                  ! palette number
    INTEGER, INTENT(inout), DIMENSION(*) :: buf        ! buffer
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imget_palette_c(loc_id,namelen,dset_name,pal_number,buf) &
            BIND(C,NAME='h5imget_palette_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
         INTEGER(size_t) :: namelen                                      ! length of name buffer
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
         INTEGER, INTENT(in) :: pal_number                       ! palette number
         INTEGER, INTENT(inout), DIMENSION(*) :: buf             ! buffer
       END FUNCTION h5imget_palette_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5imget_palette_c(loc_id,namelen,dset_name,pal_number,buf)
    
  END SUBROUTINE h5imget_palette_f


!-------------------------------------------------------------------------
! Function: h5imis_palette_f
!
! Purpose: Inquires if a dataset is a palette
!
! Return: true, false, fail
!
! Programmer: pvn@ncsa.uiuc.edu
!
! Date: October 06, 2004
!
! Comments:
!
! Modifications:
!
!-------------------------------------------------------------------------

  INTEGER FUNCTION h5imis_palette_f(loc_id,&
                                  dset_name)

    IMPLICIT NONE

    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
    INTEGER :: errcode                                 ! error code
    INTEGER(size_t) :: namelen                                 ! name length
    
    INTERFACE
       INTEGER FUNCTION h5imis_palette_c(loc_id,namelen,dset_name) &
            BIND(C,NAME='h5imis_palette_c')
         IMPORT :: C_CHAR
         IMPORT :: HID_T, SIZE_T
         IMPLICIT NONE
         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
         INTEGER(size_t) :: namelen                              ! length of name buffer
         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
       END FUNCTION h5imis_palette_c
    END INTERFACE
    
    namelen = LEN(dset_name)
    errcode = h5imis_palette_c(loc_id,namelen,dset_name)
    h5imis_palette_f = errcode
    
  END FUNCTION h5imis_palette_f

END MODULE H5IM





