summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPedro Vicente Nunes <pvn@hdfgroup.org>2006-11-20 21:31:06 (GMT)
committerPedro Vicente Nunes <pvn@hdfgroup.org>2006-11-20 21:31:06 (GMT)
commit51da322882c72fa1c9e5c173b6e60ec283f7b4a1 (patch)
tree4f84f3d6894c1277fa70d954e3230f66e00c478c
parent335978f235277f12a87fb198a5fd1a0e43ce5734 (diff)
downloadhdf5-51da322882c72fa1c9e5c173b6e60ec283f7b4a1.zip
hdf5-51da322882c72fa1c9e5c173b6e60ec283f7b4a1.tar.gz
hdf5-51da322882c72fa1c9e5c173b6e60ec283f7b4a1.tar.bz2
[svn-r12953] h5repack code revision, avoid one unnecessary call to file open/close in the cheking of objects when there are none requested by the user
-rw-r--r--tools/h5repack/h5repack_list.c285
-rw-r--r--tools/lib/h5trav.c402
2 files changed, 351 insertions, 336 deletions
diff --git a/tools/h5repack/h5repack_list.c b/tools/h5repack/h5repack_list.c
index cb9cad9..71c1798 100644
--- a/tools/h5repack/h5repack_list.c
+++ b/tools/h5repack/h5repack_list.c
@@ -38,125 +38,128 @@ extern char *progname;
int check_objects(const char* fname,
pack_opt_t *options)
{
- hid_t fid;
- unsigned int i;
- trav_table_t *travt=NULL;
-
-/*-------------------------------------------------------------------------
- * open the file
- *-------------------------------------------------------------------------
- */
- if ((fid=h5tools_fopen(fname, NULL, NULL, 0))<0){
- printf("<%s>: %s\n", fname, H5FOPENERROR );
- return -1;
- }
-
-/*-------------------------------------------------------------------------
- * get the list of objects in the file
- *-------------------------------------------------------------------------
- */
-
- /* init table */
- trav_table_init(&travt);
-
- /* get the list of objects in the file */
- if (h5trav_gettable(fid,travt)<0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * compare with user supplied list
- *-------------------------------------------------------------------------
- */
-
- if (options->verbose)
- {
- printf("Opening file <%s>. Searching for objects to modify...\n",fname);
- }
-
- for ( i = 0; i < options->op_tbl->nelems; i++)
- {
- char* name=options->op_tbl->objs[i].path;
- if (options->verbose)
- printf(" <%s>",name);
-
- /* the input object names are present in the file and are valid */
- if (h5trav_getindext(name,travt)<0)
- {
- error_msg(progname, "%s Could not find <%s> in file <%s>. Exiting...\n",
- (options->verbose?"\n":""),name,fname);
- goto out;
- }
- if (options->verbose)
- printf("...Found\n");
-
-
- /* check for extra filter conditions */
- switch (options->op_tbl->objs[i].filter->filtn)
- {
-
- /* chunk size must be smaller than pixels per block */
- case H5Z_FILTER_SZIP:
- {
- int j;
- int csize=1;
- int ppb=options->op_tbl->objs[i].filter->cd_values[0];
- hsize_t dims[H5S_MAX_RANK];
- int rank;
- hid_t did;
- hid_t sid;
-
- if (options->op_tbl->objs[i].chunk.rank>0)
- {
- rank=options->op_tbl->objs[i].chunk.rank;
- for (j=0; j<rank; j++)
- csize*=(int)options->op_tbl->objs[i].chunk.chunk_lengths[j];
+ hid_t fid;
+ unsigned int i;
+ trav_table_t *travt=NULL;
+
+ /* nothing to do */
+ if (options->op_tbl->nelems==0)
+ return 0;
+
+ /*-------------------------------------------------------------------------
+ * open the file
+ *-------------------------------------------------------------------------
+ */
+ if ((fid=h5tools_fopen(fname, NULL, NULL, 0))<0){
+ printf("<%s>: %s\n", fname, H5FOPENERROR );
+ return -1;
}
- else
+
+ /*-------------------------------------------------------------------------
+ * get the list of objects in the file
+ *-------------------------------------------------------------------------
+ */
+
+ /* init table */
+ trav_table_init(&travt);
+
+ /* get the list of objects in the file */
+ if (h5trav_gettable(fid,travt)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * compare with user supplied list
+ *-------------------------------------------------------------------------
+ */
+
+ if (options->verbose)
{
- if ((did=H5Dopen(fid,travt->objs[i].name))<0)
- goto out;
- if ((sid=H5Dget_space(did))<0)
- goto out;
- if ( (rank=H5Sget_simple_extent_ndims(sid))<0)
- goto out;
- HDmemset(dims, 0, sizeof dims);
- if ( H5Sget_simple_extent_dims(sid,dims,NULL)<0)
- goto out;
- for (j=0; j<rank; j++)
- csize*=(int)dims[j];
- if (H5Sclose(sid)<0)
- goto out;
- if (H5Dclose(did)<0)
- goto out;
+ printf("Opening file <%s>. Searching for objects to modify...\n",fname);
}
-
- if (csize < ppb )
+
+ for ( i = 0; i < options->op_tbl->nelems; i++)
{
- printf(" <warning: SZIP settins, chunk size is smaller than pixels per block>\n");
- goto out;
- }
-
-
- }
- break;
-
- }
-
-
-
- } /* i */
-/*-------------------------------------------------------------------------
- * close
- *-------------------------------------------------------------------------
- */
- H5Fclose(fid);
- trav_table_free(travt);
- return 0;
-
+ char* name=options->op_tbl->objs[i].path;
+ if (options->verbose)
+ printf(" <%s>",name);
+
+ /* the input object names are present in the file and are valid */
+ if (h5trav_getindext(name,travt)<0)
+ {
+ error_msg(progname, "%s Could not find <%s> in file <%s>. Exiting...\n",
+ (options->verbose?"\n":""),name,fname);
+ goto out;
+ }
+ if (options->verbose)
+ printf("...Found\n");
+
+
+ /* check for extra filter conditions */
+ switch (options->op_tbl->objs[i].filter->filtn)
+ {
+
+ /* chunk size must be smaller than pixels per block */
+ case H5Z_FILTER_SZIP:
+ {
+ int j;
+ int csize=1;
+ int ppb=options->op_tbl->objs[i].filter->cd_values[0];
+ hsize_t dims[H5S_MAX_RANK];
+ int rank;
+ hid_t did;
+ hid_t sid;
+
+ if (options->op_tbl->objs[i].chunk.rank>0)
+ {
+ rank=options->op_tbl->objs[i].chunk.rank;
+ for (j=0; j<rank; j++)
+ csize*=(int)options->op_tbl->objs[i].chunk.chunk_lengths[j];
+ }
+ else
+ {
+ if ((did=H5Dopen(fid,travt->objs[i].name))<0)
+ goto out;
+ if ((sid=H5Dget_space(did))<0)
+ goto out;
+ if ( (rank=H5Sget_simple_extent_ndims(sid))<0)
+ goto out;
+ HDmemset(dims, 0, sizeof dims);
+ if ( H5Sget_simple_extent_dims(sid,dims,NULL)<0)
+ goto out;
+ for (j=0; j<rank; j++)
+ csize*=(int)dims[j];
+ if (H5Sclose(sid)<0)
+ goto out;
+ if (H5Dclose(did)<0)
+ goto out;
+ }
+
+ if (csize < ppb )
+ {
+ printf(" <warning: SZIP settins, chunk size is smaller than pixels per block>\n");
+ goto out;
+ }
+
+
+ }
+ break;
+
+ }
+
+ } /* i */
+
+ /*-------------------------------------------------------------------------
+ * close
+ *-------------------------------------------------------------------------
+ */
+ H5Fclose(fid);
+ trav_table_free(travt);
+ return 0;
+
out:
- H5Fclose(fid);
- trav_table_free(travt);
- return -1;
+ H5Fclose(fid);
+ trav_table_free(travt);
+ return -1;
}
@@ -178,33 +181,33 @@ void print_objlist(const char *filename,
int nobjects,
trav_info_t *info )
{
- int i;
-
- printf("File <%s>: # of entries = %d\n", filename, nobjects );
- for ( i = 0; i < nobjects; i++)
- {
- switch ( info[i].type )
- {
- case H5G_GROUP:
- printf(" %-10s %s\n", "group", info[i].name );
- break;
- case H5G_DATASET:
- printf(" %-10s %s\n", "dataset", info[i].name );
- break;
- case H5G_TYPE:
- printf(" %-10s %s\n", "datatype", info[i].name );
- break;
- case H5G_LINK:
- printf(" %-10s %s\n", "link", info[i].name );
- break;
- case H5G_UDLINK:
- printf(" %-10s %s\n", "User defined link", info[i].name );
- break;
- default:
- printf(" %-10s %s\n", "User defined object", info[i].name );
- break;
- }
- }
+ int i;
+
+ printf("File <%s>: # of entries = %d\n", filename, nobjects );
+ for ( i = 0; i < nobjects; i++)
+ {
+ switch ( info[i].type )
+ {
+ case H5G_GROUP:
+ printf(" %-10s %s\n", "group", info[i].name );
+ break;
+ case H5G_DATASET:
+ printf(" %-10s %s\n", "dataset", info[i].name );
+ break;
+ case H5G_TYPE:
+ printf(" %-10s %s\n", "datatype", info[i].name );
+ break;
+ case H5G_LINK:
+ printf(" %-10s %s\n", "link", info[i].name );
+ break;
+ case H5G_UDLINK:
+ printf(" %-10s %s\n", "User defined link", info[i].name );
+ break;
+ default:
+ printf(" %-10s %s\n", "User defined object", info[i].name );
+ break;
+ }
+ }
}
diff --git a/tools/lib/h5trav.c b/tools/lib/h5trav.c
index 4ef495d..3da1ee0 100644
--- a/tools/lib/h5trav.c
+++ b/tools/lib/h5trav.c
@@ -16,22 +16,31 @@
#include "h5trav.h"
#include "H5private.h"
-/* functions for traversal */
+/*-------------------------------------------------------------------------
+ * local functions
+ *-------------------------------------------------------------------------
+ */
static int traverse( hid_t loc_id,
- const char *group_name,
- trav_table_t *table,
- trav_info_t *info,
- int *idx,
- int print);
+ const char *group_name,
+ trav_table_t *table,
+ trav_info_t *info,
+ int *idx,
+ int print);
static hssize_t get_nnames( hid_t loc_id,
- const char *group_name );
+ const char *group_name );
-herr_t get_name_type( hid_t loc_id,
- const char *group_name,
- int idx,
- char **name,
- H5G_obj_t *type );
+static herr_t get_name_type( hid_t loc_id,
+ const char *group_name,
+ int idx,
+ char **name,
+ H5G_obj_t *type );
+
+
+/*-------------------------------------------------------------------------
+ * "h5trav info" public functions. used in h5diff
+ *-------------------------------------------------------------------------
+ */
/*-------------------------------------------------------------------------
* Function: h5trav_getinfo
@@ -67,37 +76,8 @@ int h5trav_getinfo(hid_t file_id,
trav_table_free( table );
return nnames;
-
}
-
-/*-------------------------------------------------------------------------
- * Function: h5trav_gettable
- *
- * Purpose: get the trav_table_t struct
- *
- * Return: 0, -1 on error
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: December 17, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-int h5trav_gettable(hid_t fid, trav_table_t *travt)
-{
- int nnames=0;
-
- /* iterate starting on the root group */
- if (( nnames = traverse(fid,"/",travt,NULL,&nnames,0))<0)
- return -1;
-
- return 0;
-
-}
-
-
/*-------------------------------------------------------------------------
* Function: h5trav_getindex
*
@@ -133,8 +113,6 @@ int h5trav_getindex( const char *obj, int nobjs, trav_info_t *info )
return -1;
}
-
-
/*-------------------------------------------------------------------------
* Function: h5trav_freeinfo
*
@@ -157,6 +135,182 @@ void h5trav_freeinfo( trav_info_t *info, int nobjs )
}
}
+/*-------------------------------------------------------------------------
+ * Function: h5trav_printinfo
+ *
+ * Purpose: print list of names in file
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+void h5trav_printinfo(int nobjs, trav_info_t *travi)
+{
+ int i;
+ for ( i = 0; i < nobjs; i++)
+ {
+ switch ( travi[i].type )
+ {
+ case H5G_GROUP:
+ printf(" %-10s %s\n", "group", travi[i].name );
+ break;
+ case H5G_DATASET:
+ printf(" %-10s %s\n", "dataset", travi[i].name );
+ break;
+ case H5G_TYPE:
+ printf(" %-10s %s\n", "datatype", travi[i].name );
+ break;
+ case H5G_LINK:
+ printf(" %-10s %s\n", "link", travi[i].name );
+ break;
+ case H5G_UDLINK:
+ printf(" %-10s %s\n", "User defined link", travi[i].name );
+ break;
+ default:
+ printf(" %-10s %s\n", "User defined object", travi[i].name );
+ break;
+ }
+ }
+}
+
+/*-------------------------------------------------------------------------
+ * "h5trav table" public functions. used in h5repack
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * Function: h5trav_getindext
+ *
+ * Purpose: get index of NAME in list
+ *
+ * Return: index, -1 if not found
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: December 18, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int h5trav_getindext(const char *name, trav_table_t *table)
+{
+ char *pdest;
+ int result;
+ unsigned int i, j;
+
+ for ( i = 0; i < table->nobjs; i++)
+ {
+ if ( strcmp(name,table->objs[i].name)==0 )
+ return i;
+
+ pdest = strstr( table->objs[i].name, name );
+ result = (int)(pdest - table->objs[i].name);
+
+ /* found at position 1, meaning without '/' */
+ if( pdest != NULL && result==1 && strlen(table->objs[i].name)-1==strlen(name))
+ return i;
+
+ /* search also in the list of links */
+ if (table->objs[i].nlinks)
+ {
+ for ( j=0; j<table->objs[i].nlinks; j++)
+ {
+ if ( strcmp(name,table->objs[i].links[j].new_name)==0 )
+ return i;
+
+ pdest = strstr( table->objs[i].links[j].new_name, name );
+ result = (int)(pdest - table->objs[i].links[j].new_name);
+
+ /* found at position 1, meaning without '/' */
+ if( pdest != NULL && result==1 )
+ return i;
+
+ }
+ }
+
+ }
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5trav_gettable
+ *
+ * Purpose: get the trav_table_t struct
+ *
+ * Return: 0, -1 on error
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: December 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int h5trav_gettable(hid_t fid, trav_table_t *travt)
+{
+ int nnames=0;
+
+ /* iterate starting on the root group */
+ if (( nnames = traverse(fid,"/",travt,NULL,&nnames,0))<0)
+ return -1;
+
+ return 0;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5trav_printtable
+ *
+ * Purpose: print list of objects in file
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+void h5trav_printtable(trav_table_t *table)
+{
+ unsigned int i, j;
+
+ for ( i = 0; i < table->nobjs; i++)
+ {
+ switch ( table->objs[i].type )
+ {
+ case H5G_GROUP:
+ printf(" %-10s %s\n", "group", table->objs[i].name );
+ break;
+ case H5G_DATASET:
+ printf(" %-10s %s\n", "dataset", table->objs[i].name );
+ break;
+ case H5G_TYPE:
+ printf(" %-10s %s\n", "datatype", table->objs[i].name );
+ break;
+ case H5G_LINK:
+ printf(" %-10s %s\n", "link", table->objs[i].name );
+ break;
+ default:
+ printf(" %-10s %s\n", "User defined object", table->objs[i].name );
+ break;
+ }
+
+ if (table->objs[i].nlinks)
+ {
+ for ( j=0; j<table->objs[i].nlinks; j++)
+ {
+ printf(" %-10s %s\n", " hardlink", table->objs[i].links[j].new_name );
+ }
+ }
+
+ }
+}
+
/*-------------------------------------------------------------------------
* Function: get_nnames
@@ -253,11 +407,11 @@ static herr_t opget_info( hid_t loc_id, const char *name, void *op_data)
*-------------------------------------------------------------------------
*/
-herr_t get_name_type( hid_t loc_id,
- const char *group_name,
- int idx,
- char **name,
- H5G_obj_t *type )
+static herr_t get_name_type( hid_t loc_id,
+ const char *group_name,
+ int idx,
+ char **name,
+ H5G_obj_t *type )
{
trav_info_t info;
@@ -286,11 +440,11 @@ herr_t get_name_type( hid_t loc_id,
*/
static int traverse( hid_t loc_id,
- const char *group_name,
- trav_table_t *table,
- trav_info_t *info,
- int *idx,
- int print)
+ const char *group_name,
+ trav_table_t *table,
+ trav_info_t *info,
+ int *idx,
+ int print)
{
haddr_t objno; /* Compact form of object's location */
char *name=NULL;
@@ -566,151 +720,9 @@ static int traverse( hid_t loc_id,
-/*-------------------------------------------------------------------------
- * Function: h5trav_printinfo
- *
- * Purpose: print list of names in file
- *
- * Return: void
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: May 9, 2003
- *
- *-------------------------------------------------------------------------
- */
-void h5trav_printinfo(int nobjs, trav_info_t *travi)
-{
- int i;
- for ( i = 0; i < nobjs; i++)
- {
- switch ( travi[i].type )
- {
- case H5G_GROUP:
- printf(" %-10s %s\n", "group", travi[i].name );
- break;
- case H5G_DATASET:
- printf(" %-10s %s\n", "dataset", travi[i].name );
- break;
- case H5G_TYPE:
- printf(" %-10s %s\n", "datatype", travi[i].name );
- break;
- case H5G_LINK:
- printf(" %-10s %s\n", "link", travi[i].name );
- break;
- case H5G_UDLINK:
- printf(" %-10s %s\n", "User defined link", travi[i].name );
- break;
- default:
- printf(" %-10s %s\n", "User defined object", travi[i].name );
- break;
- }
- }
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: h5trav_printtable
- *
- * Purpose: print list of objects in file
- *
- * Return: void
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: May 9, 2003
- *
- *-------------------------------------------------------------------------
- */
-void h5trav_printtable(trav_table_t *table)
-{
- unsigned int i, j;
-
- for ( i = 0; i < table->nobjs; i++)
- {
- switch ( table->objs[i].type )
- {
- case H5G_GROUP:
- printf(" %-10s %s\n", "group", table->objs[i].name );
- break;
- case H5G_DATASET:
- printf(" %-10s %s\n", "dataset", table->objs[i].name );
- break;
- case H5G_TYPE:
- printf(" %-10s %s\n", "datatype", table->objs[i].name );
- break;
- case H5G_LINK:
- printf(" %-10s %s\n", "link", table->objs[i].name );
- break;
- default:
- printf(" %-10s %s\n", "User defined object", table->objs[i].name );
- break;
- }
-
- if (table->objs[i].nlinks)
- {
- for ( j=0; j<table->objs[i].nlinks; j++)
- {
- printf(" %-10s %s\n", " hardlink", table->objs[i].links[j].new_name );
- }
- }
-
- }
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: h5trav_getindext
- *
- * Purpose: get index of NAME in list
- *
- * Return: index, -1 if not found
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: December 18, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-int h5trav_getindext(const char *name, trav_table_t *table)
-{
- char *pdest;
- int result;
- unsigned int i, j;
-
- for ( i = 0; i < table->nobjs; i++)
- {
- if ( strcmp(name,table->objs[i].name)==0 )
- return i;
-
- pdest = strstr( table->objs[i].name, name );
- result = (int)(pdest - table->objs[i].name);
-
- /* found at position 1, meaning without '/' */
- if( pdest != NULL && result==1 && strlen(table->objs[i].name)-1==strlen(name))
- return i;
- /* search also in the list of links */
- if (table->objs[i].nlinks)
- {
- for ( j=0; j<table->objs[i].nlinks; j++)
- {
- if ( strcmp(name,table->objs[i].links[j].new_name)==0 )
- return i;
- pdest = strstr( table->objs[i].links[j].new_name, name );
- result = (int)(pdest - table->objs[i].links[j].new_name);
- /* found at position 1, meaning without '/' */
- if( pdest != NULL && result==1 )
- return i;
- }
- }
- }
- return -1;
-}