#include "hdf5.h"
#include <stdlib.h>

#define VFILE        "vlstra.h5"
#define VRANK        1
#define VDIM         4


static void write_vlstr_attr ()
{
    hid_t file, root, dataspace, att;
    hid_t type;
    herr_t ret;
    hsize_t dims[]={VDIM};
    const char *string_att[VDIM] = {"string1", 
                                    "str2", 
                                    "strings123", 
                                    "str45"};

    file = H5Fcreate(VFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    printf ("H5Fcreate returns: %i\n", file);

    /* Create a datatype to refer to. */
    type = H5Tcopy (H5T_C_S1);
    printf ("H5Tcopy returns: %i\n", type);
    
    ret = H5Tset_size (type, H5T_VARIABLE);
    printf ("H5Tset_size returns: %i\n", ret);

    root = H5Gopen(file, "/");
    printf ("H5Gopen returns: %i\n", root);

    dataspace = H5Screate_simple(VRANK, dims, NULL);
    printf ("H5Screate returns: %i\n", dataspace);

    att = H5Acreate(root, "VarStrAtt", type, dataspace, H5P_DEFAULT);
    printf ("H5Acreate returns: %i\n", att);

    ret = H5Awrite(att, type, string_att);
    printf ("H5Awrite returns: %i\n", ret);

    ret = H5Aclose(att);
    printf ("H5Aclose returns: %i\n", ret);

    ret = H5Gclose(root);
    printf ("H5Gclose returns: %i\n", ret);

    ret = H5Tclose(type);
    printf ("H5Tclose returns: %i\n", ret);

    ret = H5Sclose(dataspace);
    printf ("H5Sclose returns: %i\n", ret);

    ret = H5Fclose(file);
    printf ("H5Fclose returns: %i\n", ret);
}

static void read_vlstr_attr ()
{
    hid_t file, root, att;
    hid_t type;
    herr_t ret;
    char* string_att[VDIM];
    int i;

    file = H5Fopen(VFILE, H5F_ACC_RDONLY, H5P_DEFAULT);
    printf ("H5Fopen returns: %i\n", file);

    /* Create a datatype to refer to. */
    type = H5Tcopy (H5T_C_S1);
    printf ("H5Tcopy returns: %i\n", type);

    ret = H5Tset_size (type, H5T_VARIABLE);
    printf ("H5Tset_size returns: %i\n", ret);

    root = H5Gopen(file, "/");
    printf ("H5Gopen returns: %i\n", root);

    att = H5Aopen_name(root, "VarStrAtt");
    printf ("H5Aopen_name returns: %i\n", att);

    ret = H5Aread(att, type, string_att);
    printf ("H5Aread returns: %i\n", ret);

    printf ("Attribute Data:\n");

    for (i=0; i<VDIM; i++)
      printf (" (%i) %s\n", i, string_att[i]);
    printf ("\n");   

/*    free(string_att); This call causes core dump */
    /* Free memory allocated by the HDF5 librray */

    for (i=0; i<VDIM; i++)
      free(string_att[i]);

    ret = H5Aclose(att);
    printf ("H5Aclose returns: %i\n", ret);

    ret = H5Tclose(type);
    printf ("H5Tclose returns: %i\n", ret);

    ret = H5Gclose(root);
    printf ("H5Gclose returns: %i\n", ret);

    ret = H5Fclose(file);
    printf ("H5Fclose returns: %i\n", ret);

}

void main ()
{
    write_vlstr_attr();
    read_vlstr_attr();
}     

