summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPedro Vicente Nunes <pvn@hdfgroup.org>2005-06-28 16:25:42 (GMT)
committerPedro Vicente Nunes <pvn@hdfgroup.org>2005-06-28 16:25:42 (GMT)
commit4a5f83b8f0cf0d6899940f1940ac1f63bac847ca (patch)
tree4618cfc007f3b127e7cff92adf7416e2b4107a16
parent7592f727f409ebf9b179a1af636dbf072ee5477c (diff)
downloadhdf5-4a5f83b8f0cf0d6899940f1940ac1f63bac847ca.zip
hdf5-4a5f83b8f0cf0d6899940f1940ac1f63bac847ca.tar.gz
hdf5-4a5f83b8f0cf0d6899940f1940ac1f63bac847ca.tar.bz2
[svn-r10994] Purpose:
bug fix Description: when 2 objects were not comparable, the final print information for the non verbose mode printed "0 differences found" Solution: replaced instead with a Summary message that says "Some objects were not comparable" Platforms tested: linux solaris Misc. update:
-rw-r--r--tools/h5diff/h5diff_common.c314
-rw-r--r--tools/lib/h5diff.c1149
-rw-r--r--tools/lib/h5diff.h1
-rw-r--r--tools/lib/h5diff_array.c1
-rw-r--r--tools/lib/h5diff_attr.c3
-rw-r--r--tools/lib/h5diff_dset.c15
-rw-r--r--tools/lib/h5diff_util.c2
-rw-r--r--tools/testfiles/h5diff_11.txt3
-rw-r--r--tools/testfiles/h5diff_12.txt3
-rw-r--r--tools/testfiles/h5diff_13.txt3
-rw-r--r--tools/testfiles/h5diff_14.txt3
-rw-r--r--tools/testfiles/h5diff_15.txt3
-rw-r--r--tools/testfiles/h5diff_16.txt3
-rw-r--r--tools/testfiles/h5diff_17.txt3
-rw-r--r--tools/testfiles/h5diff_20.txt5
-rw-r--r--tools/testfiles/h5diff_21.txt5
-rw-r--r--tools/testfiles/h5diff_22.txt5
-rw-r--r--tools/testfiles/h5diff_23.txt3
-rw-r--r--tools/testfiles/h5diff_24.txt3
-rw-r--r--tools/testfiles/h5diff_25.txt3
-rw-r--r--tools/testfiles/h5diff_50.txt3
-rw-r--r--tools/testfiles/h5diff_51.txt3
-rw-r--r--tools/testfiles/h5diff_52.txt3
-rw-r--r--tools/testfiles/h5diff_53.txt3
-rw-r--r--tools/testfiles/h5diff_54.txt3
-rw-r--r--tools/testfiles/h5diff_55.txt3
-rw-r--r--tools/testfiles/h5diff_56.txt3
-rw-r--r--tools/testfiles/h5diff_57.txt5
-rw-r--r--tools/testfiles/h5diff_607.txt3
-rw-r--r--tools/testfiles/h5diff_608.txt3
-rw-r--r--tools/testfiles/h5diff_609.txt3
-rw-r--r--tools/testfiles/h5diff_610.txt3
-rw-r--r--tools/testfiles/h5diff_616.txt3
-rw-r--r--tools/testfiles/h5diff_617.txt3
-rw-r--r--tools/testfiles/h5diff_618.txt3
-rw-r--r--tools/testfiles/h5diff_619.txt3
-rw-r--r--tools/testfiles/h5diff_625.txt3
-rw-r--r--tools/testfiles/h5diff_626.txt3
-rw-r--r--tools/testfiles/h5diff_627.txt3
-rw-r--r--tools/testfiles/h5diff_628.txt3
-rw-r--r--tools/testfiles/h5diff_629.txt5
-rw-r--r--tools/testfiles/h5diff_70.txt5
-rw-r--r--tools/testfiles/h5diff_80.txt5
43 files changed, 877 insertions, 730 deletions
diff --git a/tools/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c
index 5c3e793..48bcedb 100644
--- a/tools/h5diff/h5diff_common.c
+++ b/tools/h5diff/h5diff_common.c
@@ -20,6 +20,14 @@
extern int g_Parallel;
extern int g_nTasks;
+/*-------------------------------------------------------------------------
+ * Function: parse_input
+ *
+ * Purpose: parse command line input
+ *
+ *-------------------------------------------------------------------------
+ */
+
void parse_input(int argc, const char* argv[], const char** fname1, const char** fname2, const char** objname1, const char** objname2, diff_opt_t* options)
{
int i;
@@ -34,12 +42,12 @@ void parse_input(int argc, const char* argv[], const char** fname1, const char**
*/
if ( argc==2 && (strcmp("-h",argv[1])==0) )
- usage();
+ usage();
if ( argc<3 )
{
- printf("Number of arguments is only %d\n", argc );
- usage();
+ printf("Number of arguments is only %d\n", argc );
+ usage();
}
/*-------------------------------------------------------------------------
@@ -48,8 +56,8 @@ void parse_input(int argc, const char* argv[], const char** fname1, const char**
*/
if ( argc>=3 )
{
- *fname1 = argv[1];
- *fname2 = argv[2];
+ *fname1 = argv[1];
+ *fname2 = argv[2];
}
/*-------------------------------------------------------------------------
* parse command line options
@@ -57,138 +65,156 @@ void parse_input(int argc, const char* argv[], const char** fname1, const char**
*/
for (i=3; i<argc ; i++)
{
- /* get the single-letter switches */
- if ( '-'==argv[i][0] )
- {
- for (s=argv[i]+1; *s; s++)
- {
- switch (*s) {
- default:
- printf("-%s is an invalid option\n", s );
- usage();
- break;
- case 'h':
- usage();
- break;
- case 'v':
- options->m_verbose = 1;
- break;
- case 'q':
- /* use quiet mode; supress the message "0 differences found" */
- options->m_quiet = 1;
- break;
- case 'r':
- options->m_report = 1;
- break;
- case 'd':
- /* if it is not another option */
- if ( i<argc-1 &&'-' != argv[i+1][0] )
- {
- options->d=1;
- if ( check_f_input(argv[i+1])==-1)
- {
- printf("<-d %s> is not a valid option\n", argv[i+1] );
- usage();
- }
- options->delta = atof(argv[i+1]);
- i++; /* go to next */
- }
- else
- {
- printf("Not a valid -d option\n");
- usage();
- }
- break;
- case 'p':
- if ( i<argc-1 &&'-' !=argv[i+1][0] )
- {
- options->p=1;
- if ( check_f_input(argv[i+1])==-1)
- {
- printf("<-p %s> is not a valid option\n", argv[i+1] );
- usage();
- }
- options->percent = atof(argv[i+1]);
- i++; /* go to next */
- }
- else
- {
- printf("Not a valid -p option\n");
- usage();
- }
- break;
- case 'n':
- if ( i<argc-1 && '-' !=argv[i+1][0] )
- {
- options->n=1;
- if ( check_n_input(argv[i+1])==-1)
- {
- printf("<-n %s> is not a valid option\n", argv[i+1] );
- usage();
- }
- options->count = atoi(argv[i+1]);
- i++; /* go to next */
- }
- else
- {
- printf("Not a valid -n option\n");
- usage();
- }
- break;
- } /*switch*/
- } /*for*/
- } /*if*/
+ /* get the single-letter switches */
+ if ( '-'==argv[i][0] )
+ {
+ for (s=argv[i]+1; *s; s++)
+ {
+ switch (*s) {
+ default:
+ printf("-%s is an invalid option\n", s );
+ usage();
+ break;
+ case 'h':
+ usage();
+ break;
+ case 'v':
+ options->m_verbose = 1;
+ break;
+ case 'q':
+ /* use quiet mode; supress the message "0 differences found" */
+ options->m_quiet = 1;
+ break;
+ case 'r':
+ options->m_report = 1;
+ break;
+ case 'd':
+ /* if it is not another option */
+ if ( i<argc-1 &&'-' != argv[i+1][0] )
+ {
+ options->d=1;
+ if ( check_f_input(argv[i+1])==-1)
+ {
+ printf("<-d %s> is not a valid option\n", argv[i+1] );
+ usage();
+ }
+ options->delta = atof(argv[i+1]);
+ i++; /* go to next */
+ }
+ else
+ {
+ printf("Not a valid -d option\n");
+ usage();
+ }
+ break;
+ case 'p':
+ if ( i<argc-1 &&'-' !=argv[i+1][0] )
+ {
+ options->p=1;
+ if ( check_f_input(argv[i+1])==-1)
+ {
+ printf("<-p %s> is not a valid option\n", argv[i+1] );
+ usage();
+ }
+ options->percent = atof(argv[i+1]);
+ i++; /* go to next */
+ }
+ else
+ {
+ printf("Not a valid -p option\n");
+ usage();
+ }
+ break;
+ case 'n':
+ if ( i<argc-1 && '-' !=argv[i+1][0] )
+ {
+ options->n=1;
+ if ( check_n_input(argv[i+1])==-1)
+ {
+ printf("<-n %s> is not a valid option\n", argv[i+1] );
+ usage();
+ }
+ options->count = atoi(argv[i+1]);
+ i++; /* go to next */
+ }
+ else
+ {
+ printf("Not a valid -n option\n");
+ usage();
+ }
+ break;
+ } /*switch*/
+ } /*for*/
+ } /*if*/
- else /* not single-letter switches */
+ else /* not single-letter switches */
- {
- /* check if it is not a -d, -p parameter */
- if ( '-'==argv[i-1][0] && ('d'==argv[i-1][1] ||'p'==argv[i-1][1] ))
- continue;
- else
- {
- if ( *objname1==NULL )
- *objname1 = argv[i];
- if ( *objname2==NULL )
- {
- /* check if we have a second object name */
- if ( i+1<argc && '-' !=argv[i+1][0] ) {
- /* yes */
- *objname2 = argv[i+1];
- i++; /* go to next */
- }
- else
- /* no */
- *objname2 = *objname1;
- } /*objname2*/
- } /*else*/
- } /*else*/
+ {
+ /* check if it is not a -d, -p parameter */
+ if ( '-'==argv[i-1][0] && ('d'==argv[i-1][1] ||'p'==argv[i-1][1] ))
+ continue;
+ else
+ {
+ if ( *objname1==NULL )
+ *objname1 = argv[i];
+ if ( *objname2==NULL )
+ {
+ /* check if we have a second object name */
+ if ( i+1<argc && '-' !=argv[i+1][0] ) {
+ /* yes */
+ *objname2 = argv[i+1];
+ i++; /* go to next */
+ }
+ else
+ /* no */
+ *objname2 = *objname1;
+ } /*objname2*/
+ } /*else*/
+ } /*else*/
}/*for*/
}
+/*-------------------------------------------------------------------------
+ * Function: print_results
+ *
+ * Purpose: print how many differences were found, if files were comparable or not
+ *
+ *-------------------------------------------------------------------------
+ */
+
void print_results(hsize_t nfound, diff_opt_t* options)
{
- /*-------------------------------------------------------------------------
- * print how many differences were found
- *-------------------------------------------------------------------------
- */
- if (!options->m_quiet)
- {
- if (options->cmn_objs==0)
- {
- printf("No common objects found. Files are not comparable.\n");
- if (!options->m_verbose)
- printf("Use -v for a list of objects.\n");
- }
- else
- {
- if (!options->err_stat)
- {
- print_found(nfound);
- }
- }
- }
+/*-------------------------------------------------------------------------
+ * print how many differences were found
+ *-------------------------------------------------------------------------
+ */
+ if (!options->m_quiet)
+ {
+ printf("----------------------------------------------------\n");
+ printf("Summary\n");
+ printf("----------------------------------------------------\n");
+
+ if (options->cmn_objs==0 && !options->err_stat)
+ {
+ printf("No common objects found. Files are not comparable.\n");
+ if (!options->m_verbose)
+ printf("Use -v for a list of objects.\n");
+ }
+ else
+ {
+ /* no errors found */
+ if (!options->err_stat)
+ {
+ /* objects were not compared */
+ if (options->not_cmp==1)
+ printf("Some objects are not comparable\n");
+ else
+ /* objects were compared, print the number of differences */
+ print_found(nfound);
+ }
+ }
+ }
}
/*-------------------------------------------------------------------------
@@ -215,15 +241,15 @@ int check_n_input( const char *str )
for ( i = 0; i < strlen(str); i++)
{
- c = str[i];
- if ( i==0 )
- {
- if ( c < 49 || c > 57 ) /* ascii values between 1 and 9 */
- return -1;
- }
- else
- if ( c < 48 || c > 57 ) /* 0 also */
- return -1;
+ c = str[i];
+ if ( i==0 )
+ {
+ if ( c < 49 || c > 57 ) /* ascii values between 1 and 9 */
+ return -1;
+ }
+ else
+ if ( c < 48 || c > 57 ) /* 0 also */
+ return -1;
}
return 1;
}
@@ -252,11 +278,11 @@ int check_f_input( const char *str )
on some systems; we do a character check for this
*/
if (strlen(str)>2 && str[0]=='0' && str[1]=='x')
- return -1;
+ return -1;
x=atof(str);
if (x==0)
- return -1;
+ return -1;
return 1;
}
@@ -321,7 +347,7 @@ void usage(void)
printf(" to compare '/g1/dset1' and '/g1/dset2' in the same file\n");
#ifdef H5_HAVE_PARALLEL
if(g_Parallel)
- h5diff_exit(0);
+ h5diff_exit(0);
else
#endif
exit(0);
@@ -348,11 +374,11 @@ void h5diff_exit(int status)
#ifdef H5_HAVE_PARALLEL
/* if in parallel mode, dismiss workers, close down MPI, then exit */
if((g_nTasks > 1) && g_Parallel) {
- phdiff_dismiss_workers();
- MPI_Barrier(MPI_COMM_WORLD);
+ phdiff_dismiss_workers();
+ MPI_Barrier(MPI_COMM_WORLD);
}
if(g_Parallel)
- MPI_Finalize();
+ MPI_Finalize();
#endif
exit(status);
}
diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c
index d9380d0..c7828e8 100644
--- a/tools/lib/h5diff.c
+++ b/tools/lib/h5diff.c
@@ -19,6 +19,7 @@
+
/*-------------------------------------------------------------------------
* Function: print_objname
*
@@ -51,7 +52,7 @@ void phdiff_dismiss_workers(void)
{
int i;
for(i=1; i<g_nTasks; i++)
- MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD);
+ MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD);
}
@@ -59,7 +60,7 @@ void phdiff_dismiss_workers(void)
* Function: print_manager_output
*
* Purpose: special function that prints any output accumulated by the
- * manager task.
+ * manager task.
*
* Return: none
*
@@ -74,27 +75,27 @@ void print_manager_output(void)
/* If there was something we buffered, let's print it now */
if( (outBuffOffset>0) && g_Parallel)
{
- printf("%s", outBuff);
+ printf("%s", outBuff);
- if(overflow_file)
- {
- int tmp;
+ if(overflow_file)
+ {
+ int tmp;
- rewind(overflow_file);
- while((tmp = getc(overflow_file)) >= 0)
- putchar(tmp);
+ rewind(overflow_file);
+ while((tmp = getc(overflow_file)) >= 0)
+ putchar(tmp);
- fclose(overflow_file);
- overflow_file = NULL;
- }
+ fclose(overflow_file);
+ overflow_file = NULL;
+ }
- fflush(stdout);
- memset(outBuff, 0, OUTBUFF_SIZE);
- outBuffOffset = 0;
+ fflush(stdout);
+ memset(outBuff, 0, OUTBUFF_SIZE);
+ outBuffOffset = 0;
}
else if( (outBuffOffset>0) && !g_Parallel)
{
- printf("h5diff error: outBuffOffset>0, but we're not in parallel!\n");
+ printf("h5diff error: outBuffOffset>0, but we're not in parallel!\n");
}
}
@@ -102,7 +103,7 @@ void print_manager_output(void)
* Function: print_incoming_data
*
* Purpose: special function that prints any output that has been sent to the manager
- * and is currently sitting in the incoming message queue
+ * and is currently sitting in the incoming message queue
*
* Return: none
*
@@ -115,20 +116,20 @@ void print_manager_output(void)
static void print_incoming_data(void)
{
- char data[PRINT_DATA_MAX_SIZE+1];
- int incomingMessage;
- MPI_Status Status;
+ char data[PRINT_DATA_MAX_SIZE+1];
+ int incomingMessage;
+ MPI_Status Status;
do
- {
- MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &incomingMessage, &Status);
- if(incomingMessage)
- {
- memset(data, 0, PRINT_DATA_MAX_SIZE+1);
- MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status);
-
- printf("%s", data);
- }
+ {
+ MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &incomingMessage, &Status);
+ if(incomingMessage)
+ {
+ memset(data, 0, PRINT_DATA_MAX_SIZE+1);
+ MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status);
+
+ printf("%s", data);
+ }
} while(incomingMessage);
}
#endif
@@ -146,15 +147,15 @@ static void print_incoming_data(void)
* Date: October 22, 2003
*
* Modifications: Jan 2005 Leon Arber, larber@uiuc.edu
- * Added support for parallel diffing
+ * Added support for parallel diffing
*
*-------------------------------------------------------------------------
*/
hsize_t
h5diff (const char *fname1,
- const char *fname2,
- const char *objname1, const char *objname2, diff_opt_t * options)
+ const char *fname2,
+ const char *objname1, const char *objname2, diff_opt_t * options)
{
int nobjects1, nobjects2;
trav_info_t *info1 = NULL;
@@ -169,7 +170,7 @@ h5diff (const char *fname1,
if (options->m_quiet && (options->m_verbose || options->m_report))
{
printf
- ("Error: -q (quiet mode) cannot be added to verbose or report modes\n");
+ ("Error: -q (quiet mode) cannot be added to verbose or report modes\n");
options->err_stat = 1;
return 0;
}
@@ -185,33 +186,33 @@ h5diff (const char *fname1,
/* Open the files */
if ((file1_id = H5Fopen (fname1, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
{
- printf ("h5diff: <%s>: unable to open file\n", fname1);
- options->err_stat = 1;
+ printf ("h5diff: <%s>: unable to open file\n", fname1);
+ options->err_stat = 1;
#ifdef H5_HAVE_PARALLEL
- if(g_Parallel)
- {
- /* Let tasks know that they won't be needed */
- phdiff_dismiss_workers();
- }
+ if(g_Parallel)
+ {
+ /* Let tasks know that they won't be needed */
+ phdiff_dismiss_workers();
+ }
#endif
- goto out;
+ goto out;
}
if ((file2_id = H5Fopen (fname2, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
{
- printf ("h5diff: <%s>: unable to open file\n", fname2);
- options->err_stat = 1;
+ printf ("h5diff: <%s>: unable to open file\n", fname2);
+ options->err_stat = 1;
#ifdef H5_HAVE_PARALLEL
- if(g_Parallel)
- {
- /* Let tasks know that they won't be needed */
- phdiff_dismiss_workers();
- }
+ if(g_Parallel)
+ {
+ /* Let tasks know that they won't be needed */
+ phdiff_dismiss_workers();
+ }
#endif
- goto out;
+ goto out;
}
/* enable error reporting */
}
@@ -230,11 +231,11 @@ h5diff (const char *fname1,
printf ("Error: Could not get get file contents\n");
options->err_stat = 1;
#ifdef H5_HAVE_PARALLEL
- if(g_Parallel)
- {
- /* Let tasks know that they won't be needed */
- phdiff_dismiss_workers();
- }
+ if(g_Parallel)
+ {
+ /* Let tasks know that they won't be needed */
+ phdiff_dismiss_workers();
+ }
#endif
goto out;
}
@@ -254,15 +255,15 @@ h5diff (const char *fname1,
printf ("Error: Not enough memory for object list\n");
options->err_stat = 1;
if (info1)
- h5trav_freeinfo (info1, nobjects1);
+ h5trav_freeinfo (info1, nobjects1);
if (info2)
- h5trav_freeinfo (info2, nobjects1);
+ h5trav_freeinfo (info2, nobjects1);
#ifdef H5_HAVE_PARALLEL
- if(g_Parallel)
- {
- /* Let tasks know that they won't be needed */
- phdiff_dismiss_workers();
- }
+ if(g_Parallel)
+ {
+ /* Let tasks know that they won't be needed */
+ phdiff_dismiss_workers();
+ }
#endif
goto out;
}
@@ -277,19 +278,19 @@ h5diff (const char *fname1,
if (objname1)
{
-
+
#ifdef H5_HAVE_PARALLEL
- if(g_Parallel)
- {
- /* Let tasks know that they won't be needed */
- phdiff_dismiss_workers();
- }
+ if(g_Parallel)
+ {
+ /* Let tasks know that they won't be needed */
+ phdiff_dismiss_workers();
+ }
#endif
assert (objname2);
- options->cmn_objs = 1; /* eliminate warning */
+ options->cmn_objs = 1; /* eliminate warning */
nfound = diff_compare (file1_id, fname1, objname1, nobjects1, info1,
- file2_id, fname2, objname2, nobjects2, info2,
- options);
+ file2_id, fname2, objname2, nobjects2, info2,
+ options);
}
/*-------------------------------------------------------------------------
@@ -305,23 +306,23 @@ h5diff (const char *fname1,
{
int i;
- if( (strlen(fname1) > 1024) || (strlen(fname2) > 1024))
- {
- printf("The parallel diff only supports path names up to 1024 characters\n");
- MPI_Abort(MPI_COMM_WORLD, 0);
- }
+ if( (strlen(fname1) > 1024) || (strlen(fname2) > 1024))
+ {
+ printf("The parallel diff only supports path names up to 1024 characters\n");
+ MPI_Abort(MPI_COMM_WORLD, 0);
+ }
- strcpy(filenames[0], fname1);
- strcpy(filenames[1], fname2);
+ strcpy(filenames[0], fname1);
+ strcpy(filenames[1], fname2);
- /* Alert the worker tasks that there's going to be work. */
+ /* Alert the worker tasks that there's going to be work. */
- for(i=1; i<g_nTasks; i++)
- MPI_Send(filenames, 1024*2, MPI_CHAR, i, MPI_TAG_PARALLEL, MPI_COMM_WORLD);
+ for(i=1; i<g_nTasks; i++)
+ MPI_Send(filenames, 1024*2, MPI_CHAR, i, MPI_TAG_PARALLEL, MPI_COMM_WORLD);
}
#endif
nfound = diff_match (file1_id, nobjects1, info1,
- file2_id, nobjects2, info2, options);
+ file2_id, nobjects2, info2, options);
}
@@ -356,16 +357,16 @@ out:
* Date: May 9, 2003
*
* Modifications: Jan 2005 Leon Arber, larber@uiuc.edu
- * Added support for parallel diffing
+ * Added support for parallel diffing
*
*-------------------------------------------------------------------------
*/
hsize_t
diff_match (hid_t file1_id,
- int nobjects1,
- trav_info_t * info1,
- hid_t file2_id,
- int nobjects2, trav_info_t * info2, diff_opt_t * options)
+ int nobjects1,
+ trav_info_t * info1,
+ hid_t file2_id,
+ int nobjects2, trav_info_t * info2, diff_opt_t * options)
{
int more_names_exist = (nobjects1 > 0 && nobjects2 > 0) ? 1 : 0;
trav_table_t *table = NULL;
@@ -385,64 +386,64 @@ diff_match (hid_t file1_id,
while (more_names_exist)
{
- /* criteria is string compare */
- cmp = strcmp (info1[curr1].name, info2[curr2].name);
- if (cmp == 0)
- {
- infile[0] = 1;
- infile[1] = 1;
- trav_table_addflags (infile, info1[curr1].name, info1[curr1].type,
- table);
-
- curr1++;
- curr2++;
- }
- else if (cmp < 0)
- {
- infile[0] = 1;
- infile[1] = 0;
- trav_table_addflags (infile, info1[curr1].name, info1[curr1].type,
- table);
- curr1++;
- }
- else
- {
- infile[0] = 0;
- infile[1] = 1;
- trav_table_addflags (infile, info2[curr2].name, info2[curr2].type,
- table);
- curr2++;
- }
-
- more_names_exist = (curr1 < nobjects1 && curr2 < nobjects2) ? 1 : 0;
-
-
- } /* end while */
+ /* criteria is string compare */
+ cmp = strcmp (info1[curr1].name, info2[curr2].name);
+ if (cmp == 0)
+ {
+ infile[0] = 1;
+ infile[1] = 1;
+ trav_table_addflags (infile, info1[curr1].name, info1[curr1].type,
+ table);
+
+ curr1++;
+ curr2++;
+ }
+ else if (cmp < 0)
+ {
+ infile[0] = 1;
+ infile[1] = 0;
+ trav_table_addflags (infile, info1[curr1].name, info1[curr1].type,
+ table);
+ curr1++;
+ }
+ else
+ {
+ infile[0] = 0;
+ infile[1] = 1;
+ trav_table_addflags (infile, info2[curr2].name, info2[curr2].type,
+ table);
+ curr2++;
+ }
+
+ more_names_exist = (curr1 < nobjects1 && curr2 < nobjects2) ? 1 : 0;
+
+
+ } /* end while */
/* list1 did not end */
if (curr1 < nobjects1)
{
- while (curr1 < nobjects1)
- {
- infile[0] = 1;
- infile[1] = 0;
- trav_table_addflags (infile, info1[curr1].name, info1[curr1].type,
- table);
- curr1++;
- }
+ while (curr1 < nobjects1)
+ {
+ infile[0] = 1;
+ infile[1] = 0;
+ trav_table_addflags (infile, info1[curr1].name, info1[curr1].type,
+ table);
+ curr1++;
+ }
}
/* list2 did not end */
if (curr2 < nobjects2)
{
- while (curr2 < nobjects2)
- {
- infile[0] = 0;
- infile[1] = 1;
- trav_table_addflags (infile, info2[curr2].name, info2[curr2].type,
- table);
- curr2++;
- }
+ while (curr2 < nobjects2)
+ {
+ infile[0] = 0;
+ infile[1] = 1;
+ trav_table_addflags (infile, info2[curr2].name, info2[curr2].type,
+ table);
+ curr2++;
+ }
}
/*-------------------------------------------------------------------------
@@ -452,16 +453,16 @@ diff_match (hid_t file1_id,
if (options->m_verbose)
{
- printf ("\n");
- printf ("file1 file2\n");
- printf ("---------------------------------------\n");
- for (i = 0; i < table->nobjs; i++)
- {
- c1 = (table->objs[i].flags[0]) ? 'x' : ' ';
- c2 = (table->objs[i].flags[1]) ? 'x' : ' ';
- printf ("%5c %6c %-15s\n", c1, c2, table->objs[i].name);
- }
- printf ("\n");
+ printf ("\n");
+ printf ("file1 file2\n");
+ printf ("---------------------------------------\n");
+ for (i = 0; i < table->nobjs; i++)
+ {
+ c1 = (table->objs[i].flags[0]) ? 'x' : ' ';
+ c2 = (table->objs[i].flags[1]) ? 'x' : ' ';
+ printf ("%5c %6c %-15s\n", c1, c2, table->objs[i].name);
+ }
+ printf ("\n");
}
@@ -471,243 +472,243 @@ diff_match (hid_t file1_id,
*/
{
#ifdef H5_HAVE_PARALLEL
- char* workerTasks = malloc((g_nTasks-1) * sizeof(char));
- int n;
- int busyTasks=0;
- hsize_t nFoundbyWorker;
- struct diff_args args;
- int havePrintToken = 1;
- MPI_Status Status;
-
- /*set all tasks as free */
- memset(workerTasks, 1, g_nTasks-1);
+ char* workerTasks = malloc((g_nTasks-1) * sizeof(char));
+ int n;
+ int busyTasks=0;
+ hsize_t nFoundbyWorker;
+ struct diff_args args;
+ int havePrintToken = 1;
+ MPI_Status Status;
+
+ /*set all tasks as free */
+ memset(workerTasks, 1, g_nTasks-1);
#endif
- for (i = 0; i < table->nobjs; i++)
- {
- if (table->objs[i].flags[0] && table->objs[i].flags[1])
- {
+ for (i = 0; i < table->nobjs; i++)
+ {
+ if (table->objs[i].flags[0] && table->objs[i].flags[1])
+ {
#ifdef H5_HAVE_PARALLEL
- int workerFound = 0;
+ int workerFound = 0;
#endif /* H5_HAVE_PARALLEL */
- options->cmn_objs = 1;
- if(!g_Parallel)
- {
- nfound += diff (file1_id,
- table->objs[i].name,
- file2_id,
- table->objs[i].name, options, table->objs[i].type);
- }
+ options->cmn_objs = 1;
+ if(!g_Parallel)
+ {
+ nfound += diff (file1_id,
+ table->objs[i].name,
+ file2_id,
+ table->objs[i].name, options, table->objs[i].type);
+ }
#ifdef H5_HAVE_PARALLEL
- else
- {
- /* We're in parallel mode */
- /* Since the data type of diff value is hsize_t which can
- * be arbitary large such that there is no MPI type that
- * matches it, the value is passed between processes as
- * an array of bytes in order to be portable. But this
- * may not work in non-homogeneous MPI environments.
- */
-
- /*Set up args to pass to worker task. */
- if(strlen(table->objs[i].name) > 255)
- {
- printf("The parallel diff only supports object names up to 255 characters\n");
- MPI_Abort(MPI_COMM_WORLD, 0);
- }
-
- strcpy(args.name, table->objs[i].name);
- args.options = *options;
- args.type= table->objs[i].type;
-
- /* if there are any outstanding print requests, let's handle one. */
- if(busyTasks > 0)
- {
- int incomingMessage;
- /* check if any tasks freed up, and didn't need to print. */
- MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &incomingMessage, &Status);
-
- if(incomingMessage)
- {
- workerTasks[Status.MPI_SOURCE-1] = 1;
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- busyTasks--;
- }
-
- /* check to see if the print token was returned. */
- if(!havePrintToken)
- {
- /* check incoming queue for token */
- MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status);
-
- /* incoming token implies free task. */
- if(incomingMessage)
- {
- workerTasks[Status.MPI_SOURCE-1] = 1;
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- busyTasks--;
- havePrintToken = 1;
- }
- }
-
- /* check to see if anyone needs the print token. */
- if(havePrintToken)
- {
- /* check incoming queue for print token requests */
- MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &incomingMessage, &Status);
- if(incomingMessage)
- {
- MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
- MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
- havePrintToken = 0;
- }
- }
-
- /* Print all the data in our incoming queue */
- print_incoming_data();
- }
-
- /* check array of tasks to see which ones are free.
- * Manager task never does work, so freeTasks[0] is really
- * worker task 0. */
-
- for(n=1; (n<g_nTasks) && !workerFound; n++)
- {
- if(workerTasks[n-1])
- {
- /* send file id's and names to first free worker */
- MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, n, MPI_TAG_ARGS, MPI_COMM_WORLD);
-
- /* increment counter for total number of prints. */
- busyTasks++;
-
- /* mark worker as busy */
- workerTasks[n-1] = 0;
- workerFound = 1;
- }
-
- }
-
-
- if(!workerFound)
- {
- /* if they were all busy, we've got to wait for one free up before we can move on.
- * if we don't have the token, some task is currently printing so we'll wait for that task to return it. */
- if(!havePrintToken)
- {
- MPI_Recv(&nFoundbyWorker, sizeof(hsize_t), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
- havePrintToken = 1;
- nfound += nFoundbyWorker;
- /* send this task the work unit. */
- MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
- }
- /* if we do have the token, check for task to free up, or wait for a task to request it */
- else
- {
- /* But first print all the data in our incoming queue */
- print_incoming_data();
-
- MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
- if(Status.MPI_TAG == MPI_TAG_DONE)
- {
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
- }
- else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST)
- {
- MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
- MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
-
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
- }
- else
- {
- printf("ERROR: Invalid tag (%d) received \n", Status.MPI_TAG);
- MPI_Abort(MPI_COMM_WORLD, 0);
- MPI_Finalize();
- }
- }
- }
- }
+ else
+ {
+ /* We're in parallel mode */
+ /* Since the data type of diff value is hsize_t which can
+ * be arbitary large such that there is no MPI type that
+ * matches it, the value is passed between processes as
+ * an array of bytes in order to be portable. But this
+ * may not work in non-homogeneous MPI environments.
+ */
+
+ /*Set up args to pass to worker task. */
+ if(strlen(table->objs[i].name) > 255)
+ {
+ printf("The parallel diff only supports object names up to 255 characters\n");
+ MPI_Abort(MPI_COMM_WORLD, 0);
+ }
+
+ strcpy(args.name, table->objs[i].name);
+ args.options = *options;
+ args.type= table->objs[i].type;
+
+ /* if there are any outstanding print requests, let's handle one. */
+ if(busyTasks > 0)
+ {
+ int incomingMessage;
+ /* check if any tasks freed up, and didn't need to print. */
+ MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &incomingMessage, &Status);
+
+ if(incomingMessage)
+ {
+ workerTasks[Status.MPI_SOURCE-1] = 1;
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ busyTasks--;
+ }
+
+ /* check to see if the print token was returned. */
+ if(!havePrintToken)
+ {
+ /* check incoming queue for token */
+ MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status);
+
+ /* incoming token implies free task. */
+ if(incomingMessage)
+ {
+ workerTasks[Status.MPI_SOURCE-1] = 1;
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ busyTasks--;
+ havePrintToken = 1;
+ }
+ }
+
+ /* check to see if anyone needs the print token. */
+ if(havePrintToken)
+ {
+ /* check incoming queue for print token requests */
+ MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &incomingMessage, &Status);
+ if(incomingMessage)
+ {
+ MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
+ MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+ havePrintToken = 0;
+ }
+ }
+
+ /* Print all the data in our incoming queue */
+ print_incoming_data();
+ }
+
+ /* check array of tasks to see which ones are free.
+ * Manager task never does work, so freeTasks[0] is really
+ * worker task 0. */
+
+ for(n=1; (n<g_nTasks) && !workerFound; n++)
+ {
+ if(workerTasks[n-1])
+ {
+ /* send file id's and names to first free worker */
+ MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, n, MPI_TAG_ARGS, MPI_COMM_WORLD);
+
+ /* increment counter for total number of prints. */
+ busyTasks++;
+
+ /* mark worker as busy */
+ workerTasks[n-1] = 0;
+ workerFound = 1;
+ }
+
+ }
+
+
+ if(!workerFound)
+ {
+ /* if they were all busy, we've got to wait for one free up before we can move on.
+ * if we don't have the token, some task is currently printing so we'll wait for that task to return it. */
+ if(!havePrintToken)
+ {
+ MPI_Recv(&nFoundbyWorker, sizeof(hsize_t), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+ havePrintToken = 1;
+ nfound += nFoundbyWorker;
+ /* send this task the work unit. */
+ MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
+ }
+ /* if we do have the token, check for task to free up, or wait for a task to request it */
+ else
+ {
+ /* But first print all the data in our incoming queue */
+ print_incoming_data();
+
+ MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
+ if(Status.MPI_TAG == MPI_TAG_DONE)
+ {
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
+ }
+ else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST)
+ {
+ MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
+ MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
+ }
+ else
+ {
+ printf("ERROR: Invalid tag (%d) received \n", Status.MPI_TAG);
+ MPI_Abort(MPI_COMM_WORLD, 0);
+ MPI_Finalize();
+ }
+ }
+ }
+ }
#endif
- }
- }
+ }
+ }
#ifdef H5_HAVE_PARALLEL
- if(g_Parallel)
- {
- while(busyTasks > 0) /* make sure all tasks are done */
- {
- MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
- if(Status.MPI_TAG == MPI_TAG_DONE)
- {
- MPI_Recv(&nFoundbyWorker, sizeof(hsize_t), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- busyTasks--;
- }
- else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN)
- {
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- busyTasks--;
- havePrintToken = 1;
- }
- else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST)
- {
- MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
- if(havePrintToken)
- {
- MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- busyTasks--;
- }
- else /* someone else must have it...wait for them to return it, then give it to the task that just asked for it. */
- {
- int source = Status.MPI_SOURCE;
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- busyTasks--;
- MPI_Send(NULL, 0, MPI_BYTE, source, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
- }
- }
- else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN)
- {
- MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
- nfound += nFoundbyWorker;
- busyTasks--;
- havePrintToken = 1;
- }
- else if(Status.MPI_TAG == MPI_TAG_PRINT_DATA)
- {
- char data[PRINT_DATA_MAX_SIZE+1];
- memset(data, 0, PRINT_DATA_MAX_SIZE+1);
-
- MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status);
-
- printf("%s", data);
- }
- else
- {
- printf("ph5diff-manager: ERROR!! Invalid tag (%d) received \n", Status.MPI_TAG);
- MPI_Abort(MPI_COMM_WORLD, 0);
- }
- }
-
- for(i=1; i<g_nTasks; i++)
- MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD);
-
- /* Print any final data waiting in our queue */
- print_incoming_data();
-
- }
-
- free(workerTasks);
+ if(g_Parallel)
+ {
+ while(busyTasks > 0) /* make sure all tasks are done */
+ {
+ MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
+ if(Status.MPI_TAG == MPI_TAG_DONE)
+ {
+ MPI_Recv(&nFoundbyWorker, sizeof(hsize_t), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ busyTasks--;
+ }
+ else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN)
+ {
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ busyTasks--;
+ havePrintToken = 1;
+ }
+ else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST)
+ {
+ MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
+ if(havePrintToken)
+ {
+ MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ busyTasks--;
+ }
+ else /* someone else must have it...wait for them to return it, then give it to the task that just asked for it. */
+ {
+ int source = Status.MPI_SOURCE;
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ busyTasks--;
+ MPI_Send(NULL, 0, MPI_BYTE, source, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+ }
+ }
+ else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN)
+ {
+ MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+ nfound += nFoundbyWorker;
+ busyTasks--;
+ havePrintToken = 1;
+ }
+ else if(Status.MPI_TAG == MPI_TAG_PRINT_DATA)
+ {
+ char data[PRINT_DATA_MAX_SIZE+1];
+ memset(data, 0, PRINT_DATA_MAX_SIZE+1);
+
+ MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status);
+
+ printf("%s", data);
+ }
+ else
+ {
+ printf("ph5diff-manager: ERROR!! Invalid tag (%d) received \n", Status.MPI_TAG);
+ MPI_Abort(MPI_COMM_WORLD, 0);
+ }
+ }
+
+ for(i=1; i<g_nTasks; i++)
+ MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD);
+
+ /* Print any final data waiting in our queue */
+ print_incoming_data();
+
+ }
+
+ free(workerTasks);
#endif
}
/* free table */
@@ -744,14 +745,14 @@ diff_match (hid_t file1_id,
hsize_t
diff_compare (hid_t file1_id,
- const char *file1_name,
- const char *obj1_name,
- int nobjects1,
- trav_info_t * info1,
- hid_t file2_id,
- const char *file2_name,
- const char *obj2_name,
- int nobjects2, trav_info_t * info2, diff_opt_t * options)
+ const char *file1_name,
+ const char *obj1_name,
+ int nobjects1,
+ trav_info_t * info1,
+ hid_t file2_id,
+ const char *file2_name,
+ const char *obj2_name,
+ int nobjects2, trav_info_t * info2, diff_opt_t * options)
{
int f1 = 0, f2 = 0;
@@ -762,34 +763,35 @@ diff_compare (hid_t file1_id,
if (i == -1)
{
- parallel_print ("Object <%s> could not be found in <%s>\n", obj1_name,
- file1_name);
- f1 = 1;
+ parallel_print ("Object <%s> could not be found in <%s>\n", obj1_name,
+ file1_name);
+ f1 = 1;
}
- if (j == -1)
- {
- parallel_print ("Object <%s> could not be found in <%s>\n", obj2_name,
- file2_name);
- f2 = 1;
- }
- if (f1 || f2)
- {
- options->err_stat = 1;
- return 0;
- }
-
- /* use the name with "/" first, as obtained by iterator function */
- obj1_name = info1[i].name;
+ if (j == -1)
+ {
+ parallel_print ("Object <%s> could not be found in <%s>\n", obj2_name,
+ file2_name);
+ f2 = 1;
+ }
+ if (f1 || f2)
+ {
+ options->err_stat = 1;
+ return 0;
+ }
+
+ /* use the name with "/" first, as obtained by iterator function */
+ obj1_name = info1[i].name;
obj2_name = info2[j].name;
/* objects are not the same type */
if (info1[i].type != info2[j].type)
{
if (options->m_verbose)
- parallel_print
- ("Comparison not possible: <%s> is of type %s and <%s> is of type %s\n",
- obj1_name, get_type (info1[i].type), obj2_name,
- get_type (info2[j].type));
+ parallel_print
+ ("Comparison not possible: <%s> is of type %s and <%s> is of type %s\n",
+ obj1_name, get_type (info1[i].type), obj2_name,
+ get_type (info2[j].type));
+ options->not_cmp=1;
return 0;
}
@@ -805,10 +807,10 @@ diff_compare (hid_t file1_id,
*
* Purpose: switch between types and choose the diff function
* TYPE is either
- * H5G_LINK Object is a symbolic link
- * H5G_GROUP Object is a group
- * H5G_DATASET Object is a dataset
- * H5G_TYPE Object is a named data type
+ * H5G_LINK Object is a symbolic link
+ * H5G_GROUP Object is a group
+ * H5G_DATASET Object is a dataset
+ * H5G_TYPE Object is a named data type
*
* Return: Number of differences found
*
@@ -837,165 +839,166 @@ diff (hid_t file1_id,
switch (type)
{
- /*-------------------------------------------------------------------------
- * H5G_DATASET
- *-------------------------------------------------------------------------
- */
- case H5G_DATASET:
-
- /* always print name */
- if (options->m_verbose)
- {
- if (print_objname (options, (hsize_t)1))
- parallel_print("Dataset: <%s> and <%s>\n", path1, path2);
- nfound = diff_dataset (file1_id, file2_id, path1, path2, options);
-
- }
- /* check first if we have differences */
- else
- {
- if (options->m_quiet == 0)
- {
- /* shut up temporarily */
- options->m_quiet = 1;
- nfound =
- diff_dataset (file1_id, file2_id, path1, path2, options);
- /* print again */
- options->m_quiet = 0;
- if (nfound)
- {
- if (print_objname (options, nfound))
- parallel_print("Dataset: <%s> and <%s>\n", path1, path2);
- nfound = diff_dataset (file1_id, file2_id, path1, path2, options);
- } /*if */
- } /*if */
- /* in quiet mode, just count differences */
- else
- {
- nfound = diff_dataset (file1_id, file2_id, path1, path2, options);
- }
- } /*else */
-
- break;
-
- /*-------------------------------------------------------------------------
- * H5G_TYPE
- *-------------------------------------------------------------------------
- */
- case H5G_TYPE:
- if ((type1_id = H5Topen (file1_id, path1)) < 0)
- goto out;
- if ((type2_id = H5Topen (file2_id, path2)) < 0)
- goto out;
-
- if ((ret = H5Tequal (type1_id, type2_id)) < 0)
- goto out;
-
- /* if H5Tequal is > 0 then the datatypes refer to the same datatype */
- nfound = (ret > 0) ? 0 : 1;
-
- if (print_objname (options, nfound))
- parallel_print("Datatype: <%s> and <%s>\n", path1, path2);
-
- /*-------------------------------------------------------------------------
- * compare attributes
- * the if condition refers to cases when the dataset is a referenced object
- *-------------------------------------------------------------------------
- */
- if (path1)
- diff_attr (type1_id, type2_id, path1, path2, options);
-
- if (H5Tclose (type1_id) < 0)
- goto out;
- if (H5Tclose (type2_id) < 0)
- goto out;
-
- break;
-
- /*-------------------------------------------------------------------------
- * H5G_GROUP
- *-------------------------------------------------------------------------
- */
- case H5G_GROUP:
- if ((grp1_id = H5Gopen (file1_id, path1)) < 0)
- goto out;
- if ((grp2_id = H5Gopen (file2_id, path2)) < 0)
- goto out;
-
- ret = HDstrcmp (path1, path2);
-
- /* if "path1" != "path2" then the groups are "different" */
- nfound = (ret != 0) ? 1 : 0;
-
- if (print_objname (options, nfound))
- parallel_print("Group: <%s> and <%s>\n", path1, path2);
-
- /*-------------------------------------------------------------------------
- * compare attributes
- * the if condition refers to cases when the dataset is a referenced object
- *-------------------------------------------------------------------------
- */
- if (path1)
- diff_attr (grp1_id, grp2_id, path1, path2, options);
-
- if (H5Gclose (grp1_id) < 0)
- goto out;
- if (H5Gclose (grp2_id) < 0)
- goto out;
-
- break;
-
-
- /*-------------------------------------------------------------------------
- * H5G_LINK
- *-------------------------------------------------------------------------
- */
- case H5G_LINK:
- if (H5Gget_objinfo (file1_id, path1, FALSE, &sb1) < 0)
- goto out;
- if (H5Gget_objinfo (file1_id, path1, FALSE, &sb2) < 0)
- goto out;
-
- buf1 = malloc (sb1.linklen);
- buf2 = malloc (sb2.linklen);
-
- if (H5Gget_linkval (file1_id, path1, sb1.linklen, buf1) < 0)
- goto out;
- if (H5Gget_linkval (file2_id, path2, sb1.linklen, buf2) < 0)
- goto out;
-
- ret = HDstrcmp (buf1, buf2);
-
- /* if "buf1" != "buf2" then the links are "different" */
- nfound = (ret != 0) ? 1 : 0;
-
- if (print_objname (options, nfound))
- parallel_print("Link: <%s> and <%s>\n", path1, path2);
-
- if (buf1)
- {
- free (buf1);
- buf1 = NULL;
- }
-
- if (buf2)
- {
- free (buf2);
- buf2 = NULL;
- }
-
- break;
-
-
- default:
- nfound = 0;
- if (options->m_verbose)
- {
- parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
- path1, path2, get_type (type));
- }
-
- break;
+ /*-------------------------------------------------------------------------
+ * H5G_DATASET
+ *-------------------------------------------------------------------------
+ */
+ case H5G_DATASET:
+
+ /* always print name */
+ if (options->m_verbose)
+ {
+ if (print_objname (options, (hsize_t)1))
+ parallel_print("Dataset: <%s> and <%s>\n", path1, path2);
+ nfound = diff_dataset (file1_id, file2_id, path1, path2, options);
+
+ }
+ /* check first if we have differences */
+ else
+ {
+ if (options->m_quiet == 0)
+ {
+ /* shut up temporarily */
+ options->m_quiet = 1;
+ nfound =
+ diff_dataset (file1_id, file2_id, path1, path2, options);
+ /* print again */
+ options->m_quiet = 0;
+ if (nfound)
+ {
+ if (print_objname (options, nfound))
+ parallel_print("Dataset: <%s> and <%s>\n", path1, path2);
+ nfound = diff_dataset (file1_id, file2_id, path1, path2, options);
+ } /*if */
+ } /*if */
+ /* in quiet mode, just count differences */
+ else
+ {
+ nfound = diff_dataset (file1_id, file2_id, path1, path2, options);
+ }
+ } /*else */
+
+ break;
+
+ /*-------------------------------------------------------------------------
+ * H5G_TYPE
+ *-------------------------------------------------------------------------
+ */
+ case H5G_TYPE:
+ if ((type1_id = H5Topen (file1_id, path1)) < 0)
+ goto out;
+ if ((type2_id = H5Topen (file2_id, path2)) < 0)
+ goto out;
+
+ if ((ret = H5Tequal (type1_id, type2_id)) < 0)
+ goto out;
+
+ /* if H5Tequal is > 0 then the datatypes refer to the same datatype */
+ nfound = (ret > 0) ? 0 : 1;
+
+ if (print_objname (options, nfound))
+ parallel_print("Datatype: <%s> and <%s>\n", path1, path2);
+
+ /*-------------------------------------------------------------------------
+ * compare attributes
+ * the if condition refers to cases when the dataset is a referenced object
+ *-------------------------------------------------------------------------
+ */
+ if (path1)
+ diff_attr (type1_id, type2_id, path1, path2, options);
+
+ if (H5Tclose (type1_id) < 0)
+ goto out;
+ if (H5Tclose (type2_id) < 0)
+ goto out;
+
+ break;
+
+ /*-------------------------------------------------------------------------
+ * H5G_GROUP
+ *-------------------------------------------------------------------------
+ */
+ case H5G_GROUP:
+ if ((grp1_id = H5Gopen (file1_id, path1)) < 0)
+ goto out;
+ if ((grp2_id = H5Gopen (file2_id, path2)) < 0)
+ goto out;
+
+ ret = HDstrcmp (path1, path2);
+
+ /* if "path1" != "path2" then the groups are "different" */
+ nfound = (ret != 0) ? 1 : 0;
+
+ if (print_objname (options, nfound))
+ parallel_print("Group: <%s> and <%s>\n", path1, path2);
+
+ /*-------------------------------------------------------------------------
+ * compare attributes
+ * the if condition refers to cases when the dataset is a referenced object
+ *-------------------------------------------------------------------------
+ */
+ if (path1)
+ diff_attr (grp1_id, grp2_id, path1, path2, options);
+
+ if (H5Gclose (grp1_id) < 0)
+ goto out;
+ if (H5Gclose (grp2_id) < 0)
+ goto out;
+
+ break;
+
+
+ /*-------------------------------------------------------------------------
+ * H5G_LINK
+ *-------------------------------------------------------------------------
+ */
+ case H5G_LINK:
+ if (H5Gget_objinfo (file1_id, path1, FALSE, &sb1) < 0)
+ goto out;
+ if (H5Gget_objinfo (file1_id, path1, FALSE, &sb2) < 0)
+ goto out;
+
+ buf1 = malloc (sb1.linklen);
+ buf2 = malloc (sb2.linklen);
+
+ if (H5Gget_linkval (file1_id, path1, sb1.linklen, buf1) < 0)
+ goto out;
+ if (H5Gget_linkval (file2_id, path2, sb1.linklen, buf2) < 0)
+ goto out;
+
+ ret = HDstrcmp (buf1, buf2);
+
+ /* if "buf1" != "buf2" then the links are "different" */
+ nfound = (ret != 0) ? 1 : 0;
+
+ if (print_objname (options, nfound))
+ parallel_print("Link: <%s> and <%s>\n", path1, path2);
+
+ if (buf1)
+ {
+ free (buf1);
+ buf1 = NULL;
+ }
+
+ if (buf2)
+ {
+ free (buf2);
+ buf2 = NULL;
+ }
+
+ break;
+
+
+ default:
+ nfound = 0;
+ if (options->m_verbose)
+ {
+ parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
+ path1, path2, get_type (type));
+ options->not_cmp=1;
+ }
+
+ break;
}
@@ -1005,18 +1008,18 @@ out:
/* disable error reporting */
H5E_BEGIN_TRY
{
- H5Tclose (type1_id);
- H5Tclose (type2_id);
- H5Gclose (grp1_id);
- H5Tclose (grp2_id);
- /* enable error reporting */
+ H5Tclose (type1_id);
+ H5Tclose (type2_id);
+ H5Gclose (grp1_id);
+ H5Tclose (grp2_id);
+ /* enable error reporting */
}
H5E_END_TRY;
if (buf1)
- free (buf1);
+ free (buf1);
if (buf2)
- free (buf2);
+ free (buf2);
return nfound;
}
diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h
index a9d8458..cdaabaa 100644
--- a/tools/lib/h5diff.h
+++ b/tools/lib/h5diff.h
@@ -62,6 +62,7 @@ typedef struct {
int count; /* count value */
int err_stat; /* an error ocurred (1, error, 0, no error) */
int cmn_objs; /* do we have comparable objects */
+ int not_cmp; /* are the objects comparable */
} diff_opt_t;
diff --git a/tools/lib/h5diff_array.c b/tools/lib/h5diff_array.c
index 60060e4..1ed4ab2 100644
--- a/tools/lib/h5diff_array.c
+++ b/tools/lib/h5diff_array.c
@@ -607,6 +607,7 @@ hsize_t diff_datum(void *_mem1,
default:
parallel_print("Warning: Comparison not possible of object types referenced: <%s> and <%s>",
obj1, obj2);
+ options->not_cmp=1;
break;
}
diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c
index 24ade01..56e2af1 100644
--- a/tools/lib/h5diff_attr.c
+++ b/tools/lib/h5diff_attr.c
@@ -146,7 +146,10 @@ int diff_attr(hid_t loc1_id,
name1,
name2,
options)!=1)
+ {
cmp=0;
+ options->not_cmp=1;
+ }
/*-------------------------------------------------------------------------
* only attempt to compare if possible
*-------------------------------------------------------------------------
diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c
index 1887df8..c4b4a4b 100644
--- a/tools/lib/h5diff_dset.c
+++ b/tools/lib/h5diff_dset.c
@@ -206,9 +206,10 @@ hsize_t diff_datasetid( hid_t dset1_id,
storage_size2=H5Dget_storage_size(dset2_id);
if (storage_size1<=0 && storage_size2<=0)
{
- if (options->m_verbose && obj1_name && obj2_name)
- parallel_print("<%s> and <%s> are empty datasets\n", obj1_name, obj2_name);
- cmp=0;
+ if (options->m_verbose && obj1_name && obj2_name)
+ parallel_print("<%s> and <%s> are empty datasets\n", obj1_name, obj2_name);
+ cmp=0;
+ options->not_cmp=1;
}
@@ -228,7 +229,10 @@ hsize_t diff_datasetid( hid_t dset1_id,
obj1_name,
obj2_name,
options)!=1)
+ {
cmp=0;
+ options->not_cmp=1;
+ }
/*-------------------------------------------------------------------------
* get number of elements
*-------------------------------------------------------------------------
@@ -245,7 +249,9 @@ hsize_t diff_datasetid( hid_t dset1_id,
nelmts2 *= dims2[i];
}
- assert(nelmts1==nelmts2);
+ if (cmp)
+ /* onnly assert if the space is the same */
+ assert(nelmts1==nelmts2);
/*-------------------------------------------------------------------------
* check for equal file datatype; warning only
@@ -296,6 +302,7 @@ hsize_t diff_datasetid( hid_t dset1_id,
}
cmp=0;
+ options->not_cmp=1;
}
/*-------------------------------------------------------------------------
diff --git a/tools/lib/h5diff_util.c b/tools/lib/h5diff_util.c
index 34686c6..d29434c 100644
--- a/tools/lib/h5diff_util.c
+++ b/tools/lib/h5diff_util.c
@@ -284,7 +284,7 @@ diff_basename(const char *name)
size_t i;
if (name==NULL)
- return;
+ return NULL;
/* Find the end of the base name */
i = strlen(name);
diff --git a/tools/testfiles/h5diff_11.txt b/tools/testfiles/h5diff_11.txt
index 056e486..8500115 100644
--- a/tools/testfiles/h5diff_11.txt
+++ b/tools/testfiles/h5diff_11.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5'
#############################
Dataset: </g1/dset1> and </g1/dset1>
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_12.txt b/tools/testfiles/h5diff_12.txt
index d4605b2..63ac461 100644
--- a/tools/testfiles/h5diff_12.txt
+++ b/tools/testfiles/h5diff_12.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 g1/dset1 g1/dset2'
#############################
Dataset: </g1/dset1> and </g1/dset2>
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_13.txt b/tools/testfiles/h5diff_13.txt
index 53f44c1..ebe991b 100644
--- a/tools/testfiles/h5diff_13.txt
+++ b/tools/testfiles/h5diff_13.txt
@@ -8,4 +8,7 @@ position dset1 dset1 difference
[ 1 0 ] 1.000000 1.010000 0.010000
[ 1 1 ] 1.000000 1.001000 0.001000
[ 2 0 ] 1.000000 1.000100 0.000100
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_14.txt b/tools/testfiles/h5diff_14.txt
index 15e4dee..53388ac 100644
--- a/tools/testfiles/h5diff_14.txt
+++ b/tools/testfiles/h5diff_14.txt
@@ -8,4 +8,7 @@ position dset1 dset2 difference
[ 1 0 ] 1.000000 1.010000 0.010000
[ 1 1 ] 1.000000 1.001000 0.001000
[ 2 0 ] 1.000000 1.000100 0.000100
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_15.txt b/tools/testfiles/h5diff_15.txt
index 47789c4..295bdb3 100644
--- a/tools/testfiles/h5diff_15.txt
+++ b/tools/testfiles/h5diff_15.txt
@@ -10,4 +10,7 @@ position dset3 dset4 difference
[ 1 1 ] 100.000000 80.000000 20.000000
[ 2 0 ] 100.000000 140.000000 40.000000
[ 2 1 ] 100.000000 200.000000 100.000000
+----------------------------------------------------
+Summary
+----------------------------------------------------
6 differences found
diff --git a/tools/testfiles/h5diff_16.txt b/tools/testfiles/h5diff_16.txt
index 5bff6fb..b8a78d6 100644
--- a/tools/testfiles/h5diff_16.txt
+++ b/tools/testfiles/h5diff_16.txt
@@ -10,4 +10,7 @@ position dset3 dset4 difference relative
[ 1 1 ] 100 80 20 0.2
[ 2 0 ] 100 140 40 0.4
[ 2 1 ] 100 200 100 1
+----------------------------------------------------
+Summary
+----------------------------------------------------
6 differences found
diff --git a/tools/testfiles/h5diff_17.txt b/tools/testfiles/h5diff_17.txt
index 3ba4b74..ca7c491 100644
--- a/tools/testfiles/h5diff_17.txt
+++ b/tools/testfiles/h5diff_17.txt
@@ -20,4 +20,7 @@ position dset1 dset1 difference
[ 1 1 ] 1.000000 1.001000 0.001000
[ 2 0 ] 1.000000 1.000100 0.000100
Group: </> and </>
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_20.txt b/tools/testfiles/h5diff_20.txt
index e524fd6..086a847 100644
--- a/tools/testfiles/h5diff_20.txt
+++ b/tools/testfiles/h5diff_20.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file3.h5 file3.h5 -v dset group'
#############################
Comparison not possible: </dset> is of type H5G_DATASET and </group> is of type H5G_GROUP
-0 differences found
+----------------------------------------------------
+Summary
+----------------------------------------------------
+Some objects are not comparable
diff --git a/tools/testfiles/h5diff_21.txt b/tools/testfiles/h5diff_21.txt
index a22a665..bc79754 100644
--- a/tools/testfiles/h5diff_21.txt
+++ b/tools/testfiles/h5diff_21.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file3.h5 file3.h5 -v dset link'
#############################
Comparison not possible: </dset> is of type H5G_DATASET and </link> is of type H5G_LINK
-0 differences found
+----------------------------------------------------
+Summary
+----------------------------------------------------
+Some objects are not comparable
diff --git a/tools/testfiles/h5diff_22.txt b/tools/testfiles/h5diff_22.txt
index 1c4b45a..57123fb 100644
--- a/tools/testfiles/h5diff_22.txt
+++ b/tools/testfiles/h5diff_22.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file3.h5 file3.h5 -v dset type'
#############################
Comparison not possible: </dset> is of type H5G_DATASET and </type> is of type H5G_TYPE
-0 differences found
+----------------------------------------------------
+Summary
+----------------------------------------------------
+Some objects are not comparable
diff --git a/tools/testfiles/h5diff_23.txt b/tools/testfiles/h5diff_23.txt
index d709dc6..e0801b0 100644
--- a/tools/testfiles/h5diff_23.txt
+++ b/tools/testfiles/h5diff_23.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file3.h5 file3.h5 -v group group'
#############################
Group: </group> and </group>
+----------------------------------------------------
+Summary
+----------------------------------------------------
0 differences found
diff --git a/tools/testfiles/h5diff_24.txt b/tools/testfiles/h5diff_24.txt
index 467038a..13acf40 100644
--- a/tools/testfiles/h5diff_24.txt
+++ b/tools/testfiles/h5diff_24.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file3.h5 file3.h5 -v type type'
#############################
Datatype: </type> and </type>
+----------------------------------------------------
+Summary
+----------------------------------------------------
0 differences found
diff --git a/tools/testfiles/h5diff_25.txt b/tools/testfiles/h5diff_25.txt
index dabfe91..15d8583 100644
--- a/tools/testfiles/h5diff_25.txt
+++ b/tools/testfiles/h5diff_25.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file3.h5 file3.h5 -v link link'
#############################
Link: </link> and </link>
+----------------------------------------------------
+Summary
+----------------------------------------------------
0 differences found
diff --git a/tools/testfiles/h5diff_50.txt b/tools/testfiles/h5diff_50.txt
index 0827f0d..9703403 100644
--- a/tools/testfiles/h5diff_50.txt
+++ b/tools/testfiles/h5diff_50.txt
@@ -14,4 +14,7 @@ position dset0a dset0b difference
[ 1 1 ] 1 4 3
[ 2 0 ] 1 5 4
[ 2 1 ] 1 6 5
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_51.txt b/tools/testfiles/h5diff_51.txt
index d63f7da..11869b2 100644
--- a/tools/testfiles/h5diff_51.txt
+++ b/tools/testfiles/h5diff_51.txt
@@ -8,4 +8,7 @@ position dset1a dset1b difference
[ 1 1 ] 1 4 3
[ 2 0 ] 1 5 4
[ 2 1 ] 1 6 5
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_52.txt b/tools/testfiles/h5diff_52.txt
index 2742164..81ad53e 100644
--- a/tools/testfiles/h5diff_52.txt
+++ b/tools/testfiles/h5diff_52.txt
@@ -8,4 +8,7 @@ position dset2a dset2b difference
[ 1 1 ] 1 4 3
[ 2 0 ] 1 5 4
[ 2 1 ] 1 6 5
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_53.txt b/tools/testfiles/h5diff_53.txt
index 814ae9a..da6aef6 100644
--- a/tools/testfiles/h5diff_53.txt
+++ b/tools/testfiles/h5diff_53.txt
@@ -8,4 +8,7 @@ position dset3a dset4b difference
[ 1 1 ] 1 4 3
[ 2 0 ] 1 5 4
[ 2 1 ] 1 6 5
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_54.txt b/tools/testfiles/h5diff_54.txt
index 65074cf..33d7dde 100644
--- a/tools/testfiles/h5diff_54.txt
+++ b/tools/testfiles/h5diff_54.txt
@@ -8,4 +8,7 @@ position dset4a dset4b difference
[ 1 1 ] 1 4 3
[ 2 0 ] 1 5 4
[ 2 1 ] 1 6 5
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_55.txt b/tools/testfiles/h5diff_55.txt
index ba97356..dedf59d 100644
--- a/tools/testfiles/h5diff_55.txt
+++ b/tools/testfiles/h5diff_55.txt
@@ -8,4 +8,7 @@ position dset5a dset5b difference
[ 1 1 ] 1.000000 4.000000 3.000000
[ 2 0 ] 1.000000 5.000000 4.000000
[ 2 1 ] 1.000000 6.000000 5.000000
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_56.txt b/tools/testfiles/h5diff_56.txt
index 1a00da1..acc318c 100644
--- a/tools/testfiles/h5diff_56.txt
+++ b/tools/testfiles/h5diff_56.txt
@@ -8,4 +8,7 @@ position dset6a dset6b difference
[ 1 1 ] 1.000000 4.000000 3.000000
[ 2 0 ] 1.000000 5.000000 4.000000
[ 2 1 ] 1.000000 6.000000 5.000000
+----------------------------------------------------
+Summary
+----------------------------------------------------
4 differences found
diff --git a/tools/testfiles/h5diff_57.txt b/tools/testfiles/h5diff_57.txt
index b4424a5..3917aad 100644
--- a/tools/testfiles/h5diff_57.txt
+++ b/tools/testfiles/h5diff_57.txt
@@ -9,4 +9,7 @@ Warning: Different storage datatype
</dset7a> has file datatype H5T_STD_I8LE
</dset7b> has file datatype H5T_STD_U8LE
Comparison not supported: </dset7a> has sign H5T_SGN_2 and </dset7b> has sign H5T_SGN_NONE
-0 differences found
+----------------------------------------------------
+Summary
+----------------------------------------------------
+Some objects are not comparable
diff --git a/tools/testfiles/h5diff_607.txt b/tools/testfiles/h5diff_607.txt
index fa296f7..24550f0 100644
--- a/tools/testfiles/h5diff_607.txt
+++ b/tools/testfiles/h5diff_607.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -d 1 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
6 differences found
diff --git a/tools/testfiles/h5diff_608.txt b/tools/testfiles/h5diff_608.txt
index 073322f..f0eaea5 100644
--- a/tools/testfiles/h5diff_608.txt
+++ b/tools/testfiles/h5diff_608.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -d 1 -d 2 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
6 differences found
diff --git a/tools/testfiles/h5diff_609.txt b/tools/testfiles/h5diff_609.txt
index 1312380..378615e 100644
--- a/tools/testfiles/h5diff_609.txt
+++ b/tools/testfiles/h5diff_609.txt
@@ -1,4 +1,7 @@
#############################
Expected output for 'h5diff file1.h5 file2.h5 -d 200 g1/dset3 g1/dset4'
#############################
+----------------------------------------------------
+Summary
+----------------------------------------------------
0 differences found
diff --git a/tools/testfiles/h5diff_610.txt b/tools/testfiles/h5diff_610.txt
index fa296f7..24550f0 100644
--- a/tools/testfiles/h5diff_610.txt
+++ b/tools/testfiles/h5diff_610.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -d 1 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
6 differences found
diff --git a/tools/testfiles/h5diff_616.txt b/tools/testfiles/h5diff_616.txt
index 0f71910..ccd8d48 100644
--- a/tools/testfiles/h5diff_616.txt
+++ b/tools/testfiles/h5diff_616.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -p 0.21 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
2 differences found
diff --git a/tools/testfiles/h5diff_617.txt b/tools/testfiles/h5diff_617.txt
index ef74c72..4ce6c4a 100644
--- a/tools/testfiles/h5diff_617.txt
+++ b/tools/testfiles/h5diff_617.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -p 0.21 -p 0.22 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
2 differences found
diff --git a/tools/testfiles/h5diff_618.txt b/tools/testfiles/h5diff_618.txt
index d436346..5f8ba8a 100644
--- a/tools/testfiles/h5diff_618.txt
+++ b/tools/testfiles/h5diff_618.txt
@@ -1,4 +1,7 @@
#############################
Expected output for 'h5diff file1.h5 file2.h5 -p 2 g1/dset3 g1/dset4'
#############################
+----------------------------------------------------
+Summary
+----------------------------------------------------
0 differences found
diff --git a/tools/testfiles/h5diff_619.txt b/tools/testfiles/h5diff_619.txt
index 18d1efb..ea877cd 100644
--- a/tools/testfiles/h5diff_619.txt
+++ b/tools/testfiles/h5diff_619.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -p 0.005 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
6 differences found
diff --git a/tools/testfiles/h5diff_625.txt b/tools/testfiles/h5diff_625.txt
index 74477c8..ab4d206 100644
--- a/tools/testfiles/h5diff_625.txt
+++ b/tools/testfiles/h5diff_625.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -n 2 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
2 differences found
diff --git a/tools/testfiles/h5diff_626.txt b/tools/testfiles/h5diff_626.txt
index 85eb7dc..19d7089 100644
--- a/tools/testfiles/h5diff_626.txt
+++ b/tools/testfiles/h5diff_626.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -n 2 -n 3 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
3 differences found
diff --git a/tools/testfiles/h5diff_627.txt b/tools/testfiles/h5diff_627.txt
index 999bbc3..22c2a78 100644
--- a/tools/testfiles/h5diff_627.txt
+++ b/tools/testfiles/h5diff_627.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -n 200 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
6 differences found
diff --git a/tools/testfiles/h5diff_628.txt b/tools/testfiles/h5diff_628.txt
index 604df64..8e47534 100644
--- a/tools/testfiles/h5diff_628.txt
+++ b/tools/testfiles/h5diff_628.txt
@@ -2,4 +2,7 @@
Expected output for 'h5diff file1.h5 file2.h5 -n 1 g1/dset3 g1/dset4'
#############################
Dataset: </g1/dset3> and </g1/dset4>
+----------------------------------------------------
+Summary
+----------------------------------------------------
1 differences found
diff --git a/tools/testfiles/h5diff_629.txt b/tools/testfiles/h5diff_629.txt
index 8f25c6e..db546ae 100644
--- a/tools/testfiles/h5diff_629.txt
+++ b/tools/testfiles/h5diff_629.txt
@@ -2,5 +2,6 @@
Expected output for 'h5diff file1.h6 file2.h6'
#############################
h5diff: <file1.h6>: unable to open file
-No common objects found. Files are not comparable.
-Use -v for a list of objects.
+----------------------------------------------------
+Summary
+----------------------------------------------------
diff --git a/tools/testfiles/h5diff_70.txt b/tools/testfiles/h5diff_70.txt
index a44b4de..5d154ed 100644
--- a/tools/testfiles/h5diff_70.txt
+++ b/tools/testfiles/h5diff_70.txt
@@ -1139,4 +1139,7 @@ position float3D of </> float3D of </> difference
[ 3 2 0 ] 23.000000 0.000000 23.000000
[ 3 2 1 ] 24.000000 0.000000 24.000000
24 differences found
-0 differences found
+----------------------------------------------------
+Summary
+----------------------------------------------------
+Some objects are not comparable
diff --git a/tools/testfiles/h5diff_80.txt b/tools/testfiles/h5diff_80.txt
index 8f7adca..5929c44 100644
--- a/tools/testfiles/h5diff_80.txt
+++ b/tools/testfiles/h5diff_80.txt
@@ -679,4 +679,7 @@ position vlen3D vlen3D difference
[ 3 2 1 ] 58 0 58
[ 3 2 1 ] 59 0 59
Group: </> and </>
-491 differences found
+----------------------------------------------------
+Summary
+----------------------------------------------------
+Some objects are not comparable