From 5c28e0edb915e1721281d71895a0b2083bd6e087 Mon Sep 17 00:00:00 2001 From: MuQun Yang Date: Fri, 22 Dec 2000 14:07:45 -0500 Subject: [svn-r3194] Purpose: bug fix Description: 1. zeroing out memory before using the memory buffer 2. before wrongly using Vquerysize API of HDF4 to obtain the real file size of record type in HDF4. Actually Vquerysize will return the real data type size in Memory. That will cause the object reference difference on Cray which file size is not equal memory size. Solution: 1. using h4toh5ZeroingMemory function to zero out memory. 2. calcuating the real file size of vdata record in the converter instead of using Vquerysize HDF4 API. Platforms tested: Cray J90, arabica, eirene --- tools/h4toh5vdata.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/tools/h4toh5vdata.c b/tools/h4toh5vdata.c index 68bfacb..ed692a9 100644 --- a/tools/h4toh5vdata.c +++ b/tools/h4toh5vdata.c @@ -95,7 +95,14 @@ int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id) { int check_vdname; - + /* Zeroing out memory for vdlabel,vdata_class,vdata_name */ + + h4toh5_ZeroMemory(vdata_name,MAX_NC_NAME); + h4toh5_ZeroMemory(fieldname,MAX_NC_NAME); + h4toh5_ZeroMemory(vdata_class,VSNAMELENMAX); + h4toh5_ZeroMemory(field_name_list,VSFIELDMAX*FIELDNAMELENMAX); + h4toh5_ZeroMemory(vdlabel,10); + /* get absolute path of vdata name. */ vdata_ref = VSQueryref(vdata_id); @@ -137,6 +144,7 @@ int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id) { } vdatamem_size = 0; + vdata_size = 0; nfields = VFnfields(vdata_id); if (nfields == FAIL) { @@ -187,6 +195,7 @@ int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id) { } vdatamem_size +=fieldorder*h4memsize[i]; + vdata_size +=fieldorder*h4size[i]; } @@ -387,7 +396,7 @@ int Vdata_h4_to_h5(int32 file_id,int32 vdata_id, hid_t group_id) { return FAIL; } - if(vdata_name != NULL) { + if(vdata_name[0] != '\0') { if(h4_transpredattrs(h5dset,HDF4_OBJECT_NAME,vdata_name)==FAIL){ printf("error in transfering vdata attributes.\n"); free(h5memtype); @@ -465,6 +474,10 @@ int vdata_transattrs(int32 vdata_id,hid_t h5dset,int snum_vdattrs, herr_t sret; int i; + /* zeroing out memory for svdattr_name and refstr */ + h4toh5_ZeroMemory(svdattr_name,2*MAX_NC_NAME); + h4toh5_ZeroMemory(refstr,MAXREF_LENGTH); + /* separate vdata attribute from vdata field attributes. */ if (field_index < -1) { @@ -671,10 +684,8 @@ int gen_h5comptype(int32 vdata_id,int32 nfields, char* fieldname; int32 fieldorder; - int32 fieldsize; size_t fil_offset; size_t mem_offset; - size_t fieldsizef; hsize_t fielddim[1]; hid_t h5str_type; int check_ifstr;/* flag to check if the h5 type is string.*/ @@ -684,7 +695,6 @@ int gen_h5comptype(int32 vdata_id,int32 nfields, check_ifstr = 0; fil_offset = 0; mem_offset = 0; - fieldsizef = 0; for (i =0;i< nfields;i++) { @@ -703,11 +713,6 @@ int gen_h5comptype(int32 vdata_id,int32 nfields, return FAIL; } - fieldsize = VFfieldesize(vdata_id,i); - if(fieldsize == FAIL) { - printf("error in obtaining fieldsize of vdata field.\n"); - return FAIL; - } /* when vdata is a character array, we will write the whole array as one hdf5 type string. */ -- cgit v0.12