summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/h4toh5/h4toh5image.c208
-rw-r--r--tools/h4toh5/h4toh5main.c264
-rw-r--r--tools/h4toh5/h4toh5main.h35
-rw-r--r--tools/h4toh5/h4toh5pal.c7
-rw-r--r--tools/h4toh5/h4toh5sds.c87
-rw-r--r--tools/h4toh5/h4toh5util.c8
-rw-r--r--tools/h4toh5/h4toh5util.h2
-rw-r--r--tools/h4toh5/h4toh5vdata.c7
-rw-r--r--tools/h4toh5/h4toh5vgroup.c36
9 files changed, 479 insertions, 175 deletions
diff --git a/tools/h4toh5/h4toh5image.c b/tools/h4toh5/h4toh5image.c
index 8fbbdc0..47c5363 100644
--- a/tools/h4toh5/h4toh5image.c
+++ b/tools/h4toh5/h4toh5image.c
@@ -44,7 +44,7 @@ Author: Kent Yang(ymuqun@ncsa.uiuc.edu)
*-------------------------------------------------------------------------
*/
-int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
+int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup,int h4_attr) {
int32 istat;
int32 ngrattrs;
@@ -67,6 +67,16 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
int32 chunk_dims[2];
int32 c_flags;
+ /* for checking compression */
+
+ sp_info_block_t info_block;
+ int16 special_code;
+ int32 access_id;
+ uint16 ri_ref;
+ int gzip_level;
+ uint16 temp_tag;
+ uint16* ptag_out;
+
/* define varibles for hdf5. */
hid_t h5ty_id;
@@ -82,8 +92,14 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
size_t h4memsize;
hsize_t fielddim[1];
hsize_t h5dims[2];
+ hsize_t bufsize;
herr_t ret;
hid_t create_plist;
+ hid_t write_plist;
+
+
+ temp_tag = DFTAG_NULL;
+ ptag_out = &temp_tag;
/* zeroing out memory.*/
@@ -147,13 +163,13 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
/* change the order of image dimension:
due to the difference of hdf4 image specification and
hdf5 image specification. */
-
h5dims[0] = edges[1]-start[1];
h5dims[1] = edges[0]-start[0];
gr_ref = GRidtoref(ri_id);
+
if(gr_ref == 0) {
printf("error in obtaining gr reference number. \n");
free(image_data);
@@ -196,10 +212,88 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
/* create property list. */
create_plist = H5Pcreate(H5P_DATASET_CREATE);
+ /* wait until the compression information can be obtained for image,
+ 4/28/2001, Kent Yang.*/
+
+ ri_ref = 0;
+ /*
+ ri_ref = get_RIref(file_id,DFTAG_VG,gr_ref,ptag_out);
+
+ if(ri_ref >0 ){
+ if(*ptag_out == DFTAG_RI) printf("okay\n");
+ access_id = Hstartread(file_id,*ptag_out,ri_ref);
+ }
+ */
+ if(ri_ref == 0)
+ access_id = FAIL;
+
+
+ /* if(access_id == FAIL){
+ printf("cannot find RI tag,the compression mode will not be checked");
+ printf(" when RIG is not chunked.\n");
+ }*/
+
+ if(access_id != FAIL) {
+ istat = Hinquire(access_id,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&special_code);
+ if(istat == FAIL) {
+ printf("failed to inquire information \n ");
+ free(image_data);
+ free(h5cimage_name);
+ H5Pclose(create_plist);
+ return FAIL;
+ }
+ if(special_code >0){
+
+ if(HDget_special_info(access_id,&info_block)==FAIL){
+ printf("fail to get special info.\n");
+ free(image_data);
+ free(h5cimage_name);
+ H5Pclose(create_plist);
+ return FAIL;
+ }
+ /* free(info_block.cdims);*/
+ if(info_block.key == SPECIAL_COMP) {
+
+ if(c_flags == HDF_NONE){
+ /* 1. the current HDF5 will not handle compression case itself,
+ in order that the converted HDF5 is compressed, we have to
+ provide a chunking size. currently it is set to h5dim[i].*/
+
+ printf("okay to sds compress.\n");
+
+ chunk_dims[0] = (hsize_t)(h5dims[0]);
+ chunk_dims[1] =(hsize_t)(h5dims[1]);
+
+ if(H5Pset_chunk(create_plist, 2, chunk_dims)<0) {
+ printf("failed to set up chunking information for ");
+ printf("property list.\n");
+ free(image_data);
+ free(h5cimage_name);
+ H5Pclose(create_plist);
+ return FAIL;
+ }
+
+ if(H5Pset_deflate(create_plist,GZIP_COMLEVEL)<0){
+ /* if(H5Pset_deflate(create_plist,2)<0){*/
+ printf("fail to set compression method for HDF5 file.\n");
+ free(image_data);
+ free(h5cimage_name);
+ H5Pclose(create_plist);
+ return FAIL;
+ }
+ }
+
+ }
+ /* free(info_block.cdims);*/
+ }
+
+ }
if(c_flags == HDF_CHUNK || c_flags == (HDF_CHUNK | HDF_COMP)
|| c_flags == (HDF_CHUNK | HDF_NBIT) ){
+ if(c_def_out.comp.comp_type == COMP_CODE_RLE || c_def_out.comp.comp_type == COMP_CODE_NBIT || c_def_out.comp.comp_type == COMP_CODE_SKPHUFF || c_def_out.comp.comp_type == COMP_CODE_DEFLATE || c_def_out.comp.comp_type == COMP_CODE_JPEG) {
+
chunk_dims[0] = c_def_out.chunk_lengths[0];
chunk_dims[1] = c_def_out.chunk_lengths[1];
@@ -207,11 +301,40 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
printf("failed to set up chunking information for ");
printf("property list.\n");
free(image_data);
+ free(h5cimage_name);
H5Pclose(create_plist);
return FAIL;
}
+
+ if(c_def_out.comp.comp_type == COMP_CODE_DEFLATE)
+ gzip_level = c_def_out.comp.cinfo.deflate.level;
+ else gzip_level = GZIP_COMLEVEL;
+ if(H5Pset_deflate(create_plist,gzip_level)<0){
+ printf("fail to set compression method for HDF5 file.\n");
+ free(image_data);
+ free(h5cimage_name);
+ H5Pclose(create_plist);
+ }
+ }
}
- if (ncomp == 1) {
+
+ /* HDF4 can support various compression methods including simple RLE, NBIT, Skip Huffman, gzip,Jpeg , HDF5 currently only supports gzip compression.
+ By default, we will compress HDF5 dataset by using gzip compression if HDF5 file is compressed. */
+
+
+ write_plist = H5Pcreate(H5P_DATASET_XFER);
+ bufsize = h4memsize *h5dims[1]*ncomp;
+
+ if(H5Pset_buffer(write_plist,bufsize,NULL,NULL)<0) {
+ printf("fail to create data transfer property list.\n");
+ free(image_data);
+ free(h5cimage_name);
+ H5Pclose(create_plist);
+ H5Pclose(write_plist);
+ return FAIL;
+ }
+
+ if (ncomp == 1) {
h5d_sid = H5Screate_simple(2,h5dims,NULL);
@@ -219,6 +342,8 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
printf("error in creating space for dataset. \n");
free(image_data);
free(h5cimage_name);
+ H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -229,15 +354,17 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
- if (H5Dwrite(h5dset,h5memtype,h5d_sid,h5d_sid,H5P_DEFAULT,
+ if (H5Dwrite(h5dset,h5memtype,h5d_sid,h5d_sid,write_plist,
image_data)<0) {
printf("error writing data for hdf5 dataset converted from images.\n");
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -251,6 +378,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -260,6 +388,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -275,6 +404,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -284,6 +414,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -293,6 +424,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -302,6 +434,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -311,6 +444,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -320,6 +454,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
}
@@ -330,6 +465,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
@@ -340,15 +476,17 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
- if (H5Dwrite(h5dset,h5_cmemtype,h5d_sid,h5d_sid,H5P_DEFAULT,
+ if (H5Dwrite(h5dset,h5_cmemtype,h5d_sid,h5d_sid,write_plist,
(void *)image_data)<0) {
printf("error writing data\n");
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
return FAIL;
}
ret = H5Tclose(h5_ctype);
@@ -374,6 +512,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(image_data);
free(h5cimage_name);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
return FAIL;
@@ -384,6 +523,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(h5cimage_name);
free(image_data);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
return FAIL;
@@ -394,6 +534,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
free(h5cimage_name);
free(image_data);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
return FAIL;
@@ -408,6 +549,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
printf(" cannot obtain attributes. \n");
free(image_data);
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
return FAIL;
@@ -416,7 +558,8 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
/* deal with h5dset predefined and user-defined attributes.
Obtain the name and data type and the total number of attributes.
Data attribute at hdf4 is only one-dimensional array. */
-
+
+
if (ncomp == 1 && h4size == 1)
strcpy(grlabel,RAST8LABEL);
else if(ncomp == 3 && h4size == 1)
@@ -430,6 +573,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
if(h4_transpredattrs(h5dset,HDF4_OBJECT_TYPE,grlabel)==FAIL){
printf("error in getting hdf4 image type attribute \n");
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
free(h5cimage_name);
@@ -437,19 +581,22 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
return FAIL;
}
+ if(h4_attr!=0) {
if(h4_transpredattrs(h5dset,HDF4_OBJECT_NAME,image_name)==FAIL){
printf("error in getting hdf4 image name attribute. \n");
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
free(h5cimage_name);
free(image_data);
return FAIL;
}
-
+ }
if(h4_transpredattrs(h5dset,HDF4_IMAGE_CLASS,image_class)==FAIL){
printf("error in getting hdf4 image class attribute. \n");
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
free(h5cimage_name);
@@ -457,11 +604,14 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
return FAIL;
}
+ if(h4_attr !=0){
+
gr_ref = GRidtoref(ri_id);
if(gr_ref == 0) {
printf("error in obtaining reference number of GR.\n");
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
free(h5cimage_name);
@@ -472,18 +622,20 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
if(h4_transnumattr(h5dset,HDF4_REF_NUM,gr_ref)==FAIL) {
printf("error in getting hdf4 image number attribute.\n");
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
free(h5cimage_name);
free(image_data);
return FAIL;
}
-
+ }
/* deal with palette. */
- if(gr_palette(file_id,ri_id,h5dset,h5_palgroup)== FAIL) {
+ if(gr_palette(file_id,ri_id,h5dset,h5_palgroup,h4_attr)== FAIL) {
printf("error in translating palette into h5 dataset.\n");
H5Pclose(create_plist);
+ H5Pclose(write_plist);
H5Sclose(h5d_sid);
H5Dclose(h5dset);
free(h5cimage_name);
@@ -492,6 +644,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
}
ret = H5Pclose(create_plist);
+ ret = H5Pclose(write_plist);
ret = H5Sclose(h5d_sid);
ret = H5Dclose(h5dset);
istat = GRendaccess(ri_id);
@@ -518,7 +671,7 @@ int Image_h4_to_h5(int32 file_id,int32 ri_id,hid_t h5_group,hid_t h5_palgroup) {
*-------------------------------------------------------------------------
*/
-int gr_palette(int32 file_id,int32 ri_id,hid_t h5dset,hid_t h5_palgroup) {
+int gr_palette(int32 file_id,int32 ri_id,hid_t h5dset,hid_t h5_palgroup,int h4_attr) {
int32 pal_id;
uint16 pal_ref;
@@ -595,7 +748,7 @@ int gr_palette(int32 file_id,int32 ri_id,hid_t h5dset,hid_t h5_palgroup) {
return FAIL;
}
- pal_stat = Palette_h4_to_h5(file_id,pal_id,h5_palgroup,h5pal_name);
+ pal_stat = Palette_h4_to_h5(file_id,pal_id,h5_palgroup,h5pal_name,h4_attr);
if(pal_stat == FAIL) {
printf("error occurring in transferring palette into dataset. \n");
@@ -859,3 +1012,36 @@ int create_pal_objref(hid_t h5dset,hid_t h5_palgroup,char *h5pal_name){
H5Aclose(attribID);
return SUCCEED;
}
+
+
+uint16 get_RIref(int32 file_id,uint16 tag,int32 gr_ref,uint16* ptag_out){
+
+ DFdi di;
+ int32 found,GroupID;
+ int ri_ref = 0;
+
+ if((GroupID = DFdiread(file_id,tag,(uint16)gr_ref))<0){
+ printf("cannot find gr_ref\n");
+ return ri_ref;
+ }
+
+ found = 0;
+ di.tag = DFTAG_NULL;
+ di.ref = 0;
+ while((found == 0) &&(DFdiget(GroupID,&di.tag,&di.ref)==0)){
+ if(di.tag == DFTAG_CI ||di.tag == DFTAG_RI || di.tag == DFTAG_CI8 ||
+ di.tag == DFTAG_RI8)
+ found = 1;
+ }
+
+ *ptag_out = di.tag;
+ ri_ref = di.ref;
+ ri_ref = 1;
+ if(!found) {
+ printf("cannot find ri_ref\n");
+ return 0;
+ }
+ DFdifree(GroupID);
+ return ri_ref;
+
+}
diff --git a/tools/h4toh5/h4toh5main.c b/tools/h4toh5/h4toh5main.c
index e9ef567..19d8f23 100644
--- a/tools/h4toh5/h4toh5main.c
+++ b/tools/h4toh5/h4toh5main.c
@@ -67,6 +67,7 @@ int main(int argc, char ** argv) {
char *h4_filename=NULL;
char *h5_extension;
int status = 0;
+ int h4_attr = 1;
argc--;
argv++;
@@ -86,6 +87,15 @@ int main(int argc, char ** argv) {
}
}
+ /* check whether the flag for HDF4 attributes is set.*/
+ { int i;
+ for (i=0; i < argc; i++){
+ if ( HDstrcmp(argv[i],"-na") == 0 ) {
+ h4_attr = 0;
+ break;
+ }
+ }
+ }
switch(argc) {
@@ -94,105 +104,49 @@ int main(int argc, char ** argv) {
PrintOptions_h4toh5();
break;
- case 1: /* h4toh5 file1 */
- h4_filename = argv[0];
-#ifndef WIN32
- if (test_file(h4_filename,O_EXCL,292) != 0 ) {
- /* 292 Decimal - 0444 Octal, a+r */
- printf("the current hdf4 file name is not set properly.\n");
- status = -1;
- break;
- }
- if (test_dir(h4_filename) != 0 ) {
- fprintf(stderr,"%s: Is a directory\n",h4_filename);
- status = -1;
- break;
- }
-#endif
- /*0. check whether this file is an hdf file. */
-
- if(!Hishdf(h4_filename)){
- printf("error: not an hdf file. \n");
- printf("the file will not be converted. \n");
- status = -1;
- break;
- }
- h5_extension = HDstrdup("h5");
- h5_filename = BuildFilename(h4_filename,h5_extension);
- if (h5_filename == NULL) {
- printf("error in creating hdf5 file name.\n");
- status = -1;
- break;
- }
-#ifndef WIN32
- if (test_file(h5_filename,O_CREAT|O_EXCL,436) != 0) {
- /* 436 Decimal - 0664 Octal, ug+rw,o+r */
- printf("permission of hdf5 file is not set properly.\n");
- status = -1;
- break;
- }
-#endif
- status = h4toh5(h4_filename, h5_filename);
-
- if ( status == FAIL ) {
- printf("error in converting %s into %s\n",h4_filename,h5_filename);
- break;
- }
- if (h5_filename != NULL) {
- HDfree(h5_filename);
- }
-
+ case 1: /* two cases:
+ 1. h4toh5 file1 without HDF4 specified attributes
+ this is the option where h4toh5 -na appears.
+ nothing is done.
+ 2. h4toh5 file1 including HDF4 specified attributes.
+ this is the default behavior.
+ */
+
+ if(HDstrcmp(argv[0],"-na")==0){
+ PrintOptions_h4toh5();
+ break;
+ }
+
+ if(gen_h4toh5(argv[0],NULL,h4_attr)<0){
+ status = -1;
+ return status;
+ }
break;
- case 2: /* h4toh5 file_in file_out */
+ case 2: /* h4toh5 file_in file_out with HDF4 predefined attributes
+ h4toh5 file_in file_in.h5 without HDF4 predefined attributes*/
+ if(h4_attr !=0){
h4_filename = argv[0];
h5_filename = argv[1];
+ status = gen_h4toh5(h4_filename,h5_filename,h4_attr);
+ }
-#ifndef WIN32
- if (test_file(h4_filename,O_EXCL,292) != 0 ) {
- /* 292 Decimal - 0444 Octal, a+r */
- printf("permission of hdf4 file is not set properly.\n");
- status = -1;
- break;
- }
+ else
+ status = gen_h4toh5(argv[1],NULL,h4_attr);
- if (test_dir(h4_filename) != 0 ) {
- fprintf(stderr,"%s: Is a directory\n",h4_filename);
- status = -1;
- break;
- }
+ if(status <0) return status;
+ break;
-#endif
- /*0. check whether this file is a hdf file. */
-
- if(!Hishdf(h4_filename)){
- printf("error: not an hdf file. \n");
- printf("the file will not be converted. \n");
- status = -1;
- break;
- }
-
-#ifndef WIN32
- if (test_file(h5_filename,O_CREAT|O_RDWR,436) != 0) { /* 436 Decimal - 0664 Octal, ug+rw,o+r */
- printf("permission of hdf5 file is not set properly.\n");
- status = -1;
- break;
- }
-
- if (test_dir(h4_filename) != 0 ) {
- fprintf(stderr,"%s: Is a directory\n",h4_filename);
- status = -1;
- break;
- }
+ case 3:/* h4toh5 file_in file_out without HDF4 predefined attributes.*/
-#endif
- status = h4toh5(h4_filename, h5_filename);
- if ( status == FAIL ) {
- printf("error in converting %sinto %s\n",h4_filename,h5_filename);
- break;
- }
- break;
+ if(h4_attr==0){
+ h4_filename = argv[1];
+ h5_filename = argv[2];
+ status = gen_h4toh5(h4_filename,h5_filename,h4_attr);
+ if(status <0) return status;
+ }
+ break;
default:
break;
@@ -211,7 +165,7 @@ int main(int argc, char ** argv) {
*-------------------------------------------------------------------------
*/
-int h4toh5(char*filename4, char*filename5) {
+int h4toh5(char*filename4, char*filename5,int h4_attr) {
/* define variables for hdf4. */
int32 istat ; /* hdf4 library routine return value. */
@@ -351,7 +305,7 @@ int h4toh5(char*filename4, char*filename5) {
}
/* convert all objects in lone vgroups into corresponding hdf5 objects. */
- if(h4toh5lonevgs(file_id,sd_id,h5_root,h5_dimg,h5_palg)== FAIL) {
+ if(h4toh5lonevgs(file_id,sd_id,h5_root,h5_dimg,h5_palg,h4_attr)== FAIL) {
printf("error in translating lone vgroup into hdf5 objects.\n");
SDend(sd_id);
GRend(gr_id);
@@ -366,7 +320,7 @@ int h4toh5(char*filename4, char*filename5) {
}
/*convert all objects in group rings into corresponding hdf5 objects. */
- if(h4toh5vgrings(file_id,sd_id,h5_root,h5_dimg,h5_palg) == FAIL){
+ if(h4toh5vgrings(file_id,sd_id,h5_root,h5_dimg,h5_palg,h4_attr) == FAIL){
printf("error in translating vgroup rings into hdf5 objects.\n");
SDend(sd_id);
GRend(gr_id);
@@ -382,7 +336,7 @@ int h4toh5(char*filename4, char*filename5) {
/*convert all independent lone vdata into corresponding hdf5 datasets with
- if(h4toh5lonevds(file_id,h5_root) == FAIL){
+ if(h4toh5lonevds(file_id,h5_root,h4_attr) == FAIL){
printf("error in translating lone independent vdata into hdf5 objects.\n");
SDend(sd_id);
GRend(gr_id);
@@ -413,7 +367,7 @@ int h4toh5(char*filename4, char*filename5) {
/*** deal with untouched sds objects.convert them into hdf5 datasets under root group.***/
- if(h4toh5unvisitedsds(file_id,sd_id,h5_root,h5_dimg) == FAIL) {
+ if(h4toh5unvisitedsds(file_id,sd_id,h5_root,h5_dimg,h4_attr) == FAIL) {
printf("error in converting unvisited sds objects into hdf5 file.\n");
SDend(sd_id);
GRend(gr_id);
@@ -429,7 +383,7 @@ int h4toh5(char*filename4, char*filename5) {
/*** deal with untouched image objects. convert them into hdf5 datasets under root group. ***/
- if(h4toh5unvisitedimages(file_id,h5_root,h5_palg) == FAIL) {
+ if(h4toh5unvisitedimages(file_id,h5_root,h5_palg,h4_attr) == FAIL) {
printf("error in converting unvisited image objects into hdf5 file.\n");
SDend(sd_id);
GRend(gr_id);
@@ -702,7 +656,7 @@ int set_hashtables(void) {
Modification:
*-------------------------------------------------------------------------
*/
-int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5_palg) {
+int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5_palg,int h4_attr) {
int32 vgroup_id;
int num_lonevg; /* number of lone vgroup.*/
@@ -850,7 +804,7 @@ int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
return FAIL;
}
- if(Vgroup_h4_to_h5(file_id,vgroup_id,sd_id,h5group,h5_dimg,h5_palg)==FAIL){
+ if(Vgroup_h4_to_h5(file_id,vgroup_id,sd_id,h5group,h5_dimg,h5_palg,h4_attr)==FAIL){
printf("error in translating vgroup into hdf5 objects.\n");
Vdetach(vgroup_id);
free(h5cgroup_name);
@@ -889,7 +843,7 @@ int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
*-------------------------------------------------------------------------
*/
-int h4toh5vgrings(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5_palg){
+int h4toh5vgrings(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5_palg,int h4_attr){
int32 vgroup_id;
int32 ref_num;
@@ -1019,7 +973,7 @@ int h4toh5vgrings(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
return FAIL;
}
- if(Vgroup_h4_to_h5(file_id,vgroup_id,sd_id,h5group,h5_dimg,h5_palg)
+ if(Vgroup_h4_to_h5(file_id,vgroup_id,sd_id,h5group,h5_dimg,h5_palg,h4_attr)
==FAIL){
printf("error in translating vgroup into hdf5 group\n");
@@ -1053,7 +1007,7 @@ int h4toh5vgrings(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
Modification:
*-------------------------------------------------------------------------
*/
-int h4toh5lonevds(int32 file_id, hid_t h5group){
+int h4toh5lonevds(int32 file_id, hid_t h5group,int h4_attr){
int32 vdata_id;
int32 *ref_vdata_array;
@@ -1192,7 +1146,7 @@ int h4toh5lonevds(int32 file_id, hid_t h5group){
return FAIL;
}
- if(Vdata_h4_to_h5(file_id,vdata_id,h5group)== FAIL) {
+ if(Vdata_h4_to_h5(file_id,vdata_id,h5group,h4_attr)== FAIL) {
printf("error in translating independent vdata into");
printf(" hdf5 datasets.\n");
free(h5cvdata_name);
@@ -1231,7 +1185,7 @@ int h4toh5lonevds(int32 file_id, hid_t h5group){
*/
-int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
+int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg,int h4_attr) {
int i;
int32 sds_id;/* sd dataset identifer*/
@@ -1326,7 +1280,7 @@ int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
}
/* do the convertion from sds into hdf5 dataset.*/
- if(Sds_h4_to_h5(file_id,sds_id,h5root,h5_dimg)== FAIL){
+ if(Sds_h4_to_h5(file_id,sds_id,h5root,h5_dimg,h4_attr)== FAIL){
printf("error in translating sds into hdf5 dataset.\n");
SDendaccess(sds_id);
free(h5csds_name);
@@ -1360,7 +1314,7 @@ int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
*-------------------------------------------------------------------------
*/
-int h4toh5unvisitedimages(int32 file_id,hid_t h5_root,hid_t h5_palg) {
+int h4toh5unvisitedimages(int32 file_id,hid_t h5_root,hid_t h5_palg,int h4_attr) {
int i;
int32 istat;
@@ -1451,7 +1405,7 @@ int h4toh5unvisitedimages(int32 file_id,hid_t h5_root,hid_t h5_palg) {
}
/* do the convertion from the image into hdf5 dataset.*/
- if(Image_h4_to_h5(file_id,ri_id,h5_root,h5_palg)== FAIL) {
+ if(Image_h4_to_h5(file_id,ri_id,h5_root,h5_palg,h4_attr)== FAIL) {
printf("error in transferring image name into hdf5 dataset.\n");
GRendaccess(ri_id);
free(h5cimage_name);
@@ -1619,11 +1573,109 @@ void PrintOptions_h4toh5(void)
{
fprintf(stderr,"\nUsage: ");
fprintf(stderr,"\n h4toh5 -h (gives this print-out)\n");
+ fprintf(stderr," h4toh5 -na(can convert without HDF4 specified attributes)\n");
fprintf(stderr," h4toh5 input.hdf output.h5\n");
fprintf(stderr," h4toh5 input.hdf\n");
+ fprintf(stderr," h4toh5 -na input.hdf output.h5\n");
+ fprintf(stderr," h4toh5 -na input.hdf\n");
}
+/*****************************************************************************
+
+ Routine: gen_h4toh5()
+
+ Description: This routine prints the acceptable argument formats out to stderr.
+
+ Input: h4_filename: HDF4 file name
+ h5_filename: HDF5 file name
+ h4_attr: flag to indicate whether to include HDF4
+ predefined attribute or not.
+
+ Output: -1 FAIL
+ 0 SUCCEED
+
+*****************************************************************************/
+
+
+int gen_h4toh5(char*h4_filename,char*h5_filename,int h4_attr){
+ char* h5_extension;
+ int status;
+
+#ifndef WIN32
+ if (test_file(h4_filename,O_EXCL,292) != 0 ) {
+ /* 292 Decimal - 0444 Octal, a+r */
+ printf("the current hdf4 file name is not set properly.\n");
+ status = -1;
+ return status;
+ }
+ if (test_dir(h4_filename) != 0 ) {
+ fprintf(stderr,"%s: Is a directory\n",h4_filename);
+ status = -1;
+ return status;
+ }
+#endif
+ /*0. check whether this file is an hdf file. */
+
+ if(!Hishdf(h4_filename)){
+ printf("error: not an hdf file. \n");
+ printf("the file will not be converted. \n");
+ status = -1;
+ return status;
+ }
+
+ if(h5_filename == NULL){
+ h5_extension = HDstrdup("h5");
+ h5_filename = BuildFilename(h4_filename,h5_extension);
+ if (h5_filename == NULL) {
+ printf("error in creating hdf5 file name.\n");
+ status = -1;
+ return status;
+ }
+#ifndef WIN32
+ if (test_file(h5_filename,O_CREAT|O_EXCL,436) != 0) {
+ /* 436 Decimal - 0664 Octal, ug+rw,o+r */
+ printf("permission of hdf5 file is not set properly.\n");
+ status = -1;
+ return status;
+ }
+#endif
+
+ status = h4toh5(h4_filename, h5_filename,h4_attr);
+
+ if ( status == FAIL ) {
+ printf("error in converting %s into %s\n",h4_filename,h5_filename);
+ return status;
+ }
+ if (h5_filename != NULL) {
+ HDfree(h5_filename);
+ }
+ return 0;
+ }
+
+ else {
+
+#ifndef WIN32
+ if (test_file(h5_filename,O_CREAT|O_RDWR,436) != 0) { /* 436 Decimal - 0664 Octal, ug+rw,o+r */
+ printf("permission of hdf5 file is not set properly.\n");
+ status = -1;
+ return status;
+ }
+ if (test_dir(h4_filename) != 0 ) {
+ fprintf(stderr,"%s: Is a directory\n",h4_filename);
+ status = -1;
+ return status;
+ }
+
+#endif
+ status = h4toh5(h4_filename, h5_filename,h4_attr);
+ if ( status == FAIL ) {
+ printf("error in converting %sinto %s\n",h4_filename,h5_filename);
+ return status;
+ }
+ }
+ return 0;
+}
diff --git a/tools/h4toh5/h4toh5main.h b/tools/h4toh5/h4toh5main.h
index 85c416d..7bfa794 100644
--- a/tools/h4toh5/h4toh5main.h
+++ b/tools/h4toh5/h4toh5main.h
@@ -57,42 +57,43 @@ int test_dir(char *);
char *BuildFilename(char *filename, char *ext);
/* subroutines for h4toh5main.c */
-int h4toh5(char*,char*);
+int gen_h4toh5(char*,char*,int);
+int h4toh5(char*,char*,int);
int get_numof_hdf4obj(char*,int32);
int set_hashtables(void);
int set_helpgroups(hid_t,hid_t*,hid_t*);
-int h4toh5lonevds(int32,hid_t);
-int h4toh5lonevgs(int32,int32,hid_t,hid_t,hid_t);
-int h4toh5vgrings(int32,int32,hid_t,hid_t,hid_t);
-int h4toh5unvisitedimages(int32,hid_t,hid_t);
-int h4toh5unvisitedsds(int32,int32,hid_t,hid_t);
+int h4toh5lonevds(int32,hid_t,int);
+int h4toh5lonevgs(int32,int32,hid_t,hid_t,hid_t,int);
+int h4toh5vgrings(int32,int32,hid_t,hid_t,hid_t,int);
+int h4toh5unvisitedimages(int32,hid_t,hid_t,int);
+int h4toh5unvisitedsds(int32,int32,hid_t,hid_t,int);
void free_allhashmemory(void);
/*subroutines for h4toh5vgroup.c*/
-int Vgroup_h4_to_h5(int32,int32,int32,hid_t,hid_t,hid_t);
-int convert_vgroup(int32,int32, int32,char* ,hid_t,hid_t,hid_t);
-int convert_vdata(int32,int32,char*,hid_t);
-int convert_sds(int32,int32,int32,char*,hid_t,hid_t);
-int convert_image(int32,int32,char*,hid_t,hid_t);
+int Vgroup_h4_to_h5(int32,int32,int32,hid_t,hid_t,hid_t,int);
+int convert_vgroup(int32,int32, int32,char* ,hid_t,hid_t,hid_t,int);
+int convert_vdata(int32,int32,char*,hid_t,int);
+int convert_sds(int32,int32,int32,char*,hid_t,hid_t,int);
+int convert_image(int32,int32,char*,hid_t,hid_t,int);
/*subroutines for h4toh5vdata.c*/
-int Vdata_h4_to_h5(int32,int32,hid_t);
+int Vdata_h4_to_h5(int32,int32,hid_t,int);
int vdata_transattrs(int32,hid_t,int,int,char*);
int gen_h5comptype(int32,int32,size_t *,size_t*,hid_t*,hid_t*,hid_t,hid_t);
/* subroutines for h4toh5sds.c*/
-int Sds_h4_to_h5(int32,int32,hid_t,hid_t);
+int Sds_h4_to_h5(int32,int32,hid_t,hid_t,int);
int sds_transattrs(int32, hid_t,int,int);
int sdsdim_to_h5dataset(int32,int32,hid_t,hid_t,int32);
-int convert_sdsfillvalue(int32,int32,hid_t,hid_t);
+int convert_sdsfillvalue(int32,int32,hid_t,hid_t,int);
uint16 get_SDref(int32,uint16,int32);
/*subroutines for h4toh5image.c*/
-int Image_h4_to_h5(int32,int32,hid_t,hid_t);
+int Image_h4_to_h5(int32,int32,hid_t,hid_t,int);
int gr_tranattrs(int32, hid_t,int,int);
-int gr_palette(int32,int32,hid_t,hid_t);
+int gr_palette(int32,int32,hid_t,hid_t,int);
int create_pal_objref(hid_t ,hid_t ,char *);
uint16 get_RIref(int32,uint16,int32,uint16*);
/*subroutines for h4toh5anno.c*/
@@ -101,7 +102,7 @@ int Annofil_h4_to_h5(int32,hid_t);
int Annoobj_h4_to_h5(int32,int32,int32,hid_t);
/*subroutines for h4toh5pal.c*/
-int Palette_h4_to_h5(int32,int32 ,hid_t,char *);
+int Palette_h4_to_h5(int32,int32 ,hid_t,char *,int);
diff --git a/tools/h4toh5/h4toh5pal.c b/tools/h4toh5/h4toh5pal.c
index bf90acd..f814489 100644
--- a/tools/h4toh5/h4toh5pal.c
+++ b/tools/h4toh5/h4toh5pal.c
@@ -45,7 +45,7 @@ Author: Kent Yang(ymuqun@ncsa.uiuc.edu)
*-------------------------------------------------------------------------
*/
-int Palette_h4_to_h5(int32 file_id,int32 pal_id,hid_t h5g,char*pal_name) {
+int Palette_h4_to_h5(int32 file_id,int32 pal_id,hid_t h5g,char*pal_name,int h4_attr) {
int32 ncomp;
int32 pal_ref;
@@ -160,12 +160,14 @@ int Palette_h4_to_h5(int32 file_id,int32 pal_id,hid_t h5g,char*pal_name) {
return FAIL;
}
+ if(h4_attr!=0){
if(h4_transpredattrs(h5dset,HDF4_OBJECT_TYPE,palette_label)==FAIL) {
printf("unable to transfer palette label to HDF4 OBJECT TYPE.\n");
H5Sclose(h5d_sid);
H5Dclose(h5dset);
return FAIL;
}
+ }
if(h4_transpredattrs(h5dset,HDF4_PALETTE_CLASS,palette_class)==FAIL){
printf("unable to transfer palette class to HDF4 PALETTE CLASS.\n");
@@ -187,12 +189,15 @@ int Palette_h4_to_h5(int32 file_id,int32 pal_id,hid_t h5g,char*pal_name) {
H5Dclose(h5dset);
return FAIL;
}
+
+ if(h4_attr !=0){
if(h4_transnumattr(h5dset,HDF4_REF_NUM,pal_ref)==FAIL) {
printf("unable to transfer palette reference number to HDF4 REF. NUM.\n");
H5Sclose(h5d_sid);
H5Dclose(h5dset);
return FAIL;
}
+ }
return SUCCEED;
}
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);
diff --git a/tools/h4toh5/h4toh5util.c b/tools/h4toh5/h4toh5util.c
index 879e8a9..2b6586e 100644
--- a/tools/h4toh5/h4toh5util.c
+++ b/tools/h4toh5/h4toh5util.c
@@ -1078,7 +1078,7 @@ int h4_transpredattrs(hid_t h5g,const char *attrname,char*data){
*-------------------------------------------------------------------------
*/
-int vg_transattrs(int32 h4vg,hid_t h5g) {
+int vg_transattrs(int32 h4vg,hid_t h5g,int h4_attr) {
/* define variables for hdf4. */
char vgroup_name[VGNAMELENMAX];
@@ -1108,7 +1108,7 @@ int vg_transattrs(int32 h4vg,hid_t h5g) {
int i;
num_vgattr = Vnattrs(h4vg);
-
+
for (i = 0;i <num_vgattr;i++) {
if (Vattrinfo(h4vg,i,vgattr_name,&vg_atype,
@@ -1238,6 +1238,8 @@ int vg_transattrs(int32 h4vg,hid_t h5g) {
}
/*** check this line later. ***/
+
+ if(h4_attr != 0) {
strcpy(obtype,VGROUPLABEL);
vgroup_class[0] = '\0';
@@ -1282,7 +1284,7 @@ int vg_transattrs(int32 h4vg,hid_t h5g) {
printf("error in data attribute transferring.\n");
return FAIL;
}
-
+ }
return SUCCEED;
}
diff --git a/tools/h4toh5/h4toh5util.h b/tools/h4toh5/h4toh5util.h
index 31252d3..2cda0cc 100644
--- a/tools/h4toh5/h4toh5util.h
+++ b/tools/h4toh5/h4toh5util.h
@@ -218,7 +218,7 @@ herr_t h4type_to_h5type(const int32 h4type, hid_t* h5memtype,
/* routines for translating predefined hdf4 attributes into hdf5 attributes*/
int h4_transpredattrs(hid_t ,const char *,char*data);
int h4_transnumattr(hid_t h5g,const char *,uint16 group_ref);
-int vg_transattrs(int32,hid_t);
+int vg_transattrs(int32,hid_t,int);
/*string and int conversion routines.*/
hid_t mkstr(int size, H5T_str_t pad);
diff --git a/tools/h4toh5/h4toh5vdata.c b/tools/h4toh5/h4toh5vdata.c
index e1b20d1..e4efd1d 100644
--- a/tools/h4toh5/h4toh5vdata.c
+++ b/tools/h4toh5/h4toh5vdata.c
@@ -46,7 +46,7 @@ Author: Kent Yang(ymuqun@ncsa.uiuc.edu)
*-------------------------------------------------------------------------
*/
-int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id) {
+int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id,int h4_attr) {
/* define variables for hdf4. */
@@ -388,6 +388,7 @@ int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id) {
/* converting predefined attributes. */
+ if(h4_attr != 0) {
istat = VSisattr(vdata_id);
if (istat == FAIL) {
printf("error in checking vdata attribute. \n");
@@ -428,7 +429,7 @@ int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id) {
free(vd_data);
return FAIL;
}
-
+ }
H5Sclose(h5d_sid);
H5Dclose(h5dset);
VSdetach(vdata_id);
@@ -805,7 +806,6 @@ int gen_h5comptype(int32 vdata_id,int32 nfields,
printf("error closing array datatype.\n");
return FAIL;
}
-
}
@@ -838,3 +838,4 @@ int gen_h5comptype(int32 vdata_id,int32 nfields,
+
diff --git a/tools/h4toh5/h4toh5vgroup.c b/tools/h4toh5/h4toh5vgroup.c
index 1605ec8..9d3bbef 100644
--- a/tools/h4toh5/h4toh5vgroup.c
+++ b/tools/h4toh5/h4toh5vgroup.c
@@ -54,7 +54,7 @@ Author: Kent Yang(ymuqun@ncsa.uiuc.edu)
*/
-int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid_t h5_dimgroup,hid_t h5_palgroup)
+int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid_t h5_dimgroup,hid_t h5_palgroup,int h4_attr)
{
@@ -138,7 +138,7 @@ int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid
}
/* vgroup attributes into corresponding hdf5 group attributes.*/
- if(vg_transattrs(vgroup_id,h5_pgroup)==FAIL) {
+ if(vg_transattrs(vgroup_id,h5_pgroup,h4_attr)==FAIL) {
printf("error in translating vgroup attributes into hdf5 group attr.\n");
H5Gclose(h5_pgroup);
free(h5pgroup_name);
@@ -182,7 +182,7 @@ int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid
if (Visvg(vgroup_id,obj_ref)) {
if(convert_vgroup(file_id,sd_id,obj_ref,h5pgroup_name,h5_pgroup,
- h5_dimgroup,h5_palgroup)== FAIL) {
+ h5_dimgroup,h5_palgroup,h4_attr)== FAIL) {
printf("convert_vgroup routine failed,");
printf("cannot convert vgroup into hdf5 group successfully.\n");
free(h5pgroup_name);
@@ -193,7 +193,7 @@ int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid
}
/* the object is independent vdata. */
else if(Visvs(vgroup_id,obj_ref)) {
- if(convert_vdata(file_id,obj_ref,h5pgroup_name,h5_pgroup)==FAIL){
+ if(convert_vdata(file_id,obj_ref,h5pgroup_name,h5_pgroup,h4_attr)==FAIL){
printf("fail to convert vdata into hdf5 dataset.\n");
free(h5pgroup_name);
H5Gclose(h5_pgroup);
@@ -202,7 +202,7 @@ int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid
}
else if(obj_tag == DFTAG_NDG || obj_tag == DFTAG_SDG) {
if(convert_sds(file_id,sd_id,obj_ref,h5pgroup_name,h5_pgroup,
- h5_dimgroup)==FAIL){
+ h5_dimgroup,h4_attr)==FAIL){
printf("fail to convert sds into hdf5 dataset.\n");
H5Gclose(h5_pgroup);
free(h5pgroup_name);
@@ -211,7 +211,7 @@ int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid
}
else if(obj_tag == DFTAG_RIG) {
if(convert_image(file_id,obj_ref,h5pgroup_name,
- h5_pgroup,h5_palgroup)==FAIL){
+ h5_pgroup,h5_palgroup,h4_attr)==FAIL){
printf("fail to convert image into hdf5 dataset.\n");
H5Gclose(h5_pgroup);
free(h5pgroup_name);
@@ -250,7 +250,7 @@ int Vgroup_h4_to_h5(int32 file_id,int32 vgroup_id,int32 sd_id,hid_t h5_group,hid
int convert_vgroup(int32 file_id,int32 sd_id, int32 obj_ref,
char* h5pgroup_name,hid_t h5_pgroup,hid_t h5_dimgroup,
- hid_t h5_palgroup) {
+ hid_t h5_palgroup,int h4_attr) {
int32 vgroup_cid;
int32 istat;
@@ -316,7 +316,7 @@ int convert_vgroup(int32 file_id,int32 sd_id, int32 obj_ref,
return FAIL;
}
if(Vgroup_h4_to_h5(file_id,vgroup_cid,sd_id,h5_pgroup,
- h5_dimgroup,h5_palgroup)== FAIL) {
+ h5_dimgroup,h5_palgroup,h4_attr)== FAIL) {
printf("error in transferring vgroup into hdf5 group.\n");
Vdetach(vgroup_cid);
free(h5cgroup_name);
@@ -390,7 +390,7 @@ int convert_vgroup(int32 file_id,int32 sd_id, int32 obj_ref,
*/
int convert_vdata(int32 file_id,int32 obj_ref,char * h5pgroup_name,
- hid_t h5_pgroup) {
+ hid_t h5_pgroup,int h4_attr) {
int32 vdata_id;
int check_vdata;
@@ -462,7 +462,7 @@ int convert_vdata(int32 file_id,int32 obj_ref,char * h5pgroup_name,
return FAIL;
}
- if(Vdata_h4_to_h5(file_id,vdata_id,h5_pgroup)==FAIL){
+ if(Vdata_h4_to_h5(file_id,vdata_id,h5_pgroup,h4_attr)==FAIL){
printf("failed to transfer vdata into hdf5 dataset.\n");
VSdetach(vdata_id);
free(h5cvdata_name);
@@ -536,7 +536,7 @@ int convert_vdata(int32 file_id,int32 obj_ref,char * h5pgroup_name,
*-------------------------------------------------------------------------
*/
int convert_sds(int32 file_id,int32 sd_id,int32 obj_ref,char * h5pgroup_name,
- hid_t h5_pgroup,hid_t h5_dimgroup) {
+ hid_t h5_pgroup,hid_t h5_dimgroup,int h4_attr) {
int32 sd_index;
int32 sds_id;
@@ -609,7 +609,7 @@ int convert_sds(int32 file_id,int32 sd_id,int32 obj_ref,char * h5pgroup_name,
return FAIL;
}
/* convert the sds object into hdf5 dataset.*/
- if(Sds_h4_to_h5(file_id,sds_id,h5_pgroup,h5_dimgroup)==FAIL){
+ if(Sds_h4_to_h5(file_id,sds_id,h5_pgroup,h5_dimgroup,h4_attr)==FAIL){
printf("error in translating sds into hdf5 dataset.\n");
SDendaccess(sds_id);
free(h5csds_name);
@@ -673,7 +673,7 @@ int convert_sds(int32 file_id,int32 sd_id,int32 obj_ref,char * h5pgroup_name,
*-------------------------------------------------------------------------
*/
int convert_image(int32 file_id,int32 obj_ref,char * h5pgroup_name,
- hid_t h5_pgroup,hid_t h5_palgroup) {
+ hid_t h5_pgroup,hid_t h5_palgroup,int h4_attr) {
int32 gr_id;
int32 gr_index;
@@ -754,7 +754,7 @@ int convert_image(int32 file_id,int32 obj_ref,char * h5pgroup_name,
free(h5cimage_name);
return FAIL;
}
- if(Image_h4_to_h5(file_id,ri_id,h5_pgroup,h5_palgroup)==FAIL) {
+ if(Image_h4_to_h5(file_id,ri_id,h5_pgroup,h5_palgroup,h4_attr)==FAIL) {
printf("error in transferring image name into hdf5 dataset.\n");
GRendaccess(ri_id);
free(h5cimage_name);
@@ -810,3 +810,11 @@ int convert_image(int32 file_id,int32 obj_ref,char * h5pgroup_name,
+
+
+
+
+
+
+
+