summaryrefslogtreecommitdiffstats
path: root/tools/h4toh5/h4toh5sds.c
diff options
context:
space:
mode:
authorMuQun Yang <ymuqun@hdfgroup.org>2001-06-11 21:20:10 (GMT)
committerMuQun Yang <ymuqun@hdfgroup.org>2001-06-11 21:20:10 (GMT)
commit1a5197918c0ef3e9f26af8538cf8c278bfa09fe2 (patch)
tree69beb8b96244f379cc524d7d8fac3a66559b3886 /tools/h4toh5/h4toh5sds.c
parent1b484c377cfb56b4f36840f74a85bf86211f71e6 (diff)
downloadhdf5-1a5197918c0ef3e9f26af8538cf8c278bfa09fe2.zip
hdf5-1a5197918c0ef3e9f26af8538cf8c278bfa09fe2.tar.gz
hdf5-1a5197918c0ef3e9f26af8538cf8c278bfa09fe2.tar.bz2
[svn-r3988]
Purpose: new features Description: 1. add an option to convert HDF4 file without HDF4 specified attributes such as HDF4_OBJECT_TYPE, HDF4_REF_NUM etc. it can be done by inputting "h4toh5 -na input.hdf" The default converter will still keep HDF4 specfied attributes. 2. Add compression features (gzip) for image too. Now the compressed HDF4 image can be supported by using HDF5 gzip. Not sure whether tools can read it. Need to be tested. 3. Change SPACEPAD to NULLTERM for HDF4 dimensional name list. We can use variable length HDF5 string to represent these names, however currently H5dump and H5view cannot support variable length HDF5 string. converter will wait for other tools' update. Solution: Platforms tested: eirene(Red Hat 6.2) and arabica(solaris 2.7)
Diffstat (limited to 'tools/h4toh5/h4toh5sds.c')
-rw-r--r--tools/h4toh5/h4toh5sds.c87
1 files changed, 68 insertions, 19 deletions
diff --git a/tools/h4toh5/h4toh5sds.c b/tools/h4toh5/h4toh5sds.c
index b488f78..a4d9e3b 100644
--- a/tools/h4toh5/h4toh5sds.c
+++ b/tools/h4toh5/h4toh5sds.c
@@ -45,7 +45,7 @@ Author: Kent Yang(ymuqun@ncsa.uiuc.edu)
*-------------------------------------------------------------------------
*/
-int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup){
+int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int h4_attr){
int32 sds_dtype;
int32 sds_rank;
@@ -115,7 +115,7 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup){
return FAIL;
}
if(sds_empty !=0) {
- if(convert_sdsfillvalue(file_id,sds_id,h5_group,h5_dimgroup)==FAIL) {
+ if(convert_sdsfillvalue(file_id,sds_id,h5_group,h5_dimgroup,h4_attr)==FAIL) {
printf("cannot convert fill value successfully.\n");
return FAIL;
}
@@ -530,6 +530,7 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup){
/* handle extra attributes of sds : sds label, object type
and reference num */
+ if(h4_attr !=0) {
strcpy(sdslabel,SDSLABEL);
if(h4_transpredattrs(h5dset,HDF4_OBJECT_TYPE,sdslabel)==FAIL) {
@@ -572,7 +573,7 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup){
printf("unable to transfer sds ref. to HDF5 dataset attribute.\n");
return FAIL;
}
-
+ }
istat = SDendaccess(sds_id);
ret = H5Pclose(create_plist);
ret = H5Sclose(h5d_sid);
@@ -820,8 +821,7 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
hid_t h5dim_tid;
hid_t h5dim_memtype;
-
- hid_t h5dim_nameaid;
+hid_t h5dim_nameaid;
hid_t h5dim_namesid;
hid_t h5str_dimntype;
@@ -831,6 +831,7 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
hid_t attribID;
hid_t create_plist;
+ int dim_index;
hsize_t h5dimscas[1];
hsize_t max_h5dimscas[1];
hsize_t h5dim_dims[1];
@@ -842,8 +843,11 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
hobj_ref_t* alldim_refdat;
char* h5sdsdim_name;
- char h5sdsdim_allname[MAX_VAR_DIMS * MAX_DIM_NAME];
- char h5newsdsdim_name[MAX_DIM_NAME];
+ /* char *h5sdsdim_allname[MAX_VAR_DIMS];
+ char *h5newsdsdim_name; */
+
+ char h5sdsdim_allname[MAX_VAR_DIMS*MAX_DIM_NAME];
+ char h5newsdsdim_name[MAX_DIM_NAME];
char h5dimpath_name[MAX_DIM_NAME];
herr_t ret;
@@ -853,11 +857,12 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
sdsdimempty[i] = 0;
/*zero out memory for h5sdsdim_allname and h5dimpath_name */
+
+ /*** the following line should be erased for variable length HDF5 string.**/
h4toh5_ZeroMemory(h5sdsdim_allname,(MAX_VAR_DIMS*MAX_DIM_NAME)*sizeof(char));
h4toh5_ZeroMemory(h5dimpath_name,MAX_DIM_NAME*sizeof(char));
/*check whether the sds is created with unlimited dimension. */
-
if(SDgetchunkinfo(sds_id,&c_def_out, &c_flags)== FAIL) {
printf("error in getting chunking information. \n");
return FAIL;
@@ -887,13 +892,22 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
SDendaccess(sdsdim_id);
return FAIL;
}
+
+ /* Here we have very messy cases for dimensional scale when
+ sdsdim_type is 0(or not set).
+ When sdsdim_type is 0, it means no SDS dimensional scale
+ data for this dimensions. However, users may define SDS dimensional
+ scale name. We want to keep this information.
+ If user doesn't specific the name we will skip this dimension */
+
if(sdsdim_type == 0) {
if(strncmp(sdsdim_name,fakeDim,strlen(fakeDim))==0)
continue;
}
- /* for unlimited sds dimension, grab the current dimensional size. */
+ /* for unlimited SDS dimension, grab the current dimensional size. */
if(sds_dimscasize[0] == 0) sds_dimscasize[0] = firstdimsize;
+
/* check whether this dimensional scale dataset is looked up. */
check_sdsdim = lookup_name(sdsdim_name,DIM_HASHSIZE,dim_hashtab);
@@ -918,7 +932,11 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
}
free(cor_sdsdimname);
- strcpy(&h5sdsdim_allname[count_h5attrname*MAX_DIM_NAME],h5sdsdim_name);
+ strncpy(&h5sdsdim_allname[count_h5attrname*MAX_DIM_NAME],h5sdsdim_name,MAX_DIM_NAME);
+
+
+ /*h5sdsdim_allname[count_h5attrname]=HDstrdup(h5sdsdim_name);
+ should be added for variable length HDF5 string. 6/11/2001. */
/* here we should add some comments for fakedim0--name. It seems that
hdf4(netcdf) will use unique fake dimension name, fakedim + unique
@@ -932,6 +950,12 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
if (check_sdsdim == 1){/* the dimension is touched, skip this one.*/
free(h5sdsdim_name);
SDendaccess(sdsdim_id);
+ /* here we have to check a special case when the dimension type is 0.
+ We should ignore counting object reference.*/
+ if(sdsdim_type == 0) {
+ count_h5attrname++;
+ continue;
+ }
count_h5objref = count_h5objref + 1;
count_h5attrname = count_h5attrname + 1;
continue;
@@ -944,7 +968,10 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
return FAIL;
}
+ /* here we want to keep the dimensional scale name without
+ making the object reference. */
if(sdsdim_type == 0) {
+
count_h5attrname = count_h5attrname + 1;
sdsdimempty[i] = 1;
continue;
@@ -1065,7 +1092,7 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
if (H5Dwrite(h5dim_dset,h5dim_memtype,h5dim_sid,h5dim_sid,
H5P_DEFAULT,(void *)dim_scadata)<0) {
- printf("error writing data\n");
+ printf("error writing dimensional scale data\n");
free(h5sdsdim_name);
free(dim_scadata);
SDendaccess(sdsdim_id);
@@ -1117,12 +1144,16 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
return FAIL;
}
k =0;
+
for(i=0;i<count_h5objref;i++){
- h4toh5_ZeroMemory(h5newsdsdim_name,MAX_DIM_NAME);
if(sdsdimempty[i])
k = k +1;
- strcpy(h5newsdsdim_name,&h5sdsdim_allname[k*MAX_DIM_NAME]);
-
+ h4toh5_ZeroMemory(h5newsdsdim_name,MAX_DIM_NAME);
+ strcpy(h5newsdsdim_name,&h5sdsdim_allname[k*MAX_DIM_NAME]);
+
+ /*h5newsdsdim_name = HDstrdup(h5sdsdim_allname[k]);
+ for variable length HDF5 string. 6/11/2001; Kent*/
+
ret = H5Rcreate(&dim_refdat,sh5_dimgroup,h5newsdsdim_name,
H5R_OBJECT,-1);
if(ret <0) {
@@ -1134,7 +1165,9 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
}
alldim_refdat[i] = dim_refdat;
k = k +1;
- }
+
+ /*free(h5newsdsdim_name); for variable length HDF5 string 6/11/2001.*/
+ }
attribID = H5Acreate(sh5dset,DIMSCALE,attr_refType,attr_refSpace,
H5P_DEFAULT);
@@ -1166,13 +1199,21 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
return FAIL;
}
- h5str_dimntype = mkstr(MAX_DIM_NAME,H5T_STR_SPACEPAD);
+ /*h5str_dimntype = mkstr(MAX_DIM_NAME,H5T_STR_SPACEPAD); */
+
+ h5str_dimntype = mkstr(MAX_DIM_NAME,H5T_STR_NULLTERM);
if(h5str_dimntype < 0) {
H5Sclose(h5dim_namesid);
printf("error in generating H5T_STRING type.\n");
return FAIL;
- }
+ }
+ /*using variable length, h5dump and h5view do not
+ support this, this will be supported later.
+ h5str_dimntype = H5Tcopy(H5T_C_S1);
+ ret = H5Tset_size(h5str_dimntype,H5T_VARIABLE);
+ 6/11/2001, Kent Yang
+ */
h5dim_nameaid = H5Acreate(sh5dset,HDF4_DIMENSION_LIST,h5str_dimntype,
h5dim_namesid,H5P_DEFAULT);
@@ -1191,15 +1232,22 @@ int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
return FAIL;
}
+
ret = H5Sclose(h5dim_namesid);
ret = H5Aclose(h5dim_nameaid);
+ /*used for variable length HDF5 string.
+ for(dim_index = 0; dim_index <count_h5attrname;dim_index++)
+ free(h5sdsdim_allname[dim_index]);
+ 6/11/2001, kent*/
}
+
+
free(sdsdimempty);
return SUCCEED;
}
-int convert_sdsfillvalue(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup){
+int convert_sdsfillvalue(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int h4_attr){
int32 sds_dtype;
@@ -1519,6 +1567,7 @@ int convert_sdsfillvalue(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimg
/* handle extra attributes of sds : sds label, object type
and reference num */
+ if(h4_attr !=0) {
strcpy(sdslabel,SDSLABEL);
if(h4_transpredattrs(h5dset,HDF4_OBJECT_TYPE,sdslabel)==FAIL) {
@@ -1561,7 +1610,7 @@ int convert_sdsfillvalue(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimg
printf("unable to transfer sds ref. to HDF5 dataset attribute.\n");
return FAIL;
}
-
+ }
free(sds_start);
free(sds_edge);
free(sds_stride);