hid_t CreateTestFile() { hid_t fid; herr_t status; char ah5_status; hid_t label_grp; hid_t link_grp; hid_t links; hid_t link; char *labels[2] = {"label subject", "label object"}; fid = H5Fcreate(TEST_FILE, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT); if (fid < 0) return fid; // Create nodes label_grp = H5Gcreate(fid, "label", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (label_grp < 0) return label_grp; link_grp = H5Gcreate(fid, "link", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (link_grp < 0) return link_grp; links = H5Gcreate(link_grp, "link", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (links < 0) return links; link = H5Gcreate(links, "link_instance_0", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (link < 0) return link; // Label array. ah5_status = AH5_write_str_dataset(label_grp, "link", 2, 14, (char** const)labels); if (ah5_status != AH5_TRUE) return -1; // link attribute.s status = AH5_write_str_attr(link, ".", "object", "/label/link"); if (status < 0) return status; status = AH5_write_int_attr(link, ".", "object_id", 1); if (status < 0) return status; status = AH5_write_str_attr(link, ".", "subject", "/label/link"); if (status < 0) return status; status = AH5_write_int_attr(link, ".", "subject_id", 0); if (status < 0) return status; status = AH5_write_flt_attr(link, ".", "my attr", 1.1); if (status < 0) return status; // Release nodes status = H5Gclose(label_grp); if (status < 0) return status; status = H5Gclose(link); if (status < 0) return status; status = H5Gclose(links); if (status < 0) return status; status = H5Gclose(link_grp); if (status < 0) return status; return fid; }
char *test_write_string_dataset() { #define DIM0 4 #define SDIM 8 hid_t file_id, filetype, memtype, space, dset; size_t sdim; hsize_t dims[1] = {DIM0}; int ndims, i, j; /*char wdata[DIM0][SDIM] =*/ char *wdata[] = {"Parting", "is such", "sweet ", "sorrow."}; char **rdata; // Write a simple mesh test. file_id = AH5_auto_test_file(); mu_assert("Write string dataset.", AH5_write_str_dataset(file_id, "dataset_name", DIM0, SDIM, wdata)); // Test the written data using hdf5 API. dset = H5Dopen(file_id, "/dataset_name", H5P_DEFAULT); filetype = H5Dget_type(dset); sdim = H5Tget_size(filetype); space = H5Dget_space(dset); ndims = H5Sget_simple_extent_dims(space, dims, NULL); rdata = (char **) malloc(dims[0] * sizeof (char *)); rdata[0] = (char *) malloc(dims[0] * sdim * sizeof (char)); for (i=1; i<dims[0]; i++) rdata[i] = rdata[0] + i * sdim; memtype = H5Tcopy(H5T_C_S1); mu_assert("HDF5 error in H5Tset_size.", H5Tset_size(memtype, sdim) >= 0); mu_assert("HDF5 error in H5Dread.", H5Dread(dset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]) >= 0); for (i = 0; i < dims[0]; i++) { printf("%s %s\n", wdata[i], rdata[i]); /*mu_assert_str_equal("Check the first str dataset values.", wdata[i], rdata[i]);*/ j = 0; while (wdata[i][j] != ' ' && wdata[i][j] != '\0') { mu_assert_equal("Check the first str dataset values.", wdata[i][j], rdata[i][j]); ++j; } } // Release resources. free(rdata[0]); free(rdata); mu_assert("HDF5 error in H5Dclose.", H5Dclose(dset) >= 0); mu_assert("HDF5 error in H5Sclose.", H5Sclose(space) >= 0); mu_assert("HDF5 error in H5Tclose.", H5Tclose(filetype) >= 0); mu_assert("HDF5 error in H5Tclose.", H5Tclose(memtype) >= 0); // Write a string dataset using strlen. mu_assert("Write string dataset using strlen.", AH5_write_str_dataset(file_id, "dataset_name_2", DIM0, strlen(wdata[0]) + 1, wdata)); // Test the written data using hdf5 API. dset = H5Dopen(file_id, "/dataset_name", H5P_DEFAULT); filetype = H5Dget_type(dset); sdim = H5Tget_size(filetype); space = H5Dget_space(dset); ndims = H5Sget_simple_extent_dims(space, dims, NULL); rdata = (char **) malloc(dims[0] * sizeof (char *)); rdata[0] = (char *) malloc(dims[0] * sdim * sizeof (char)); for (i=1; i<dims[0]; i++) rdata[i] = rdata[0] + i * sdim; memtype = H5Tcopy(H5T_C_S1); mu_assert("HDF5 error in H5Tset_size.", H5Tset_size(memtype, sdim) >= 0); mu_assert("HDF5 error in H5Dread.", H5Dread(dset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]) >= 0); for (i = 0; i < dims[0]; i++) { /*mu_assert_str_equal("Check the first str dataset values.", wdata[i], rdata[i]);*/ j = 0; while (wdata[i][j] != ' ' && wdata[i][j] != '\0') { mu_assert_equal("Check the first str dataset values.", wdata[i][j], rdata[i][j]); ++j; } } // Release resources. free(rdata[0]); free(rdata); mu_assert("HDF5 error in H5Dclose.", H5Dclose(dset) >= 0); mu_assert("HDF5 error in H5Sclose.", H5Sclose(space) >= 0); mu_assert("HDF5 error in H5Tclose.", H5Tclose(filetype) >= 0); mu_assert("HDF5 error in H5Tclose.", H5Tclose(memtype) >= 0); // Close file. AH5_close_test_file(file_id); return MU_FINISHED_WITHOUT_ERRORS; }