diff options
-rw-r--r-- | tools/h5diff/h5diff_common.c | 34 | ||||
-rw-r--r-- | tools/h5diff/h5diff_main.c | 4 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_10.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_19.txt | 24 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_600.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_603.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_604.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_605.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_606.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_612.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_613.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_614.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_615.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_621.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_622.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_623.txt | 19 | ||||
-rw-r--r-- | tools/h5diff/testfiles/h5diff_624.txt | 19 | ||||
-rwxr-xr-x | tools/h5diff/testh5diff.sh | 6 | ||||
-rwxr-xr-x | tools/h5repack/h5repack.sh.in | 4 | ||||
-rw-r--r-- | tools/lib/h5diff.c | 137 | ||||
-rw-r--r-- | tools/lib/h5diff.h | 2 |
21 files changed, 361 insertions, 116 deletions
diff --git a/tools/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c index 357bb32..05111a9 100644 --- a/tools/h5diff/h5diff_common.c +++ b/tools/h5diff/h5diff_common.c @@ -31,7 +31,7 @@ const char *progname = "h5diff"; * Command-line options: The user can specify short or long-named * parameters. */ -static const char *s_opts = "hVrvqn:d:p:"; +static const char *s_opts = "hVrvqn:d:p:c"; static struct long_options l_opts[] = { { "help", no_arg, 'h' }, { "version", no_arg, 'V' }, @@ -41,6 +41,7 @@ static struct long_options l_opts[] = { { "count", require_arg, 'n' }, { "delta", require_arg, 'd' }, { "relative", require_arg, 'p' }, + { "contents", no_arg, 'c' }, { NULL, 0, '\0' } }; @@ -91,6 +92,9 @@ void parse_command_line(int argc, case 'r': options->m_report = 1; break; + case 'c': + options->m_contents = 1; + break; case 'd': options->d=1; @@ -170,7 +174,7 @@ void parse_command_line(int argc, void print_info(diff_opt_t* options) { - if (options->m_quiet || options->err_stat) + if (options->m_quiet || options->err_stat || options->m_contents) return; if (options->cmn_objs==0) @@ -318,8 +322,10 @@ void usage(void) printf(" -V, --version Print version number and exit\n"); printf(" -r, --report Report mode. Print differences\n"); printf(" -v, --verbose Verbose mode. Print differences, list of objects\n"); - printf(" -q, --quiet Quiet mode. Do not do output\n"); + printf(" -c, --contents Contents mode. Objects in both files must match\n"); + + printf(" -n C, --count=C Print differences up to C number\n"); printf(" -d D, --delta=D Print difference when greater than limit D\n"); printf(" -p R, --relative=R Print difference when greater than relative limit R\n"); @@ -339,6 +345,22 @@ void usage(void) printf(" -r Report mode: print the above plus the differences\n"); printf(" -v Verbose mode: print the above plus a list of objects and warnings\n"); printf(" -q Quiet mode: do not print output\n"); + printf(" -c Contents mode: objects in both files must match\n"); + + printf("\n"); + + printf(" Compare criteria\n"); + printf("\n"); + printf(" If no objects [obj1[obj2]] are specified, h5diff only compares objects\n"); + printf(" with the same absolute path in both files. However,\n"); + printf(" when the -c flag is present, (contents mode) the objects in file1\n"); + printf(" must match exactly the objects in file2\n"); + printf("\n"); + + printf(" The compare criteria is:\n"); + printf(" 1) datasets: numerical array differences 2) groups: name string difference\n"); + printf(" 3) datatypes: the return value of H5Tequal 2) links: name string difference\n"); + printf(" of the linked value\n"); printf("\n"); @@ -368,11 +390,7 @@ void usage(void) printf("\n"); printf(" to compare '/g1/dset1' and '/g1/dset2' in the same file\n"); printf("\n"); - printf(" If no objects [obj1[obj2]] are specified, h5diff only compares objects\n"); - printf(" with the same absolute path in both files. The compare criteria is:\n"); - printf(" 1) datasets: numerical array differences 2) groups: name string difference\n"); - printf(" 3) datatypes: the return value of H5Tequal 2) links: name string difference\n"); - printf(" of the linked value\n"); + } diff --git a/tools/h5diff/h5diff_main.c b/tools/h5diff/h5diff_main.c index 54a075f..17fe275 100644 --- a/tools/h5diff/h5diff_main.c +++ b/tools/h5diff/h5diff_main.c @@ -89,6 +89,10 @@ int main(int argc, const char *argv[]) */ ret = (nfound == 0 ? 0 : 1 ); + + if ( options.m_contents && options.contents == 0 ) + ret = 1; + if(options.err_stat) ret = -1; return ret; diff --git a/tools/h5diff/testfiles/h5diff_10.txt b/tools/h5diff/testfiles/h5diff_10.txt index 887ee9e..8877a75 100644 --- a/tools/h5diff/testfiles/h5diff_10.txt +++ b/tools/h5diff/testfiles/h5diff_10.txt @@ -9,6 +9,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -23,6 +24,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -48,8 +62,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_19.txt b/tools/h5diff/testfiles/h5diff_19.txt new file mode 100644 index 0000000..cda2f73 --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_19.txt @@ -0,0 +1,24 @@ + +file1 file2 +--------------------------------------- + x x / + x /g1 + x /g1/d1 + x /g1/d2 + x /g1/dset1 + x /g1/dset10 + x /g1/dset3 + x /g1/dset5 + x /g1/dset6 + x /g1/dset7 + x /g1/dset8 + x /g1/dset9 + x /g1/fp1 + x /g1/fp15 + x /g1/fp16 + x /g1/fp17 + x /g1/fp18 + x /g1/fp2 + +group : </> and </> +0 differences found diff --git a/tools/h5diff/testfiles/h5diff_600.txt b/tools/h5diff/testfiles/h5diff_600.txt index 82b69d9..3697279 100644 --- a/tools/h5diff/testfiles/h5diff_600.txt +++ b/tools/h5diff/testfiles/h5diff_600.txt @@ -9,6 +9,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -23,6 +24,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -48,9 +62,4 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value h5diff error: missing file names diff --git a/tools/h5diff/testfiles/h5diff_603.txt b/tools/h5diff/testfiles/h5diff_603.txt index 9ddf674..a2f07f2 100644 --- a/tools/h5diff/testfiles/h5diff_603.txt +++ b/tools/h5diff/testfiles/h5diff_603.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_604.txt b/tools/h5diff/testfiles/h5diff_604.txt index 763999d..90d9bdb 100644 --- a/tools/h5diff/testfiles/h5diff_604.txt +++ b/tools/h5diff/testfiles/h5diff_604.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_605.txt b/tools/h5diff/testfiles/h5diff_605.txt index e00bf5b..9e45341 100644 --- a/tools/h5diff/testfiles/h5diff_605.txt +++ b/tools/h5diff/testfiles/h5diff_605.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_606.txt b/tools/h5diff/testfiles/h5diff_606.txt index 3d77495..31053d5 100644 --- a/tools/h5diff/testfiles/h5diff_606.txt +++ b/tools/h5diff/testfiles/h5diff_606.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_612.txt b/tools/h5diff/testfiles/h5diff_612.txt index 8f665b8..0a05b7f 100644 --- a/tools/h5diff/testfiles/h5diff_612.txt +++ b/tools/h5diff/testfiles/h5diff_612.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_613.txt b/tools/h5diff/testfiles/h5diff_613.txt index f3f16fd..155d7f6 100644 --- a/tools/h5diff/testfiles/h5diff_613.txt +++ b/tools/h5diff/testfiles/h5diff_613.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_614.txt b/tools/h5diff/testfiles/h5diff_614.txt index c78fc8c..fac1c6a 100644 --- a/tools/h5diff/testfiles/h5diff_614.txt +++ b/tools/h5diff/testfiles/h5diff_614.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_615.txt b/tools/h5diff/testfiles/h5diff_615.txt index d25b847..f40ac2a 100644 --- a/tools/h5diff/testfiles/h5diff_615.txt +++ b/tools/h5diff/testfiles/h5diff_615.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_621.txt b/tools/h5diff/testfiles/h5diff_621.txt index 21dac0b..93f1714 100644 --- a/tools/h5diff/testfiles/h5diff_621.txt +++ b/tools/h5diff/testfiles/h5diff_621.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_622.txt b/tools/h5diff/testfiles/h5diff_622.txt index c46356a..0cdc67c 100644 --- a/tools/h5diff/testfiles/h5diff_622.txt +++ b/tools/h5diff/testfiles/h5diff_622.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_623.txt b/tools/h5diff/testfiles/h5diff_623.txt index 7ae15e8..b821511 100644 --- a/tools/h5diff/testfiles/h5diff_623.txt +++ b/tools/h5diff/testfiles/h5diff_623.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testfiles/h5diff_624.txt b/tools/h5diff/testfiles/h5diff_624.txt index caf4e62..d9ce5e6 100644 --- a/tools/h5diff/testfiles/h5diff_624.txt +++ b/tools/h5diff/testfiles/h5diff_624.txt @@ -10,6 +10,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r, --report Report mode. Print differences -v, --verbose Verbose mode. Print differences, list of objects -q, --quiet Quiet mode. Do not do output + -c, --contents Contents mode. Objects in both files must match -n C, --count=C Print differences up to C number -d D, --delta=D Print difference when greater than limit D -p R, --relative=R Print difference when greater than relative limit R @@ -24,6 +25,19 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -r Report mode: print the above plus the differences -v Verbose mode: print the above plus a list of objects and warnings -q Quiet mode: do not print output + -c Contents mode: objects in both files must match + + Compare criteria + + If no objects [obj1[obj2]] are specified, h5diff only compares objects + with the same absolute path in both files. However, + when the -c flag is present, (contents mode) the objects in file1 + must match exactly the objects in file2 + + The compare criteria is: + 1) datasets: numerical array differences 2) groups: name string difference + 3) datatypes: the return value of H5Tequal 2) links: name string difference + of the linked value Return exit code: @@ -49,8 +63,3 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] to compare '/g1/dset1' and '/g1/dset2' in the same file - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 2) links: name string difference - of the linked value diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh index a2a9ecc..d2fd6f8 100755 --- a/tools/h5diff/testh5diff.sh +++ b/tools/h5diff/testh5diff.sh @@ -41,6 +41,7 @@ SRCFILE7=h5diff_dset1.h5 SRCFILE8=h5diff_dset2.h5 SRCFILE9=h5diff_hyper1.h5 SRCFILE10=h5diff_hyper2.h5 +SRCFILE11=h5diff_empty.h5 FILE1="$INDIR/$SRCFILE1" FILE2="$INDIR/$SRCFILE2" @@ -52,6 +53,7 @@ FILE7="$INDIR/$SRCFILE7" FILE8="$INDIR/$SRCFILE8" FILE9="$INDIR/$SRCFILE9" FILE10="$INDIR/$SRCFILE10" +FILE11="$INDIR/$SRCFILE11" H5DIFF=h5diff # The tool name @@ -327,6 +329,10 @@ TOOLTEST h5diff_17.txt -v $FILE1 $FILE2 TESTING $H5DIFF -q $SRCFILE1 $SRCFILE2 TOOLTEST h5diff_18.txt -q $FILE1 $FILE2 +# 1.9 contents mode +TESTING $H5DIFF -v -c $SRCFILE1 $SRCFILE11 +TOOLTEST h5diff_19.txt -v -c $FILE1 $FILE11 + # ############################################################################## # # not comparable types # ############################################################################## diff --git a/tools/h5repack/h5repack.sh.in b/tools/h5repack/h5repack.sh.in index 334b384..0d3c7d4 100755 --- a/tools/h5repack/h5repack.sh.in +++ b/tools/h5repack/h5repack.sh.in @@ -93,9 +93,9 @@ DIFFTEST() { VERIFY $@ if [ "`uname -s`" = "TFLOPS O/S" ]; then - $RUNSERIAL $H5DIFF_BIN -q $@ + $RUNSERIAL $H5DIFF_BIN -q -c $@ else - $RUNSERIAL $H5DIFF_BIN -q "$@" + $RUNSERIAL $H5DIFF_BIN -q -c "$@" fi RET=$? if [ $RET != 0 ] ; then diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c index 9d64e44..503affe 100644 --- a/tools/lib/h5diff.c +++ b/tools/lib/h5diff.c @@ -373,7 +373,8 @@ hsize_t diff_match(hid_t file1_id, curr1 = 0; curr2 = 0; - while(curr1 < info1->nused && curr2 < info2->nused) { + while(curr1 < info1->nused && curr2 < info2->nused) + { /* criteria is string compare */ int cmp = HDstrcmp(info1->paths[curr1].path, info2->paths[curr2].path); @@ -385,13 +386,15 @@ hsize_t diff_match(hid_t file1_id, curr1++; curr2++; } /* end if */ - else if(cmp < 0) { + else if(cmp < 0) + { infile[0] = 1; infile[1] = 0; trav_table_addflags(infile, info1->paths[curr1].path, info1->paths[curr1].type, table); curr1++; } /* end else-if */ - else { + else + { infile[0] = 0; infile[1] = 1; trav_table_addflags(infile, info2->paths[curr2].path, info2->paths[curr2].type, table); @@ -402,7 +405,8 @@ hsize_t diff_match(hid_t file1_id, /* list1 did not end */ infile[0] = 1; infile[1] = 0; - while(curr1 < info1->nused) { + while(curr1 < info1->nused) + { trav_table_addflags(infile, info1->paths[curr1].path, info1->paths[curr1].type, table); curr1++; } /* end while */ @@ -410,7 +414,8 @@ hsize_t diff_match(hid_t file1_id, /* list2 did not end */ infile[0] = 0; infile[1] = 1; - while(curr2 < info2->nused) { + while(curr2 < info2->nused) + { trav_table_addflags(infile, info2->paths[curr2].path, info2->paths[curr2].type, table); curr2++; } /* end while */ @@ -435,6 +440,35 @@ hsize_t diff_match(hid_t file1_id, } /* end if */ + + /*------------------------------------------------------------------------- + * contents mode. we do an "absolute" compare criteria, the number of objects + * in file1 must be the same as in file2 + *------------------------------------------------------------------------- + */ + if ( options->m_contents ) + { + /* assume equal contents initially */ + options->contents = 1; + + /* number of different objects */ + if ( info1->nused != info2->nused ) + { + options->contents = 0; + } + + + for( i = 0; i < table->nobjs; i++) + { + if( table->objs[i].flags[0] != table->objs[i].flags[1] ) + { + options->contents = 0; + } + } + + } + + /*------------------------------------------------------------------------- * do the diff for common objects *------------------------------------------------------------------------- @@ -453,17 +487,21 @@ hsize_t diff_match(hid_t file1_id, HDmemset(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]) + { options->cmn_objs = 1; - if(!g_Parallel) { + if(!g_Parallel) + { nfound += diff(file1_id, table->objs[i].name, file2_id, table->objs[i].name, options, table->objs[i].type); } /* end if */ #ifdef H5_HAVE_PARALLEL - else { + else + { int workerFound = 0; h5diffdebug("beginning of big else block\n"); @@ -476,7 +514,8 @@ hsize_t diff_match(hid_t file1_id, */ /*Set up args to pass to worker task. */ - if(HDstrlen(table->objs[i].name) > 255) { + if(HDstrlen(table->objs[i].name) > 255) + { printf("The parallel diff only supports object names up to 255 characters\n"); MPI_Abort(MPI_COMM_WORLD, 0); } /* end if */ @@ -487,14 +526,16 @@ hsize_t diff_match(hid_t file1_id, h5diffdebug2("busyTasks=%d\n", busyTasks); /* if there are any outstanding print requests, let's handle one. */ - if(busyTasks > 0) { + 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); /* first block*/ - if(incomingMessage) { + 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.nfound; @@ -503,7 +544,8 @@ hsize_t diff_match(hid_t file1_id, } /* end if */ /* check to see if the print token was returned. */ - if(!havePrintToken) { + if(!havePrintToken) + { /* If we don't have the token, someone is probably sending us output */ print_incoming_data(); @@ -522,10 +564,12 @@ hsize_t diff_match(hid_t file1_id, } /* end if */ /* check to see if anyone needs the print token. */ - if(havePrintToken) { + 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) { + 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; @@ -536,8 +580,10 @@ hsize_t diff_match(hid_t file1_id, /* 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]) { + 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(args), MPI_BYTE, n, MPI_TAG_ARGS, MPI_COMM_WORLD); @@ -551,20 +597,24 @@ hsize_t diff_match(hid_t file1_id, } /* end for */ h5diffdebug2("workerfound is %d \n", workerFound); - if(!workerFound) { + 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) { - while(!havePrintToken) { + if(!havePrintToken) + { + while(!havePrintToken) + { int incomingMessage; print_incoming_data(); MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status); - if(incomingMessage) { + if(incomingMessage) + { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); havePrintToken = 1; nfound += nFoundbyWorker.nfound; @@ -575,23 +625,27 @@ hsize_t diff_match(hid_t file1_id, } /* end while */ } /* end if */ /* if we do have the token, check for task to free up, or wait for a task to request it */ - else { + 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) { + 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.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; MPI_Send(&args, sizeof(args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD); } /* end if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) { + else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) + { int 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); - do { + do + { MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status); print_incoming_data(); @@ -602,7 +656,8 @@ hsize_t diff_match(hid_t file1_id, options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; MPI_Send(&args, sizeof(args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD); } /* end else-if */ - else { + else + { printf("ERROR: Invalid tag (%d) received \n", Status.MPI_TAG); MPI_Abort(MPI_COMM_WORLD, 0); MPI_Finalize(); @@ -616,26 +671,32 @@ hsize_t diff_match(hid_t file1_id, h5diffdebug("done with for loop\n"); #ifdef H5_HAVE_PARALLEL - if(g_Parallel) { + if(g_Parallel) + { /* make sure all tasks are done */ - while(busyTasks > 0) { + while(busyTasks > 0) + { MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - if(Status.MPI_TAG == MPI_TAG_DONE) { + 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.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; } /* end if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) { + 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.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; havePrintToken = 1; } /* end else-if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) { + 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) { + if(havePrintToken) + { int incomingMessage; MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); @@ -652,11 +713,13 @@ hsize_t diff_match(hid_t file1_id, busyTasks--; } /* end if */ /* someone else must have it...wait for them to return it, then give it to the task that just asked for it. */ - else { + else + { int source = Status.MPI_SOURCE; int incomingMessage; - do { + do + { MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status); print_incoming_data(); @@ -670,7 +733,8 @@ hsize_t diff_match(hid_t file1_id, MPI_Send(NULL, 0, MPI_BYTE, source, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); } /* end else */ } /* end else-if */ - else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) { + 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.nfound; options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; @@ -686,7 +750,8 @@ hsize_t diff_match(hid_t file1_id, printf("%s", data); } /* end else-if */ - else { + else + { printf("ph5diff-manager: ERROR!! Invalid tag (%d) received \n", Status.MPI_TAG); MPI_Abort(MPI_COMM_WORLD, 0); } /* end else */ diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h index 373eeed..d12031a 100644 --- a/tools/lib/h5diff.h +++ b/tools/lib/h5diff.h @@ -37,6 +37,8 @@ typedef struct { 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 */ + int m_contents;/* contents mode */ + int contents; /* equal contents */ } diff_opt_t; |