/*
 *   Creating datasets with bitfields and opaque types.
 */

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

main() {

   hid_t       file_id, dset_id, space_id;  /* identifiers */
   hid_t       type_id, grp_id;
   hsize_t     dims[2];
   herr_t      status;
   size_t      i;
   hsize_t     nelmts;
   unsigned char   buf[32];

   /* Create a new file using default properties. */
   file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   grp_id = H5Gcreate(file_id, "typetests", 0);
   printf ("H5Gcreate returns: %i\n", grp_id);

   printf ("\nCreate bitfield_1 datatype.\n");

   nelmts = sizeof(buf);

   type_id = H5Tcopy(H5T_STD_B8LE);
   printf ("H5Tcopy returns: %i\n", type_id);

   space_id = H5Screate_simple (1, &nelmts, NULL);
   printf ("H5Screate_simple returns: %i\n", space_id);
   dset_id=H5Dcreate(grp_id, "bitfield_1", type_id, space_id, H5P_DEFAULT);
   printf ("H5Dcreate returns: %i\n", dset_id);

   for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i
;
   status = H5Dwrite (dset_id, type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
   printf ("H5Dwrite returns: %i\n", status);
   status = H5Sclose (space_id);
   printf ("H5Sclose returns: %i\n", status);
   status = H5Tclose(type_id);
   printf ("H5Tclose returns: %i\n", status);
   status = H5Dclose (dset_id);
   printf ("H5Dclose returns: %i\n", status);
   
   printf ("\nCreate bitfield_2 datatype.\n");
   nelmts = sizeof(buf)/2;

   type_id = H5Tcopy(H5T_STD_B16LE);
   printf ("H5Tcopy returns: %i\n", type_id);
   space_id = H5Screate_simple(1, &nelmts, NULL);
   printf ("H5Screate_simple returns: %i\n", space_id);
   dset_id = H5Dcreate(grp_id, "bitfield_2", type_id, space_id, H5P_DEFAULT);
   printf ("H5Dcreate returns: %i\n", dset_id);

   for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i
;

   status = H5Dwrite(dset_id, type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
   printf ("H5Dwrite returns: %i\n", status);
   status = H5Sclose (space_id);
   printf ("H5Sclose returns: %i\n", status);
   status = H5Tclose(type_id);
   printf ("H5Tclose returns: %i\n", status);
   status = H5Dclose (dset_id);
   printf ("H5Dclose returns: %i\n", status);

   printf ("\nCreate opaque_1 datatype.\n");
   nelmts = sizeof(buf);
   type_id = H5Tcreate(H5T_OPAQUE, 1);
   printf ("H5Tcreate returns: %i\n", type_id);
   status = H5Tset_tag(type_id, "testing 1-byte opaque type");
   printf ("H5Tset_tag returns: %i\n", status);

   space_id = H5Screate_simple(1, &nelmts, NULL);
   printf ("H5Screate_simple returns: %i\n", space_id);
   dset_id = H5Dcreate(grp_id, "opaque_1", type_id, space_id, H5P_DEFAULT);
   printf ("H5Dcreate returns: %i\n", dset_id);
   for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i
;
   status = H5Dwrite(dset_id, type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
   printf ("H5Dwrite returns: %i\n", status);
   status = H5Sclose (space_id);
   printf ("H5Sclose returns: %i\n", status);
   status = H5Tclose(type_id);
   printf ("H5Tclose returns: %i\n", status);
   status = H5Dclose (dset_id);
   printf ("H5Dclose returns: %i\n", status);

   printf ("\nCreate opaque_2 datatype.\n");
   nelmts = sizeof(buf)/4;
   type_id = H5Tcreate (H5T_OPAQUE, 4);
   printf ("H5Tcreate returns: %i\n", type_id);
   status = H5Tset_tag(type_id, "testing 4-byte opaque type");
   printf ("H5Tset_tag returns: %i\n", status);

   space_id = H5Screate_simple(1, &nelmts, NULL);
   printf ("H5Screate_simple returns: %i\n", space_id);
   dset_id = H5Dcreate (grp_id, "opaque_2", type_id, space_id, H5P_DEFAULT);
   printf ("H5Dcreate returns: %i\n", dset_id);
   for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i
;
   status = H5Dwrite(dset_id, type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
   printf ("H5Dwrite returns: %i\n", status);
   status = H5Sclose (space_id);
   printf ("H5Sclose returns: %i\n", status);
   status = H5Tclose(type_id);
   printf ("H5Tclose returns: %i\n", status);
   status = H5Dclose (dset_id);
   printf ("H5Dclose returns: %i\n", status);

   status = H5Gclose (grp_id);
   printf ("H5Gclose returns: %i\n", status);
   status = H5Fclose (file_id);
   printf ("H5Fclose returns: %i\n", status);
   
}

