diff options
author | Paul Harten <pharten@ncsa.uiuc.edu> | 1998-11-21 20:14:09 (GMT) |
---|---|---|
committer | Paul Harten <pharten@ncsa.uiuc.edu> | 1998-11-21 20:14:09 (GMT) |
commit | c43b9183ccf64b8a8dae444029863ee61397901d (patch) | |
tree | 1eb9bcb1256eb079b91e2b0e0a3b6a7c571ae22b /tools/h5toh4.c | |
parent | 8ef8c8b29094eb72ed0a90dc2915012f5f6d9e9f (diff) | |
download | hdf5-c43b9183ccf64b8a8dae444029863ee61397901d.zip hdf5-c43b9183ccf64b8a8dae444029863ee61397901d.tar.gz hdf5-c43b9183ccf64b8a8dae444029863ee61397901d.tar.bz2 |
[svn-r942] PURPOSE:
New Feature
SOLUTION:
h5toh4 is an H5 utility which converts HDF5 files into
HDF4 files. It converts only those H5 objects which have
have mappings into H4 objects.
Some H5 objects that may be converted into H4 objects are:
1) H5 group objects may be converted into H4 Vgroup objects.
2) H5 dataset objects of integer or floating point datatype
may be converted into H4 SDS objects.
3) H5 dataset objects of compound datatype and rank 1 may
be converted into H4 Vdata objects. Field members of the
compound datatype are constrained to be single dimensional.
Platforms tested:
Solaris2.5, HP10.20
Diffstat (limited to 'tools/h5toh4.c')
-rw-r--r-- | tools/h5toh4.c | 1407 |
1 files changed, 1407 insertions, 0 deletions
diff --git a/tools/h5toh4.c b/tools/h5toh4.c new file mode 100644 index 0000000..e44a339 --- /dev/null +++ b/tools/h5toh4.c @@ -0,0 +1,1407 @@ + + +/****************************************************************************** + + Description: This file contains routines to translate H5 files to H4 files. + + Author: Paul Harten for the University of Illinois, NCSA + + Creation Date: 04 October 1998 + + History: + + +*****************************************************************************/ + +#include <stdio.h> +#include <sys/fcntl.h> +#include <sys/errno.h> +#include <string.h> + +#include <h5toh4.h> + +extern int PrintOptions_h5toh4(void); +extern char *BuildFilename(char *h5_filename, char *h4_extension); +extern int test_file(char *filename, int oflag, mode_t mode); +extern int test_dir(char *); +extern int h5toh4(char *, char *); + +extern herr_t convert_group(hid_t, char *, op_data_t *); +extern herr_t convert_dataset(hid_t, char *, op_data_t *); +extern herr_t convert_all(hid_t, char *, op_data_t *); +extern herr_t convert_attr(hid_t, char *, op_data_t *); +extern int32 h5type_to_h4type(hid_t); +extern hid_t h4type_to_memtype(int32); + +extern void init_table(void); +extern void free_table(void); +extern void dump_tables(void); +extern herr_t find_shared_objs(hid_t , char *, void *); + +extern int optind; +extern void perror(const char *); +extern int errno; + +typedef herr_t (*H5G_operator_t)(hid_t, const char*, void*); + + +/***************************************************************************** + + Routine: main() + + Description: This routine check out arguments sent, makes sure everything is + ok, chooses between the acceptable argument formats and then + calls h5toh4(). + + Input: arg - the number of arguments from the call + 1; + argv - a pointer to an array of strings which are the arguments. + This includes the routine name as the first string. + + Output: function return - error status + +*****************************************************************************/ + +int +main(int argc, char **argv) +{ + char **fargv; + char *h5_filename, *h4_filename; + char *h4_extension = "hdf"; + int status = 0; + int status2 = 0; + + fargv = argv + optind; + argc -= optind; + + if (argc == 0) { + fprintf(stderr,"\nError: Invalid Arguments\n"); + PrintOptions_h5toh4(); + return -1; + } + + while ( *fargv != NULL ) { + if ( strcmp(*fargv,"-h") == 0 ) { + PrintOptions_h5toh4(); + return -1; + } + fargv++; + } + + fargv = argv + optind; + + if (argc == 2 && strcmp(*fargv,"-m") == 0) { + fargv++; + argc--; + } + + switch(argc) { + + case 0: + + PrintOptions_h5toh4(); + break; + + case 1: /* h5toh4 file1 */ + h5_filename = *fargv; + + if (strcmp(h5_filename,"-m") == 0) { + fprintf(stderr,"\nError: Invalid Arguments\n"); + PrintOptions_h5toh4(); + status = -1; + break; + } + if (test_file(h5_filename,O_EXCL,292) != 0 ) { /* 292 Decimal - 0444 Octal, a+r */ + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + if (test_dir(h5_filename) != 0 ) { + fprintf(stderr,"%s: Is a directory\n",h5_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + + h4_filename = BuildFilename(h5_filename,h4_extension); + if (h4_filename == NULL) { + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + + if (test_file(h4_filename,O_CREAT|O_EXCL,436) != 0) { /* 436 Decimal - 0664 Octal, ug+rw,o+r */ + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + + status = h5toh4(h5_filename, h4_filename); + if ( status != 0 ) { + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + } + HDfree(h4_filename); + + break; + + case 2: /* h5toh4 file_in file_out */ + h5_filename = *fargv++; + h4_filename = *fargv++; + + if (strcmp(h4_filename,"-m") == 0) { + fprintf(stderr,"\nError: Invalid Arguments\n"); + PrintOptions_h5toh4(); + status = -1; + break; + } + if (test_file(h5_filename,O_EXCL,292) != 0 ) { /* 292 Decimal - 0444 Octal, a+r */ + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + if (test_dir(h5_filename) != 0 ) { + fprintf(stderr,"%s: Is a directory\n",h5_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + if (test_file(h4_filename,O_CREAT|O_RDWR,436) != 0) { /* 436 Decimal - 0664 Octal, ug+rw,o+r */ + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + if (test_dir(h4_filename) != 0 ) { + fprintf(stderr,"%s: Is a directory\n",h4_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status = -1; + break; + } + + status = h5toh4(h5_filename, h4_filename); + if ( status != 0 ) { + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + } + break; + + default: /* h5toh4 -m file1 file2 file3 ... */ + if (strcmp(*fargv++,"-m") != 0) { + fprintf(stderr,"\nError: Invalid Arguments\n"); + PrintOptions_h5toh4(); + status = -1; + break; + } + + while ( (h5_filename = *fargv++) != NULL ) { + + if (strcmp(h5_filename,"-m") == 0) { + fprintf(stderr,"\nError: Invalid Arguments\n"); + PrintOptions_h5toh4(); + status2 = -1; + break; + } + if (test_file(h5_filename,O_EXCL,292) != 0 ) { /* 292 Decimal - 0444 Octal, a+r */ + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status2 = -1; + continue; + } + if (test_dir(h5_filename) != 0 ) { + fprintf(stderr,"%s: Is a directory\n",h5_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status2 = -1; + continue; + } + + h4_filename = BuildFilename(h5_filename,h4_extension); + if (h4_filename == NULL) { + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status2 = -1; + continue; + } + + if (test_file(h4_filename,O_CREAT|O_EXCL,436) != 0) { /* 436 Decimal - 0664 Octal, ug+rw,o+r */ + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status2 = -1; + continue; + } + + status = h5toh4(h5_filename, h4_filename); + if ( status != 0 ) { + fprintf(stderr,"Error: Problem with %s\n",h5_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "main", __FILE__, __LINE__); + status2 = status; + } + HDfree(h4_filename); + + } + status = status2; + break; + } + + return status; + +} + + +/***************************************************************************** + + Routine: PrintOptions_h5toh4() + + Description: This routine prints the acceptable argument formats out to stderr. + + Input: None + + Output: output to stderr + +*****************************************************************************/ + +int PrintOptions_h5toh4() +{ + fprintf(stderr,"\nh5toh4 -h (gives this print-out)\n"); + fprintf(stderr,"h5toh4 file.h5 file.hdf\n"); + fprintf(stderr,"h5toh4 file.h5\n"); + fprintf(stderr,"h5toh4 -m file1.h5 file2.h5 ...\n\n"); + return (SUCCEED); +} + + +/***************************************************************************** + + Routine: h5toh4() + + Description: This routine translates information from a HDF5 file into a + HDF4 file. + + Input: h5_filename - filename of HDF5 file, + h4_filename - filename of HDF4 file + + Output: function return - error status + +*****************************************************************************/ + +int h5toh4(h5_filename, h4_filename) + char *h5_filename; + char *h4_filename; +{ + + hid_t fid, gid; + hid_t plist=H5P_DEFAULT; + int status = 0; + int32 hfile_id; + int32 sd_id; + op_data_t op_data; + void *edata; + hid_t (*func)(void*); + + /* open hdf5 file */ + if ((fid = H5Fopen (h5_filename, H5F_ACC_RDONLY, plist)) <= 0) { + fprintf(stderr,"Error: Unable to open file %s\n",h5_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + return (fid); + } + + /* open root group */ + if ((gid = H5Gopen (fid, "/")) <= 0 ) { + fprintf(stderr,"Error: Unable to open root group\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + return (gid); + } else { + + /* open hdf4 file */ + if ((hfile_id = Hopen(h4_filename, DFACC_CREATE, 0)) <= 0) { + fprintf(stderr,"Error: Unable to open file %s\n", h4_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + return (hfile_id); + } else { + + if ((sd_id = SDstart(h4_filename, DFACC_RDWR)) <= 0) { + fprintf(stderr,"Error: Unable to open file %s, using SDstart\n", h4_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + return (sd_id); + } else { + + /* Initialize Vgroup interface */ + if ((status = Vstart(hfile_id)) != SUCCEED) { + fprintf(stderr,"Error: Unable to initialize Vgroup interface\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + status = FAIL; + } + + /* allocate and initialize internal data structure */ + init_table(); + + /* Disable error reporting */ + H5Eget_auto (&func, &edata); + H5Eset_auto (NULL, NULL); + + /* find all shared objects */ + if ((status = H5Giterate(fid, "/", NULL, (H5G_operator_t)find_shared_objs, NULL)) != SUCCEED ) { + fprintf(stderr,"Error: Unable to iterate over all of the groups\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + } + + /* Enable error reporting */ + H5Eset_auto (func, edata); + +#ifdef H5DUMP_DEBUG + dump_tables(); +#endif + + if (status != SUCCEED) { + fprintf(stderr,"Error: internal error! \n"); + goto done; + } + + op_data.hfile_id = hfile_id; + op_data.sd_id = sd_id; + op_data.vgroup_id = 0; + + /* start at root group */ + if (( status = convert_group (gid, "/", &op_data)) != SUCCEED) { + fprintf(stderr,"Error: convert_group did not work for %s\n","/"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + status = FAIL; + } + + /* Terminate access to Vgroup interface */ + if ((status = Vend(hfile_id)) != SUCCEED) { + fprintf(stderr,"Error: Unable to terminate Vgroup interface\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + status = FAIL; + } + } + + /* close hdf4 SDS */ + if ((status = SDend(sd_id)) != SUCCEED) { + fprintf(stderr,"Error: Unable to close file %s, from SDstart\n", h4_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + status = FAIL; + } + + } + + /* close hdf4 file */ + if ((status = Hclose(hfile_id)) != SUCCEED) { + fprintf(stderr,"Error: Unable to close file %s\n", h4_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + status = FAIL; + } + + } + + if ((status = H5Gclose (gid)) != SUCCEED) { + fprintf(stderr,"Error: Unable to close root group\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + status = FAIL; + } + + if ((status = H5Fclose (fid)) != SUCCEED) { + fprintf(stderr,"Error: Unable to close file %s\n", h5_filename); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "h5toh4", __FILE__, __LINE__); + status = FAIL; + } + +done: + + free_table(); + + return status; + +} + +/*------------------------------------------------------------------------- + * Function: convert_group + * + * Purpose: Dump everything within the specified group + * + * Return: void + * + * Programmer: Paul Harten + * + * Modifications: + * + *-----------------------------------------------------------------------*/ +herr_t +convert_group (hid_t gid, char *name, op_data_t *op_data) { +H5G_stat_t statbuf; + + int32 hfile_id; + int32 vgroup_id; + int32 obj_idx; + int32 status; + + hfile_id = op_data->hfile_id; + + if ((vgroup_id = Vattach(hfile_id, -1, "w")) <= 0 ) { + fprintf(stderr,"Error: Unable to create new vgroup\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + return(vgroup_id); + } + + if ((status = Vsetname(vgroup_id, name)) != SUCCEED ) { + fprintf(stderr,"Error: Unable to set name on new vgroup\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + return(status); + } + + if ((status = Vsetclass(vgroup_id, "HDF5")) != SUCCEED ) { + fprintf(stderr,"Error: Unable to set class on new vgroup\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + return(status); + } + + if (op_data->vgroup_id == 0) { + obj_idx = -1; /* Indexes assigned below start from 0 */ + } else { + if ((obj_idx = Vinsert(op_data->vgroup_id, vgroup_id)) < 0) { + fprintf(stderr,"Error: Index %d of the new vgroup is illegal\n",(int)obj_idx); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + return(obj_idx); + } + } + op_data->vgroup_id = vgroup_id; + op_data->sds_id = 0; + op_data->vdata_id = 0; + op_data->obj_idx = obj_idx; + + + /* hard link */ + if ((status = H5Gget_objinfo(gid, ".", TRUE, &statbuf)) != SUCCEED ) { + fprintf(stderr,"Error: H5Gget_objinfo() did not work\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + return (status); + } + + if ((status = H5Aiterate(gid, NULL, (H5G_operator_t)convert_attr, op_data)) != SUCCEED ) { + fprintf(stderr,"Error: Unable to iterate over all of the attributes\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + status = FAIL; + } + + if ((status = H5Giterate(gid, ".", NULL, (H5G_operator_t)convert_all, op_data)) != SUCCEED ) { + fprintf(stderr,"Error: Unable to iterate over all of the groups\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + status = FAIL; + } + + if ((status = Vdetach(vgroup_id)) != SUCCEED ) { + fprintf(stderr,"Error: Unable to detach the new Vgroup\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_group", __FILE__, __LINE__); + status = FAIL; + } + + return status; + +} + + +/*------------------------------------------------------------------------- + * Function: convert_dataset + * + * Purpose: Dump the specified data set + * + * Return: void + * + * Programmer: Paul Harten + * + * Modifications: + * + *-----------------------------------------------------------------------*/ +herr_t +convert_dataset (hid_t did, char *name, op_data_t *op_data) { +hid_t type, space, class, mem_type, type2; +H5G_stat_t statbuf; +size_t typesize; +int i, idx; +int32 dim_sizes[32], start[32], edges[32]; +int ndims; +int ndimf; +hsize_t dims[32], maxdims[32]; +size_t dimf[4]; +int permf[4]; +int32 hfile_id; +int32 sd_id; +int32 sds_id; +int32 vdata_id; +int32 n_values; +int32 status; +int32 h4_type; +int32 recsize; +int32 n_records, num_of_recs, record_pos; +intn nmembers; +char *buffer; /* read/write buffer*/ +char fieldname_list[4096] = "\0"; +char *fieldname; +hid_t fieldtype; +int32 order; +off_t offset; + + sd_id = op_data->sd_id; + + /* hard link */ + if ((status = H5Gget_objinfo(did, ".", TRUE, &statbuf)) != SUCCEED ) { + fprintf(stderr,"Error: H5Gget_objinfo() did not work\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + return (status); + } + + if ((type = H5Dget_type(did)) <= 0) { + fprintf(stderr, "Error: H5Dget_type() didn't return appropriate value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + return status; + } + + if ((space = H5Dget_space(did)) <= 0) { + fprintf(stderr, "Error: H5Dget_space() didn't return appropriate value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + return status; + } + + if ((n_values = H5Sget_simple_extent_npoints(space)) <= 0) { + fprintf(stderr, "Error: H5Sget_simple_extent_npoints() returned inappropriate value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + return status; + } + + if ((ndims = H5Sget_simple_extent_dims(space,dims,maxdims)) < 0 ) { + fprintf(stderr, "Error: Problems getting ndims, dims, and maxdims of dataset\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = ndims; + return status; + } + + if ((class = H5Tget_class(type)) < 0 ) { + fprintf(stderr,"Error: problem with getting class\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = class; + return status; + } + + switch (class) { + case H5T_INTEGER: + case H5T_FLOAT: + if ((h4_type = h5type_to_h4type(type)) == FAIL ) { + fprintf(stderr, "Error: Problems translating h5 type to h4 type\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + if ((mem_type = h4type_to_memtype(h4_type)) == FAIL ) { + fprintf(stderr, "Error: Problems translating h4 type to mem type\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + return status; + } + if ((typesize = H5Tget_size(mem_type)) <= 0) { + fprintf(stderr, "Error: H5Tget_size() didn't return appropriate value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + if ((buffer = HDmalloc(n_values*typesize)) == NULL) { + fprintf(stderr, "Error: Problems with HDmalloc of memory space\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + if ((status = H5Dread(did, mem_type, space, space, H5P_DEFAULT, buffer)) != SUCCEED) { + fprintf(stderr, "Error: Problems with H5Aread\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + for (i=0;i<ndims;i++) { + if (i==0) { + dim_sizes[i] = (int32)maxdims[i]; + } else if (maxdims[i] == 0) { + dim_sizes[i] = (int32)dims[i]; + } else { + dim_sizes[i] = (int32)maxdims[i]; + } + start[i] = 0; + edges[i] = (int32)dims[i]; + } + if ((sds_id = SDcreate(sd_id, name, h4_type, ndims, dim_sizes)) <= 0 ) { + fprintf(stderr, "Error: Unable to create SDS %s.\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + op_data->sds_id = sds_id; + if ((status = SDwritedata(sds_id, start, NULL, edges, buffer)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to write SDS %s.\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + } + if ((status = H5Aiterate(did, NULL, (H5G_operator_t)convert_attr, op_data)) < 0 ) { + fprintf(stderr,"Error: iterate over attributes\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + } + if ((status = SDendaccess(sds_id)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to end access to SDS %s.\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + } + break; + case H5T_TIME: + fprintf(stderr,"Error: H5T_TIME not yet implemented.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + case H5T_STRING: + fprintf(stderr,"Error: H5T_STRING not yet implemented.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + case H5T_BITFIELD: + fprintf(stderr,"Error: H5T_BITFIELD not yet implemented.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + case H5T_OPAQUE: + fprintf(stderr,"Error: H5T_OPAQUE not yet implemented.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + case H5T_COMPOUND: + if (ndims==1) { + if ((nmembers = H5Tget_nmembers(type)) <= 0 ) { + fprintf(stderr, "Error: Unable to get information about compound datatype %d\n",nmembers); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + for (idx=0;idx<nmembers;idx++) { + if ((ndimf = H5Tget_member_dims(type, idx, dimf, permf)) > 1 ) { + fprintf(stdout,"Warning: H5 datasets of H5T_COMPOUND type with ndims = 1, whose members\n"); + fprintf(stdout,"Warning: of the H5T_COMPOUND type have rank > 1 are not converted.\n"); + break; + } + } + hfile_id = op_data->hfile_id; + if ((vdata_id = VSattach(hfile_id, -1, "w")) <= 0 ) { + fprintf(stderr, "Error: Unable to create vdata %s.\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + op_data->vdata_id = vdata_id; + if ((status = VSsetname(vdata_id, name)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set vdata name %s.\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((status = VSsetclass(vdata_id, "HDF5")) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set class on vdata %s\n", name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + for (idx=0;idx<nmembers;idx++) { + if ((ndimf = H5Tget_member_dims(type, idx, dimf, NULL)) < 0 ) { + fprintf(stderr, "Error: field rank for H5T_COMPOUND type %d, idx %d < 0\n", type, idx); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((fieldname = H5Tget_member_name(type, idx)) == NULL ) { + fprintf(stderr, "Error: Unable to get fieldname for compound type %d, idx %d\n", type, idx); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((fieldtype = H5Tget_member_type(type, idx)) < 0 ) { + fprintf(stderr,"Error: H5 datasets of H5T_COMPOUND type with fieldtype %d, idx %d.\n",fieldtype,idx); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((h4_type = h5type_to_h4type(fieldtype)) < 0 ) { + fprintf(stderr, "Error: Problems translating h5 type to h4 type\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } +/* + if ((mem_type = h4type_to_memtype(h4_type)) == FAIL ) { + fprintf(stderr, "Error: Problems translating h4 type to mem type\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + return FAIL; + } +*/ + if (ndimf == 0 ) { + order = 1; + } else { + order = dimf[0]; + } + if ((status = VSfdefine(vdata_id, fieldname, h4_type, order)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set field %d\n", idx); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + strcat(fieldname_list,fieldname); + if (idx<nmembers-1) { + strcat(fieldname_list,", "); + } + + HDfree(fieldname); + } + if ((status = VSsetfields(vdata_id, fieldname_list)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set fieldname list %s\n", name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((status = VSsetinterlace(vdata_id, FULL_INTERLACE)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set FULL_INTERLACE mode, status %d\n", (int)status); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + + if ((type2 = H5Tcopy(type)) <= 0 ) { + fprintf(stderr, "Error: H5Tcopy did not SUCCEED, type %d\n", type2); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((status = H5Tpack(type2)) != SUCCEED ) { + fprintf(stderr, "Error: H5Tpack did not SUCCEED, status %d\n", (int)status); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((recsize = H5Tget_size(type2)) <= 0 ) { + fprintf(stderr, "Error: Unable to get record size %d\n", (int)recsize); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + n_records = (int32)dims[0]; + if ((buffer = HDmalloc(n_records*recsize)) == NULL) { + fprintf(stderr, "Error: Problems with HDmalloc of memory space\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + if ((status = H5Dread(did, type2, space, space, H5P_DEFAULT, buffer)) != SUCCEED) { + fprintf(stderr, "Error: Problems with H5Aread\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + break; + } + + if ((record_pos = VSseek(vdata_id, 0)) != 0 ) { + fprintf(stderr, "Error: Could not seek the beginning of the Vdata, %d\n", (int)record_pos); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + if ((num_of_recs = VSwrite(vdata_id, (void *)buffer, n_records, FULL_INTERLACE)) != n_records ) { + fprintf(stderr, "Error: Only able to write %d of %d records\n", (int)num_of_recs, (int)n_records); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + /* there are only vdata attributes, no field attributes */ + if ((status = H5Aiterate(did, NULL, (H5G_operator_t)convert_attr, op_data)) < 0 ) { + fprintf(stderr,"Error: iterate over attributes\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + } + if ((status = VSdetach(vdata_id)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to detach to vdata %s.\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + + if ((status = H5Tclose(type2)) != SUCCEED ) { + fprintf(stderr, "Error: H5Tclose did not SUCCEED, status %d\n", (int)status); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + break; + } + } else { + fprintf(stdout,"Warning: H5 datasets of H5T_COMPOUND type with ndims > 1 are not converted.\n"); + } + break; + default: + fprintf(stderr,"Error: %d class not found\n",class); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + } + + if ((status = H5Tclose(type)) < 0 ) { + fprintf(stderr,"Error: closing type\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + } + + if ((status = H5Sclose(space)) < 0 ) { + fprintf(stderr,"Error: closing space\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + } + + HDfree(buffer); + + return status; + +} + + +/*------------------------------------------------------------------------- + * Function: convert_attr + * + * Purpose: dump the attribute + * + * Return: Success: SUCCEED + * + * Failure: FAIL + * + * Programmer: Paul Harten + * + * Modifications: + * + *-----------------------------------------------------------------------*/ + +herr_t +convert_attr (hid_t attr, char *attr_name, op_data_t *op_data) +{ +hid_t attr_id, type, space, mem_type; +size_t typesize; +char *attr_values; +int32 status; +int32 h4_type; +int32 sds_id; +int32 vdata_id; +int32 vgroup_id; +int32 n_values; + + sds_id = op_data->sds_id; + vdata_id = op_data->vdata_id; + vgroup_id = op_data->vgroup_id; + + if ((attr_id = H5Aopen_name (attr, attr_name))>= 0) { + + if ((type = H5Aget_type(attr_id)) <= 0) { + fprintf(stderr, "Error: H5Dget_type() didn't return appropriate value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + return status; + } + + if ((space = H5Aget_space(attr_id)) <= 0) { + fprintf(stderr, "Error: H5Dget_space() didn't return appropriate value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr2", __FILE__, __LINE__); + status = FAIL; + return status; + } + + if ((n_values = H5Sget_simple_extent_npoints(space)) <= 0) { + fprintf(stderr, "Error: H5sget_simple_extent_npoints() didn't return correct value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + + if ((h4_type = h5type_to_h4type(type)) == FAIL ) { + fprintf(stderr, "Error: Problems translating h5 type to h4 type\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + + if ((mem_type = h4type_to_memtype(h4_type)) == FAIL ) { + fprintf(stderr, "Error: Problems translating h4 type to mem type\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_dataset", __FILE__, __LINE__); + status = FAIL; + return status; + } + + if ((typesize = H5Tget_size(mem_type)) <= 0) { + fprintf(stderr, "Error: H5Tget_size() didn't return appropriate value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + + if ((attr_values = HDmalloc(n_values*typesize)) == NULL) { + fprintf(stderr, "Error: Problems with HDmalloc of memory space\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + + if ((status = H5Aread(attr_id, mem_type, attr_values)) != SUCCEED) { + fprintf(stderr, "Error: Problems with H5Aread\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + + if (sds_id != 0) { + if ((status = SDsetattr(sds_id, attr_name, h4_type, n_values, attr_values)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set %s attribute.\n",attr_name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + } else if (vdata_id != 0) { + if ((status = VSsetattr(vdata_id, -1, attr_name, h4_type, n_values, attr_values)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set %s attribute.\n",attr_name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + } else { + if ((status = Vsetattr(vgroup_id, attr_name, h4_type, n_values, attr_values)) != SUCCEED ) { + fprintf(stderr, "Error: Unable to set %s attribute.\n",attr_name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + + } + + if ((status = H5Tclose(type)) != SUCCEED ) { + fprintf(stderr, "Error: Problems closing H5Tclose\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + if ((status = H5Sclose(space)) != SUCCEED ) { + fprintf(stderr, "Error: Problems closing H5Sclose\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + if ((status = H5Aclose(attr_id)) != SUCCEED ) { + fprintf(stderr, "Error: Problems closing H5Aclose\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_attr", __FILE__, __LINE__); + status = FAIL; + } + + HDfree(attr_values); + + status = SUCCEED; + + } else { + + status = FAIL; + + } + + return status; + +} + + +/*------------------------------------------------------------------------- + * Function: convert_all + * + * Purpose: Dump everything in the specified object + * + * Return: Success: SUCCEED + * + * Failure: FAIL + * + * Programmer: Paul Harten + * + * Modifications: + * + *-----------------------------------------------------------------------*/ +herr_t +convert_all (hid_t group, char *name, op_data_t *op_data) +{ + hid_t obj; + H5G_stat_t statbuf; + int status; + op_data_t op_data_save; + int32 vgroup_id; + char *sds_name; + int32 sd_id; + int32 sds_id; + int32 sds_ref; + int32 sds_index; + void *edata; + hid_t (*func)(void*); + + op_data_save = *op_data; + + vgroup_id = op_data->vgroup_id; + sd_id = op_data->sd_id; + sds_id = op_data->sds_id; + + if ((status = H5Gget_objinfo(group, name, FALSE, &statbuf)) != SUCCEED ) { + fprintf(stderr,"Error: H5Gget_objinfo() did not work\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (status); + } + + switch (statbuf.type) { + + case H5G_LINK: + + if (statbuf.nlink==0) { + + /* Disable error reporting */ + H5Eget_auto (&func, &edata); + H5Eset_auto (NULL, NULL); + + /* test to see if object exists */ + if ((status = H5Gget_objinfo(group, name, TRUE, NULL)) != SUCCEED ) { + fprintf(stdout,"Warning: the object pointed to by the symbolic link \"%s\" does not exist.\n",name); + } + + /* Enable error reporting */ + H5Eset_auto (func, edata); + + if (status != SUCCEED) { + break; + } + + } + /* follow link */ + if ((status = H5Gget_objinfo(group, name, TRUE, &statbuf)) != SUCCEED ) { + fprintf(stderr,"Error: H5Gget_objinfo() did not work\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (status); + } + + if (statbuf.type==H5G_DATASET) { + + sds_name = HDmalloc (statbuf.linklen*sizeof(char)); + if ((status = H5Gget_linkval (group, name, statbuf.linklen, sds_name)) != SUCCEED ) { + fprintf (stderr,"Error: unable to get link value.\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (status); + } + if ((sds_index = SDnametoindex(sd_id, sds_name)) < 0 ) { + fprintf (stderr,"Error: Problem with SDnametoindex().\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (sds_index); + } + if ((sds_id = SDselect(sd_id, sds_index)) < 0 ) { + fprintf (stderr,"Error: Problem with SDselect().\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (sds_id); + } + if ((sds_ref = SDidtoref(sds_id)) < 0 ) { + fprintf (stderr,"Error: Problem with SDidtoref().\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (sds_ref); + } + if ((status = Vaddtagref(vgroup_id, DFTAG_NDG, sds_ref)) != SUCCEED ) { + fprintf (stderr,"Error: Problem with Vaddtagref().\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (status); + } + + free (sds_name); + + } + + break; + + case H5G_GROUP: + if ((obj = H5Gopen (group, name)) <= 0 ) { + fprintf(stderr,"Error: Unable to open group\n"); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (obj); + } else { + if (( status = convert_group (obj, name, op_data)) != SUCCEED) { + fprintf(stderr,"Error: convert_group did not work for %s\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + status = FAIL; + break; + } + } + if ((status = H5Gclose(obj)) != SUCCEED) { + fprintf(stderr,"Error: Unable to close group %s\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + status = FAIL; + break; + } + break; + + case H5G_DATASET: + + if ((obj = H5Dopen (group, name)) <= 0 ) { + fprintf(stderr,"Error: Unable to open H5 dataset %s\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + return (obj); + } else { + if (( status = convert_dataset (obj, name, op_data)) != SUCCEED) { + fprintf(stderr,"Error: convert_dataset did not work for %s\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + status = FAIL; + break; + } + } + if ((status = H5Dclose(obj)) != SUCCEED) { + fprintf(stderr,"Error: Unable to close H5 dataset %s\n",name); + DEBUG_PRINT("Error detected in %s() [%s line %d]\n", "convert_all", __FILE__, __LINE__); + status = FAIL; + break; + } + break; + + case H5G_TYPE: + /* object is ignored */ + break; + + default: + fprintf (stderr,"Unknown Object %s\n", name); + status = 1; + return FAIL; + break; + + } + + *op_data = op_data_save; + + return SUCCEED; + +} + + +/***************************************************************************** + + Routine: h5type_to_h4type(h5type) + + Description: Translate h5 datatype into h4 datatype + + Input: h5 datatype + + Output: function return, h4 datatype + +*****************************************************************************/ + +int32 h5type_to_h4type(hid_t h5_datatype) +{ + int32 h4_datatype; + + if (H5Tequal(h5_datatype,H5T_STD_I8BE)) { + h4_datatype = DFNT_INT8; + } else if (H5Tequal(h5_datatype,H5T_STD_I16BE)) { + h4_datatype = DFNT_INT16; + } else if (H5Tequal(h5_datatype,H5T_STD_I32BE)) { + h4_datatype = DFNT_INT32; + } else if (H5Tequal(h5_datatype,H5T_STD_I64BE)) { + h4_datatype = DFNT_INT64; + } else if (H5Tequal(h5_datatype,H5T_STD_U8BE)) { + h4_datatype = DFNT_UINT8; + } else if (H5Tequal(h5_datatype,H5T_STD_U16BE)) { + h4_datatype = DFNT_UINT16; + } else if (H5Tequal(h5_datatype,H5T_STD_U32BE)) { + h4_datatype = DFNT_UINT32; + } else if (H5Tequal(h5_datatype,H5T_STD_U64BE)) { + h4_datatype = DFNT_UINT64; + } else if (H5Tequal(h5_datatype,H5T_IEEE_F32BE)) { + h4_datatype = DFNT_FLOAT32; + } else if (H5Tequal(h5_datatype,H5T_IEEE_F64BE)) { + h4_datatype = DFNT_FLOAT64; + } else if (H5Tequal(h5_datatype,H5T_STD_I8LE)) { + h4_datatype = DFNT_INT8; + } else if (H5Tequal(h5_datatype,H5T_STD_I16LE)) { + h4_datatype = DFNT_INT16; + } else if (H5Tequal(h5_datatype,H5T_STD_I32LE)) { + h4_datatype = DFNT_INT32; + } else if (H5Tequal(h5_datatype,H5T_STD_I64LE)) { + h4_datatype = DFNT_INT64; + } else if (H5Tequal(h5_datatype,H5T_STD_U8LE)) { + h4_datatype = DFNT_UINT8; + } else if (H5Tequal(h5_datatype,H5T_STD_U16LE)) { + h4_datatype = DFNT_UINT16; + } else if (H5Tequal(h5_datatype,H5T_STD_U32LE)) { + h4_datatype = DFNT_UINT32; + } else if (H5Tequal(h5_datatype,H5T_STD_U64LE)) { + h4_datatype = DFNT_UINT64; + } else if (H5Tequal(h5_datatype,H5T_IEEE_F32LE)) { + h4_datatype = DFNT_FLOAT32; + } else if (H5Tequal(h5_datatype,H5T_IEEE_F64LE)) { + h4_datatype = DFNT_FLOAT64; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_CHAR)) { + h4_datatype = DFNT_INT8; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_UCHAR)) { + h4_datatype = DFNT_UINT8; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_SHORT)) { + h4_datatype = DFNT_INT16; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_USHORT)) { + h4_datatype = DFNT_UINT16; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_INT)) { + h4_datatype = DFNT_INT32; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_UINT)) { + h4_datatype = DFNT_UINT32; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_LONG)) { + h4_datatype = DFNT_INT64; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_ULONG)) { + h4_datatype = DFNT_UINT64; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_LLONG)) { + h4_datatype = DFNT_INT128; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_ULLONG)) { + h4_datatype = DFNT_UINT128; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_FLOAT)) { + h4_datatype = DFNT_FLOAT32; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_DOUBLE)) { + h4_datatype = DFNT_FLOAT64; + } else if (H5Tequal(h5_datatype,H5T_NATIVE_LDOUBLE)) { + h4_datatype = DFNT_FLOAT128; + } else { + h4_datatype = FAIL; + } + + return h4_datatype; + +} + + +/***************************************************************************** + + Routine: h4type_to_memtype(h4type) + + Description: Translate h4 datatype into mem datatype + + Input: h4 datatype + + Output: function return, mem datatype + +*****************************************************************************/ + +hid_t h4type_to_memtype(int32 h4_datatype) +{ + hid_t mem_datatype; + + switch (h4_datatype) { + case DFNT_INT8: + case DFNT_NINT8: + case DFNT_LINT8: + mem_datatype = H5T_NATIVE_CHAR; break; + case DFNT_UINT8: + case DFNT_NUINT8: + case DFNT_LUINT8: + mem_datatype = H5T_NATIVE_UCHAR; break; + case DFNT_INT16: + case DFNT_NINT16: + case DFNT_LINT16: + mem_datatype = H5T_NATIVE_SHORT; break; + case DFNT_UINT16: + case DFNT_NUINT16: + case DFNT_LUINT16: + mem_datatype = H5T_NATIVE_USHORT; break; + case DFNT_INT32: + case DFNT_NINT32: + case DFNT_LINT32: + mem_datatype = H5T_NATIVE_INT; break; + case DFNT_UINT32: + case DFNT_NUINT32: + case DFNT_LUINT32: + mem_datatype = H5T_NATIVE_UINT; break; + case DFNT_INT64: + case DFNT_NINT64: + case DFNT_LINT64: + mem_datatype = H5T_NATIVE_LONG; break; + case DFNT_UINT64: + case DFNT_NUINT64: + case DFNT_LUINT64: + mem_datatype = H5T_NATIVE_ULONG; break; + case DFNT_INT128: + case DFNT_NINT128: + case DFNT_LINT128: + mem_datatype = H5T_NATIVE_LLONG; break; + case DFNT_UINT128: + case DFNT_NUINT128: + case DFNT_LUINT128: + mem_datatype = H5T_NATIVE_ULLONG; break; + case DFNT_FLOAT32: + case DFNT_NFLOAT32: + case DFNT_LFLOAT32: + mem_datatype = H5T_NATIVE_FLOAT; break; + case DFNT_FLOAT64: + case DFNT_NFLOAT64: + case DFNT_LFLOAT64: + mem_datatype = H5T_NATIVE_DOUBLE; break; + case DFNT_FLOAT128: + case DFNT_NFLOAT128: + case DFNT_LFLOAT128: + mem_datatype = H5T_NATIVE_LDOUBLE; break; + default: + mem_datatype = FAIL; + } + + return mem_datatype; + +} + + +/***************************************************************************** + + Routine: test_file + + Description: Test a file for read/write - ability. + + Input: filename - Unix filename + + Output: function return, global variable - errno + +*****************************************************************************/ + +int test_file(char *filename,int oflag,mode_t mode) +{ + int fid; + + errno = 0; + + fid = open(filename, oflag, mode); + if (fid < 0) { + perror(filename); + } + close(fid); + + return errno; + +} + + +/***************************************************************************** + + Routine: test_dir + + Description: Test pathway to determine if it is a directory + + Input: path - pathname given + + Output: function return TRUE/FALSE + +*****************************************************************************/ + +int test_dir(path) + char *path; +{ + + struct stat buf; + struct stat *buf_ptr; + int idir; + + buf_ptr = &buf; + + idir = stat(path, buf_ptr); + if (idir < 0) { + if (errno == 2) { + return 0; + } else { + perror(path); + } + } + + return S_ISDIR(buf_ptr->st_mode); + +} + +/***************************************************************************** + + Routine: BuildFilename() + + Description: Build a filename with new extension + + Input: filename - present filename + ext - extension to root of filename + + Output: (filename:r).ext + +*****************************************************************************/ + +char *BuildFilename(char *filename, char *ext) +{ + /* build outgoing filename */ + + char *filename_out; + char *lastper_ptr, *lastdir_ptr; + int root_len; + + lastper_ptr = strrchr(filename,'.'); + lastdir_ptr = strrchr(filename,'/'); + + if ( lastper_ptr <= lastdir_ptr ) { /* no extension */ + root_len = strlen(filename); + } else { /* existing extension */ + root_len = (int)(lastper_ptr - filename); + } + + filename_out = (char *)HDmalloc(root_len + strlen(ext) + 2); + filename_out = strncpy(filename_out, filename, (size_t)root_len); + filename_out[root_len] = '\0'; + filename_out = strcat(filename_out,"."); + filename_out = strcat(filename_out,ext); + + return filename_out; +} + |