summaryrefslogtreecommitdiffstats
path: root/tools/lib
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/h5diff.c147
-rw-r--r--tools/lib/h5diff.h8
2 files changed, 138 insertions, 17 deletions
diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c
index 2734bef..d462b45 100644
--- a/tools/lib/h5diff.c
+++ b/tools/lib/h5diff.c
@@ -224,6 +224,99 @@ out:
}
/*-------------------------------------------------------------------------
+ * Function: is_exclude_path
+ *
+ * Purpose: check if 'paths' are part of exclude path list
+ *
+ * Return:
+ * 1 - excluded path
+ * 0 - not excluded path
+ *
+ * Programmer: Jonathan Kim
+ * Date: Aug 23, 2010
+ *------------------------------------------------------------------------*/
+static int is_exclude_path (trav_path_t * paths, diff_opt_t *options)
+{
+ struct exclude_path_list * exclude_path_ptr;
+ int ret_cmp;
+ int ret = 0;
+ int len_grp;
+
+ /* check if exclude path option is given */
+ if (!options->exclude_path)
+ goto out;
+
+ /* assign to local exclude list pointer */
+ exclude_path_ptr = options->exclude;
+
+ /* search objects in exclude list */
+ while (NULL != exclude_path_ptr)
+ {
+ /* if given object is group, exclude its members as well */
+ if (exclude_path_ptr->obj_type == H5TRAV_TYPE_GROUP)
+ {
+ ret_cmp = HDstrncmp(exclude_path_ptr->obj_path, paths->path,
+ strlen(exclude_path_ptr->obj_path));
+ if (ret_cmp == 0)
+ {
+ /* check if given path belong to an excluding group, if so
+ * exclude it as well.
+ * This verifies if “/grp1/dset1” is only under “/grp1”, but
+ * not under “/grp1xxx/” group.
+ */
+ len_grp = HDstrlen(exclude_path_ptr->obj_path);
+ if (paths->path[len_grp] == '/')
+ {
+ /* belong to excluded group! */
+ ret = 1;
+ break; /* while */
+ }
+ }
+ }
+ /* exclude target is not group, just exclude the object */
+ else
+ {
+ ret_cmp = HDstrcmp(exclude_path_ptr->obj_path, paths->path);
+ if (ret_cmp == 0)
+ {
+ /* excluded non-group object */
+ ret = 1;
+ /* assign type as scan progress, which is sufficient to
+ * determine type for excluding groups from the above if. */
+ exclude_path_ptr->obj_type = paths->type;
+ break; /* while */
+ }
+ }
+ exclude_path_ptr = exclude_path_ptr->next;
+ }
+
+out:
+ return ret;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: free_exclude_path_list
+ *
+ * Purpose: free exclud object list from diff options
+ *
+ * Programmer: Jonathan Kim
+ * Date: Aug 23, 2010
+ *------------------------------------------------------------------------*/
+static void free_exclude_path_list(diff_opt_t *options)
+{
+ struct exclude_path_list * curr = options->exclude;
+ struct exclude_path_list * next;
+
+ while (NULL != curr)
+ {
+ next = curr->next;
+ HDfree(curr);
+ curr = next;
+ }
+}
+
+/*-------------------------------------------------------------------------
* Function: build_match_list
*
* Purpose: get list of matching path_name from info1 and info2
@@ -283,25 +376,33 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
cmp = HDstrcmp(path1_lp, path2_lp);
if(cmp == 0) {
- infile[0] = 1;
- infile[1] = 1;
- trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
-
+ if(!is_exclude_path(&(info1->paths[curr1]), options))
+ {
+ infile[0] = 1;
+ infile[1] = 1;
+ trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+ }
curr1++;
curr2++;
} /* end if */
else if(cmp < 0)
{
- infile[0] = 1;
- infile[1] = 0;
- trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+ if(!is_exclude_path(&(info1->paths[curr1]), options))
+ {
+ infile[0] = 1;
+ infile[1] = 0;
+ trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+ }
curr1++;
} /* end else-if */
else
{
- infile[0] = 0;
- infile[1] = 1;
- trav_table_addflags(infile, path2_lp, info2->paths[curr2].type, table);
+ if (!is_exclude_path(&(info2->paths[curr2]), options))
+ {
+ infile[0] = 0;
+ infile[1] = 1;
+ trav_table_addflags(infile, path2_lp, info2->paths[curr2].type, table);
+ }
curr2++;
} /* end else */
} /* end while */
@@ -311,8 +412,11 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
infile[1] = 0;
while(curr1 < info1->nused)
{
- path1_lp = (info1->paths[curr1].path) + path1_offset;
- trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+ if(!is_exclude_path(&(info1->paths[curr1]), options))
+ {
+ path1_lp = (info1->paths[curr1].path) + path1_offset;
+ trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+ }
curr1++;
} /* end while */
@@ -321,11 +425,15 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
infile[1] = 1;
while(curr2 < info2->nused)
{
- path2_lp = (info2->paths[curr2].path) + path2_offset;
- trav_table_addflags(infile, path2_lp, info2->paths[curr2].type, table);
+ if (!is_exclude_path(&(info2->paths[curr2]), options))
+ {
+ path2_lp = (info2->paths[curr2].path) + path2_offset;
+ trav_table_addflags(infile, path2_lp, info2->paths[curr2].type, table);
+ }
curr2++;
} /* end while */
+ free_exclude_path_list (options);
/*------------------------------------------------------
* print the list
*/
@@ -968,10 +1076,14 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
*-------------------------------------------------------------------------
*/
- /* number of different objects */
- if ( info1->nused != info2->nused )
+ /* not valid compare nused when --exclude-path option is used */
+ if (!options->exclude_path)
{
- options->contents = 0;
+ /* number of different objects */
+ if ( info1->nused != info2->nused )
+ {
+ options->contents = 0;
+ }
}
/* objects in one file and not the other */
@@ -980,6 +1092,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
if( table->objs[i].flags[0] != table->objs[i].flags[1] )
{
options->contents = 0;
+ break;
}
}
diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h
index 916197d..c89b9d3 100644
--- a/tools/lib/h5diff.h
+++ b/tools/lib/h5diff.h
@@ -25,6 +25,12 @@
* command line options
*-------------------------------------------------------------------------
*/
+/* linked list to keep exclude path list */
+struct exclude_path_list {
+ char *obj_path;
+ h5trav_type_t obj_type;
+ struct exclude_path_list * next;
+};
typedef struct {
int m_quiet; /* quiet mide: no output at all */
@@ -45,6 +51,8 @@ typedef struct {
int contents; /* equal contents */
int do_nans; /* consider Nans while diffing floats */
int m_list_not_cmp; /* list not comparable messages */
+ int exclude_path; /* exclude path to an object */
+ struct exclude_path_list * exclude; /* keep exclude path list */
} diff_opt_t;