mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-04-12 17:31:09 +08:00
[svn-r7969] Purpose:
h5repack new features Description: addded the copy routines for hard links changed the traversal structure to store information about the hard links added tests Solution: Platforms tested: linux solaris IRIX Misc. update:
This commit is contained in:
parent
1f0ca5b200
commit
8f65e4252d
@ -134,52 +134,39 @@ void print_objlist(const char *filename,
|
||||
|
||||
int do_copy_file(hid_t fidin,
|
||||
hid_t fidout,
|
||||
int nobjects,
|
||||
trav_info_t *info,
|
||||
trav_table_t *travt,
|
||||
pack_opt_t *options);
|
||||
|
||||
int copy_attr(hid_t loc_in,
|
||||
hid_t loc_out,
|
||||
pack_opt_t *options,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
hid_t fidout /*for saving references */
|
||||
trav_table_t *travt,
|
||||
hid_t fidout /* for saving references */
|
||||
);
|
||||
|
||||
|
||||
void read_info(const char *filename,pack_opt_t *options);
|
||||
|
||||
|
||||
void close_obj(H5G_obj_t obj_type, hid_t obj_id);
|
||||
|
||||
const char* MapIdToName(hid_t refobj_id,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
pack_opt_t *options) /* repack options */;
|
||||
|
||||
|
||||
|
||||
int do_copy_refobjs(hid_t fidin,
|
||||
hid_t fidout,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
pack_opt_t *options); /* repack options */
|
||||
|
||||
int do_copy_refobjs_inattr(hid_t loc_in,
|
||||
hid_t loc_out,
|
||||
pack_opt_t *options,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
hid_t fidout /* for saving references */
|
||||
);
|
||||
|
||||
void read_info(const char *filename,pack_opt_t *options);
|
||||
void close_obj(H5G_obj_t obj_type, hid_t obj_id);
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* options table
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
int options_table_init( pack_opttbl_t **tbl );
|
||||
int options_table_free( pack_opttbl_t *table );
|
||||
int options_add_chunk ( obj_list_t *obj_list,
|
||||
@ -194,9 +181,6 @@ int options_add_comp ( obj_list_t *obj_list,
|
||||
pack_info_t* options_get_object( const char *path,
|
||||
pack_opttbl_t *table);
|
||||
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* parse functions
|
||||
*-------------------------------------------------------------------------
|
||||
@ -217,46 +201,36 @@ int parse_number(char *str);
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#define FNAME1 "testcopy.h5"
|
||||
#define FNAME1OUT "testcopyout.h5"
|
||||
#define FNAME2 "testfilters.h5"
|
||||
#define FNAME2OUT "testfiltersout.h5"
|
||||
|
||||
|
||||
|
||||
#define FNAME1 "testcopy.h5"
|
||||
#define FNAME1OUT "testcopyout.h5"
|
||||
#define FNAME2 "testfilters.h5"
|
||||
#define FNAME2OUT "testfiltersout.h5"
|
||||
|
||||
#define FNAME1 "test1.h5"
|
||||
#define FNAME1OUT "test1out.h5"
|
||||
#define FNAME2 "test2.h5"
|
||||
#define FNAME2OUT "test2out.h5"
|
||||
#define FNAME3 "test3.h5"
|
||||
#define FNAME3OUT "test3out.h5"
|
||||
#define FNAME4 "test4.h5"
|
||||
#define FNAME4OUT "test4out.h5"
|
||||
|
||||
int make_testfiles(void);
|
||||
|
||||
int make_all_objects(hid_t fid);
|
||||
|
||||
int make_attributes(hid_t fid);
|
||||
int make_special_objects(hid_t loc_id);
|
||||
int make_attr(hid_t fid);
|
||||
|
||||
int write_dset( hid_t loc_id,
|
||||
int rank,
|
||||
hsize_t *dims,
|
||||
const char *dset_name,
|
||||
hid_t type_id,
|
||||
void *buf );
|
||||
|
||||
int write_attr(hid_t loc_id,
|
||||
int rank,
|
||||
hsize_t *dims,
|
||||
const char *attr_name,
|
||||
hid_t type_id,
|
||||
void *buf);
|
||||
|
||||
|
||||
void write_attr_in(hid_t loc_id,
|
||||
const char* dset_name, /* for saving reference to dataset*/
|
||||
hid_t fid, /* for reference create */
|
||||
int make_diffs /* flag to modify data buffers */);
|
||||
|
||||
void write_dset_in(hid_t loc_id,
|
||||
const char* dset_name, /* for saving reference to dataset*/
|
||||
hid_t file_id,
|
||||
|
@ -37,10 +37,10 @@ int copy_file(const char* fnamein,
|
||||
const char* fnameout,
|
||||
pack_opt_t *options)
|
||||
{
|
||||
hid_t fidin;
|
||||
hid_t fidout;
|
||||
int nobjects;
|
||||
trav_info_t *travi=NULL;
|
||||
hid_t fidin;
|
||||
hid_t fidout;
|
||||
int nobjects=0;
|
||||
trav_table_t *travt=NULL;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* open the files
|
||||
@ -67,65 +67,66 @@ int copy_file(const char* fnamein,
|
||||
printf("Making file <%s>...\n",fnameout);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* get the number of objects in the file
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
/* init table */
|
||||
trav_table_init(&travt);
|
||||
|
||||
if ((nobjects = h5trav_getinfo(fidin, NULL ))<0) {
|
||||
printf("h5repack: <%s>: Could not obtain object list\n", fnamein );
|
||||
return -1;
|
||||
}
|
||||
/* get the list of objects in the file */
|
||||
if (h5trav_gettable(fidin,travt)<0)
|
||||
goto out;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* get the list of objects in the file
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
if ((travi = (trav_info_t*) malloc( nobjects * sizeof(trav_info_t)))==NULL){
|
||||
printf("h5repack: <%s>: Could not allocate object list\n", fnamein );
|
||||
return -1;
|
||||
}
|
||||
if (h5trav_getinfo(fidin, travi )<0) {
|
||||
printf("h5repack: <%s>: Could not obtain object list\n", fnamein );
|
||||
return -1;
|
||||
}
|
||||
#if defined (H5_REPACK_DEBUG)
|
||||
h5trav_printtable(travt);
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* do the copy
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if(do_copy_file(fidin,fidout,nobjects,travi,options)<0) {
|
||||
if(do_copy_file(fidin,fidout,travt,options)<0) {
|
||||
printf("h5repack: <%s>: Could not copy data to: %s\n", fnamein, fnameout);
|
||||
return -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* do the copy of referenced objects
|
||||
* and create hard links
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if(do_copy_refobjs(fidin,fidout,nobjects,travi,options)<0) {
|
||||
if(do_copy_refobjs(fidin,fidout,travt,options)<0) {
|
||||
printf("h5repack: <%s>: Could not copy data to: %s\n", fnamein, fnameout);
|
||||
return -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
#if defined (H5_REPACK_DEBUG)
|
||||
h5trav_printinfo(nobjects,travi);
|
||||
#endif
|
||||
|
||||
/* free table */
|
||||
trav_table_free(travt);
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* free
|
||||
* close
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
H5Fclose(fidin);
|
||||
H5Fclose(fidout);
|
||||
h5trav_freeinfo(travi,nobjects);
|
||||
return 0;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* out
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
out:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Fclose(fidin);
|
||||
H5Fclose(fidout);
|
||||
trav_table_free(travt);
|
||||
} H5E_END_TRY;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: do_copy_file
|
||||
*
|
||||
@ -142,8 +143,7 @@ int copy_file(const char* fnamein,
|
||||
|
||||
int do_copy_file(hid_t fidin,
|
||||
hid_t fidout,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
pack_opt_t *options) /* repack options */
|
||||
{
|
||||
hid_t grp_in; /* group ID */
|
||||
@ -168,10 +168,10 @@ int do_copy_file(hid_t fidin,
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
for ( i = 0; i < nobjects; i++)
|
||||
for ( i = 0; i < travt->nobjs; i++)
|
||||
{
|
||||
|
||||
switch ( travi[i].type )
|
||||
switch ( travt->objs[i].type )
|
||||
{
|
||||
/*-------------------------------------------------------------------------
|
||||
* H5G_GROUP
|
||||
@ -179,19 +179,19 @@ int do_copy_file(hid_t fidin,
|
||||
*/
|
||||
case H5G_GROUP:
|
||||
if (options->verbose)
|
||||
printf(" %-10s %s\n", "group",travi[i].name );
|
||||
printf(" %-10s %s\n", "group",travt->objs[i].name );
|
||||
|
||||
if ((grp_out=H5Gcreate(fidout,travi[i].name, 0))<0)
|
||||
if ((grp_out=H5Gcreate(fidout,travt->objs[i].name, 0))<0)
|
||||
goto error;
|
||||
|
||||
if((grp_in = H5Gopen (fidin,travi[i].name))<0)
|
||||
if((grp_in = H5Gopen (fidin,travt->objs[i].name))<0)
|
||||
goto error;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* copy attrs
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if (copy_attr(grp_in,grp_out,options,nobjects,travi,fidout)<0)
|
||||
/*-------------------------------------------------------------------------
|
||||
* copy attrs
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if (copy_attr(grp_in,grp_out,options,travt,fidout)<0)
|
||||
goto error;
|
||||
|
||||
if (H5Gclose(grp_out)<0)
|
||||
@ -199,6 +199,7 @@ int do_copy_file(hid_t fidin,
|
||||
if (H5Gclose(grp_in)<0)
|
||||
goto error;
|
||||
|
||||
|
||||
break;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -207,9 +208,9 @@ int do_copy_file(hid_t fidin,
|
||||
*/
|
||||
case H5G_DATASET:
|
||||
if (options->verbose)
|
||||
printf(" %-10s %s\n", "dataset",travi[i].name );
|
||||
printf(" %-10s %s\n", "dataset",travt->objs[i].name );
|
||||
|
||||
if ((dset_in=H5Dopen(fidin,travi[i].name))<0)
|
||||
if ((dset_in=H5Dopen(fidin,travt->objs[i].name))<0)
|
||||
goto error;
|
||||
if ((space_id=H5Dget_space(dset_in))<0)
|
||||
goto error;
|
||||
@ -256,7 +257,7 @@ int do_copy_file(hid_t fidin,
|
||||
* create/write dataset/close
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if ((dset_out=H5Dcreate(fidout,travi[i].name,ftype_id,space_id,dcpl_id))<0)
|
||||
if ((dset_out=H5Dcreate(fidout,travt->objs[i].name,ftype_id,space_id,dcpl_id))<0)
|
||||
goto error;
|
||||
if (H5Dwrite(dset_out,mtype_id,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0)
|
||||
goto error;
|
||||
@ -264,8 +265,8 @@ int do_copy_file(hid_t fidin,
|
||||
/*-------------------------------------------------------------------------
|
||||
* copy attrs
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if (copy_attr(dset_in,dset_out,options,nobjects,travi,fidout)<0)
|
||||
*/
|
||||
if (copy_attr(dset_in,dset_out,options,travt,fidout)<0)
|
||||
goto error;
|
||||
|
||||
/*close */
|
||||
@ -274,6 +275,7 @@ int do_copy_file(hid_t fidin,
|
||||
|
||||
if (buf)
|
||||
free(buf);
|
||||
|
||||
|
||||
}/*H5T_STD_REF_OBJ*/
|
||||
|
||||
@ -293,8 +295,6 @@ int do_copy_file(hid_t fidin,
|
||||
goto error;
|
||||
if (H5Dclose(dset_in)<0)
|
||||
goto error;
|
||||
|
||||
|
||||
|
||||
break;
|
||||
|
||||
@ -304,20 +304,20 @@ int do_copy_file(hid_t fidin,
|
||||
*/
|
||||
case H5G_TYPE:
|
||||
|
||||
if ((type_in = H5Topen (fidin,travi[i].name))<0)
|
||||
if ((type_in = H5Topen (fidin,travt->objs[i].name))<0)
|
||||
goto error;
|
||||
|
||||
if ((type_out = H5Tcopy(type_in))<0)
|
||||
goto error;
|
||||
|
||||
if ((H5Tcommit(fidout,travi[i].name,type_out))<0)
|
||||
if ((H5Tcommit(fidout,travt->objs[i].name,type_out))<0)
|
||||
goto error;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* copy attrs
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if (copy_attr(type_in,type_out,options,nobjects,travi,fidout)<0)
|
||||
if (copy_attr(type_in,type_out,options,travt,fidout)<0)
|
||||
goto error;
|
||||
|
||||
if (H5Tclose(type_in)<0)
|
||||
@ -326,7 +326,7 @@ int do_copy_file(hid_t fidin,
|
||||
goto error;
|
||||
|
||||
if (options->verbose)
|
||||
printf(" %-10s %s\n","datatype",travi[i].name );
|
||||
printf(" %-10s %s\n","datatype",travt->objs[i].name );
|
||||
|
||||
break;
|
||||
|
||||
@ -343,32 +343,32 @@ int do_copy_file(hid_t fidin,
|
||||
H5G_stat_t statbuf;
|
||||
char *targbuf=NULL;
|
||||
|
||||
if (H5Gget_objinfo(fidin,travi[i].name,FALSE,&statbuf)<0)
|
||||
if (H5Gget_objinfo(fidin,travt->objs[i].name,FALSE,&statbuf)<0)
|
||||
goto error;
|
||||
|
||||
targbuf = malloc(statbuf.linklen);
|
||||
|
||||
if (H5Gget_linkval(fidin,travi[i].name,statbuf.linklen,targbuf)<0)
|
||||
if (H5Gget_linkval(fidin,travt->objs[i].name,statbuf.linklen,targbuf)<0)
|
||||
goto error;
|
||||
|
||||
if (H5Glink(fidout,
|
||||
H5G_LINK_SOFT,
|
||||
targbuf, /* current name of object */
|
||||
travi[i].name /* new name of object */
|
||||
travt->objs[i].name /* new name of object */
|
||||
)<0)
|
||||
goto error;
|
||||
|
||||
free(targbuf);
|
||||
|
||||
if (options->verbose)
|
||||
printf(" %-10s %s\n","link",travi[i].name );
|
||||
printf(" %-10s %s\n","link",travt->objs[i].name );
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (options->verbose)
|
||||
printf(" %-10s %s\n","User defined object",travi[i].name);
|
||||
printf(" %-10s %s\n","User defined object",travt->objs[i].name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -389,7 +389,7 @@ int do_copy_file(hid_t fidin,
|
||||
if ((grp_in = H5Gopen(fidin,"/"))<0)
|
||||
goto error;
|
||||
|
||||
if (copy_attr(grp_in,grp_out,options,nobjects,travi,fidout)<0)
|
||||
if (copy_attr(grp_in,grp_out,options,travt,fidout)<0)
|
||||
goto error;
|
||||
|
||||
if (H5Gclose(grp_out)<0)
|
||||
@ -439,8 +439,7 @@ error:
|
||||
int copy_attr(hid_t loc_in,
|
||||
hid_t loc_out,
|
||||
pack_opt_t *options,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
hid_t fidout /* for saving references */
|
||||
)
|
||||
{
|
||||
@ -577,4 +576,3 @@ error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
* Function: do_copy_refobjs
|
||||
*
|
||||
* Purpose: duplicate all referenced HDF5 objects in the file
|
||||
* and create hard links
|
||||
*
|
||||
* Return: 0, ok, -1 no
|
||||
*
|
||||
@ -36,8 +37,7 @@
|
||||
|
||||
int do_copy_refobjs(hid_t fidin,
|
||||
hid_t fidout,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
pack_opt_t *options) /* repack options */
|
||||
{
|
||||
hid_t grp_in; /* group ID */
|
||||
@ -62,22 +62,32 @@ int do_copy_refobjs(hid_t fidin,
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
for ( i = 0; i < nobjects; i++)
|
||||
for ( i = 0; i < travt->nobjs; i++)
|
||||
{
|
||||
|
||||
switch ( travi[i].type )
|
||||
switch ( travt->objs[i].type )
|
||||
{
|
||||
/*-------------------------------------------------------------------------
|
||||
* H5G_GROUP
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
case H5G_GROUP:
|
||||
|
||||
if((grp_in = H5Gopen (fidin,travi[i].name))<0)
|
||||
goto error;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* check for hard links
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
if (H5Gclose(grp_in)<0)
|
||||
goto error;
|
||||
if (travt->objs[i].nlinks)
|
||||
{
|
||||
for ( j=0; j<travt->objs[i].nlinks; j++)
|
||||
{
|
||||
H5Glink(fidout,
|
||||
H5G_LINK_HARD,
|
||||
travt->objs[i].name,
|
||||
travt->objs[i].links[j].new_name);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@ -87,7 +97,7 @@ int do_copy_refobjs(hid_t fidin,
|
||||
*/
|
||||
case H5G_DATASET:
|
||||
|
||||
if ((dset_in=H5Dopen(fidin,travi[i].name))<0)
|
||||
if ((dset_in=H5Dopen(fidin,travt->objs[i].name))<0)
|
||||
goto error;
|
||||
if ((space_id=H5Dget_space(dset_in))<0)
|
||||
goto error;
|
||||
@ -149,14 +159,14 @@ int do_copy_refobjs(hid_t fidin,
|
||||
|
||||
/* get the name. a valid name could only occur in the
|
||||
second traversal of the file */
|
||||
if ((refname=MapIdToName(refobj_id,nobjects,travi,options))!=NULL)
|
||||
if ((refname=MapIdToName(refobj_id,travt,options))!=NULL)
|
||||
{
|
||||
/* create the reference */
|
||||
if (H5Rcreate(&refbuf[j],fidout,refname,H5R_OBJECT,-1)<0)
|
||||
goto error;
|
||||
|
||||
if (options->verbose)
|
||||
printf("object <%s> reference created to <%s>\n",travi[i].name,refname);
|
||||
printf("object <%s> reference created to <%s>\n",travt->objs[i].name,refname);
|
||||
}
|
||||
close_obj(obj_type,refobj_id);
|
||||
}/* j */
|
||||
@ -167,7 +177,7 @@ int do_copy_refobjs(hid_t fidin,
|
||||
* create/write dataset/close
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if ((dset_out=H5Dcreate(fidout,travi[i].name,ftype_id,space_id,dcpl_id))<0)
|
||||
if ((dset_out=H5Dcreate(fidout,travt->objs[i].name,ftype_id,space_id,dcpl_id))<0)
|
||||
goto error;
|
||||
if (H5Dwrite(dset_out,mtype_id,H5S_ALL,H5S_ALL,H5P_DEFAULT,refbuf)<0)
|
||||
goto error;
|
||||
@ -185,7 +195,7 @@ int do_copy_refobjs(hid_t fidin,
|
||||
|
||||
else
|
||||
{
|
||||
if ((dset_out=H5Dopen(fidout,travi[i].name))<0)
|
||||
if ((dset_out=H5Dopen(fidout,travt->objs[i].name))<0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -194,8 +204,24 @@ int do_copy_refobjs(hid_t fidin,
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
if (do_copy_refobjs_inattr(dset_in,dset_out,options,nobjects,travi,fidout)<0)
|
||||
if (do_copy_refobjs_inattr(dset_in,dset_out,options,travt,fidout)<0)
|
||||
goto error;
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* check for hard links
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
if (travt->objs[i].nlinks)
|
||||
{
|
||||
for ( j=0; j<travt->objs[i].nlinks; j++)
|
||||
{
|
||||
H5Glink(fidout,
|
||||
H5G_LINK_HARD,
|
||||
travt->objs[i].name,
|
||||
travt->objs[i].links[j].new_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -225,7 +251,7 @@ int do_copy_refobjs(hid_t fidin,
|
||||
*/
|
||||
case H5G_TYPE:
|
||||
|
||||
if ((type_in = H5Topen (fidin,travi[i].name))<0)
|
||||
if ((type_in = H5Topen (fidin,travt->objs[i].name))<0)
|
||||
goto error;
|
||||
|
||||
if (H5Tclose(type_in)<0)
|
||||
@ -267,7 +293,7 @@ int do_copy_refobjs(hid_t fidin,
|
||||
if ((grp_in = H5Gopen(fidin,"/"))<0)
|
||||
goto error;
|
||||
|
||||
if (do_copy_refobjs_inattr(grp_in,grp_out,options,nobjects,travi,fidout)<0)
|
||||
if (do_copy_refobjs_inattr(grp_in,grp_out,options,travt,fidout)<0)
|
||||
goto error;
|
||||
|
||||
if (H5Gclose(grp_out)<0)
|
||||
@ -314,8 +340,7 @@ error:
|
||||
int do_copy_refobjs_inattr(hid_t loc_in,
|
||||
hid_t loc_out,
|
||||
pack_opt_t *options,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
hid_t fidout /* for saving references */
|
||||
)
|
||||
{
|
||||
@ -414,7 +439,7 @@ int do_copy_refobjs_inattr(hid_t loc_in,
|
||||
|
||||
/* get the name. a valid name could only occur in the
|
||||
second traversal of the file */
|
||||
if ((refname=MapIdToName(refobj_id,nobjects,travi,options))!=NULL)
|
||||
if ((refname=MapIdToName(refobj_id,travt,options))!=NULL)
|
||||
{
|
||||
/* create the reference */
|
||||
if (H5Rcreate(&refbuf[i],fidout,refname,H5R_OBJECT,-1)<0)
|
||||
@ -506,8 +531,7 @@ static void close_obj(H5G_obj_t obj_type, hid_t obj_id)
|
||||
*/
|
||||
|
||||
const char* MapIdToName(hid_t refobj_id,
|
||||
int nobjects, /* number of objects */
|
||||
trav_info_t *travi, /* array of object names */
|
||||
trav_table_t *travt,
|
||||
pack_opt_t *options) /* repack options */
|
||||
{
|
||||
hid_t id;
|
||||
@ -521,9 +545,9 @@ const char* MapIdToName(hid_t refobj_id,
|
||||
}
|
||||
|
||||
|
||||
for ( i=0; i<nobjects; i++)
|
||||
for ( i=0; i<travt->nobjs; i++)
|
||||
{
|
||||
switch ( travi[i].type )
|
||||
switch ( travt->objs[i].type )
|
||||
{
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -543,7 +567,7 @@ const char* MapIdToName(hid_t refobj_id,
|
||||
|
||||
case H5G_DATASET:
|
||||
|
||||
if ((id = H5Dopen(fid,travi[i].name))<0)
|
||||
if ((id = H5Dopen(fid,travt->objs[i].name))<0)
|
||||
{
|
||||
assert(0);
|
||||
return NULL;
|
||||
@ -558,7 +582,7 @@ const char* MapIdToName(hid_t refobj_id,
|
||||
if (id==refobj_id)
|
||||
{
|
||||
H5Fclose(fid);
|
||||
return travi[i].name;
|
||||
return travt->objs[i].name;
|
||||
}
|
||||
|
||||
|
||||
|
@ -22,12 +22,6 @@
|
||||
*
|
||||
* Purpose: make a dataset using DEFLATE (GZIP) compression in FID
|
||||
*
|
||||
* Return: Success: zero
|
||||
* Failure: 1
|
||||
*
|
||||
* Programmer: Pedro Vicente <pvn@ncsa.uiuc.edu>
|
||||
* September, 19, 2003
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
@ -82,12 +76,6 @@ error:
|
||||
*
|
||||
* Purpose: make a dataset using SZIP compression in FID
|
||||
*
|
||||
* Return: Success: zero
|
||||
* Failure: 1
|
||||
*
|
||||
* Programmer: Pedro Vicente <pvn@ncsa.uiuc.edu>
|
||||
* September, 19, 2003
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
@ -152,12 +140,6 @@ error:
|
||||
* Purpose: make a test file with all types of HDF5 objects,
|
||||
* datatypes and filters
|
||||
*
|
||||
* Return: Success: zero
|
||||
* Failure: 1
|
||||
*
|
||||
* Programmer: Pedro Vicente <pvn@ncsa.uiuc.edu>
|
||||
* September, 19, 2003
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
int make_testfiles(void)
|
||||
@ -167,23 +149,35 @@ int make_testfiles(void)
|
||||
|
||||
TESTING(" generating datasets");
|
||||
|
||||
/* create a file for the copy test */
|
||||
/* create a file for general copy test */
|
||||
if((fid = H5Fcreate(FNAME1,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0)
|
||||
TEST_ERROR;
|
||||
|
||||
nerrors += make_all_objects(fid);
|
||||
|
||||
/* close */
|
||||
if(H5Fclose(fid)<0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* create a file for the filters test */
|
||||
/* create a file for attributes copy test */
|
||||
if((fid = H5Fcreate(FNAME2,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0)
|
||||
TEST_ERROR;
|
||||
|
||||
nerrors += make_attributes(fid);
|
||||
/* close */
|
||||
if(H5Fclose(fid)<0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* create a file for special items test */
|
||||
if((fid = H5Fcreate(FNAME3,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0)
|
||||
TEST_ERROR;
|
||||
nerrors += make_special_objects(fid);
|
||||
/* close */
|
||||
if(H5Fclose(fid)<0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* create a file for the filters test */
|
||||
if((fid = H5Fcreate(FNAME4,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0)
|
||||
TEST_ERROR;
|
||||
nerrors += make_deflate(fid);
|
||||
nerrors += make_szip(fid);
|
||||
|
||||
/* close */
|
||||
if(H5Fclose(fid)<0)
|
||||
TEST_ERROR;
|
||||
@ -199,20 +193,11 @@ error:
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: make_all_objects
|
||||
*
|
||||
* Purpose: make a test file with all types of HDF5 objects, datatypes
|
||||
*
|
||||
* Return: Success: zero
|
||||
* Failure: 1
|
||||
*
|
||||
* Programmer: Pedro Vicente <pvn@ncsa.uiuc.edu>
|
||||
* September, 19, 2003
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
int make_all_objects(hid_t fid)
|
||||
@ -266,15 +251,6 @@ int make_all_objects(hid_t fid)
|
||||
|
||||
H5Glink(fid, H5G_LINK_SOFT, "dset", "link");
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* write a series of attributes on the dataset, group, and root group
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
write_attr_in(dset_id,"dset_ref",fid,0);
|
||||
write_attr_in(group_id,"dset_ref",fid,0);
|
||||
write_attr_in(root_id,"dset_ref",fid,0);
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* write a series of datasetes on the group, and root group
|
||||
*-------------------------------------------------------------------------
|
||||
@ -293,3 +269,109 @@ int make_all_objects(hid_t fid)
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: make_attributes
|
||||
*
|
||||
* Purpose: make a test file with all types of attributes
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
int make_attributes(hid_t fid)
|
||||
{
|
||||
hid_t dset_id;
|
||||
hid_t group_id;
|
||||
hid_t root_id;
|
||||
hid_t space_id;
|
||||
hsize_t dims[1]={2};
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* H5G_DATASET
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
space_id = H5Screate_simple(1,dims,NULL);
|
||||
dset_id = H5Dcreate(fid,"dset",H5T_NATIVE_INT,space_id,H5P_DEFAULT);
|
||||
H5Sclose(space_id);
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* H5G_GROUP
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
group_id = H5Gcreate(fid,"g1",0);
|
||||
root_id = H5Gopen(fid, "/");
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* write a series of attributes on the dataset, group, and root group
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
write_attr_in(dset_id,"dset",fid,0);
|
||||
write_attr_in(group_id,"dset",fid,0);
|
||||
write_attr_in(root_id,"dset",fid,0);
|
||||
|
||||
/* Close */
|
||||
H5Dclose(dset_id);
|
||||
H5Gclose(group_id);
|
||||
H5Gclose(root_id);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: make_special_objects
|
||||
*
|
||||
* Purpose: make a test file with non common items
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
int make_special_objects(hid_t loc_id)
|
||||
{
|
||||
hid_t group1_id;
|
||||
hid_t group2_id;
|
||||
hid_t group3_id;
|
||||
hsize_t dims[1]={2};
|
||||
int buf[2]= {1,2};
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* create a dataset and some hard links to it
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
if (write_dset(loc_id,1,dims,"dset",H5T_NATIVE_INT,buf)<0)
|
||||
return -1;
|
||||
if (H5Glink(loc_id, H5G_LINK_HARD, "dset", "link1 to dset")<0)
|
||||
return -1;
|
||||
if (H5Glink(loc_id, H5G_LINK_HARD, "dset", "link2 to dset")<0)
|
||||
return -1;
|
||||
if (H5Glink(loc_id, H5G_LINK_HARD, "dset", "link3 to dset")<0)
|
||||
return -1;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* create a group and some hard links to it
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
if ((group1_id = H5Gcreate(loc_id,"g1",0))<0)
|
||||
return -1;
|
||||
if ((group2_id = H5Gcreate(group1_id,"g2",0))<0)
|
||||
return -1;
|
||||
if ((group3_id = H5Gcreate(group2_id,"g3",0))<0)
|
||||
return -1;
|
||||
if (H5Glink(loc_id, H5G_LINK_HARD, "g1", "link1 to g1")<0)
|
||||
return -1;
|
||||
if (H5Glink(loc_id, H5G_LINK_HARD, "g1", "link2 to g1")<0)
|
||||
return -1;
|
||||
|
||||
|
||||
H5Gclose(group1_id);
|
||||
H5Gclose(group2_id);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,6 @@ test_copy(void)
|
||||
memset(&diff_options, 0, sizeof (diff_opt_t));
|
||||
|
||||
TESTING(" copy with no filters");
|
||||
|
||||
if (h5repack_init (&pack_options, 0)<0)
|
||||
TEST_ERROR;
|
||||
if (h5repack(FNAME1,FNAME1OUT,&pack_options)<0)
|
||||
@ -51,8 +50,30 @@ test_copy(void)
|
||||
TEST_ERROR;
|
||||
if (h5diff(FNAME1,FNAME1OUT,NULL,NULL,&diff_options) == 1)
|
||||
TEST_ERROR;
|
||||
PASSED();
|
||||
|
||||
TESTING(" copy of attributes");
|
||||
if (h5repack_init (&pack_options, 0)<0)
|
||||
TEST_ERROR;
|
||||
if (h5repack(FNAME2,FNAME2OUT,&pack_options)<0)
|
||||
TEST_ERROR;
|
||||
if (h5repack_end (&pack_options)<0)
|
||||
TEST_ERROR;
|
||||
if (h5diff(FNAME2,FNAME2OUT,NULL,NULL,&diff_options) == 1)
|
||||
TEST_ERROR;
|
||||
PASSED();
|
||||
|
||||
TESTING(" copy of hardlinks");
|
||||
if (h5repack_init (&pack_options, 0)<0)
|
||||
TEST_ERROR;
|
||||
if (h5repack(FNAME3,FNAME3OUT,&pack_options)<0)
|
||||
TEST_ERROR;
|
||||
if (h5repack_end (&pack_options)<0)
|
||||
TEST_ERROR;
|
||||
if (h5diff(FNAME3,FNAME3OUT,NULL,NULL,&diff_options) == 1)
|
||||
TEST_ERROR;
|
||||
PASSED();
|
||||
|
||||
PASSED();
|
||||
return 0;
|
||||
|
||||
error:
|
||||
@ -97,11 +118,11 @@ test_filter_deflate(void)
|
||||
TEST_ERROR;
|
||||
if (h5repack_addchunk("dset_gzip:5x4",&pack_options)<0)
|
||||
TEST_ERROR;
|
||||
if (h5repack(FNAME2,FNAME2OUT,&pack_options)<0)
|
||||
if (h5repack(FNAME4,FNAME4OUT,&pack_options)<0)
|
||||
TEST_ERROR;
|
||||
if (h5repack_end (&pack_options)<0)
|
||||
TEST_ERROR;
|
||||
if (h5diff(FNAME2,FNAME2OUT,NULL,NULL,&diff_options) == 1)
|
||||
if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) == 1)
|
||||
TEST_ERROR;
|
||||
|
||||
PASSED();
|
||||
|
@ -239,7 +239,7 @@ int diff_match( hid_t file1_id,
|
||||
{
|
||||
c1 = (table->objs[i].flags[0]) ? 'x' : ' ';
|
||||
c2 = (table->objs[i].flags[1]) ? 'x' : ' ';
|
||||
printf("%5c %6c %-15s\n", c1, c2, table->objs[i].objname);
|
||||
printf("%5c %6c %-15s\n", c1, c2, table->objs[i].name);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
@ -254,9 +254,9 @@ int diff_match( hid_t file1_id,
|
||||
{
|
||||
if ( table->objs[i].flags[0] && table->objs[i].flags[1] )
|
||||
nfound+=diff( file1_id,
|
||||
table->objs[i].objname,
|
||||
table->objs[i].name,
|
||||
file2_id,
|
||||
table->objs[i].objname,
|
||||
table->objs[i].name,
|
||||
options,
|
||||
table->objs[i].type );
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ int traverse( hid_t loc_id,
|
||||
trav_info_t *info,
|
||||
int *idx );
|
||||
|
||||
herr_t get_nobjects( hid_t loc_id,
|
||||
herr_t get_nnames( hid_t loc_id,
|
||||
const char *group_name );
|
||||
|
||||
herr_t get_name_type( hid_t loc_id,
|
||||
@ -40,7 +40,7 @@ herr_t get_name_type( hid_t loc_id,
|
||||
* Purpose: get an array of "trav_info_t" , containing the name and type of
|
||||
* objects in the file
|
||||
*
|
||||
* Return: number of objects in file
|
||||
* Return: number of object names in file
|
||||
*
|
||||
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
|
||||
*
|
||||
@ -53,19 +53,46 @@ int h5trav_getinfo( hid_t file_id, trav_info_t *info )
|
||||
{
|
||||
|
||||
trav_table_t *table=NULL;
|
||||
int nobjects=0;
|
||||
int nnames=0;
|
||||
|
||||
/* init table */
|
||||
trav_table_init( &table );
|
||||
|
||||
/* iterate starting on the root group */
|
||||
if (( nobjects = traverse( file_id, "/", table, info, &nobjects )) < 0 )
|
||||
if (( nnames = traverse( file_id, "/", table, info, &nnames )) < 0 )
|
||||
return -1;
|
||||
|
||||
/* free table */
|
||||
trav_table_free( table );
|
||||
|
||||
return nobjects;
|
||||
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)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
@ -131,7 +158,7 @@ void h5trav_freeinfo( trav_info_t *info, int nobjs )
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: count_objects
|
||||
* Function: count_names
|
||||
*
|
||||
* Purpose: operator function
|
||||
*
|
||||
@ -146,7 +173,7 @@ void h5trav_freeinfo( trav_info_t *info, int nobjs )
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static herr_t count_objects( hid_t loc_id, const char *name, void *op_data)
|
||||
static herr_t count_names( hid_t loc_id, const char *name, void *op_data)
|
||||
{
|
||||
|
||||
H5G_stat_t statbuf;
|
||||
@ -161,9 +188,9 @@ static herr_t count_objects( hid_t loc_id, const char *name, void *op_data)
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: get_nobjects
|
||||
* Function: get_nnames
|
||||
*
|
||||
* Purpose: Counts the number of objects in the group GROUP_NAME
|
||||
* Purpose: Counts the number of names in the group GROUP_NAME
|
||||
*
|
||||
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
|
||||
*
|
||||
@ -181,12 +208,12 @@ static herr_t count_objects( hid_t loc_id, const char *name, void *op_data)
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
herr_t get_nobjects( hid_t loc_id, const char *group_name )
|
||||
herr_t get_nnames( hid_t loc_id, const char *group_name )
|
||||
{
|
||||
|
||||
int nobjs = 0;
|
||||
|
||||
if ( H5Giterate( loc_id, group_name, NULL, count_objects, (void *)&nobjs ) < 0 )
|
||||
if ( H5Giterate( loc_id, group_name, NULL, count_names, (void *)&nobjs ) < 0 )
|
||||
return -1;
|
||||
|
||||
return nobjs;
|
||||
@ -287,17 +314,18 @@ int traverse( hid_t loc_id,
|
||||
|
||||
char *name=NULL;
|
||||
H5G_obj_t type;
|
||||
int nobjs;
|
||||
int i;
|
||||
int n_names;
|
||||
char *path=NULL;
|
||||
H5G_stat_t statbuf;
|
||||
int inserted_objs=0;
|
||||
int j;
|
||||
int i, j;
|
||||
|
||||
if (( nobjs = get_nobjects( loc_id, group_name )) < 0 )
|
||||
|
||||
/* get the number of names */
|
||||
if (( n_names = get_nnames( loc_id, group_name )) < 0 )
|
||||
return -1;
|
||||
|
||||
for ( i = 0; i < nobjs; i++)
|
||||
for ( i = 0; i < n_names; i++)
|
||||
{
|
||||
|
||||
if (get_name_type( loc_id, group_name, i, &name, &type ) < 0 )
|
||||
@ -365,8 +393,9 @@ int traverse( hid_t loc_id,
|
||||
else
|
||||
{
|
||||
#if defined (H5_TRAV_DEBUG)
|
||||
printf("%s %s\n", "HARDLINK", table->objs[j].objname);
|
||||
printf("<%s> HARDLINK to <%s>\n", path, table->objs[j].name);
|
||||
#endif
|
||||
trav_table_addlink(table,j,path);
|
||||
}
|
||||
|
||||
}
|
||||
@ -404,11 +433,11 @@ int traverse( hid_t loc_id,
|
||||
else
|
||||
{
|
||||
#if defined (H5_TRAV_DEBUG)
|
||||
printf("%s %s\n", "HARDLINK", table->objs[j].objname);
|
||||
printf("<%s> HARDLINK to <%s>\n", path, table->objs[j].name);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
trav_table_addlink(table,j,path);
|
||||
} /* displayed==1 */
|
||||
} /* nlink>1 */
|
||||
|
||||
|
||||
break;
|
||||
@ -442,7 +471,10 @@ int traverse( hid_t loc_id,
|
||||
|
||||
/* increment */
|
||||
inserted_objs++;
|
||||
|
||||
|
||||
/* add object to table */
|
||||
trav_table_add(statbuf.objno, path, H5G_LINK, table );
|
||||
|
||||
break;
|
||||
|
||||
|
||||
@ -471,9 +503,9 @@ int traverse( hid_t loc_id,
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: diff_list
|
||||
* Function: h5trav_printinfo
|
||||
*
|
||||
* Purpose: print list of objects in file
|
||||
* Purpose: print list of names in file
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
@ -481,10 +513,6 @@ int traverse( hid_t loc_id,
|
||||
*
|
||||
* Date: May 9, 2003
|
||||
*
|
||||
* Comments:
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
void h5trav_printinfo(int nobjs, trav_info_t *travi)
|
||||
@ -515,3 +543,52 @@ void h5trav_printinfo(int nobjs, trav_info_t *travi)
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* 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)
|
||||
{
|
||||
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] );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,17 +39,29 @@ typedef struct trav_info_t {
|
||||
} trav_info_t;
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* keep record of hard link information
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
typedef struct trav_link_t {
|
||||
char *new_name;
|
||||
} trav_link_t;
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* struct to store basic info needed for the h5trav table traversal algorythm
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
typedef struct trav_obj_t {
|
||||
haddr_t objno;
|
||||
unsigned flags[2];
|
||||
char *objname;
|
||||
int displayed;
|
||||
H5G_obj_t type;
|
||||
haddr_t objno; /* object number from H5Gget_objinfo */
|
||||
unsigned flags[2]; /* h5diff.object is present or not in both files*/
|
||||
char *name; /* name */
|
||||
int displayed; /* hard link already traversed once */
|
||||
H5G_obj_t type; /* type of object */
|
||||
trav_link_t *links; /* array of possible link names */
|
||||
int sizelinks; /* size of links array */
|
||||
int nlinks; /* number of links */
|
||||
} trav_obj_t;
|
||||
|
||||
|
||||
@ -78,7 +90,7 @@ int h5trav_getinfo( hid_t file_id, trav_info_t *info );
|
||||
int h5trav_getindex( const char *obj, int nobjs, trav_info_t *info );
|
||||
void h5trav_freeinfo( trav_info_t *info, int nobjs );
|
||||
void h5trav_printinfo(int nobjs, trav_info_t *info);
|
||||
|
||||
int h5trav_gettable(hid_t fid, trav_table_t *travt);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
@ -107,6 +119,11 @@ void trav_table_addflags(unsigned *flags,
|
||||
H5G_obj_t type,
|
||||
trav_table_t *table);
|
||||
|
||||
void h5trav_printtable(trav_table_t *table);
|
||||
|
||||
void trav_table_addlink(trav_table_t *table,
|
||||
int j /* the object index */,
|
||||
char *path );
|
||||
|
||||
|
||||
#endif /* H5TRAV_H__ */
|
||||
|
@ -57,7 +57,7 @@ int trav_table_search(haddr_t objno, trav_table_t *table )
|
||||
*/
|
||||
|
||||
void trav_table_add(haddr_t objno,
|
||||
char *objname,
|
||||
char *name,
|
||||
H5G_obj_t type,
|
||||
trav_table_t *table)
|
||||
{
|
||||
@ -73,16 +73,21 @@ void trav_table_add(haddr_t objno,
|
||||
table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
|
||||
table->objs[i].displayed = 0;
|
||||
table->objs[i].type = H5G_UNKNOWN;
|
||||
table->objs[i].objname = NULL;
|
||||
table->objs[i].name = NULL;
|
||||
table->objs[i].links = NULL;
|
||||
table->objs[i].nlinks = 0;
|
||||
table->objs[i].sizelinks = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i = table->nobjs++;
|
||||
table->objs[i].objno = objno;
|
||||
table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
|
||||
HDfree(table->objs[i].objname);
|
||||
table->objs[i].objname = (char *)HDstrdup(objname);
|
||||
HDfree(table->objs[i].name);
|
||||
table->objs[i].name = (char *)HDstrdup(name);
|
||||
table->objs[i].type = type;
|
||||
table->objs[i].links = NULL;
|
||||
table->objs[i].nlinks = 0;
|
||||
}
|
||||
|
||||
|
||||
@ -101,7 +106,7 @@ void trav_table_add(haddr_t objno,
|
||||
*/
|
||||
|
||||
void trav_table_addflags(unsigned *flags,
|
||||
char *objname,
|
||||
char *name,
|
||||
H5G_obj_t type,
|
||||
trav_table_t *table)
|
||||
{
|
||||
@ -117,7 +122,10 @@ void trav_table_addflags(unsigned *flags,
|
||||
table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
|
||||
table->objs[i].displayed = 0;
|
||||
table->objs[i].type = H5G_UNKNOWN;
|
||||
table->objs[i].objname = NULL;
|
||||
table->objs[i].name = NULL;
|
||||
table->objs[i].links = NULL;
|
||||
table->objs[i].nlinks = 0;
|
||||
table->objs[i].sizelinks = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,9 +133,11 @@ void trav_table_addflags(unsigned *flags,
|
||||
table->objs[i].objno = 0;
|
||||
table->objs[i].flags[0] = flags[0];
|
||||
table->objs[i].flags[1] = flags[1];
|
||||
HDfree(table->objs[i].objname);
|
||||
table->objs[i].objname = (char *)HDstrdup(objname);
|
||||
HDfree(table->objs[i].name);
|
||||
table->objs[i].name = (char *)HDstrdup(name);
|
||||
table->objs[i].type = type;
|
||||
table->objs[i].links = NULL;
|
||||
table->objs[i].nlinks = 0;
|
||||
}
|
||||
|
||||
|
||||
@ -160,7 +170,10 @@ void trav_table_init( trav_table_t **tbl )
|
||||
table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
|
||||
table->objs[i].displayed = 0;
|
||||
table->objs[i].type = H5G_UNKNOWN;
|
||||
table->objs[i].objname = NULL;
|
||||
table->objs[i].name = NULL;
|
||||
table->objs[i].links = NULL;
|
||||
table->objs[i].nlinks = 0;
|
||||
table->objs[i].sizelinks = 0;
|
||||
}
|
||||
|
||||
*tbl = table;
|
||||
@ -184,14 +197,53 @@ void trav_table_init( trav_table_t **tbl )
|
||||
|
||||
void trav_table_free( trav_table_t *table )
|
||||
{
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
for ( i = 0; i < table->nobjs; i++)
|
||||
HDfree( table->objs[i].objname );
|
||||
{
|
||||
HDfree( table->objs[i].name );
|
||||
if (table->objs[i].nlinks)
|
||||
{
|
||||
for ( j=0; j<table->objs[i].nlinks; j++)
|
||||
HDfree( table->objs[i].links[j].new_name );
|
||||
|
||||
HDfree(table->objs[i].links);
|
||||
}
|
||||
}
|
||||
HDfree(table->objs);
|
||||
HDfree(table);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: trav_table_addlink
|
||||
*
|
||||
* Purpose: Add a hardlink name to the object
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
|
||||
*
|
||||
* Date: December 17, 2003
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void trav_table_addlink(trav_table_t *table,
|
||||
int j /* the object index */,
|
||||
char *path )
|
||||
{
|
||||
int k;
|
||||
/* store the link information */
|
||||
if (table->objs[j].nlinks == table->objs[j].sizelinks) {
|
||||
table->objs[j].sizelinks += 2;
|
||||
table->objs[j].links =
|
||||
(trav_link_t*)HDrealloc(table->objs[j].links,
|
||||
table->objs[j].sizelinks * sizeof(trav_link_t));
|
||||
}
|
||||
k = table->objs[j].nlinks++;
|
||||
table->objs[j].links[k].new_name = (char*)HDstrdup(path);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user