diff options
Diffstat (limited to 'tools/h4toh5/h4toh5main.c')
-rw-r--r-- | tools/h4toh5/h4toh5main.c | 1681 |
1 files changed, 0 insertions, 1681 deletions
diff --git a/tools/h4toh5/h4toh5main.c b/tools/h4toh5/h4toh5main.c deleted file mode 100644 index 51099d8..0000000 --- a/tools/h4toh5/h4toh5main.c +++ /dev/null @@ -1,1681 +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 - -This file describes the main driver of hdf to hdf5 converter. It checks -the inputting parameters, initializes the global tables, sets up the root level -hdf5 structure and also check the special case fof vgroup loops at HDF file. - - -Author: Kent Yang(ymuqun@ncsa.uiuc.edu) - - -*****************************************************************************/ - - -#include "h4toh5main.h" - -int32 estnum_vg; -int32 estnum_vd; -int32 num_sds; -int32 num_images; -int num_objects; -int32 num_glsdsattrs; -int32 num_glgrattrs; -struct table* sds_hashtab; -struct table* gr_hashtab; -struct table* vg_hashtab; -struct table* vd_hashtab; -struct table* pal_hashtab; -struct name_table* name_hashtab; -struct name_table* dim_hashtab; - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: driver routine to handle all objects of hdf4 file. - * - * Return: FAIL if failed, SUCCEED if successful. - - Modfication: - *------------------------------------------------------------------------- - */ - - - -int main(int argc, char ** argv) { - - char *h5_filename=NULL; - char *h4_filename=NULL; - char *h5_extension; - int status = 0; - int h4_attr = 1; - - argc--; - argv++; - - if (argc == 0) { - fprintf(stderr,"\nError: Invalid Arguments\n"); - PrintOptions_h4toh5(); - return FAIL; - } - - /* take care -h (help) option first */ - { int i; - for (i=0; i < argc; i++) - if ( HDstrcmp(argv[i],"-h") == 0 ) { - PrintOptions_h4toh5(); - return SUCCEED; - } - } - - /* check whether the flag for HDF4 attributes is set.*/ - { int i; - for (i=0; i < argc; i++){ - if ( HDstrcmp(argv[i],"-na") == 0 ) { - h4_attr = 0; - break; - } - } - } - - switch(argc) { - - case 0: - - PrintOptions_h4toh5(); - break; - - case 1: /* two cases: - 1. h4toh5 file1 without HDF4 specified attributes - this is the option where h4toh5 -na appears. - nothing is done. - 2. h4toh5 file1 including HDF4 specified attributes. - this is the default behavior. - */ - - if(HDstrcmp(argv[0],"-na")==0){ - PrintOptions_h4toh5(); - break; - } - - if(gen_h4toh5(argv[0],NULL,h4_attr)<0){ - status = -1; - return status; - } - break; - - case 2: /* h4toh5 file_in file_out with HDF4 predefined attributes - h4toh5 file_in file_in.h5 without HDF4 predefined attributes*/ - - if(h4_attr !=0){ - h4_filename = argv[0]; - h5_filename = argv[1]; - status = gen_h4toh5(h4_filename,h5_filename,h4_attr); - } - - else - status = gen_h4toh5(argv[1],NULL,h4_attr); - - if(status <0) return status; - break; - - case 3:/* h4toh5 file_in file_out without HDF4 predefined attributes.*/ - - if(h4_attr==0){ - h4_filename = argv[1]; - h5_filename = argv[2]; - status = gen_h4toh5(h4_filename,h5_filename,h4_attr); - if(status <0) return status; - } - break; - - default: - break; - } - - return status; - -} - -/*------------------------------------------------------------------------- - * Function: h4toh5 - * - * Purpose: This routine checks out arguments sent, makes sure that hdf4 - file is valid, makes sure filename for hdf5 file is correct, - and then call h4toh5(). - - *------------------------------------------------------------------------- - */ -int h4toh5(char*filename4, char*filename5,int h4_attr) { - - /* define variables for hdf4. */ - int32 istat ; /* hdf4 library routine return value. */ - int32 file_id;/* file identfier of hdf file.*/ - int32 sd_id;/* sd interface identifer*/ - int32 gr_id;/* gr interface identifer*/ - int check_glo; - - /* define variables for hdf5. */ - hid_t file5_id;/* hdf5 file identifier. */ - hid_t h5_root;/* new hdf5 root group identifier.*/ - - hid_t h5_dimg;/* hdf5 dimensional scale group identifier. */ - hid_t h5_palg;/* hdf5 palette group identifier. */ - - /*1. open the current hdf4 file. */ - - file_id = Hopen(filename4, DFACC_READ, 0); - if(file_id == FAIL) { - printf("error: no such hdf4 files. \n"); - return FAIL; - } - - /* open sd interface.*/ - sd_id = SDstart(filename4,DFACC_READ); - if(sd_id == FAIL) { - printf("error: cannot start SD interface. \n"); - Hclose(file_id); - return FAIL; - } - - /* open gr interface.*/ - gr_id = GRstart(file_id); - if(gr_id == FAIL) { - printf("error in obtaining gr id. \n"); - SDend(sd_id); - Hclose(file_id); - return FAIL; - } - - /* open V interface. */ - istat = Vstart(file_id); - if(istat == FAIL) { - printf("error in starting V interface. \n"); - SDend(sd_id); - GRend(gr_id); - Hclose(file_id); - return FAIL; - } - - /* 2. obtain number of hdf4 objects(sds,image,vdata,vgroup,palette) - in this hdf4 file. */ - - if(get_numof_hdf4obj(filename4,file_id) == FAIL) { - printf("error in obtaining number of hdf4 objects.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - return FAIL; - } - - /* set up global hash tables for hdf4 objects. */ - if(set_hashtables() == FAIL){ - printf("error in setting hashtables. \n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - return FAIL; - } - - /* create hdf5 file. */ - file5_id = H5Fcreate(filename5,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); - - if (file5_id < 0) { - fprintf(stderr, "unable to create hdf5 file \n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - free_allhashmemory(); - return FAIL; - } - - /* Initialize hdf5 group interface. */ - h5_root = H5Gopen(file5_id,"/"); - - if(h5_root < 0) { - printf("error in opening hdf5 root group. \n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - /**** build up helper groups(dimensional scale and palette) ****/ - if(set_helpgroups(h5_root,&h5_dimg,&h5_palg)==FAIL) { - printf("error setting up dimensional scale and palette groups.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - /* convert global sds attributes into global attributes under root group.*/ - check_glo = 1; - - if(sds_transattrs(sd_id, h5_root,num_glsdsattrs,check_glo)==FAIL) { - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - - /* convert global image attributes into global attributes under root group.*/ - check_glo = 1; - - if(gr_tranattrs(gr_id, h5_root,num_glgrattrs,check_glo)==FAIL) { - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - /* convert all objects in lone vgroups into corresponding hdf5 objects. */ - if(h4toh5lonevgs(file_id,sd_id,h5_root,h5_dimg,h5_palg,h4_attr)== FAIL) { - printf("error in translating lone vgroup into hdf5 objects.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - if(num_sds >0) H5Gclose(h5_dimg); - if(num_images >0) H5Gclose(h5_palg); - H5Gclose(h5_root); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - -/*convert all objects in group rings into corresponding hdf5 objects. */ - if(h4toh5vgrings(file_id,sd_id,h5_root,h5_dimg,h5_palg,h4_attr) == FAIL){ - printf("error in translating vgroup rings into hdf5 objects.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - if(num_sds >0) H5Gclose(h5_dimg); - if(num_images >0) H5Gclose(h5_palg); - H5Gclose(h5_root); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - /*convert all independent lone vdata into corresponding hdf5 datasets with - - if(h4toh5lonevds(file_id,h5_root,h4_attr) == FAIL){ - printf("error in translating lone independent vdata into hdf5 objects.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - if(num_sds >0) H5Gclose(h5_dimg); - if(num_images >0) H5Gclose(h5_palg); - H5Gclose(h5_root); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - /*** convert hdf file annotations into hdf5 attributes under the root.***/ - if(Annofil_h4_to_h5(file_id,h5_root) == FAIL) { - printf("error in translating file annotations into root attributes.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - if(num_sds >0) H5Gclose(h5_dimg); - if(num_images >0) H5Gclose(h5_palg); - H5Gclose(h5_root); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - /*** deal with untouched sds objects.convert them into hdf5 datasets under root group.***/ - - if(h4toh5unvisitedsds(file_id,sd_id,h5_root,h5_dimg,h4_attr) == FAIL) { - printf("error in converting unvisited sds objects into hdf5 file.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - if(num_sds >0) H5Gclose(h5_dimg); - if(num_images >0) H5Gclose(h5_palg); - H5Gclose(h5_root); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - /*** deal with untouched image objects. convert them into hdf5 datasets under root group. ***/ - - if(h4toh5unvisitedimages(file_id,h5_root,h5_palg,h4_attr) == FAIL) { - printf("error in converting unvisited image objects into hdf5 file.\n"); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - if(num_sds >0) H5Gclose(h5_dimg); - if(num_images >0) H5Gclose(h5_palg); - H5Gclose(h5_root); - H5Fclose(file5_id); - free_allhashmemory(); - return FAIL; - } - - free_allhashmemory(); - SDend(sd_id); - GRend(gr_id); - Vend(file_id); - Hclose(file_id); - if(num_sds >0) H5Gclose(h5_dimg); - if(num_images >0) H5Gclose(h5_palg); - H5Gclose(h5_root); - H5Fclose(file5_id); - return SUCCEED; -} - -/*------------------------------------------------------------------------- - * Function: get_numof_hdf4obj - * - * Purpose: get number or estimated number of hdf4 objects - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : - file_id: hdf file identifier - filename: hdf file name - Out: - Modification: - *------------------------------------------------------------------------- - */ -int get_numof_hdf4obj(char*filename,int32 file_id) { - - int32 sd_id;/* sd interface identifer*/ - int32 gr_id;/* gr interface identifer*/ - int num_lonevd;/* number of lone vdata*/ - int num_lonevg;/* number of lone vgroup.*/ - int32 istat; - - estnum_vg = 0; - estnum_vd = 0; - num_sds = 0; - num_images = 0; - num_objects = 0; - - /* obtain number of sds and number of global sds attribute. */ - - sd_id = SDstart(filename,DFACC_READ); - if(sd_id == FAIL) { - printf("error: cannot start SD interface. \n"); - return FAIL; - } - - if(SDfileinfo(sd_id,&num_sds,&num_glsdsattrs) == FAIL) { - printf("error in obtaining SDS information from the file.\n"); - return FAIL; - } - - /* obtain number of images and number of global image attributes.*/ - - gr_id = GRstart(file_id); - if(gr_id == FAIL) { - printf("error in obtaining gr id. \n"); - return FAIL; - } - - if(GRfileinfo(gr_id,&num_images,&num_glgrattrs) == FAIL) { - printf("error in obtaining GR information from the file. \n"); - return FAIL; - } - - /* obtain number of lone vgroup and lone vdata. */ - - istat = Vstart(file_id); - if (istat == FAIL) { - fprintf(stderr, "unable to start hdf4 V interface.\n"); - return FAIL; - } - - num_lonevd = VSlone(file_id,NULL,0); - if(num_lonevd == FAIL) { - printf("error in obtaining lone vdata number. \n"); - return FAIL; - } - - num_lonevg = Vlone(file_id,NULL,0); - if(num_lonevg == FAIL) { - printf("error in obtaining lone vgroup number. \n"); - return FAIL; - } - - /* intelligent guess of the total number of vgroups,total number of - independent vdata. */ - - estnum_vg = 6* num_lonevg; - estnum_vd = 4* num_lonevd; - - /* set the size of name hashtable to num_objects. */ - num_objects = estnum_vg + estnum_vd + num_sds + num_images; - - return SUCCEED; -} - - - -/*------------------------------------------------------------------------- - * Function: set_helpgroups - * - * Purpose: get number or estimated number of hdf4 objects - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : - h5root: hdf5 group identifier - h5dimgptr: h5 dimensional group pointer - h5palgptr: h5 palette group pointer - Modification: - *------------------------------------------------------------------------- - */ - -int set_helpgroups(hid_t h5root,hid_t* h5dimgptr,hid_t* h5palgptr){ - - hid_t h5_dimg=(-1);/* hdf5 dimensional scale group identifier. */ - hid_t h5_palg;/* hdf5 palette group identifier. */ - - /*1. dimensional scale group.*/ - - if(num_sds > 0) { - h5_dimg = H5Gcreate(h5root,HDF4_DIMG,0); - if (h5_dimg <0) { - printf("error in creating hdf5 dimensional scale group. \n"); - return FAIL; - } - - *h5dimgptr = h5_dimg; - } - - /*2. palette group.*/ - - if(num_images >0) { - h5_palg = H5Gcreate(h5root,HDF4_PALG,0); - if(h5_palg <0) { - printf("error in creating hdf5 palette group. \n"); - if(h5_dimg>0) H5Gclose(h5_dimg); - return FAIL; - } - - *h5palgptr = h5_palg; - } - - return SUCCEED; - -} - - -/*------------------------------------------------------------------------- - * Function: set_hashtables - * - * Purpose: set up hashtables - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : - - Out: - Modification: - *------------------------------------------------------------------------- - */ -int set_hashtables(void) { - - if(num_sds > 0) { - sds_hashtab = malloc(sizeof(struct table)*2*num_sds); - if(init_tab(2*num_sds,sds_hashtab)== FAIL){ - printf("cannot initialize sds hashing table. \n"); - return FAIL; - } - } - - if(num_images > 0) { - gr_hashtab = malloc(sizeof(struct table)*2*num_images); - if(init_tab(2*num_images,gr_hashtab) == FAIL){ - printf("cannot initialize image hashing table. \n"); - return FAIL; - } - } - - /*hashtable is made to be fixed for dimensional scale and palette.*/ - - if(num_sds > 0) { - dim_hashtab = malloc(sizeof(struct name_table)*DIM_HASHSIZE); - if(init_nametab(DIM_HASHSIZE,dim_hashtab) == FAIL) { - printf("can not initialize dimension hashing table.\n"); - return FAIL; - } - } - - /* initialize the palette table */ - if(num_images > 0){ - pal_hashtab = malloc(sizeof(struct table)*PAL_HASHSIZE); - if(init_tab(PAL_HASHSIZE,pal_hashtab) == FAIL) { - printf("can not initialize palette hashing table.\n"); - return FAIL; - } - } - - /* initialize the vgroup table */ - if(estnum_vg > 0) { - vg_hashtab = malloc(sizeof(struct table)*estnum_vg); - } - else { - estnum_vg = VG_DEFHASHSIZE; - vg_hashtab = malloc(sizeof(struct table)*estnum_vg); - } - if(init_tab(estnum_vg,vg_hashtab) == FAIL) { - printf("error in allocating memory for vgroup hashing table.\n"); - return FAIL; - } - - /* initialize the vdata table.*/ - if(estnum_vd > 0) { - vd_hashtab = malloc(sizeof(struct table)*estnum_vd); - } - else { - estnum_vd = VD_DEFHASHSIZE; - vd_hashtab = malloc(sizeof(struct table)*estnum_vd); - } - - if(init_tab(estnum_vd,vd_hashtab)== FAIL) { - printf("cannot initialize vdata hashing table.\n"); - return FAIL; - } - - /* The name hashtable is only for dealing with name clashing, - num_objects is the size of the hash table. */ - - if(num_objects != 0){ - name_hashtab = malloc(sizeof(struct name_table)*num_objects); - if(init_nametab(num_objects,name_hashtab)== FAIL) { - printf("cannot initialize name hashing table. \n"); - return FAIL; - } - } - - return SUCCEED; -} - -/*------------------------------------------------------------------------- - * Function: h4toh5lonevgs - * - * Purpose: Recursively convert hdf4 objects in lone vgroups into - corresponding hdf5 datasets - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : file_id: hdf file id - sd_id: hdf sd interface id - h5group: hdf5 group id - h5_dimg: hdf5 dimensional scale group id - h5_palg: hdf5 palette group id - - Out: - Modification: - *------------------------------------------------------------------------- - */ -int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5_palg,int h4_attr) { - - int32 vgroup_id; - int num_lonevg; /* number of lone vgroup.*/ - int32 *ref_array; - int32 istat; - char vgroup_name[VGNAMELENMAX]; - char* cor_vgroupname; - char vgroup_class[VGNAMELENMAX]; - char refstr[MAXREF_LENGTH]; - int check_vgroup; - int check_tabst; - int lone_vg_number; - char *h5cgroup_name; - - istat = Vstart(file_id); - if (istat == FAIL) { - fprintf(stderr, "unable to start hdf4 V interface.\n"); - return FAIL; - } - - num_lonevg = Vlone(file_id,NULL,0); - - if (num_lonevg == FAIL) { - printf("error in obtaining lone vgroup number. \n"); - return FAIL; - } - - /* obtain object reference array. */ - - /* if no lone vgroup, quit from this function. */ - if(num_lonevg == 0) - return SUCCEED; - - ref_array = (int32 *)malloc(sizeof(int32) *num_lonevg); - - if(ref_array == NULL) { - printf("error in allocating memory for ref_array.\n"); - return FAIL; - } - - num_lonevg = Vlone(file_id,ref_array,num_lonevg); - - /* walk through every lone group in the file */ - - for(lone_vg_number = 0; lone_vg_number < num_lonevg; - lone_vg_number++) { - - vgroup_id = Vattach(file_id,ref_array[lone_vg_number],"r"); - - if(vgroup_id ==FAIL) { - printf("error in attaching lone vgroup.\n"); - free(ref_array); - return FAIL; - } - - /*obtain group name and class name.*/ - h4toh5_ZeroMemory(vgroup_class,VGNAMELENMAX); - istat = Vgetclass(vgroup_id,vgroup_class); - if(istat == FAIL) { - printf("error in getting vgroup class.\n"); - free(ref_array); - Vdetach(vgroup_id); - return FAIL; - } - - h4toh5_ZeroMemory(vgroup_name,VGNAMELENMAX); - istat = Vgetname(vgroup_id,vgroup_name); - if(istat == FAIL ) { - printf("error in getting vgroup name. \n"); - Vdetach(vgroup_id); - free(ref_array); - return FAIL; - } - - /* check for CDF0.0 and RIG0.0, if yes - don't go into this group.*/ - - if(strcmp(vgroup_class,_HDF_CDF)==0) { - Vdetach(vgroup_id); - continue; - } - if(strcmp(vgroup_class,GR_NAME)==0) { - Vdetach(vgroup_id); - continue; - } - - /* converting integer number into string format. */ - if(conv_int_str((int)ref_array[lone_vg_number],refstr) == FAIL) { - printf("ref. is negative, error in converting\n"); - Vdetach(vgroup_id); - free(ref_array); - return FAIL; - } - - /* checking whether vgroup name contains ORI_SLASH, changing into CHA_SLASH.*/ - cor_vgroupname = correct_name(vgroup_name); - if(cor_vgroupname == NULL) { - printf("error in generating corrected vgroup name. \n"); - Vdetach(vgroup_id); - free(ref_array); - return FAIL; - } - - /* obtaining group name of the converted lone vgroup. In this call, - we will deal with cases such as name clashing and no available vgroup - name. */ - - h5cgroup_name = get_obj_aboname(cor_vgroupname,refstr,NULL,HDF4_VGROUP); - - if(h5cgroup_name == NULL) { - printf("error in getting group name.\n"); - Vdetach(vgroup_id); - free(ref_array); - free(cor_vgroupname); - return FAIL; - } - - /* free memory of corrected name. */ - free(cor_vgroupname); - - /* updating lookup table for vgroups.*/ - - check_vgroup = lookup(ref_array[lone_vg_number],estnum_vg,vg_hashtab); - - if(check_vgroup == 0) { /* adding this vgroup into the list. */ - - check_tabst = set_name(ref_array[lone_vg_number],estnum_vg, - vg_hashtab,h5cgroup_name); - if(check_tabst == FAIL) { - printf("not enough memory to be allocated for vgroup name. \n"); - Vdetach(vgroup_id); - free(h5cgroup_name); - free(ref_array); - return FAIL; - } - } - - /* this line should never fail, if failed, something is wrong with converter or hdf library. */ - - if(check_vgroup == 1){ - fprintf(stderr,"this vgroup should not be touched. \n"); - Vdetach(vgroup_id); - free(h5cgroup_name); - free(ref_array); - return FAIL; - } - - if(Vgroup_h4_to_h5(file_id,vgroup_id,sd_id,h5group,h5_dimg,h5_palg,h4_attr)==FAIL){ - printf("error in translating vgroup into hdf5 objects.\n"); - Vdetach(vgroup_id); - free(h5cgroup_name); - free(ref_array); - return FAIL; - } - - Vdetach(vgroup_id); - free(h5cgroup_name); - } - free(ref_array); - return SUCCEED; -} - - - -/*------------------------------------------------------------------------- - * Function: h4toh5vgrings - * - * Purpose: Recursively convert objects at special hdf4 vgroups - (vgroup rings) - into objects of corresponding hdf5 groups. The strategy here - is to arbitrily grab any vgroup in the group ring and put it - under hdf5 root. - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : file_id: hdf file id - sd_id: hdf sds id - h5group: hdf5 group id - h5_dimg: hdf5 dimensional scale group id - h5_palg: hdf5 palette group id - - Out: - Modification: - *------------------------------------------------------------------------- - */ - -int h4toh5vgrings(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5_palg,int h4_attr){ - - int32 vgroup_id; - int32 ref_num; - char vgroup_name[VGNAMELENMAX]; - char* cor_vgroupname; - char vgroup_class[VGNAMELENMAX]; - char refstr[MAXREF_LENGTH]; - int check_vgroup; - int32 istat; - char *h5cgroup_name; - - ref_num = Vgetid(file_id,-1); - - while (ref_num != -1) { - - /* if we find a group that is not touched, grab it under root group.*/ - - check_vgroup = lookup(ref_num,estnum_vg,vg_hashtab); - - if (check_vgroup == 0){ - - vgroup_id = Vattach(file_id,ref_num,"r"); - if(vgroup_id ==FAIL) { - printf("error in attaching group in a group ring. \n"); - return FAIL; - } - - h4toh5_ZeroMemory(vgroup_name,VGNAMELENMAX); - istat = Vgetname(vgroup_id,vgroup_name); - if(istat ==FAIL) { - printf("error in obtaining vgroup names. \n"); - Vdetach(vgroup_id); - return FAIL; - } - - h4toh5_ZeroMemory(vgroup_class,VGNAMELENMAX); - if(Vgetclass(vgroup_id,vgroup_class) == FAIL) { - printf("error in obtaining vgroup class name. \n"); - Vdetach(vgroup_id); - return FAIL; - } - - /* do nothing for those predefined attribute.*/ - - if(vgroup_class[0] != '\0') { - - if(strcmp(vgroup_class,_HDF_ATTRIBUTE)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - - if(strcmp(vgroup_class,_HDF_VARIABLE)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - - if(strcmp(vgroup_class,_HDF_DIMENSION)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - - if(strcmp(vgroup_class,_HDF_UDIMENSION)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - - if(strcmp(vgroup_class,_HDF_CDF)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - - if(strcmp(vgroup_class,GR_NAME)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - - if(strcmp(vgroup_class,RI_NAME)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - } - - if(vgroup_name[0] != '\0') { - if(strcmp(vgroup_name,GR_NAME)==0) { - ref_num = Vgetid(file_id,ref_num); - Vdetach(vgroup_id); - continue; - } - } - - /* convert reference number into string format. */ - if(conv_int_str((uint16)ref_num,refstr) == FAIL) { - printf("ref. is negative, error in converting\n"); - Vdetach(vgroup_id); - return FAIL; - } - - /* checking whether vgroup name contains ORI_SLASH, changing into CHA_SLASH.*/ - cor_vgroupname = correct_name(vgroup_name); - if(cor_vgroupname == NULL) { - printf("error in generating corrected vgroup name. \n"); - Vdetach(vgroup_id); - return FAIL; - } - /* obtain the hdf5 group name. */ - h5cgroup_name = get_obj_aboname(cor_vgroupname,refstr,NULL,HDF4_VGROUP); - - if(h5cgroup_name == NULL) { - printf("error in getting vgroup name.\n"); - Vdetach(vgroup_id); - free(cor_vgroupname); - return FAIL; - } - - free(cor_vgroupname); - if(set_name(ref_num,estnum_vg,vg_hashtab,h5cgroup_name)==FAIL) { - printf("error in setting h5 group name.\n"); - Vdetach(vgroup_id); - free(h5cgroup_name); - return FAIL; - } - - if(Vgroup_h4_to_h5(file_id,vgroup_id,sd_id,h5group,h5_dimg,h5_palg,h4_attr) - ==FAIL){ - - printf("error in translating vgroup into hdf5 group\n"); - Vdetach(vgroup_id); - free(h5cgroup_name); - return FAIL; - } - - Vdetach(vgroup_id); - free(h5cgroup_name); - } - ref_num = Vgetid(file_id,ref_num); - } - return SUCCEED; - -} - - -/*------------------------------------------------------------------------- - * Function: h4toh5lonevds - * - * Purpose: convert hdf4 lone vdata into - the corresponding hdf5 datasets - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : file_id: hdf file id - h5group: hdf5 group id - - Out: - Modification: - *------------------------------------------------------------------------- - */ -int h4toh5lonevds(int32 file_id, hid_t h5group,int h4_attr){ - - int32 vdata_id; - int32 *ref_vdata_array; - int32 vdata_tag; - int32 vdata_ref; - int32 istat; - char vdata_name[VGNAMELENMAX]; - char* cor_vdataname; - char vdata_class[VGNAMELENMAX]; - char refstr[MAXREF_LENGTH]; - int check_vdata; - int lone_vd_number; - int num_lonevd; - char *h5cvdata_name; - - num_lonevd = VSlone(file_id,NULL,0); - - if (num_lonevd == FAIL) { - printf("error in obtaining lone vgroup number. \n"); - return FAIL; - } - - if (num_lonevd > 0) { - - ref_vdata_array = (int32 *)malloc(sizeof(int32) *(num_lonevd)); - - num_lonevd = VSlone(file_id,ref_vdata_array,num_lonevd); - - if(num_lonevd == FAIL) { - printf("error in obtaining lone vdata number the second time.\n"); - free(ref_vdata_array); - } - /* walk through all lone vdatas. */ - - for(lone_vd_number = 0; lone_vd_number < num_lonevd;lone_vd_number++) - { - vdata_id = VSattach(file_id,ref_vdata_array[lone_vd_number],"r"); - - if(vdata_id == FAIL) { - printf("error in obtaining vdata id for lone vdata.\n"); - free(ref_vdata_array); - } - - /* Make sure this vdata is not an attribute of other hdf4 objects.*/ - - if(!VSisattr(vdata_id)) { - - h4toh5_ZeroMemory(vdata_class,VGNAMELENMAX); - istat = VSgetclass(vdata_id,vdata_class); - if(istat == FAIL) { - printf("error in getting vdata class name.\n"); - free(ref_vdata_array); - VSdetach(vdata_id); - return FAIL; - } - - - if(!strncmp(vdata_class,_HDF_CHK_TBL_CLASS,strlen(_HDF_CHK_TBL_CLASS))){ - - VSdetach(vdata_id); - continue; - } - - vdata_ref = VSQueryref(vdata_id); - - if(vdata_ref == FAIL) { - printf("error in getting vdata reference number.\n"); - free(ref_vdata_array); - VSdetach(vdata_id); - return FAIL; - } - - vdata_tag = VSQuerytag(vdata_id); - if(vdata_tag == FAIL){ - printf("error in getting vdata tag.\n"); - free(ref_vdata_array); - VSdetach(vdata_id); - return FAIL; - } - - - h4toh5_ZeroMemory(vdata_name,VGNAMELENMAX); - istat = VSQueryname(vdata_id,vdata_name); - - if(istat == FAIL) { - printf("error in getting vdata name. \n"); - free(ref_vdata_array); - VSdetach(vdata_id); - return FAIL; - } - - /* converting reference number into string format.*/ - if(conv_int_str((uint16)ref_vdata_array[lone_vd_number],refstr)==FAIL) { - printf("error in converting int to string.\n"); - free(ref_vdata_array); - VSdetach(vdata_id); - return FAIL; - } - /* checking whether vdata name contains ORI_SLASH, changing into CHA_SLASH.*/ - cor_vdataname = correct_name(vdata_name); - if(cor_vdataname == NULL) { - printf("error in generating corrected vgroup name. \n"); - VSdetach(vdata_id); - free(ref_vdata_array); - return FAIL; - } - /* obtaining hdf5 dataset name that is converted from hdf4 vdata.*/ - h5cvdata_name = get_obj_aboname(cor_vdataname,refstr,NULL,HDF4_VDATA); - if(h5cvdata_name == NULL) { - printf("error in getting vdata name.\n"); - free(ref_vdata_array); - VSdetach(vdata_id); - free(cor_vdataname); - return FAIL; - } - - free(cor_vdataname); - check_vdata = lookup(ref_vdata_array[lone_vd_number],estnum_vd, - vd_hashtab); - - /* check_vdata should be 1, if it is 1, either converter or hdf lib has bugs. */ - if(check_vdata == 1){ - printf("lone vdata should not be checked before.\n"); - free(h5cvdata_name); - free(ref_vdata_array); - VSdetach(vdata_id); - return FAIL; - } - - if(set_name(ref_vdata_array[lone_vd_number],estnum_vd,vd_hashtab, - h5cvdata_name)==FAIL) { - printf("error in setting lone vdata name. \n"); - free(ref_vdata_array); - free(h5cvdata_name); - VSdetach(vdata_id); - return FAIL; - } - - if(Vdata_h4_to_h5(file_id,vdata_id,h5group,h4_attr)== FAIL) { - printf("error in translating independent vdata into"); - printf(" hdf5 datasets.\n"); - free(h5cvdata_name); - free(ref_vdata_array); - VSdetach(vdata_id); - return FAIL; - } - free(h5cvdata_name); - - } - VSdetach(vdata_id); - } - free(ref_vdata_array); - } - return SUCCEED; -} - - -/*------------------------------------------------------------------------- - * Function: h4toh5unvisitedsds - * - * Purpose: convert unvisited sds objects into hdf5 datasets and put these - datasets under hdf5 root group - This routine will cover old hdf file that doesn't have vgroups. - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : - sd_id: hdf sds id - h5root: hdf5 root id - h5_dimg: hdf5 dimensional scale group id - - Out: - Modification: - *------------------------------------------------------------------------- - */ - - -int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg,int h4_attr) { - - int i; - int32 sds_id;/* sd dataset identifer*/ - int32 sds_rank;/* sds dataset dimension rank.*/ - int32 sds_dimsizes[DIM_HASHSIZE];/* array that contains the size of the each dimension in sds dataset.*/ - int32 sds_dtype;/*sds dataset datatype.*/ - int32 num_sdsattrs;/* number of sds attributes. */ - char sds_name[MAX_NC_NAME];/* sds name.*/ - char* cor_sdsname; - int32 obj_ref; /* obj reference number assigned to sds and images.*/ - char refstr[MAXREF_LENGTH];/*object reference number in character string format.*/ - int check_sds;/* flag to check whether this sds is visited. 1 for visited and 0 for non-visited.*/ - char *h5csds_name;/* absolute path name of hdf5 dataset transferred from old sds.*/ - - if(sd_id == FAIL) { - printf("error: cannot start SD interface. \n"); - return FAIL; - } - - /* check all sds objects. */ - for(i=0;i<num_sds;i++){ - - sds_id = SDselect(sd_id,i); - - if (sds_id == FAIL) { - printf("error in obtaining sd id.\n"); - return FAIL; - } - - /* if this sds is dimensional scale, the converting should be ignored. dimensional scale will be converted separately. */ - if(SDiscoordvar(sds_id)) continue; - - /* obtain sds information. */ - if(SDgetinfo(sds_id,sds_name,&sds_rank,sds_dimsizes, - &sds_dtype,&num_sdsattrs)== FAIL) { - printf("error in obtaining SD info at "); - printf("the unvisited sds routine.\n"); - SDendaccess(sds_id); - return FAIL; - } - - /* obtain object reference number of the current sds dataset.*/ - obj_ref = SDidtoref(sds_id); - if(obj_ref == FAIL) { - printf("error in obtaining sds object reference at "); - printf("the unvisited sds routine.\n"); - SDendaccess(sds_id); - return FAIL; - } - - /* convert object reference number into string format. */ - if(conv_int_str((uint16)obj_ref,refstr) == FAIL) { - printf("error in converting integer into string.\n"); - SDendaccess(sds_id); - return FAIL; - } - - /* check whether the current sds is visited or not. */ - check_sds = lookup(obj_ref,2*num_sds,sds_hashtab); - - /* if not visited, we will do the convertion. */ - - if(check_sds == 0) { - /* since different hdf sds may hold the same name and it is also - legal that sds may not have a name; but for hdf5 dataset, - it must hold a name, so we will use get_obj_aboname to assure - that each new hdf5 dataset converted from - sds objects will have a disabiguous name. */ - - /* checking whether vgroup name contains ORI_SLASH, changing into CHA_SLASH.*/ - cor_sdsname = correct_name(sds_name); - if(cor_sdsname == NULL) { - printf("error in generating corrected sds name. \n"); - SDendaccess(sds_id); - return FAIL; - } - - h5csds_name = get_obj_aboname(cor_sdsname,refstr,NULL,HDF4_SDS); - if(h5csds_name == NULL) { - printf("error in obtaining sds name.\n"); - SDendaccess(sds_id); - free(cor_sdsname); - return FAIL; - } - free(cor_sdsname); - /* put this name into hashtable. */ - if(set_name(obj_ref,2*num_sds,sds_hashtab,h5csds_name)==FAIL) { - printf("error in setting object name.\n"); - SDendaccess(sds_id); - free(h5csds_name); - return FAIL; - } - - /* do the convertion from sds into hdf5 dataset.*/ - if(Sds_h4_to_h5(file_id,sds_id,h5root,h5_dimg,h4_attr)== FAIL){ - printf("error in translating sds into hdf5 dataset.\n"); - SDendaccess(sds_id); - free(h5csds_name); - return FAIL; - } - free(h5csds_name); - - } - SDendaccess(sds_id); - - } - return SUCCEED; -} - -/*------------------------------------------------------------------------- - * Function: h4toh5unvisitedimages - * - * Purpose: convert unvisited images into hdf5 dataset and put it - under hdf5 root group - This routine will cover old hdf file. - * - * Return: FAIL if failed, SUCCEED if successful. - * - * In : - file_id: hdf file id - h5_root: hdf5 root id - h5_palg: hdf5 palette group id - - Out: - Modification: - *------------------------------------------------------------------------- - */ - -int h4toh5unvisitedimages(int32 file_id,hid_t h5_root,hid_t h5_palg,int h4_attr) { - - int i; - int32 istat; - int32 gr_id; - int32 ri_id;/*raster image identifer.*/ - char image_name[MAX_GR_NAME];/* image name.*/ - char* cor_imagename; - int check_image;/* flag to check whether this image is visited. 1 for visited and 0 for non-visited.*/ - int32 obj_ref; /* obj reference number assigned to sds and images.*/ - char refstr[MAXREF_LENGTH];/*object reference number in character string format.*/ - char *h5cimage_name;/* absolute path name of hdf5 dataset transferred from old image.*/ - - gr_id = GRstart(file_id); - if(gr_id == FAIL) { - printf("error in obtaining gr id. \n"); - return FAIL; - } - - /* check all images. */ - for (i=0;i<num_images;i++) { - - ri_id = GRselect(gr_id,i); - if(ri_id ==FAIL) { - printf("error in selecting gr interface.\n"); - return FAIL; - } - - /* obtain information of GR */ - istat = GRgetiminfo(ri_id, image_name, NULL, NULL, NULL, NULL, NULL); - - if(istat == FAIL) { - printf("error in getting GR images.\n"); - GRendaccess(ri_id); - return FAIL; - } - - /* obtain object reference number and convert it into string format. */ - obj_ref = GRidtoref(ri_id); - if(obj_ref == 0) { - printf("error in obtaining image reference number"); - printf(" at h4toh5unvisitedimages routine.\n"); - GRendaccess(ri_id); - return FAIL; - } - - if(conv_int_str((uint16)obj_ref,refstr)== FAIL) { - printf("error in converting object reference number"); - printf(" into string at h4toh5unvisitedimages routine.\n"); - GRendaccess(ri_id); - return FAIL; - } - - /* check whether the current image is visited or not. */ - check_image = lookup(obj_ref,2*num_images,gr_hashtab); - - if(check_image == 0) { - - /* since different hdf image may hold the same name and it is - also legal that an image may not have a name; but for hdf5 - dataset, it must hold a name, so we will use get_obj_aboname - to guarrtte that each new hdf5 dataset converted from - image objects will have a disabiguous name. */ - - /* checking whether vgroup name contains ORI_SLASH, - changing into CHA_SLASH.*/ - - cor_imagename = correct_name(image_name); - if(cor_imagename == NULL) { - printf("error in generating corrected image name. \n"); - GRendaccess(ri_id); - return FAIL; - } - h5cimage_name = get_obj_aboname(cor_imagename,refstr,NULL, - HDF4_IMAGE); - if(h5cimage_name == NULL) { - printf("error in getting image name.\n"); - GRendaccess(ri_id); - free(cor_imagename); - return FAIL; - } - free(cor_imagename); - - if(set_name(obj_ref,2*num_images,gr_hashtab,h5cimage_name)==FAIL) { - printf("error setting image name.\n"); - GRendaccess(ri_id); - free(h5cimage_name); - return FAIL; - } - - /* do the convertion from the image into hdf5 dataset.*/ - if(Image_h4_to_h5(file_id,ri_id,h5_root,h5_palg,h4_attr)== FAIL) { - printf("error in transferring image name into hdf5 dataset.\n"); - GRendaccess(ri_id); - free(h5cimage_name); - return FAIL; - } - free(h5cimage_name); - } - GRendaccess(ri_id); - } - return SUCCEED; -} - -/*------------------------------------------------------------------------- - * Function: free_allhashmemory() - * - * Purpose: free memory allocated for all hashtables - * - * Return: - * - * In : - - - Out: - Modification: - *------------------------------------------------------------------------- - */ - -void free_allhashmemory(){ - - 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); - -} - - - -/********The following routines are adapted from h5toh4 converter. *******/ -/***************************************************************************** - - Routine: test_file - - Description: Test a file for read/write - ability. - - Input: filename - Unix filename - - Output: function return, global variable - errno - -*****************************************************************************/ - -int test_file(char *filename,int oflag,mode_t mode) -{ - int fid; - - errno = 0; - - fid = open(filename, oflag, mode); - if (fid < 0) { - perror(filename); - } - close(fid); - - return errno; - -} - - -/***************************************************************************** - - Routine: test_dir - - Description: Test pathway to determine if it is a directory - - Input: path - pathname given - - Output: function return TRUE/FALSE - -*****************************************************************************/ - -int test_dir(char *path) -{ - - struct stat buf; - struct stat *buf_ptr; - int idir; - - buf_ptr = &buf; - - idir = stat(path, buf_ptr); - if (idir < 0) { - if (errno == 2) { - return 0; - } else { - perror(path); - } - } - - return S_ISDIR(buf_ptr->st_mode); -} - -/***************************************************************************** - - Routine: BuildFilename() - - Description: Build a filename with new extension - - Input: filename - present filename - ext - extension to root of filename - - Output: (filename:r).ext - -*****************************************************************************/ - -char *BuildFilename(char *filename, char *ext) -{ - /* build outgoing filename */ - - char *filename_out; - char *lastper_ptr, *lastdir_ptr; - int root_len; - - lastper_ptr = strrchr(filename,'.'); - lastdir_ptr = strrchr(filename,'/'); - - if ( lastper_ptr <= lastdir_ptr ) { /* no extension */ - root_len = strlen(filename); - } else { /* existing extension */ - root_len = (int)(lastper_ptr - filename); - } - - filename_out = (char *)HDmalloc(root_len + strlen(ext) + 2); - filename_out = strncpy(filename_out, filename, (size_t)root_len); - filename_out[root_len] = '\0'; - filename_out = strcat(filename_out,"."); - filename_out = strcat(filename_out,ext); - - return filename_out; -} - - -/***************************************************************************** - - Routine: PrintOptions_h4toh5() - - Description: This routine prints the acceptable argument formats out to stderr. - - Input: None - - Output: output to stderr - -*****************************************************************************/ - -void PrintOptions_h4toh5(void) -{ - fprintf(stderr,"\nUsage: "); - fprintf(stderr,"\n h4toh5 -h (gives this print-out)\n"); - fprintf(stderr," h4toh5 -na(can convert without HDF4 specified attributes)\n"); - fprintf(stderr," h4toh5 input.hdf output.h5\n"); - fprintf(stderr," h4toh5 input.hdf\n"); - fprintf(stderr," h4toh5 -na input.hdf output.h5\n"); - fprintf(stderr," h4toh5 -na input.hdf\n"); -} - - -/***************************************************************************** - - Routine: gen_h4toh5() - - Description: This routine prints the acceptable argument formats out to stderr. - - Input: h4_filename: HDF4 file name - h5_filename: HDF5 file name - h4_attr: flag to indicate whether to include HDF4 - predefined attribute or not. - - Output: -1 FAIL - 0 SUCCEED - -*****************************************************************************/ - - -int gen_h4toh5(char*h4_filename,char*h5_filename,int h4_attr){ - char* h5_extension; - int status; - -#ifndef WIN32 - if (test_file(h4_filename,O_EXCL,292) != 0 ) { - /* 292 Decimal - 0444 Octal, a+r */ - printf("the current hdf4 file name is not set properly.\n"); - status = -1; - return status; - } - if (test_dir(h4_filename) != 0 ) { - fprintf(stderr,"%s: Is a directory\n",h4_filename); - status = -1; - return status; - } -#endif - /*0. check whether this file is an hdf file. */ - - if(!Hishdf(h4_filename)){ - printf("error: not an hdf file. \n"); - printf("the file will not be converted. \n"); - status = -1; - return status; - } - - if(h5_filename == NULL){ - h5_extension = HDstrdup("h5"); - h5_filename = BuildFilename(h4_filename,h5_extension); - if (h5_filename == NULL) { - printf("error in creating hdf5 file name.\n"); - status = -1; - return status; - } -#ifndef WIN32 - if (test_file(h5_filename,O_CREAT|O_EXCL,436) != 0) { - /* 436 Decimal - 0664 Octal, ug+rw,o+r */ - printf("permission of hdf5 file is not set properly.\n"); - status = -1; - return status; - } -#endif - - status = h4toh5(h4_filename, h5_filename,h4_attr); - - if ( status == FAIL ) { - printf("error in converting %s into %s\n",h4_filename,h5_filename); - return status; - } - if (h5_filename != NULL) { - HDfree(h5_filename); - } - return 0; - } - - else { - -#ifndef WIN32 - if (test_file(h5_filename,O_CREAT|O_RDWR,436) != 0) { /* 436 Decimal - 0664 Octal, ug+rw,o+r */ - printf("permission of hdf5 file is not set properly.\n"); - status = -1; - return status; - } - - if (test_dir(h4_filename) != 0 ) { - fprintf(stderr,"%s: Is a directory\n",h4_filename); - status = -1; - return status; - } - -#endif - status = h4toh5(h4_filename, h5_filename,h4_attr); - if ( status == FAIL ) { - printf("error in converting %sinto %s\n",h4_filename,h5_filename); - return status; - } - } - return 0; -} - - |