/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 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 files COPYING and Copyright.html.  COPYING can be found at the root   *
 * of the source code distribution tree; Copyright.html can be found at the  *
 * root level of an installed copy of the electronic HDF5 document set and   *
 * is linked from the top-level documents page.  It can also be found at     *
 * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have     *
 * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* This files contains C stubs for H5A Fortran APIs */

#include "H5f90.h"

/*----------------------------------------------------------------------------
 * Name:        h5acreate_c
 * Purpose:     Call H5Acreate to create an attribute 
 * Inputs:      obj_id - object identifier 
 *              name - name of the attribute     
 *              namelen - name length
 *              type_id - datatype identifier
 *              space_id - dataspace identifier
 *              crt_pr  - identifier of creation property list
 * Outputs:     attr_id - attribute identifier
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5acreate_c (hid_t_f *obj_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *space_id, hid_t_f *crt_prp,  hid_t_f *attr_id)
{
     int ret_value = -1;
     char *c_name;
     int c_namelen;
     hid_t c_obj_id;
     hid_t c_type_id;
     hid_t c_space_id;
     hid_t c_attr_id;
     hid_t c_crt_prp;
     /*
      * Define creation property
      */
     c_crt_prp = (hid_t)*crt_prp;
/*
     if ( H5P_DEFAULT_F == c_crt_prp ) c_crt_prp = H5P_DEFAULT;
*/

     /*
      * Convert FORTRAN name to C name
      */
     c_namelen = *namelen;
     c_name = (char *)HD5f2cstring(name, c_namelen); 
     if (c_name == NULL) return ret_value;

     /*
      * Call H5Acreate function.
      */
     c_obj_id = *obj_id;
     c_type_id = *type_id;
     c_space_id = *space_id; 
     c_attr_id = H5Acreate(c_obj_id, c_name, c_type_id, c_space_id, c_crt_prp);


     if (c_attr_id < 0) goto DONE;
     *attr_id = (hid_t_f)c_attr_id;
     ret_value = 0;

DONE:
     HDfree(c_name);
     return ret_value;
}      

/*----------------------------------------------------------------------------
 * Name:        h5aopen_name _c
 * Purpose:     Call H5Aopen_name to open an attribute 
 * Inputs:      obj_id - object identifier 
 *              name - name of the attribute     
 *              namelen - name length
 * Outputs:     attr_id - dataset identifier
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5aopen_name_c (hid_t_f *obj_id, _fcd name, int_f *namelen, hid_t_f *attr_id)
{
     int ret_value = -1;
     char *c_name;
     int c_namelen;
     hid_t c_obj_id;
     hid_t c_attr_id;

     /*
      * Convert FORTRAN name to C name
      */
     c_namelen = *namelen;
     c_name = (char *)HD5f2cstring(name, c_namelen); 
     if (c_name == NULL) return ret_value;
     /*
      * Call H5Aopen function.
      */
     c_obj_id = *obj_id;
     c_attr_id = H5Aopen_name(c_obj_id, c_name);

     if (c_attr_id < 0) goto DONE;
     *attr_id = (hid_t_f)c_attr_id;
     ret_value = 0;

DONE:
     HDfree(c_name);
     return ret_value;
}      

/*----------------------------------------------------------------------------
 * Name:        h5awritec_c
 * Purpose:     Call h5awrite_c to write a character  attribute
 * Inputs:      attr_id - dataset identifier 
 *              mem_type_id - memory datatype identifier
 *              buf      - character data buffer
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday , August 12, 1999
 * Modifications: dims paramete added.
 *                April 4, 2001
 *---------------------------------------------------------------------------*/
int_f
nh5awritec_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, int_f *dims)
{
     int ret_value = -1;
     
     /*
      * Call h5awrite_c  function.
      */
     ret_value = nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);

     return ret_value;
}

/*----------------------------------------------------------------------------
 * Name:        h5awrite_c
 * Purpose:     Call H5Awrite to write a attribute 
 * Inputs:      attr_id - attribute identifier 
 *              mem_type_id - memory datatype identifier
 *              buf      - data buffer
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications: dims parameter added
 *                April 4, 2001 
 *---------------------------------------------------------------------------*/
int_f
nh5awrite_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, int_f *dims)
{
     int ret_value = -1;
     herr_t ret;
     hid_t c_attr_id;
     hid_t c_mem_type_id;

     /*
      * Call H5Awrite function.
      */
     c_attr_id = *attr_id;
     c_mem_type_id = *mem_type_id;
     ret = H5Awrite(c_attr_id, c_mem_type_id, buf);

     if (ret < 0) return ret_value;
     ret_value = 0;
     return ret_value;
}      

/*----------------------------------------------------------------------------
 * Name:        h5awritec_c_b
 * Purpose:     Call h5awrite_c_b to write a character  attribute
 * Inputs:      attr_id - dataset identifier 
 *              mem_type_id - memory datatype identifier
 *              buf      - character data buffer
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Tuesday, May 14, 2002
 * Modifications: This function was added to accomodate h5awrite_f call with
 *                dims buffer being of INTEGER(HSIZE_T) type
 *---------------------------------------------------------------------------*/
int_f
nh5awritec_c_b (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, hsize_t_f *dims)
{
     int ret_value = -1;
     
     /*
      * Call h5awrite_c  function.
      */
     ret_value = nh5awrite_c_b(attr_id, mem_type_id, _fcdtocp(buf), dims);

     return ret_value;
}

/*----------------------------------------------------------------------------
 * Name:        h5awrite_c_b
 * Purpose:     Call H5Awrite to write a attribute 
 * Inputs:      attr_id - attribute identifier 
 *              mem_type_id - memory datatype identifier
 *              buf      - data buffer
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Tuesday, May 14, 2002
 * Modifications: This function was added to accomodate h5awrite_f call with
 *                dims buffer being of INTEGER(HSIZE_T) type
 *---------------------------------------------------------------------------*/
int_f
nh5awrite_c_b (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, hsize_t_f *dims)
{
     int ret_value = -1;
     herr_t ret;
     hid_t c_attr_id;
     hid_t c_mem_type_id;

     /*
      * Call H5Awrite function.
      */
     c_attr_id = *attr_id;
     c_mem_type_id = *mem_type_id;
     ret = H5Awrite(c_attr_id, c_mem_type_id, buf);

     if (ret < 0) return ret_value;
     ret_value = 0;
     return ret_value;
}      



/*----------------------------------------------------------------------------
 * Name:        h5areadc_c
 * Purpose:     Call h5aread_c to read character  attribute
 * Inputs:      dset_id - dataset identifier 
 *              mem_type_id - memory datatype identifier
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Outputs:     buf      - character data buffer
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications: dims parameter added.
 *                April 4, 2001
 *---------------------------------------------------------------------------*/
int_f
nh5areadc_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, int_f *dims)
{
     int ret_value = -1;
     
     /*
      * Call h5aread_c  function.
      */
     ret_value = nh5aread_c(attr_id, mem_type_id, (_fcdtocp(buf)), dims);

     return ret_value;
}

/*----------------------------------------------------------------------------
 * Name:        h5aread_c
 * Purpose:     Call H5Araed to read an attribute 
 * Inputs:      dset_id - dataset identifier 
 *              mem_type_id - memory datatype identifier
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Outputs:     buf      - data buffer
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications: dims paramete added.
 *                April 4, 2001
 *---------------------------------------------------------------------------*/
int_f
nh5aread_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, int_f *dims)
{
     int ret_value = -1;
     herr_t ret;
     hid_t c_attr_id;
     hid_t c_mem_type_id;

     /*
      * Call H5Aread function.
      */
     c_attr_id = *attr_id;
     c_mem_type_id = *mem_type_id;
     ret = H5Aread(c_attr_id, c_mem_type_id, buf);

     if (ret < 0) return ret_value;
     ret_value = 0;
     return ret_value;
}
/*----------------------------------------------------------------------------
 * Name:        h5areadc_c_b
 * Purpose:     Call h5aread_c_b to read character  attribute
 * Inputs:      dset_id - dataset identifier 
 *              mem_type_id - memory datatype identifier
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Outputs:     buf      - character data buffer
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Tuesday, May 14, 2002
 * Modifications: This function was added to accomodate h5aread_f call with
 *                dims buffer being of INTEGER(HSIZE_T) type
 *---------------------------------------------------------------------------*/
int_f
nh5areadc_c_b (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, hsize_t_f *dims)
{
     int ret_value = -1;
     
     /*
      * Call h5aread_c  function.
      */
     ret_value = nh5aread_c_b(attr_id, mem_type_id, (_fcdtocp(buf)), dims);

     return ret_value;
}

/*----------------------------------------------------------------------------
 * Name:        h5aread_c_b
 * Purpose:     Call H5Aread to read an attribute 
 * Inputs:      dset_id - dataset identifier 
 *              mem_type_id - memory datatype identifier
 *              dims     - array to store dimensions sizes of buf; used only
 *                         by Fortran routine.
 * Outputs:     buf      - data buffer
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Tuesday, May 14, 2002
 * Modifications: This function was added to accomodate h5awrite_f call with
 *                dims buffer being of INTEGER(HSIZE_T) type
 *---------------------------------------------------------------------------*/
int_f
nh5aread_c_b (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, hsize_t_f *dims)
{
     int ret_value = -1;
     herr_t ret;
     hid_t c_attr_id;
     hid_t c_mem_type_id;

     /*
      * Call H5Aread function.
      */
     c_attr_id = *attr_id;
     c_mem_type_id = *mem_type_id;
     ret = H5Aread(c_attr_id, c_mem_type_id, buf);

     if (ret < 0) return ret_value;
     ret_value = 0;
     return ret_value;
}


/*----------------------------------------------------------------------------
 * Name:        h5aclose_c
 * Purpose:     Call H5Aclose to close an attribute 
 * Inputs:      attr_id - identifier of an attribute to be closed
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/

int_f 
nh5aclose_c ( hid_t_f *attr_id )
{
  int ret_value = 0;
  hid_t c_attr_id;
  c_attr_id = *attr_id;
  if ( H5Aclose(c_attr_id) < 0  ) ret_value = -1;
  return ret_value;
}

/*----------------------------------------------------------------------------
 * Name:        h5adelete_c
 * Purpose:     Call H5Adelete to delete an attribute 
 * Inputs:      obj_id - object identifier 
 *              name - name of the attribute     
 *              namelen - name length
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5adelete_c (hid_t_f *obj_id, _fcd name, int_f *namelen)
{
     int ret_value = -1;
     herr_t status;
     hid_t c_obj_id;
     char *c_name;
     int c_namelen;

     /*
      * Convert FORTRAN name to C name
      */
     c_namelen = *namelen;
     c_name = (char *)HD5f2cstring(name, c_namelen); 
     if (c_name == NULL) return ret_value;

     /*
      * Call H5Adelete function.
      */
     c_obj_id = *obj_id;
     status = H5Adelete(c_obj_id, c_name);

     if (status < 0) goto DONE;
     ret_value = 0;

DONE:
     HDfree(c_name);
     return ret_value;
}      


/*----------------------------------------------------------------------------
 * Name:        h5aopen_idx_c
 * Purpose:     Call H5Aopen_idx to open an attribute 
 * Inputs:      obj_id - object identifier 
 *              idx    - attribute index ( zero based)
 * Outputs:     attr_id - attribute identifier
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5aopen_idx_c (hid_t_f *obj_id, int_f *idx, hid_t_f *attr_id)
{
     int ret_value = -1;
     hid_t c_obj_id;
     hid_t c_attr_id;
     unsigned c_idx;
     c_idx = (unsigned)*idx;

     /*
      * Call H5Aopen_idx function.
      */
     c_obj_id = *obj_id;
     c_attr_id = H5Aopen_idx(c_obj_id, c_idx);

     if (c_attr_id < 0) return ret_value;
     *attr_id = (hid_t_f)c_attr_id;
     ret_value = 0;
     return ret_value;
}      


/*----------------------------------------------------------------------------
 * Name:        h5aget_space_c
 * Purpose:     Call H5Aget_space to get attribute's dataspace 
 * Inputs:      attr_id - attribute identifier 
 * Outputs:     space_id - dataspace identifier
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5aget_space_c (hid_t_f *attr_id, hid_t_f *space_id)
{
     int ret_value = -1;
     hid_t c_attr_id;
     hid_t c_space_id;

     /*
      * Call H5Aget_space function.
      */
     c_attr_id = *attr_id;
     c_space_id = H5Aget_space(c_attr_id);

     if (c_space_id < 0) return ret_value;
     *space_id = (hid_t_f)c_space_id;
     ret_value = 0;
     return ret_value;
}      

/*----------------------------------------------------------------------------
 * Name:        h5aget_type_c
 * Purpose:     Call H5Aget_space to get attribute's datatype 
 * Inputs:      attr_id - attribute identifier 
 * Outputs:     type_id - datatype identifier
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5aget_type_c (hid_t_f *attr_id, hid_t_f *type_id)
{
     int ret_value = -1;
     hid_t c_attr_id;
     hid_t c_type_id;

     /*
      * Call H5Aget_type function.
      */
     c_attr_id = *attr_id;
     c_type_id = H5Aget_type(c_attr_id);

     if (c_type_id < 0) return ret_value;
     *type_id = (hid_t_f)c_type_id;
     ret_value = 0;
     return ret_value;
}      

/*----------------------------------------------------------------------------
 * Name:        h5aget_num_attrs_c
 * Purpose:     Call H5Aget_num_attrs to determine number of 
 *              attributes of an object 
 * Inputs:      obj_id - object identifier 
 *              attr_num - number of attributes 
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5aget_num_attrs_c (hid_t_f *obj_id, int_f *attr_num)
{
     int ret_value = -1;
     hid_t c_obj_id;
     int c_attr_num;

     /*
      * Call H5Aget_num_attrs function.
      */
     c_obj_id = *obj_id;
     c_attr_num = H5Aget_num_attrs(c_obj_id);

     if (c_attr_num < 0) return ret_value;
     *attr_num = c_attr_num;
     ret_value = 0;
     return ret_value;
}      


/*----------------------------------------------------------------------------
 * Name:        h5aget_name_c
 * Purpose:     Call H5Aget_name to get attribute's name 
 * Inputs:      attr_id - attribute identifier 
 *              bufsize -size of the buffer 
 * Outputs:     buf - buffer to hold the name
 * Returns:     0 on success, -1 on failure
 * Programmer:  Elena Pourmal
 *              Thursday, August 12, 1999
 * Modifications:
 *---------------------------------------------------------------------------*/
int_f
nh5aget_name_c(hid_t_f *attr_id, size_t_f *bufsize, _fcd buf)
{
     int ret_value = -1;
     hid_t c_attr_id;
     ssize_t c_size;
     size_t c_bufsize;
     char *c_buf =NULL;

     /*
      * Allocate buffer to hold name of an attribute
      */
     c_bufsize = *bufsize;
     c_buf = (char *)HDmalloc((int)c_bufsize +1);
     if (c_buf == NULL) return ret_value; 
 
     /*
      * Call H5Aget_name function
      */
     c_attr_id = *attr_id;
     c_size = H5Aget_name(c_attr_id, c_bufsize, c_buf);
     if (c_size < 0) goto DONE;

     /*
      * Convert C name to FORTRAN and place it in the given buffer
      */
      HD5packFstring(c_buf, _fcdtocp(buf), (int)c_bufsize);
      ret_value = (int_f)c_size;

DONE:
      HDfree(c_buf);
      return ret_value;
}
