summaryrefslogtreecommitdiffstats
path: root/tools/h4toh5main.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h4toh5main.c')
-rw-r--r--tools/h4toh5main.c143
1 files changed, 101 insertions, 42 deletions
diff --git a/tools/h4toh5main.c b/tools/h4toh5main.c
index de51554..abf3d89 100644
--- a/tools/h4toh5main.c
+++ b/tools/h4toh5main.c
@@ -1,4 +1,35 @@
-/*** This file is the main program of converter. ***/
+/*-------------------------------------------------------------------------
+ *
+ * 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"
@@ -37,14 +68,13 @@ int main(int argc, char ** argv) {
char *h5_extension;
int status = 0;
-
argc--;
argv++;
if (argc == 0) {
fprintf(stderr,"\nError: Invalid Arguments\n");
PrintOptions_h4toh5();
- return -1;
+ return FAIL;
}
/* take care -h (help) option first */
@@ -52,7 +82,7 @@ int main(int argc, char ** argv) {
for (i=0; i < argc; i++)
if ( HDstrcmp(argv[i],"-h") == 0 ) {
PrintOptions_h4toh5();
- return 0;
+ return SUCCEED;
}
}
@@ -79,6 +109,14 @@ int main(int argc, char ** argv) {
break;
}
+ /*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;
+ break;
+ }
h5_extension = HDstrdup("h5");
h5_filename = BuildFilename(h4_filename,h5_extension);
if (h5_filename == NULL) {
@@ -94,15 +132,6 @@ int main(int argc, char ** argv) {
break;
}
- /*0. check whether this file is a hdf file. */
-
- if(!Hishdf(h4_filename)){
- printf("error: not an hdf file. \n");
- printf("the file will not be converted. \n");
- return FAIL;
- }
-
-
status = h4toh5(h4_filename, h5_filename);
if ( status == FAIL ) {
@@ -115,7 +144,8 @@ int main(int argc, char ** argv) {
break;
- case 2: /* h5toh4 file_in file_out */
+ case 2: /* h4toh5 file_in file_out */
+
h4_filename = argv[0];
h5_filename = argv[1];
@@ -132,25 +162,27 @@ int main(int argc, char ** argv) {
break;
}
+ /*0. check whether this file is a hdf file. */
+
+ if(!Hishdf(h4_filename)){
+ printf("error: not an hdf file. \n");
+ printf("the file will not be converted. \n");
+ status = -1;
+ break;
+ }
+
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;
break;
}
+
if (test_dir(h4_filename) != 0 ) {
fprintf(stderr,"%s: Is a directory\n",h4_filename);
status = -1;
break;
}
- /*0. check whether this file is a hdf file. */
-
- if(!Hishdf(h4_filename)){
- printf("error: not an hdf file. \n");
- printf("the file will not be converted. \n");
- return FAIL;
- }
-
status = h4toh5(h4_filename, h5_filename);
if ( status == FAIL ) {
printf("error in converting %sinto %s\n",h4_filename,h5_filename);
@@ -191,9 +223,6 @@ int h4toh5(char*filename4, char*filename5) {
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);
@@ -381,7 +410,8 @@ int h4toh5(char*filename4, char*filename5) {
/*** deal with untouched sds objects.convert them into hdf5 datasets under root group.***/
if(h4toh5unvisitedsds(file_id,sd_id,h5_root,h5_dimg) == FAIL) {
- printf("error in converting unvisited sds objects into hdf5 file.\n"); SDend(sd_id);
+ printf("error in converting unvisited sds objects into hdf5 file.\n");
+ SDend(sd_id);
GRend(gr_id);
Vend(file_id);
Hclose(file_id);
@@ -462,7 +492,6 @@ int get_numof_hdf4obj(char*filename,int32 file_id) {
return FAIL;
}
-
/* obtain number of images and number of global image attributes.*/
gr_id = GRstart(file_id);
@@ -575,7 +604,7 @@ int set_helpgroups(hid_t h5root,hid_t* h5dimgptr,hid_t* h5palgptr){
*/
int set_hashtables(void) {
- if(num_sds != 0) {
+ 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");
@@ -583,7 +612,7 @@ int set_hashtables(void) {
}
}
- if(num_images != 0) {
+ 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");
@@ -593,7 +622,7 @@ int set_hashtables(void) {
/*hashtable is made to be fixed for dimensional scale and palette.*/
- if(num_sds != 0) {
+ 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");
@@ -602,7 +631,7 @@ int set_hashtables(void) {
}
/* initialize the palette table */
- if(num_images != 0){
+ 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");
@@ -699,6 +728,10 @@ int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
/* 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) {
@@ -783,7 +816,7 @@ int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
return FAIL;
}
- /* printf("h5cgroup_name %s\n",h5cgroup_name);*/
+ /* free memory of corrected name. */
free(cor_vgroupname);
/* updating lookup table for vgroups.*/
@@ -803,7 +836,7 @@ int h4toh5lonevgs(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
}
}
- /* this line is for debugging. */
+ /* 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");
@@ -993,7 +1026,7 @@ int h4toh5vgrings(int32 file_id,int32 sd_id,hid_t h5group,hid_t h5_dimg,hid_t h5
Vdetach(vgroup_id);
free(h5cgroup_name);
- }
+ }
ref_num = Vgetid(file_id,ref_num);
}
return SUCCEED;
@@ -1044,6 +1077,7 @@ int h4toh5lonevds(int32 file_id, hid_t h5group){
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);
@@ -1124,6 +1158,8 @@ int h4toh5lonevds(int32 file_id, hid_t h5group){
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);
@@ -1210,7 +1246,7 @@ int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
return FAIL;
}
- /* if this sds is dimensional scale, the converting should be ignored. */
+ /* 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. */
@@ -1246,7 +1282,7 @@ int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
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 guarrtte
+ 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. */
@@ -1257,6 +1293,7 @@ int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
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");
@@ -1281,8 +1318,10 @@ int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
return FAIL;
}
free(h5csds_name);
+
}
SDendaccess(sds_id);
+
}
return SUCCEED;
}
@@ -1305,6 +1344,7 @@ int h4toh5unvisitedsds(int32 file_id,int32 sd_id,hid_t h5root,hid_t h5_dimg) {
Modification:
*-------------------------------------------------------------------------
*/
+
int h4toh5unvisitedimages(int32 file_id,hid_t h5_root,hid_t h5_palg) {
int i;
@@ -1443,12 +1483,7 @@ void free_allhashmemory(){
}
-void PrintOptions_h4toh5(void)
-{
- fprintf(stderr,"\nh4toh5 -h (gives this print-out)\n");
- fprintf(stderr,"h4toh5 file.hdf file.h5\n");
- fprintf(stderr,"h4toh5 file.hdf\n");
-}
+
/********The following routines are adapted from h5toh4 converter. *******/
/*****************************************************************************
@@ -1553,3 +1588,27 @@ char *BuildFilename(char *filename, char *ext)
}
+/*****************************************************************************
+
+ 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 input.hdf output.h5\n");
+ fprintf(stderr," h4toh5 input.hdf\n");
+}
+
+
+
+
+