/*
  cenum.c -
 */

#include "hdf5.h"

#define FILE          "cmpenum.h5"
#define DATASETNAME   "Compound Array"
#define LENGTH        5 
#define PARTS         5
#define RANK          2 
#define ARRAY_SIZE    3
#define ARRAY_RANK    1 


typedef enum
{
   CLEAR,
   RED,
   GREEN,
   BLUE,
   WHITE,
   BLACK
} ColorEnum;

typedef struct sa_t {
   int d[ARRAY_SIZE];
   ColorEnum d1; 
 } data_t;

 data_t      datastuff[LENGTH][PARTS];

int
main(void)
{

    int     i, j, k;

    hsize_t offset[2]={0, 0};
    hsize_t newsize [2] = {0, 0};
    hsize_t offset_slab[] = {1};

    hsize_t count[2]= {LENGTH, PARTS};

    hsize_t dim[2] =  {LENGTH, PARTS};
    hsize_t maxdim[2] = {H5S_UNLIMITED, PARTS};
    hsize_t chkdim[2] = {LENGTH, PARTS};

    hid_t      file, dataset, memspace, space, datatype, dataspace;
    hid_t      cparms;
    hid_t      d_dtype, ColorEnumId;
    hid_t      dtype_memory;
 
    herr_t     status;
    ColorEnum  val;
    hsize_t    array_dim[] = {ARRAY_SIZE};


    /*
     * Initialize the data
     */
    for (k = 0; k< LENGTH; k++)
       for (i = 0; i< PARTS; i++) {
        for (j = 0; j < ARRAY_SIZE; j++) 
             datastuff[k][i].d[j] = 7;
        datastuff[k][i].d1 = i;
    }


    space = H5Screate_simple(RANK, dim, maxdim);
    printf ("H5Screate_simple returns: %i\n", space);

    file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    printf ("H5Fcreate returns: %i\n", file);

    ColorEnumId = H5Tcreate (H5T_ENUM, sizeof (ColorEnum));
    printf ("H5Tcreate returns: %i\n", ColorEnumId);
    val = CLEAR;
    status = H5Tenum_insert (ColorEnumId, "CLEAR", (int *)&val);
    printf ("H5Tenum_insert: %i\n", status);
    val = RED;
    status = H5Tenum_insert (ColorEnumId, "RED", (int *)&val);
    printf ("H5Tenum_insert: %i\n", status);
    val = GREEN;
    status = H5Tenum_insert (ColorEnumId, "GREEN", (int *)&val);
    printf ("H5Tenum_insert: %i\n", status);
    val = BLUE;
    status = H5Tenum_insert (ColorEnumId, "BLUE", (int *)&val);
    printf ("H5Tenum_insert: %i\n", status);
    val = WHITE;
    status = H5Tenum_insert (ColorEnumId, "WHITE", (int *)&val);
    printf ("H5Tenum_insert: %i\n", status);
    val = BLACK;
    status = H5Tenum_insert (ColorEnumId, "BLACK", (int *)&val);
    printf ("H5Tenum_insert: %i\n", status);

    d_dtype = H5Tarray_create(H5T_NATIVE_INT, ARRAY_RANK, array_dim, NULL);
    printf ("H5Tarray_create returns: %i\n", d_dtype);

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

    dtype_memory = H5Tcreate (H5T_COMPOUND, sizeof(data_t));
    printf ("H5Tcreate returns: %i\n", dtype_memory);
    status = H5Tinsert(dtype_memory, "d_name", HOFFSET(data_t, d), d_dtype);
    printf ("H5Tinsert returns: %i\n", status);
    status = H5Tinsert(dtype_memory, "enum_d1", HOFFSET(data_t, d1), ColorEnumId);
    printf ("H5Tinsert returns: %i\n", status);

    dataset = H5Dcreate(file, DATASETNAME, dtype_memory, space, cparms);
    printf ("H5Dcreate returns: %i\n", dataset);

    status = H5Dwrite(dataset, dtype_memory, H5S_ALL, H5S_ALL, H5P_DEFAULT, datastuff);
    printf ("H5Dwrite returns: %i\n", status);

    status = H5Pclose (cparms);
    printf ("H5Pclose returns: %i\n", status);
    status = H5Tclose (ColorEnumId);
    printf ("H5Tclose returns: %i\n", status);
    status = H5Tclose (dtype_memory);
    printf ("H5Tclose returns: %i\n", status);
    status = H5Tclose (d_dtype);
    printf ("H5Tclose returns: %i\n", status);
    status = H5Sclose(space);
    printf ("H5Sclose returns: %i\n", status);
    status = H5Dclose(dataset);
    printf ("H5Dclose returns: %i\n", status);
    status = H5Fclose(file);
    printf ("H5Fclose returns: %i\n", status);

    return 0;
}
