diff options
Diffstat (limited to 'tools/h4toh5/h4toh5util.c')
-rw-r--r-- | tools/h4toh5/h4toh5util.c | 1633 |
1 files changed, 1633 insertions, 0 deletions
diff --git a/tools/h4toh5/h4toh5util.c b/tools/h4toh5/h4toh5util.c new file mode 100644 index 0000000..879e8a9 --- /dev/null +++ b/tools/h4toh5/h4toh5util.c @@ -0,0 +1,1633 @@ +/*------------------------------------------------------------------------- + * + * 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) + void* s(PVOID in windows) +*/ +void h4toh5_ZeroMemory(void*s,size_t n) { +#ifdef WIN32 + ZeroMemory(s,n); +#else + bzero(s,n); +#endif +} + +/*------------------------------------------------------------------------- + * Function: h5string_to_int + * + * Purpose: This function will convert H5T_STRING into integer. + 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 + * + * 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) + h5type: pointer of which value should be h5type(the hdf5 + type stored at the disk). + * + *------------------------------------------------------------------------- + */ + +int h5string_to_int(const int32 h4type, hid_t* h5memtype, + const size_t h4memsize,hid_t* h5type) { + + switch(h4type) { + + case DFNT_CHAR8: + + *h5type = H5T_STD_I8BE; + if (h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_SCHAR; + else if(h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_UCHAR8: + + *h5type = H5T_STD_U8BE; + if (h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + } + return SUCCEED; +} + +/*------------------------------------------------------------------------- + * Function: h4type_to_h5type + * + * Purpose: this function will convert HDF4 datatype into HDF5 datatype + The converter includes file to file datatype and datasize + conversion, file to memory datatype and datasize conversion. + Check the mapping document for details. + + * Errors: will return error message to the interface. + * Return: false, FAIL. otherwise,SUCCEED. + * + * In : h4type: HDF4 datatype. + * Out: h4size: the file(disk) size of h4type. + h4memsize: the real memory size of h4type. + * h5memtype: pointer of which value should be h5memtype(the real + type stored at the memory). + h5type: pointer of which value should be h5type(the hdf5 + type that is stored at the disk). + * + * + *------------------------------------------------------------------------- + */ +int h4type_to_h5type(const int32 h4type, hid_t* h5memtype, + size_t* h4memsize,size_t* h4size, hid_t *h5type) +{ + + switch (h4type) { + + case DFNT_CHAR8: + + *h4size = 1; + *h4memsize = sizeof(int8); + /* assume DFNT_CHAR8 C type character. */ + *h5memtype = H5T_STRING; + *h5type = H5T_STRING; + break; + + case DFNT_UCHAR8: + + *h4size = 1; + *h4memsize = sizeof(int8); + *h5memtype = H5T_STRING; + *h5type = H5T_STRING; + break; + + case DFNT_INT8: + + *h4size = 1; + *h5type = H5T_STD_I8BE; + *h4memsize = sizeof(int8); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_SCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_UINT8: + + *h4size =1; + *h5type = H5T_STD_U8BE; + *h4memsize = sizeof(int8); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_NINT8: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting result may not be correct.\n"); + *h4size = 1; + *h5type = H5T_NATIVE_SCHAR; + *h4memsize = sizeof(int8); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_SCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_NUINT8: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting result may not be correct.\n"); + *h4size = 1; + *h5type = H5T_NATIVE_UCHAR; + *h4memsize = sizeof(int8); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_LINT8: + *h4size = 1; + *h5type = H5T_STD_I8LE; + *h4memsize = sizeof(int8); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_LUINT8: + *h4size = 1; + *h5type = H5T_STD_U8LE; + *h4memsize = sizeof(int8); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_INT16: + *h4size = 2; + *h5type = H5T_STD_I16BE; + *h4memsize = sizeof(int16); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_CHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_UINT16: + *h4size = 2; + *h5type = H5T_STD_U16BE; + *h4memsize = sizeof(int16); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_NINT16: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting result may not be correct.\n"); + *h4size = 2; + *h5type = H5T_NATIVE_SHORT; + *h4memsize = sizeof(int16); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_CHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_NUINT16: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting result may not be correct.\n"); + *h4size = 2; + *h5type = H5T_NATIVE_USHORT; + *h4memsize = sizeof(int16); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_LINT16: + *h4size = 2; + *h5type = H5T_STD_I16LE; + *h4memsize = sizeof(int16); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_LUINT16: + *h4size = 2; + *h5type = H5T_STD_U16LE; + *h4memsize = sizeof(int16); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_INT32: + *h4size = 4; + *h5type = H5T_STD_I32BE; + *h4memsize = sizeof(int32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_CHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_UINT32: + *h4size = 4; + *h5type = H5T_STD_U32BE; + *h4memsize = sizeof(int32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_NINT32: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting result may not be correct.\n"); + *h4size = 4; + *h5type = H5T_NATIVE_INT; + *h4memsize = sizeof(int32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_CHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_NUINT32: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting results may not be correct.\n"); + *h4size =4; + *h5type = H5T_NATIVE_UINT; + *h4memsize = sizeof(int32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_LINT32: + *h4size =4; + *h5type = H5T_STD_I32LE; + *h4memsize = sizeof(int32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_CHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_SHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_INT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_LONG; + else return FAIL; + break; + + case DFNT_LUINT32: + *h4size =4; + *h5type = H5T_STD_U32LE; + *h4memsize = sizeof(int32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_CHAR)) + *h5memtype = H5T_NATIVE_UCHAR; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_SHORT)) + *h5memtype = H5T_NATIVE_USHORT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_INT)) + *h5memtype = H5T_NATIVE_UINT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_LONG)) + *h5memtype = H5T_NATIVE_ULONG; + else return FAIL; + break; + + case DFNT_FLOAT32: + *h4size =4; + *h5type = H5T_IEEE_F32BE; + *h4memsize = sizeof(float32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_FLOAT)) + *h5memtype = H5T_NATIVE_FLOAT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_DOUBLE)) + *h5memtype = H5T_NATIVE_DOUBLE; + else return FAIL; + break; + + case DFNT_FLOAT64: + *h4size = 8; + *h5type = H5T_IEEE_F64BE; + *h4memsize = sizeof(float64); + if(*h4memsize == H5Tget_size(H5T_NATIVE_FLOAT)) + *h5memtype = H5T_NATIVE_FLOAT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_DOUBLE)) + *h5memtype = H5T_NATIVE_DOUBLE; + else return FAIL; + break; + + case DFNT_NFLOAT32: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting results may not be correct.\n"); + *h4size = 4; + *h5type = H5T_NATIVE_FLOAT; + *h4memsize = sizeof(float32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_FLOAT)) + *h5memtype = H5T_NATIVE_FLOAT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_DOUBLE)) + *h5memtype = H5T_NATIVE_DOUBLE; + else return FAIL; + break; + + case DFNT_NFLOAT64: + printf("warning, Native HDF datatype is encountered"); + printf(" the converting result may not be correct.\n"); + *h4size = 8; + *h5type = H5T_NATIVE_DOUBLE; + *h4memsize = sizeof(float64); + if(*h4memsize == H5Tget_size(H5T_NATIVE_FLOAT)) + *h5memtype = H5T_NATIVE_FLOAT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_DOUBLE)) + *h5memtype = H5T_NATIVE_DOUBLE; + else return FAIL; + break; + + case DFNT_LFLOAT32: + *h4size = 4; + *h5type = H5T_IEEE_F32LE; + *h4memsize = sizeof(float32); + if(*h4memsize == H5Tget_size(H5T_NATIVE_FLOAT)) + *h5memtype = H5T_NATIVE_FLOAT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_DOUBLE)) + *h5memtype = H5T_NATIVE_DOUBLE; + else return FAIL; + break; + + case DFNT_LFLOAT64: + *h4size = 8; + *h5type = H5T_IEEE_F64LE; + *h4memsize = sizeof(float64); + if(*h4memsize == H5Tget_size(H5T_NATIVE_FLOAT)) + *h5memtype = H5T_NATIVE_FLOAT; + else if(*h4memsize == H5Tget_size(H5T_NATIVE_DOUBLE)) + *h5memtype = H5T_NATIVE_DOUBLE; + else return FAIL; + break; + + default: + return FAIL; + } + return SUCCEED; +} +/*------------------------------------------------------------------------- + * Function: conv_int_str + * + * Purpose: this function will convert numerical number into the + string format for a reference(<=65536). + * Return: SUCCEED if success, FAIL if failed. + * + * In : num: an unsigned digital number that is not greater than 65536. + + * Out: str_num: character string format of the number. + + * + * + *------------------------------------------------------------------------- + */ + +int conv_int_str(uint16 num, char* str_num) { + + /* the maximum reference number is 65536. */ + + + if(str_num == NULL) { + printf(" memory for str_num should be allocated.\n"); + return FAIL; + } + + /* Adding this line will cause problems, investigating this later. +h4toh5_ZeroMemory(str_num,strlen(str_num)+1);*/ + + sprintf(str_num,"%d",num); + return SUCCEED; +} + + +/*------------------------------------------------------------------------- + * Function: lookup + * + * Purpose: this function will use objref as a key to check whether + * the current object is touched. + + * Return: 1, the object is found. 0,the object is not found. + -1, the table doesn't exist. + * + * In : objref: reference number of the current object. + SIZE: the hashtable SIZE. + hashtab: pointer to the hash table. + + *------------------------------------------------------------------------- + */ + +int lookup(int objref,int SIZE,struct table*hashtab) { + + struct table *np; + if(hashtab == NULL) { + printf("the table doesn't exist. \n"); + return -1; + } + np = hashtab+objref%SIZE; + + for (np = hashtab+objref%SIZE; np!=NULL;np=np->next){ + if (np->ref == objref){ + return 1; + } + } + return 0; +} + +/*------------------------------------------------------------------------- + * Function: init_tab + * + * Purpose: this function will initialize the hash table. + * + + * Return: SUCCEED, table is initialzed. FAIL,otherwise. + * + * In : + SIZE: the hashtable SIZE. + hashtab: pointer to the hash table. + + *------------------------------------------------------------------------- + */ + +int init_tab(int SIZE,struct table *hashtab) { + + int i; + if(hashtab == NULL) { + printf("memory for hashing table is not allocated.\n"); + return FAIL; + } + for (i = 0;i < SIZE; i++) { + (hashtab+i%SIZE)->ref = -1; + (hashtab+i%SIZE)->next = NULL; + (hashtab+i%SIZE)->name = NULL; + } + return SUCCEED; +} + +/*------------------------------------------------------------------------- + * Function: init_nametab + * + * Purpose: this function will initialize the name hash table. + * + + * Return: SUCCEED, table is initialzed. FAIL,otherwise. + * + * In : + SIZE: the hashtable SIZE. + name_hashtab: pointer to the hash table. + + *------------------------------------------------------------------------- + */ +int init_nametab(int SIZE, struct name_table * name_hashtab) { + + int i; + + if(name_hashtab == NULL) { + printf("cannot allocate memory for name hashing table.\n"); + return FAIL; + } + for (i=0;i < SIZE; i++) { + (name_hashtab+i%SIZE)->name = NULL; + (name_hashtab+i%SIZE)->next = NULL; + } + return SUCCEED; +} + +/*------------------------------------------------------------------------- + * Function: get_name + * + * Purpose: obtain the name of the object + * + * Return: the object name + * + * In : objref: reference number of the current object. + SIZE: the hashtable SIZE. + hashtab: pointer to the hash table + pcheck_get: a flag to check errors + + *------------------------------------------------------------------------- + */ + +char* get_name(int objref,int SIZE,struct table*hashtab, int* pcheck_get) { + + struct table *np; + char* tempname; + + np = hashtab+objref%SIZE; + + for (np = hashtab+objref%SIZE; np!=NULL;np=np->next){ + + if (np->ref==objref){ + + if (np->name == NULL) { + *pcheck_get = -1; + return NULL; + } + + else { + tempname = malloc(strlen(np->name)+1); + if(tempname == NULL) { + *pcheck_get = -2; + return NULL; + } + strcpy(tempname,np->name); + return tempname; + } + } + } + + *pcheck_get = 0; + return NULL; +} + + +/*------------------------------------------------------------------------- + * Function: set_name + * + * Purpose: store the name of the object into the hash table + * + * Return: SUCCEED: the name is either set before or set in this routine + * FAIL: the name is not set properly + * + * In : objref: reference number of the current object + SIZE: the hashtable SIZE + hashtab: hash table + namein: object name + + *------------------------------------------------------------------------- + */ + + +int set_name(int objref,int SIZE,struct table*hashtab, char* namein) { + + struct table *np; + struct table *temptr; + + temptr = malloc(sizeof(struct table)); + if(temptr == NULL) { + printf("not enough memory to be allocated. \n"); + return FAIL; + } + + np = hashtab+objref%SIZE; + if(namein == NULL) { + printf("error in inputting name into the table.\n"); + return FAIL; + } + + for (np = hashtab+objref%SIZE; np!= NULL;np = np->next){ + if (np->ref==objref){ + /* the name is set already, don't do anything.*/ + return SUCCEED; + } + if (np->next == NULL) { + np->next = temptr; + temptr->ref = objref; + temptr->next = NULL; + temptr->name = malloc(strlen(namein)+1); + if(temptr->name == NULL) { + printf("error in allocating memory. \n"); + return FAIL; + } + strcpy(temptr->name,namein); + return SUCCEED; + } + } + return SUCCEED; +} + + +/*------------------------------------------------------------------------- + * Function: lookup_name + * + * Purpose: 1. look up whether the same name is used for different objects + 2. then update the table + * + * Return: 1, if the name is in the name hash table. + 0, if the name is to be added into the name table. + -1, otherwise. + * + * In : + size: the hashtable SIZE. + nametab: name hash table + name: the name to be looked up + + *------------------------------------------------------------------------- + */ + +int lookup_name(char* name, int size,struct name_table *nametab) { + + /* temporary pointer of the name table that points to the beginning + address of the current bucket.*/ + struct name_table *np; + + /* temporary pointer of the added name table.*/ + struct name_table *temptr; + + if(name == NULL) { + printf("the name to be looked up is NULL.\n"); + return -1; + } + + temptr = malloc(sizeof(struct name_table)); + if(temptr == NULL) { + printf("not enough memory to be allocated. \n"); + 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); + if(temptr->name == NULL) { + printf("not enough memory to be allocated to table name.\n"); + return -1; + } + + /* look through the linked list starting from the current bucket. + If the name is found, return 1, otherwise, return 0 + after inserting the new bucket. */ + + for(np = nametab+hash_fun(name,size); np!= NULL;np = np->next) { + if(np->name == NULL) { + np->name = malloc(strlen(name)+1); + if(np->name == NULL) { + printf("cannot allocate memory for object name.\n"); + return -1; + } + strcpy(np->name,name); + free(temptr->name); + free(temptr); + return 0; + } + if(strcmp(name,np->name)==0){ + free(temptr->name); + free(temptr); + return 1; + } + if (np->next == NULL) { + np->next = temptr; + temptr->next = NULL; + strcpy(temptr->name,name); + return 0; + } + } + return -1; +} + + +/*------------------------------------------------------------------------- + * Function: hash_fun + * + * Purpose: to get the hash value based on the key + * + * Return: No. of the hashtable + * + * In : name: object name + size: the hashtable size. + + *------------------------------------------------------------------------- + */ +int hash_fun(char *name,int size) { + +int hashval; + + for (hashval = 0;*name !='\0';) + hashval += *name++; + return(hashval%size); + +} + +/*------------------------------------------------------------------------- + * Function: freenametable + * + * Purpose: free the memory of hash table + * + * Return: 0 + * + * In : + SIZE: the hashtable SIZE. + nametab: hash table of the name + + *------------------------------------------------------------------------- + */ +int freenametable(int SIZE,struct name_table *nametab) { + + struct name_table *np,*temptr,*temptr1; + int i; + + if(nametab == NULL) return 0; + /* we first free the additional linked items of the hashtable, + and then free the whole hash table. */ + for (i = 0;i < SIZE; i++) { + np = nametab+i; + temptr1 = np->next; + while(temptr1 != NULL) { + temptr = temptr1; + temptr1 = temptr1->next; + free(temptr->name); + free(temptr); + } + if(np->name !=NULL) free(np->name); + } + free(nametab); + return 0; +} + + +/*------------------------------------------------------------------------- + * Function: freetable + * + * Purpose: free the memory of hash table + * + * Return: 0 + * + * In : + SIZE: the hashtable SIZE. + nametab: hash table + + *------------------------------------------------------------------------- + */ +int freetable(int SIZE,struct table *hashtab) { + + struct table *np,*temptr,*temptr1; + int i; + if(hashtab == NULL) return 0; + + /* we first free the additional linked items of the hashtable, + and then free the whole hash table. */ + for (i =0;i < SIZE; i++) { + np = hashtab+i; + temptr1 = np->next; + while(temptr1 != NULL) { + temptr = temptr1; + temptr1 = temptr1->next; + free(temptr->name); + free(temptr); + } + if(np->name != NULL) free(np->name); + } + + free(hashtab); + return 0; +} + +/*------------------------------------------------------------------------- + * Function: mkstr + * + * Purpose: make hdf5 string type + * + * Return: type + * + * In : + size: String Size + H5T_str_t: pad + + *------------------------------------------------------------------------- + */ + +hid_t mkstr(int size, H5T_str_t pad) { + + hid_t type; + + if((type=H5Tcopy(H5T_C_S1))<0) return -1; + if((H5Tset_size(type,(size_t)size))<0) return -1; + if((H5Tset_strpad(type,pad))<0) return -1; + + return type; +} + +/*------------------------------------------------------------------------- + * Function: h4_transnumattr + * + * Purpose: translate reference number into hdf5 attribute + * + * Return: FAIL if failed, SUCCEED if successful. + * + * In : + h5g: hdf5 group id + refname: reference name + group_ref: reference number + + *------------------------------------------------------------------------- + */ +int h4_transnumattr(hid_t h5g,const char *refname,uint16 group_ref) { + + hid_t h5memtype=(-1); + hid_t h5a_id; + hid_t h5a_sid; + herr_t ret; + + h5a_sid = H5Screate(H5S_SCALAR); + + if (h5a_sid < 0) { + fprintf(stderr,"failed to create attribute space for HDF4_REF_NUM. \n"); + return FAIL; + } + + h5a_id = H5Acreate(h5g,refname,H5T_STD_U16BE,h5a_sid,H5P_DEFAULT); + + if(h5a_id <0) { + fprintf(stderr,"failed to obtain attribute id for HDF4_REF_NUM. \n"); + H5Sclose(h5a_sid); + return FAIL; + } + + if(H5Tget_size(H5T_NATIVE_CHAR)== sizeof(uint16)) + h5memtype = H5T_NATIVE_UCHAR; + else if(H5Tget_size(H5T_NATIVE_SHORT)== sizeof(uint16)) + h5memtype = H5T_NATIVE_USHORT; + else if(H5Tget_size(H5T_NATIVE_INT) == sizeof(uint16)) + h5memtype = H5T_NATIVE_UINT; + else if(H5Tget_size(H5T_NATIVE_LONG)== sizeof(uint16)) + h5memtype = H5T_NATIVE_ULONG; + + ret = H5Awrite(h5a_id,h5memtype,(void *)&group_ref); + + if(ret <0) { + printf("failed to obtain attribute.\n "); + H5Sclose(h5a_sid); + H5Aclose(h5a_id); + return FAIL; + } + + ret = H5Sclose(h5a_sid); + ret = H5Aclose(h5a_id); + return SUCCEED; +} + + +/*------------------------------------------------------------------------- + * Function: h4_transpredattrs + * + * Purpose: translate predefined attributes into hdf5 attribute + * predefined attributes include HDF4 OBJECT TYPE, + HDF4 OBJECT NAME, HDF4 CLASS etc. They are all in + H5T_STRING format. + + * Return: FAIL if failed, SUCCEED if successful. + * + * In : + h5g: group id + attrname: attribute name + data: attribute data + + *------------------------------------------------------------------------- + */ +int h4_transpredattrs(hid_t h5g,const char *attrname,char*data){ + + hsize_t h5str_size; + hid_t h5a_id; + hid_t h5a_sid; + hid_t h5str_type; + herr_t ret; + + if(data == NULL) { + printf("attribute data is not available.\n"); + return FAIL; + } + + h5str_size = strlen(data); + + if ((h5str_type = mkstr(h5str_size,H5T_STR_SPACEPAD))<0) { + printf("error in making string for predefined ATTR. \n"); + return FAIL; + } + + h5a_sid = H5Screate(H5S_SCALAR); + + if (h5a_sid < 0) { + printf("failed to create attribute space for HDF4_OBJECT. \n"); + return FAIL; + } + + h5a_id = H5Acreate(h5g,attrname,h5str_type,h5a_sid,H5P_DEFAULT); + + if(h5a_id <0) { + fprintf(stderr,"failed to obtain attribute id for HDF4_OBJECT. \n"); + H5Sclose(h5a_sid); + return FAIL; + } + + ret = H5Awrite(h5a_id,h5str_type,(void *)data); + + if(ret <0) { + fprintf(stderr,"failed to obtain attribute.\n "); + H5Aclose(h5a_id); + H5Sclose(h5a_sid); + return FAIL; + } + ret = H5Sclose(h5a_sid); + ret = H5Aclose(h5a_id); + return SUCCEED; +} + +/*------------------------------------------------------------------------- + * Function: vg_transattrs + * + * Purpose: translate predefined vgroup attributes into hdf5 attribute + * + * Return: FAIL if failed, SUCCEED if successful. + * + * In : + h4vg: hdf4 vgroup id + h5g: hdf5 group id + + *------------------------------------------------------------------------- + */ + +int vg_transattrs(int32 h4vg,hid_t h5g) { + + /* define variables for hdf4. */ + char vgroup_name[VGNAMELENMAX]; + char vgroup_class[VGNAMELENMAX]; + char vgattr_name[MAX_NC_NAME]; + char obtype[MAX_NC_NAME]; + + int32 vgroup_cref; + int32 num_vgattr; + int32 count_vgattr; + int32 vg_atype; + int32 attr_size; + + size_t sh4_size; + size_t sh4_amemsize; + + /* define variables for hdf5. */ + hid_t sh5a_sid; + hid_t sh5a_id; + hid_t sh5_atype; + hid_t sh5_amemtype; + hid_t sh5str_type; + hid_t sh5str_memtype; + hsize_t sh5dims[MAX_VAR_DIMS]; + void* vg_adata; + herr_t sret; + int i; + + num_vgattr = Vnattrs(h4vg); + + for (i = 0;i <num_vgattr;i++) { + + if (Vattrinfo(h4vg,i,vgattr_name,&vg_atype, + &count_vgattr,&attr_size)== FAIL){ + printf("unable to obtain attribute information. \n"); + return FAIL; + } + + /* convert attribute datatype into the corresponding hdf5 datatype */ + + if(h4type_to_h5type(vg_atype,&sh5_amemtype,&sh4_amemsize, + &sh4_size,&sh5_atype)==FAIL){ + printf("unable to do data type converting.\n"); + return FAIL; + } + + vg_adata = malloc(sh4_amemsize*count_vgattr); + + if(vg_adata == NULL) { + printf("error in allocating vgroup attribute data. \n"); + return FAIL; + } + + if(Vgetattr(h4vg,i,(VOIDP)vg_adata)==FAIL){ + printf("unable to get attribute.\n"); + free(vg_adata); + return FAIL; + } + + /* if the attribute doesn't have a name, a default name is set. */ + if(vgattr_name[0] == '\0') + strcpy(vgattr_name,trans_obj_name(DFTAG_VG,i)); + + /* now do attribute-transferring. + 1. deal with string data type + 2. set attribute space + 3. get attribute name, set property list. */ + + if (sh5_atype == H5T_STRING ) { + + sh5a_sid = H5Screate(H5S_SCALAR); + + if (sh5a_sid < 0) { + printf("failed to create attribute space "); + printf("for HDF4_OBJECT_TYPE SDS. \n"); + free(vg_adata); + return FAIL; + } + + 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; + } + + + if ((sh5str_memtype = mkstr(count_vgattr*sh4_amemsize, + H5T_STR_SPACEPAD))<0){ + fprintf(stderr,"error in making memory string for VGROUP ATTR. \n"); + free(vg_adata); + return FAIL; + } + + sh5a_id = H5Acreate(h5g,vgattr_name,sh5str_type,sh5a_sid,H5P_DEFAULT); + + if (sh5a_id <0) { + printf("failed to obtain attribute id"); + printf(" for HDF4_OBJECT_TYPE VGROUP. \n"); + free(vg_adata); + return FAIL; + } + sret = H5Awrite(sh5a_id,sh5str_memtype,(void *)vg_adata); + + if (sret <0) { + fprintf(stderr,"failed to obtain attribute.\n "); + free(vg_adata); + return FAIL; + } + sret = H5Sclose(sh5a_sid); + sret = H5Aclose(sh5a_id); + } + + else { + + if (count_vgattr == 1) { + sh5a_sid = H5Screate(H5S_SCALAR); + if (sh5a_sid < 0) { + fprintf(stderr,"failed to create space id. \n"); + free(vg_adata); + return FAIL; + } + } + + else { + + sh5dims[0] = count_vgattr; + sh5a_sid = H5Screate_simple(1,sh5dims,NULL); + if (sh5a_sid < 0) { + fprintf(stderr,"failed to create vgroup attribute space. \n"); + free(vg_adata); + return FAIL; + } + } + + sh5a_id = H5Acreate(h5g,vgattr_name,sh5_atype,sh5a_sid,H5P_DEFAULT); + + if(sh5a_id <0) { + fprintf(stderr,"failed to obtain attribute id. \n"); + free(vg_adata); + H5Sclose(sh5a_sid); + return FAIL; + } + sret = H5Awrite(sh5a_id,sh5_amemtype,(void *)vg_adata); + + if(sret < 0) { + fprintf(stderr,"failed to obtain attribute.\n "); + free(vg_adata); + H5Sclose(sh5a_sid); + H5Aclose(sh5a_id); + return FAIL; + } + + sret = H5Sclose(sh5a_sid); + sret = H5Aclose(sh5a_id); + } + free(vg_adata); + } + + /*** check this line later. ***/ + strcpy(obtype,VGROUPLABEL); + vgroup_class[0] = '\0'; + + /* ignore CDF0.0 and RIG0.0 vgroups. */ + if(Vgetclass(h4vg,vgroup_class) == SUCCEED){ + if(vgroup_class[0] != '\0') { + if(!strcmp(vgroup_class,_HDF_CDF)|| + !strcmp(vgroup_class,GR_NAME)) + return SUCCEED; + } + } + + /* transfer predefined attributes. */ + if(h4_transpredattrs(h5g,HDF4_OBJECT_TYPE,obtype)==FAIL){ + printf("error in data attribute transferring.\n"); + return FAIL; + } + + if(Vgetname(h4vg,vgroup_name) == SUCCEED){ + if(vgroup_name[0] != '\0') { + if(h4_transpredattrs(h5g,HDF4_OBJECT_NAME,vgroup_name)==FAIL){ + printf("error in data attribute transferring.\n"); + return FAIL; + } + } + } + + if(vgroup_class[0] !='\0') { + if(h4_transpredattrs(h5g,HDF4_VGROUP_CLASS,vgroup_class)==FAIL){ + printf("error in data attribute transferring.\n"); + return FAIL; + } + } + + vgroup_cref = VQueryref(h4vg); + if(vgroup_cref == FAIL) { + printf("failed to obtain group reference number.\n"); + return FAIL; + } + + if(h4_transnumattr(h5g,HDF4_REF_NUM,vgroup_cref)==FAIL){ + printf("error in data attribute transferring.\n"); + return FAIL; + } + + return SUCCEED; +} + + +/*------------------------------------------------------------------------- + * Function: get_obj_aboname + * + * Purpose: get absolute path name of hdf5 object + In this function, we will deal with name clashing. + If we find an object name(by using lookup_name routine) + that has already been used, + we will remake name for this object. We will follow + object type(vgroup,sds,image,palette, vdata) plus reference + number to make it unique. + * + * Return: NULL if failed, object name if successful. + * + * In : + obj_name: relative object name + ref_str: reference number in character format + path_name: absolute path + objstr: object type in character format + + *------------------------------------------------------------------------- + */ + +char* get_obj_aboname(char* obj_name,char* refstr,char* path_name, + const char*objstr ) { + + char *abo_objname; + 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); + else + abo_objname = make_objname_yes(obj_name,path_name); + + /* look up the name and see whether there is name clashing here. + if yes, remake the object 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); + + if(path_name != NULL) { + abo_objname= malloc(strlen(path_name)+strlen(objstr)+ + strlen(refstr)+3); + if(abo_objname == NULL) { + printf("error in allocating memory. \n"); + return NULL; + } + h4toh5_ZeroMemory(abo_objname,strlen(path_name)+strlen(objstr)+ + strlen(refstr)+3); + strcpy(abo_objname,path_name); + strcat(abo_objname,"/"); + strcat(abo_objname,objstr); + strcat(abo_objname,"_"); + strcat(abo_objname,refstr); + } + + else { + abo_objname= malloc(strlen(objstr)+strlen(refstr)+3); + if(abo_objname == NULL) { + printf("error in allocating memory. \n"); + return NULL; + } + h4toh5_ZeroMemory(abo_objname,strlen(objstr)+strlen(refstr)+3); + strcat(abo_objname,"/"); + strcat(abo_objname,objstr); + strcat(abo_objname,"_"); + strcat(abo_objname,refstr); + } + } + } + + return abo_objname; +} + +/*------------------------------------------------------------------------- + * Function: make_objname_no + * + * Purpose: get absolute path name of hdf5 object when object name is + not defined. + We will use path name and + object type(vgroup,sds,image,palette, vdata) plus reference + number to make it unique. + * + * Return: NULL if failed, object name if successful. + * + * In : + ref_str: reference number in character format + path_name: absolute path + objstr: object type in character format + + *------------------------------------------------------------------------- + */ + +char* make_objname_no(char* refstr,char* path_name,const char*objstr) { + + char *new_objname; + + if(objstr == NULL || refstr == NULL) { + printf("error, object type and ref. number should be defined.\n"); + return NULL; + } + + if (path_name == NULL) {/* under root group. */ + + new_objname= malloc(strlen(objstr)+strlen(refstr)+3); + if(new_objname == NULL) { + printf("error in allocating memory for object name. \n"); + return NULL; + } + h4toh5_ZeroMemory(new_objname,strlen(objstr)+strlen(refstr)+3); + strcpy(new_objname,"/"); + strcat(new_objname,objstr); + strcat(new_objname,"_"); + strcat(new_objname,refstr); + } + + else { + + new_objname= malloc(strlen(path_name)+strlen(objstr)+strlen(refstr)+3); + if(new_objname == NULL) { + printf("error in allocating memory. \n"); + return NULL; + } + h4toh5_ZeroMemory(new_objname,strlen(path_name)+strlen(objstr)+strlen(refstr)+3); + strcpy(new_objname,path_name); + strcat(new_objname,"/"); + strcat(new_objname,objstr); + strcat(new_objname,"_"); + strcat(new_objname,refstr); + } + + return new_objname; +} + +/*------------------------------------------------------------------------- + * Function: make_objname_yes + * + * Purpose: get absolute path name of hdf5 object when object name is + defined. + + * + * Return: NULL if failed, object name if successful. + * + * In : obj_name: object name + path_name: absolute path + + *------------------------------------------------------------------------- + */ + +char* make_objname_yes(char* obj_name,char* path_name){ + + char*new_objname; + + if(path_name == NULL) { + new_objname = malloc(strlen(obj_name)+2); + if(new_objname == NULL) { + printf("error in allocating memory. \n"); + return NULL; + } + h4toh5_ZeroMemory(new_objname,strlen(obj_name)+2); + strcpy(new_objname,"/"); + strcat(new_objname,obj_name); + } + else { + new_objname = malloc(strlen(path_name)+strlen(obj_name)+2); + if(new_objname == NULL) { + printf("error in allocating memory. \n"); + return NULL; + } + h4toh5_ZeroMemory(new_objname,strlen(path_name)+strlen(obj_name)+2); + strcpy(new_objname,path_name); + strcat(new_objname,"/"); + strcat(new_objname,obj_name); + } + return new_objname; +} + +/*------------------------------------------------------------------------- + * Function: trans_obj_name + * + * Purpose: obtain hdf4 attribute name from hdf4 object type + plus ATTR plus reference number. + * + * Return: object name; + * + * In : + obj_tag: hdf4 tag + index : hdf5 group id + + *------------------------------------------------------------------------- + */ +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) { + printf("indstr is not allocated. \n"); + return NULL; + } + + switch(obj_tag) { + + case DFTAG_SD: + case DFTAG_NDG: + case DFTAG_SDG: + strcpy(obj_name,HDF4_SDS); + break; + + case DFTAG_RIG: + case DFTAG_RI: + case DFTAG_RI8: + strcpy(obj_name,HDF4_IMAGE); + break; + + case DFTAG_VG: + strcpy(obj_name,HDF4_VGROUP); + break; + + case DFTAG_VH: + case DFTAG_VS: + strcpy(obj_name,HDF4_VDATA); + break; + + case DFTAG_LUT: + strcpy(obj_name,HDF4_PALETTE); + break; + + default: + printf("error, object tag is transferred out of limits. \n"); + free(obj_name); + return NULL; + } + + strcat(obj_name,"_"); + strcat(obj_name,ATTR); + strcat(obj_name,"_"); + strcat(obj_name,indstr); + + return obj_name; +} +/*------------------------------------------------------------------------- + * Function: freehashmemory + * + * Purpose: free memories allocated for hash tables. + + * + * Return: NULL + * + * In : + + + *------------------------------------------------------------------------- + */ + +void freehashmemory(void){ + + if(estnum_vg > 0) freetable(estnum_vg,vg_hashtab); + if(estnum_vd > 0) freetable(estnum_vd,vd_hashtab); + + if(num_sds > 0) { + freetable(2*num_sds,sds_hashtab); + freenametable(DIM_HASHSIZE,dim_hashtab); + } + + if(num_images > 0) { + freetable(2*num_images,gr_hashtab); + freetable(PAL_HASHSIZE,pal_hashtab); + } + + if(num_objects > 0) freenametable(num_objects,name_hashtab); + +} + +/*------------------------------------------------------------------------- + * Function: correct_name + * + * Purpose: modify the hdf4 object name when the name contains '/'. Change + this character into '_'. + + * + * Return: the corrected name + * + * In : old name + + + *------------------------------------------------------------------------- + */ +char *correct_name(char* oldname){ + + char * cptr; + char * newname; + + if(oldname == NULL) { + printf("inputting name is wrong.\n"); + return NULL; + } + + newname = malloc(strlen(oldname)+1); + h4toh5_ZeroMemory(newname,strlen(oldname)+1); + newname = strncpy(newname, oldname, strlen(oldname)); + + while(strchr(newname,ORI_SLASH)!= NULL){ + cptr = strchr(newname,ORI_SLASH); + *cptr = CHA_SLASH; + } + + return newname; +} + + + + + + + + + + + + + + + + |