diff options
Diffstat (limited to 'tools/h4toh5/h4toh5util.c')
-rw-r--r-- | tools/h4toh5/h4toh5util.c | 1635 |
1 files changed, 0 insertions, 1635 deletions
diff --git a/tools/h4toh5/h4toh5util.c b/tools/h4toh5/h4toh5util.c deleted file mode 100644 index 2b6586e..0000000 --- a/tools/h4toh5/h4toh5util.c +++ /dev/null @@ -1,1635 +0,0 @@ -/*------------------------------------------------------------------------- - * - * 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,int h4_attr) { - - /* 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. ***/ - - if(h4_attr != 0) { - 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; -} - - - - - - - - - - - - - - - - |