/********************************************************************/
/*
   Create a dataset with a string in it.
*/
/********************************************************************/

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

int main() {

   hid_t       file_id, dataset_id, dataspace_id;  /* identifiers */
   herr_t      status;
   char        metabuf[21];
   hsize_t     dims[1]={0}, maxdims[1]={H5S_UNLIMITED}, mdims[1]={1};
   hsize_t     dspace_id, mspace_id, cparms;
   hid_t       dtype;
   size_t      size;
   hsize_t     chkdim[1]={5};
   hsize_t     offset[1]={0}, newsize[1]={0}, count[1]={1};
   int         i;

   file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
   printf ("H5Fcreate returns: %i\n", file_id);
   dataspace_id = H5Screate_simple (1, dims, maxdims);
   printf ("H5Screate_simple returns: %i\n", dataspace_id);

   cparms = H5Pcreate (H5P_DATASET_CREATE);
   printf ("H5Pcreate: %i\n", cparms);
   status = H5Pset_chunk ( cparms, 1, chkdim);
   printf ("H5Pset_chunk: %i\n", status);
   status = H5Pset_deflate (cparms, 9);
   printf ("H5Pset_deflate: %i\n", status);

   dtype = H5Tcopy (H5T_C_S1);
   size = 21;
   status = H5Tset_size (dtype, size);
   strcpy (metabuf, "This is a string!!!! ");
   metabuf[20] = '\0';
   
   dataset_id = H5Dcreate(file_id, "strings", dtype, dataspace_id, cparms);
   printf ("H5Dcreate returns: %i\n", dataset_id);
   status = H5Sget_simple_extent_ndims (dataspace_id);
   printf ("H5Sget_simple_extent_ndims returns: %i\n", status);

   for (i=0; i<5;i++) 
   {
      offset[0] = newsize[0];
      newsize[0]=newsize[0]+1;
      status = H5Dextend (dataset_id, newsize);
      printf ("H5Dextend returns: %i\n", status);
  
      mspace_id = H5Screate_simple (1, mdims, NULL); 
      printf ("H5Screate_simple returns: %i\n", mspace_id);
      dspace_id = H5Dget_space (dataset_id);
      printf ("H5Dget_space returns: %i\n", dspace_id);

      status = H5Sselect_hyperslab (dspace_id, H5S_SELECT_SET, offset, NULL, count, NULL);
      printf ("H5Sselect_hyperslab: %i\n", status);
 
      status = H5Dwrite (dataset_id, dtype, mspace_id, dspace_id, H5P_DEFAULT, metabuf);
      printf ("H5Dwrite returns: %i\n", status);

   }
   status = H5Dclose(dataset_id);
   printf ("H5Dclose returns: %i\n", status);
   status = H5Sclose(dataspace_id);
   printf ("H5Sclose returns: %i\n", status);
   status = H5Sclose(mspace_id);
   printf ("H5Sclose returns: %i\n", status);
   status = H5Sclose(dspace_id);
   printf ("H5Sclose returns: %i\n", status);
   status = H5Pclose (cparms);
   printf ("H5Pclose returns: %i\n", status);
   status = H5Fclose(file_id);
   printf ("H5Fclose returns: %i\n", status);
}

