/* 
   h5cksum: This example uses the Fletcher32 checksum algorithm
            for error detection
 */

#include "hdf5.h"
#define FILE "cksum.h5"

int main() {

   hid_t       file_id, dataset_id, dataspace_id, dxpl, property_id;
   hsize_t     dims[2];
   herr_t      status;
   hsize_t     chkdim[2] ={2,3};
   int         i, j, dset_data[4][6];
   H5Z_EDC_t   edc;
   

     /* Create the data space for the dataset. */
   dims[0] = 4;
   dims[1] = 6;
   dataspace_id = H5Screate_simple(2, dims, NULL);

   /* Initialize the dataset. */
   for (i = 0; i < 4; i++)
      for (j = 0; j < 6; j++)
         dset_data[i][j] = i * 6 + j + 1;

   /* Create a new file using default properties. */
   file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   /* Create the dataset with checksum filter */
   property_id = H5Pcreate(H5P_DATASET_CREATE);
   status = H5Pset_chunk (property_id, 2, chkdim); 
   status = H5Pset_filter (property_id, H5Z_FILTER_FLETCHER32, 0, 0, NULL);

   dataset_id = H5Dcreate (file_id, "/dset", H5T_STD_I32BE, dataspace_id, 
                           property_id);

   status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, 
                     dset_data);

   status = H5Pclose (property_id);
   status = H5Dclose(dataset_id);
   status = H5Fclose(file_id);

   file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT);
   dataset_id = H5Dopen (file_id, "/dset");

   dxpl = H5Pcreate (H5P_DATASET_XFER);
   edc = H5Pget_edc_check (dxpl);
   if (edc == 1) printf ("Checksum is enabled\n");
   if (edc == 0) printf ("Checksum is disabled\n");

   status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, 
                    dset_data);
   printf ("H5Dread returns: %i\n", status); 

   status = H5Pclose (dxpl);
   status = H5Dclose(dataset_id);
   status = H5Fclose(file_id);


}
