// Open all external files and store the id char AH5_open_external_files(AH5_eet_dataset_t *eet_dataset) { char success = AH5_TRUE; hid_t file_id; hid_t *buf_id; AH5_set_t buf; hsize_t i; char const* name; hsize_t id = 0; size_t fpath_size; char* fpath; AH5_init_set(&buf); buf_id = malloc(eet_dataset->nb_eed_items * sizeof(hid_t)); // temporary buffer containing file_id for (i = 0; i < eet_dataset->nb_eed_items; ++i) { name = eet_dataset->eed_items[AH5_EE_EXTERNAL_FILE_NAME(i)]; // copy of the pointer (shorter expression) if (AH5_index_in_set(&buf, name, &id) == AH5_FALSE) // avoid multiple opening { fpath_size = AH5_file_path_next_to(eet_dataset->principle_file_path, name, NULL, 0); fpath = malloc(fpath_size); AH5_file_path_next_to(eet_dataset->principle_file_path, name, fpath, fpath_size); if (ACCESS(fpath, F_OK | R_OK) != -1) { file_id = H5Fopen(fpath, H5F_ACC_RDONLY, H5P_DEFAULT); } else { file_id = -1; } free(fpath); AH5_add_to_set(&buf, name); buf_id[buf.nb_values - 1] = file_id; eet_dataset->file_id[i] = file_id; // write new file_id into the ext_elt structure if (file_id < 0) { printf("***** ERROR(%s): Cannot open file \"%s\". *****\n\n", AH5_C_EXTERNAL_ELEMENT, name); success = AH5_FALSE; } } else { eet_dataset->file_id[i] = buf_id[id]; // write existing file_id into the ext_elt structure } } AH5_free_set(&buf); free(buf_id); return success; }
// Print dataset in externalElement void AH5_print_eet_dataset (const AH5_eet_dataset_t *eet_dataset, int space) { hsize_t i; printf("%*sInstance: %s\n", space, "", AH5_get_name_from_path(eet_dataset->path)); for (i = 0; i < eet_dataset->nb_eed_items; i++) { printf("%*sId %lu:\n", space + 3, "", (long unsigned) i); printf("%*s-internal: %s\n", space + 6, "", eet_dataset->eed_items[AH5_EE_INTERNAL_NAME(i)]); printf("%*s-external: %s:%s\n", space + 6, "", eet_dataset->eed_items[AH5_EE_EXTERNAL_FILE_NAME(i)], eet_dataset->eed_items[AH5_EE_EXTERNAL_NAME(i)]); printf("%*s-file_id: %i\n\n", space + 6, "",eet_dataset->file_id[i]); } }
// Open all external files and store the id char AH5_open_external_files(AH5_eet_dataset_t *eet_dataset) { char success = AH5_TRUE; hid_t file_id; hid_t *buf_id; AH5_set_t buf = {NULL, 0}; hsize_t i; char *name; hsize_t id = 0; buf_id = (hid_t*) malloc(eet_dataset->nb_eed_items * sizeof(hid_t)); // temporary buffer containing file_id buf.values = (char **) malloc(eet_dataset->nb_eed_items * sizeof(char*)); // temporary buffer containing paths for (i = 0; i < eet_dataset->nb_eed_items; i++) { name = eet_dataset->eed_items[AH5_EE_EXTERNAL_FILE_NAME(i)]; // copy of the pointer (shorter expression) if (!AH5_index_in_set(buf, name, &id)) // avoid multiple opening { if (access(name, R_OK) != -1 ) { file_id = H5Fopen(name, H5F_ACC_RDONLY, H5P_DEFAULT); } else { file_id = -1; } buf = AH5_add_to_set(buf, name); // new memory allocation!!! buf_id[buf.nb_values - 1] = file_id; eet_dataset->file_id[i] = file_id; // write new file_id into the ext_elt structure if (file_id < 0) { printf("***** ERROR(%s): Cannot open file \"%s\". *****\n\n", AH5_C_EXTERNAL_ELEMENT, name); success = AH5_FALSE; } } else { eet_dataset->file_id[i] = buf_id[id]; // write existing file_id into the ext_elt structure } } for (i = 0; i < buf.nb_values; i++) { free(buf.values[i]); } free(buf.values); free(buf_id); return success; }