/*
 *   Creating a dataset attribute.
 */

#include "hdf5.h"
#define FILE "dset.h5"

herr_t attr_info(hid_t loc_id, const char *name, void *opdata);

main() {

   hid_t       file_id, dataset_id, attribute_id, attribute_id2, dataspace_id;
   hsize_t     dims[2];
   hsize_t     dimsa;
   int         attr_data[2];
   herr_t      status;
   unsigned    start;
   int         count;

/***************************************
 Create file and dataset and close  
***************************************/

  file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   dims[0] = 4;
   dims[1] = 6;
   dataspace_id = H5Screate_simple (2, dims, NULL);

   dataset_id = H5Dcreate (file_id, "/dset", H5T_STD_I32BE, dataspace_id, 
                           H5P_DEFAULT);

   status = H5Dclose (dataset_id);
   status = H5Sclose (dataspace_id);
   status = H5Fclose (file_id);

/********************************************
 Reopen file and add two attributes to it. 
 Iterate through attributes.
********************************************/

   /* Initialize the attribute data. */
   attr_data[0] = 100;
   attr_data[1] = 200;

   /* Open an existing file. */
   file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT);

   /* Open an existing dataset. */
   dataset_id = H5Dopen(file_id, "/dset");

   /* Create the data space for the attribute. */
   dimsa = 2;
   dataspace_id = H5Screate_simple(1, &dimsa, NULL);

   /* Create a dataset attribute. */
   attribute_id = H5Acreate(dataset_id, "Units", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT);
   attribute_id2 = H5Acreate(dataset_id, "Units2", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT);

   /* Write the attribute data. */
   status = H5Awrite(attribute_id, H5T_NATIVE_INT, attr_data);
   status = H5Awrite(attribute_id2, H5T_NATIVE_INT, attr_data);

   /* Close the attributes. */
   status = H5Aclose(attribute_id);
   status = H5Aclose(attribute_id2);

   /* Close the dataspace. */
   status = H5Sclose(dataspace_id);

   status = H5Aget_num_attrs(dataset_id);
   printf ("H5Aget_num_attrs returns: %i\n", status);

   status = H5Aiterate(dataset_id,NULL ,attr_info, NULL);
   printf ("\nH5Aiterate returns: %i\n", status);

   /* Close to the dataset. */
   status = H5Dclose(dataset_id);

   /* Close the file. */
   status = H5Fclose(file_id);
}


/****************************************************************
**
**  attr_info(): Attribute operator
**
****************************************************************/
herr_t attr_info(hid_t loc_id, const char *name, void *opdata)

{
    herr_t ret=0;
    hid_t attr, atype, aspace;
    int   rank;
    hsize_t sdim[64];
    int i;

    attr = H5Aopen_name(loc_id, name);
    printf("\n");
    printf("Name : ");
    puts(name);

    atype  = H5Aget_type(attr);
    aspace = H5Aget_space(attr);
    rank = H5Sget_simple_extent_ndims(aspace);
    ret = H5Sget_simple_extent_dims(aspace, sdim, NULL);

    if(rank > 0) {
       printf("Rank : %d \n", rank);
       printf("Dimension sizes : ");
       for (i=0; i< rank; i++) printf("%d ", (int)sdim[i]);
       printf("\n");
    }

    ret = H5Tclose(atype);
    ret = H5Sclose(aspace);
    ret = H5Aclose(attr);

    return(ret);

} /* end attr_info() */
