diff options
Diffstat (limited to 'tools/h4toh5util.c')
-rw-r--r-- | tools/h4toh5util.c | 147 |
1 files changed, 72 insertions, 75 deletions
diff --git a/tools/h4toh5util.c b/tools/h4toh5util.c index 4c76dd5..ea9c452 100644 --- a/tools/h4toh5util.c +++ b/tools/h4toh5util.c @@ -1,10 +1,40 @@ +/*------------------------------------------------------------------------- + * + * Copyright (C) 2000 National Center for Supercomputing Applications. + * All rights reserved. + * + *------------------------------------------------------------------------- + */ + +/****************************************************************************** + + Description: + +1. converter + +See HDF4 to HDF5 mapping specification at +(http://hdf.ncsa.uiuc.edu/HDF5/papers/h4toh5) for the default mapping +from HDF4 object to HDF5 object. + +The whole converter includes 10 files, h4toh5util.h, h4toh5main.h, h4toh5util.c, h4toh5main.c, h4toh5sds.c, h4toh5image.c,h4toh5vdata.c,h4toh5vgroup.c,h4toh5pal.c and h4toh5anno.c. + +2. this file + +including all routines that are useful for other files. + +Author: Kent Yang(ymuqun@ncsa.uiuc.edu) + + +*****************************************************************************/ + + #include "h4toh5util.h" /* Function h4toh5_ZeroMemory -* Purpose: Zero out memory -* return: None -* In: size_t n(DWORD in windows) + Purpose: Zero out memory + return: None + In: size_t n(DWORD in windows) void* s(PVOID in windows) */ void h4toh5_ZeroMemory(void*s,size_t n) { @@ -19,17 +49,17 @@ void h4toh5_ZeroMemory(void*s,size_t n) { * Function: h5string_to_int * * Purpose: This function will convert H5T_STRING into integer. - This is for cases the user define the numerical datatype int8 - as DFNT_CHAR8 and DFNT_UCHAR8 + This is a correction routine when the user define the + numerical datatype int8 as DFNT_CHAR8 and DFNT_UCHAR8 - * Errors: will return error message to the interface. - * Return: FAIL if failed, SUCCEED if success. + * Errors: will return error message to the interface + * Return: FAIL if failed, SUCCEED if success * - * In : h4type: HDF4 datatype. - h4memsize: the real memory size of h4type. + * In : h4type: HDF4 datatype + h4memsize: the real memory size of h4type * Out: h5memtype: pointer of which value should be h5memtype(the real - data type stored at the memory). + data type stored at the memory) h5type: pointer of which value should be h5type(the hdf5 type stored at the disk). * @@ -53,6 +83,7 @@ int h5string_to_int(const int32 h4type, hid_t* h5memtype, else if(h4memsize == H5Tget_size(H5T_NATIVE_LONG)) *h5memtype = H5T_NATIVE_LONG; else return FAIL; + break; case DFNT_UCHAR8: @@ -66,6 +97,7 @@ int h5string_to_int(const int32 h4type, hid_t* h5memtype, else if(h4memsize == H5Tget_size(H5T_NATIVE_LONG)) *h5memtype = H5T_NATIVE_ULONG; else return FAIL; + break; } return SUCCEED; } @@ -149,7 +181,7 @@ int h4type_to_h5type(const int32 h4type, hid_t* h5memtype, case DFNT_NINT8: printf("warning, Native HDF datatype is encountered"); - printf(" the converting results may not be correct.\n"); + printf(" the converting result may not be correct.\n"); *h4size = 1; *h5type = H5T_NATIVE_SCHAR; *h4memsize = sizeof(int8); @@ -166,7 +198,7 @@ int h4type_to_h5type(const int32 h4type, hid_t* h5memtype, case DFNT_NUINT8: printf("warning, Native HDF datatype is encountered"); - printf(" the converting results may not be correct.\n"); + printf(" the converting result may not be correct.\n"); *h4size = 1; *h5type = H5T_NATIVE_UCHAR; *h4memsize = sizeof(int8); @@ -243,7 +275,7 @@ int h4type_to_h5type(const int32 h4type, hid_t* h5memtype, case DFNT_NINT16: printf("warning, Native HDF datatype is encountered"); - printf(" the converting results may not be correct.\n"); + printf(" the converting result may not be correct.\n"); *h4size = 2; *h5type = H5T_NATIVE_SHORT; *h4memsize = sizeof(int16); @@ -260,7 +292,7 @@ int h4type_to_h5type(const int32 h4type, hid_t* h5memtype, case DFNT_NUINT16: printf("warning, Native HDF datatype is encountered"); - printf(" the converting results may not be correct.\n"); + printf(" the converting result may not be correct.\n"); *h4size = 2; *h5type = H5T_NATIVE_USHORT; *h4memsize = sizeof(int16); @@ -337,7 +369,7 @@ int h4type_to_h5type(const int32 h4type, hid_t* h5memtype, case DFNT_NINT32: printf("warning, Native HDF datatype is encountered"); - printf(" the converting results may not be correct.\n"); + printf(" the converting result may not be correct.\n"); *h4size = 4; *h5type = H5T_NATIVE_INT; *h4memsize = sizeof(int32); @@ -436,7 +468,7 @@ int h4type_to_h5type(const int32 h4type, hid_t* h5memtype, case DFNT_NFLOAT64: printf("warning, Native HDF datatype is encountered"); - printf(" the converting results may not be correct.\n"); + printf(" the converting result may not be correct.\n"); *h4size = 8; *h5type = H5T_NATIVE_DOUBLE; *h4memsize = sizeof(float64); @@ -494,58 +526,13 @@ int conv_int_str(uint16 num, char* str_num) { /* the maximum reference number is 65536. */ - int d0,d1,d2,d3,d4; - int i; - if(str_num == NULL) { printf(" memory for str_num should be allocated.\n"); return FAIL; } - for (i=0;i<5;i++) - str_num[i] = '\0'; - - if((num/10000)!=0) { - d4 = num/10000; - str_num[4]= (char)(d4+48); - d3 = (num-d4*10000)/1000; - str_num[3]= (char)(d3+48); - d2 =(num-d4*10000-d3*1000)/100; - str_num[2]= (char)(d2+48); - d1 =(num-d4*10000-d3*1000-d2*100)/10; - str_num[1] =(char)(d1+48); - d0= num-d4*10000-d3*1000-d2*100-d1*10; - str_num[0] =(char)(d0+48); - } - - else if ((num/1000)!=0){ - - d3 = num/1000; - str_num[3] =(char)(d3+48); - d2 =(num-d3*1000)/100; - str_num[2]=(char)(d2+48); - d1 =(num-d3*1000-d2*100)/10; - str_num[1]=(char)(d1+48); - d0 =num-d3*1000-d2*100-d1*10; - str_num[0] =(char)(d0+48); - } - else if ((num/100)!=0){ - - d2 =num/100; - str_num[2]=(char)(d2+48); - d1 =(num-d2*100)/10; - str_num[1]=(char)(d1+48); - d0 =num-d2*100-d1*10; - str_num[0] =(char)(d0+48); - } - else if((num/10)!=0) { - d1= num/10; - str_num[1]=(char)(d1+48); - d0 = num%10; - str_num[0]=(char)(d0+48); - } - else - str_num[0] =(char)(num+48); + sprintf(str_num,"%d",num); + return SUCCEED; } @@ -784,6 +771,10 @@ int lookup_name(char* name, int size,struct name_table *nametab) { return -1; } + if(nametab == NULL) { + printf("no name_table for this category of objects.\n"); + return -1; + } np = nametab+hash_fun(name,size); temptr->name = malloc(strlen(name)+1); @@ -1037,7 +1028,7 @@ int h4_transpredattrs(hid_t h5g,const char *attrname,char*data){ h5str_size = strlen(data); - if ((h5str_type = mkstr(h5str_size,H5T_STR_NULLTERM))<0) { + if ((h5str_type = mkstr(h5str_size,H5T_STR_SPACEPAD))<0) { printf("error in making string for predefined ATTR. \n"); return FAIL; } @@ -1150,7 +1141,7 @@ int vg_transattrs(int32 h4vg,hid_t h5g) { /* now do attribute-transferring. 1. deal with string data type - 2. set attribute space. + 2. set attribute space 3. get attribute name, set property list. */ if (sh5_atype == H5T_STRING ) { @@ -1164,15 +1155,15 @@ int vg_transattrs(int32 h4vg,hid_t h5g) { return FAIL; } - if ((sh5str_type = mkstr(count_vgattr*sh4_size,H5T_STR_NULLTERM))<0) { + if ((sh5str_type = mkstr(count_vgattr*sh4_size,H5T_STR_SPACEPAD))<0) { fprintf(stderr,"error in making string for VGROUP ATTR. \n"); free(vg_adata); return FAIL; } - /* check this line later. */ + if ((sh5str_memtype = mkstr(count_vgattr*sh4_amemsize, - H5T_STR_NULLTERM))<0){ + H5T_STR_SPACEPAD))<0){ fprintf(stderr,"error in making memory string for VGROUP ATTR. \n"); free(vg_adata); return FAIL; @@ -1322,9 +1313,11 @@ char* get_obj_aboname(char* obj_name,char* refstr,char* path_name, int check_name; char check_char; + /* sometimes although the object name is not NULL, but it is empty. We will use make_objname_no under this situation. */ if(obj_name != NULL) check_char = *obj_name; + /* obtain the absolute name of the object. */ if (obj_name == NULL || check_char == '\0') abo_objname = make_objname_no(refstr,path_name,objstr); @@ -1336,7 +1329,7 @@ char* get_obj_aboname(char* obj_name,char* refstr,char* path_name, check_name = lookup_name(abo_objname,num_objects,name_hashtab); if(check_name == 1) { - + /* name_clashing is found. */ if(objstr != NULL && refstr != NULL){ free(abo_objname); @@ -1370,6 +1363,7 @@ char* get_obj_aboname(char* obj_name,char* refstr,char* path_name, } } } + return abo_objname; } @@ -1405,7 +1399,7 @@ char* make_objname_no(char* refstr,char* path_name,const char*objstr) { new_objname= malloc(strlen(objstr)+strlen(refstr)+3); if(new_objname == NULL) { - printf("error in allocating memory. \n"); + printf("error in allocating memory for object name. \n"); return NULL; } h4toh5_ZeroMemory(new_objname,strlen(objstr)+strlen(refstr)+3); @@ -1495,11 +1489,14 @@ char* trans_obj_name(int32 obj_tag,int32 index) { char* obj_name; char indstr[5]; + /* the reason why we allocate memory with strlen(HDF4_PALETTE) is + HDF4_PALETTE is the longest string among HDF4_??? */ obj_name = malloc(strlen(HDF4_PALETTE)+strlen(ATTR)+8); if(obj_name == NULL) { printf("cannot allocate memory for object name. \n"); return NULL; } + h4toh5_ZeroMemory(obj_name,strlen(HDF4_PALETTE)+strlen(ATTR)+8); if(conv_int_str(index,indstr)== FAIL) { @@ -1563,20 +1560,20 @@ char* trans_obj_name(int32 obj_tag,int32 index) { void freehashmemory(void){ - if(estnum_vg != 0) freetable(estnum_vg,vg_hashtab); - if(estnum_vd != 0) freetable(estnum_vd,vd_hashtab); + if(estnum_vg > 0) freetable(estnum_vg,vg_hashtab); + if(estnum_vd > 0) freetable(estnum_vd,vd_hashtab); - if(num_sds !=0) { + if(num_sds > 0) { freetable(2*num_sds,sds_hashtab); freenametable(DIM_HASHSIZE,dim_hashtab); } - if(num_images !=0) { + if(num_images > 0) { freetable(2*num_images,gr_hashtab); freetable(PAL_HASHSIZE,pal_hashtab); } - if(num_objects !=0) freenametable(num_objects,name_hashtab); + if(num_objects > 0) freenametable(num_objects,name_hashtab); } |