/*
*/

#include "hdf5.h"

#define FILE          "uslab.h5"
#define DATASETNAME   "slab"
#define LENGTH        5 
#define RANK         3  
#define HEIGHT    1024 
#define WIDTH     1024 

int
main(void)
{

    /* First structure  and dataset*/

    hssize_t offset[3]={0, 0, 0};
    hsize_t count[3]={LENGTH, HEIGHT, WIDTH};
    int       *data, *data1;

    int        i,j, k;
    hid_t      file, dataset, memspace, space, xfer;
    herr_t     status;
    hsize_t    dim[3] = {5, HEIGHT, WIDTH};   
    hsize_t    maxdim[3] = {H5S_UNLIMITED, HEIGHT, WIDTH};   
    hid_t      cparms;
    hsize_t    chkdim[3]={5,HEIGHT, WIDTH };
    hsize_t    newsize[3]={5, HEIGHT, WIDTH};
    void       *tbuf = NULL;

    data = (int*)malloc (LENGTH*HEIGHT*WIDTH*sizeof (int));
    data1 = (int*)malloc (LENGTH*HEIGHT*WIDTH*sizeof (int));
 
    for (i=0; i<(LENGTH*HEIGHT*WIDTH); i++) {
         data[i] = 0;
         data1[i] = 1;
     }  

    /* Create the data space  */
    space = H5Screate_simple (RANK, dim, maxdim);

    /* Create the file  */
    file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    printf ("H5Fcreate: %i\n", file);

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

    tbuf = (int*) malloc (6000000);
    xfer = H5Pcreate (H5P_DATASET_XFER);
    status= H5Pset_buffer (xfer, (hsize_t)6000000, tbuf, NULL);

    /* Create the dataset  */
    dataset = H5Dcreate(file, DATASETNAME, H5T_STD_I32BE, space, cparms);
    printf ("H5Dcreate: %i\n", dataset);

    /* Create memory space for slab writes */
    memspace = H5Dget_space (dataset);
    printf ("H5Dget_space: %i\n", memspace);

    status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, data);
    printf ("H5Dwrite: %i\n", status);

    /* Loop through, extending dataset by 5 and writing values to just
       the extended portion of dataset */

    for (j=0;j<2;j++)
    {
     
       offset[0] = newsize[0]; 
       newsize[0]=newsize[0]+LENGTH;
       
       status = H5Dextend (dataset, newsize);
       printf ("H5Dextend: %i\n", status);

       space = H5Dget_space (dataset);
       printf ("H5Dget_space: %i\n", space);

       status = H5Sselect_hyperslab (space, H5S_SELECT_SET, offset, NULL,
                count, NULL);
       printf ("H5Sselect_hyperslab: %i\n", status);

       status = H5Dwrite(dataset, H5T_NATIVE_INT, memspace, space, xfer, data1);
       printf ("H5Dwrite: %i\n", status);
    }

    /* Release resources */
    status= H5Pclose (xfer);
    printf ("H5Pclose: %i\n", status);
    status= H5Pclose (cparms);
    printf ("H5Pclose: %i\n", status);
    status=H5Sclose(space);
    printf ("H5Sclose: %i\n", status);
    status=H5Sclose(memspace);
    printf ("H5Sclose: %i\n", status);
    status=H5Dclose(dataset);
    printf ("H5Dclose: %i\n", status);
    status=H5Fclose(file);
    printf ("H5Fclose: %i\n", status);

    free (tbuf);
    free (data);
    free (data1);
}
