Beispiel #1
0
// 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;
}
// 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;
}