From a04636e260a6ce1a4b798ba075228a321138eb23 Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Wed, 18 Feb 2009 15:49:58 -0500 Subject: [svn-r16491] #1368 (E1) h5diff: implement "not comparable" messages. Implemented RFC. The new option is <-c, --compare List objects that are not comparable> added some test cases and new test files for output tested: h5committest --- MANIFEST | 8 ++ tools/h5diff/h5diff_main.c | 83 +++++------ tools/h5diff/h5diffgentest.c | 98 ++++++++++--- tools/h5diff/testfiles/h5diff_10.txt | 5 +- tools/h5diff/testfiles/h5diff_16_1.txt | 1 + tools/h5diff/testfiles/h5diff_16_3.txt | 1 + tools/h5diff/testfiles/h5diff_17.txt | 9 ++ tools/h5diff/testfiles/h5diff_20.txt | 1 + tools/h5diff/testfiles/h5diff_200.txt | 4 + tools/h5diff/testfiles/h5diff_201.txt | 1 + tools/h5diff/testfiles/h5diff_202.txt | 2 + tools/h5diff/testfiles/h5diff_203.txt | 2 + tools/h5diff/testfiles/h5diff_204.txt | 2 + tools/h5diff/testfiles/h5diff_205.txt | 3 + tools/h5diff/testfiles/h5diff_206.txt | 1 + tools/h5diff/testfiles/h5diff_207.txt | 2 + tools/h5diff/testfiles/h5diff_21.txt | 1 + tools/h5diff/testfiles/h5diff_22.txt | 1 + tools/h5diff/testfiles/h5diff_57.txt | 3 +- tools/h5diff/testfiles/h5diff_600.txt | 5 +- tools/h5diff/testfiles/h5diff_603.txt | 5 +- tools/h5diff/testfiles/h5diff_604.txt | 5 +- tools/h5diff/testfiles/h5diff_605.txt | 5 +- tools/h5diff/testfiles/h5diff_606.txt | 5 +- tools/h5diff/testfiles/h5diff_612.txt | 5 +- tools/h5diff/testfiles/h5diff_613.txt | 5 +- tools/h5diff/testfiles/h5diff_614.txt | 5 +- tools/h5diff/testfiles/h5diff_615.txt | 5 +- tools/h5diff/testfiles/h5diff_621.txt | 5 +- tools/h5diff/testfiles/h5diff_622.txt | 5 +- tools/h5diff/testfiles/h5diff_623.txt | 5 +- tools/h5diff/testfiles/h5diff_624.txt | 5 +- tools/h5diff/testfiles/h5diff_70.txt | 1 + tools/h5diff/testfiles/h5diff_80.txt | 1 + tools/h5diff/testfiles/h5diff_90.txt | 33 +++++ tools/h5diff/testfiles/h5diff_basic2.h5 | Bin 4240 -> 9120 bytes tools/h5diff/testh5diff.sh | 26 ++++ tools/lib/h5diff.h | 8 +- tools/lib/h5diff_attr.c | 10 +- tools/lib/h5diff_dset.c | 237 +++++++++++++++++++++++--------- 40 files changed, 453 insertions(+), 156 deletions(-) create mode 100644 tools/h5diff/testfiles/h5diff_200.txt create mode 100644 tools/h5diff/testfiles/h5diff_201.txt create mode 100644 tools/h5diff/testfiles/h5diff_202.txt create mode 100644 tools/h5diff/testfiles/h5diff_203.txt create mode 100644 tools/h5diff/testfiles/h5diff_204.txt create mode 100644 tools/h5diff/testfiles/h5diff_205.txt create mode 100644 tools/h5diff/testfiles/h5diff_206.txt create mode 100644 tools/h5diff/testfiles/h5diff_207.txt diff --git a/MANIFEST b/MANIFEST index 21a5dad..0d5471f 100644 --- a/MANIFEST +++ b/MANIFEST @@ -2221,6 +2221,14 @@ ./tools/h5diff/testfiles/h5diff_58.txt ./tools/h5diff/testfiles/h5diff_basic2.h5 ./tools/h5diff/testfiles/h5diff_hyper1.h5 +./tools/h5diff/testfiles/h5diff_200.txt +./tools/h5diff/testfiles/h5diff_201.txt +./tools/h5diff/testfiles/h5diff_202.txt +./tools/h5diff/testfiles/h5diff_203.txt +./tools/h5diff/testfiles/h5diff_204.txt +./tools/h5diff/testfiles/h5diff_205.txt +./tools/h5diff/testfiles/h5diff_206.txt +./tools/h5diff/testfiles/h5diff_207.txt diff --git a/tools/h5diff/h5diff_main.c b/tools/h5diff/h5diff_main.c index 5169019..daddab9 100644 --- a/tools/h5diff/h5diff_main.c +++ b/tools/h5diff/h5diff_main.c @@ -35,7 +35,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:N"; +static const char *s_opts = "hVrvqn:d:p:Nc"; static struct long_options l_opts[] = { { "help", no_arg, 'h' }, { "version", no_arg, 'V' }, @@ -46,6 +46,7 @@ static struct long_options l_opts[] = { { "delta", require_arg, 'd' }, { "relative", require_arg, 'p' }, { "nan", no_arg, 'N' }, + { "compare", no_arg, 'c' }, { NULL, 0, '\0' } }; @@ -132,30 +133,30 @@ int main(int argc, const char *argv[]) *------------------------------------------------------------------------- */ -void parse_command_line(int argc, - const char* argv[], - const char** fname1, +void parse_command_line(int argc, + const char* argv[], + const char** fname1, const char** fname2, - const char** objname1, - const char** objname2, + const char** objname1, + const char** objname2, diff_opt_t* options) { - + int opt; - + /* process the command-line */ memset(options, 0, sizeof (diff_opt_t)); /* assume equal contents initially */ options->contents = 1; - /* NaNs are handled by default */ + /* NaNs are handled by default */ options->do_nans = 1; - + /* parse command line options */ - while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) + while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) { - switch ((char)opt) + switch ((char)opt) { default: usage(); @@ -178,7 +179,7 @@ void parse_command_line(int argc, break; case 'd': options->d=1; - + if ( check_d_input( opt_arg )==-1) { printf("<-d %s> is not a valid option\n", opt_arg ); @@ -187,9 +188,9 @@ void parse_command_line(int argc, } options->delta = atof( opt_arg ); break; - + case 'p': - + options->p=1; if ( check_p_input( opt_arg )==-1) { @@ -199,9 +200,9 @@ void parse_command_line(int argc, } options->percent = atof( opt_arg ); break; - + case 'n': - + options->n=1; if ( check_n_input( opt_arg )==-1) { @@ -210,37 +211,37 @@ void parse_command_line(int argc, h5diff_exit(EXIT_FAILURE); } options->count = atol( opt_arg ); - + break; - case 'N': options->do_nans = 0; break; - - + case 'c': + options->m_list_not_cmp = 1; + break; } } - + /* check for file names to be processed */ - if (argc <= opt_ind || argv[ opt_ind + 1 ] == NULL) + if (argc <= opt_ind || argv[ opt_ind + 1 ] == NULL) { error_msg(progname, "missing file names\n"); usage(); h5diff_exit(EXIT_FAILURE); } - + *fname1 = argv[ opt_ind ]; *fname2 = argv[ opt_ind + 1 ]; *objname1 = argv[ opt_ind + 2 ]; - + if ( *objname1 == NULL ) { *objname2 = NULL; return; } - - if ( argv[ opt_ind + 3 ] != NULL) + + if ( argv[ opt_ind + 3 ] != NULL) { *objname2 = argv[ opt_ind + 3 ]; } @@ -248,8 +249,8 @@ void parse_command_line(int argc, { *objname2 = *objname1; } - - + + } @@ -276,11 +277,15 @@ void print_info(diff_opt_t* options) if (options->not_cmp==1) { - printf("--------------------------------\n"); - printf("Some objects are not comparable\n"); - printf("--------------------------------\n"); - if (!options->m_verbose) - printf("Use -v for a list of objects.\n"); + if ( options->m_list_not_cmp == 0 ) + { + printf("--------------------------------\n"); + printf("Some objects are not comparable\n"); + printf("--------------------------------\n"); + printf("Use -c for a list of objects.\n"); + } + + } } @@ -413,13 +418,13 @@ void usage(void) 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, --compare List objects that are not comparable\n"); + printf(" -N, --nan Avoid NaNs detection\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"); - printf(" -N, --nan Avoid NaNs detection\n"); - printf("\n"); @@ -441,10 +446,9 @@ void usage(void) 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.\n"); - + printf(" with the same absolute path in both files\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 4) links: name string difference\n"); @@ -483,6 +487,7 @@ void usage(void) } + /*------------------------------------------------------------------------- * Function: h5diff_exit * diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c index f4fd90a..b96511d 100644 --- a/tools/h5diff/h5diffgentest.c +++ b/tools/h5diff/h5diffgentest.c @@ -159,7 +159,7 @@ int test_basic(const char *fname1, const char *fname2, const char *fname3) { double data1[3][2] = {{1,1}, {1,1}, {0,0}}; double data2[3][2] = {{0,1.1},{1.01,1.001},{0,1}}; - double data3[3][2] = {{100,100},{100,100},{100,100}}; + double data3[3][2] = {{100,100},{100,100},{100,100}}; double data4[3][2] = {{105,120},{160,95},{80,40}}; write_dset(gid1,2,dims2,"dset1",H5T_NATIVE_DOUBLE,data1); @@ -175,7 +175,7 @@ int test_basic(const char *fname1, const char *fname2, const char *fname3) *------------------------------------------------------------------------- */ { - int data5[3][2] = {{100,100},{100,0},{0,100}}; + int data5[3][2] = {{100,100},{100,0},{0,100}}; int data6[3][2] = {{120,80}, {0,100},{0,50}}; write_dset(gid1,2,dims2,"dset5",H5T_NATIVE_INT,data5); @@ -189,7 +189,7 @@ int test_basic(const char *fname1, const char *fname2, const char *fname3) *------------------------------------------------------------------------- */ { - unsigned long_long data7[3][2] = {{100,100},{100,0},{0,100}}; + unsigned long_long data7[3][2] = {{100,100},{100,0},{0,100}}; unsigned long_long data8[3][2] = {{120,80}, {0,100},{0,50}}; write_dset(gid1,2,dims2,"dset7",H5T_NATIVE_ULLONG,data7); @@ -211,7 +211,7 @@ int test_basic(const char *fname1, const char *fname2, const char *fname3) *------------------------------------------------------------------------- */ { - double data9[3][2] = {{100,100},{100,0},{0,100}}; + double data9[3][2] = {{100,100},{100,0},{0,100}}; double data10[3][2] ={{120,80}, {0,100},{0,50}}; write_dset(gid1,2,dims2,"dset9",H5T_NATIVE_DOUBLE,data9); @@ -239,6 +239,23 @@ int test_basic(const char *fname1, const char *fname2, const char *fname3) } +#if H5_SIZEOF_LONG_DOUBLE !=0 + { + + /*------------------------------------------------------------------------- + * H5T_NATIVE_LDOUBLE + *------------------------------------------------------------------------- + */ + + long double data15[3][2] ={{1,1},{1,1},{1,1}}; + + write_dset(gid1,2,dims2,"ld",H5T_NATIVE_LDOUBLE,data15); + + } +#endif + + + /*------------------------------------------------------------------------- * NaNs in H5T_NATIVE_FLOAT *------------------------------------------------------------------------- @@ -294,21 +311,71 @@ int test_basic(const char *fname1, const char *fname2, const char *fname3) write_dset(gid1,1,dims1,"fp18",H5T_NATIVE_DOUBLE,data18); } - -#if H5_SIZEOF_LONG_DOUBLE !=0 + + /* not comparable objects */ { + + typedef struct cmp1_t + { + double d; + int i; + } cmp1_t; + + typedef struct cmp2_t + { + int i; + double d; + } cmp2_t; + + typedef struct cmp3_t + { + int i; + } cmp3_t; + + double data2[6] = {0,0,0,0,0,0}; + int data3[6] = {0,0,0,0,0,0}; + int data4[3][2] = {{0,0},{0,0},{0,0}}; + int data5[2][2] = {{0,0},{0,0}}; + unsigned int data6[3][2] = {{0,0},{0,0},{0,0}}; + cmp1_t data7[1] = {1,2}; + cmp2_t data8[1] = {1,2}; + hsize_t dims3[2] = { 2,2 }; + hsize_t dims4[1] = { 1 }; + size_t type_size; + hid_t tid; + - /*------------------------------------------------------------------------- - * H5T_NATIVE_LDOUBLE - *------------------------------------------------------------------------- - */ - - long double data15[3][2] ={{1,1},{1,1},{1,1}}; - - write_dset(gid1,2,dims2,"ld",H5T_NATIVE_LDOUBLE,data15); + + write_dset(gid3,1,dims1,"dset1",H5T_NATIVE_DOUBLE,NULL); + write_dset(gid3,1,dims1,"dset2",H5T_NATIVE_DOUBLE,data2); + write_dset(gid3,1,dims1,"dset3",H5T_NATIVE_INT,data3); + write_dset(gid3,2,dims2,"dset4",H5T_NATIVE_INT,data4); + write_dset(gid3,2,dims3,"dset5",H5T_NATIVE_INT,data5); + write_dset(gid3,2,dims2,"dset6",H5T_NATIVE_UINT,data6); + + /* case of compound with different type members */ + type_size = sizeof( cmp1_t ); + tid = H5Tcreate (H5T_COMPOUND, type_size ); + H5Tinsert(tid, "d", HOFFSET( cmp1_t, d ), H5T_NATIVE_DOUBLE ); + H5Tinsert(tid, "i", HOFFSET( cmp1_t, i ), H5T_NATIVE_INT ); + write_dset(gid3,1,dims4,"dset7",tid,data7); + H5Tclose(tid); + + type_size = sizeof( cmp2_t ); + tid = H5Tcreate (H5T_COMPOUND, type_size ); + H5Tinsert(tid, "i", HOFFSET( cmp2_t, i ), H5T_NATIVE_INT ); + H5Tinsert(tid, "d", HOFFSET( cmp2_t, d ), H5T_NATIVE_DOUBLE ); + write_dset(gid3,1,dims4,"dset8",tid,data8); + H5Tclose(tid); + + /* case of compound with different number of members */ + type_size = sizeof( cmp3_t ); + tid = H5Tcreate (H5T_COMPOUND, type_size ); + H5Tinsert(tid, "i", HOFFSET( cmp2_t, i ), H5T_NATIVE_INT ); + write_dset(gid3,1,dims4,"dset9",tid,NULL); + H5Tclose(tid); } -#endif /* H5_SIZEOF_LONG_DOUBLE */ /*------------------------------------------------------------------------- @@ -328,7 +395,6 @@ out: } - /*------------------------------------------------------------------------- * Function: test_types * diff --git a/tools/h5diff/testfiles/h5diff_10.txt b/tools/h5diff/testfiles/h5diff_10.txt index 9e33a46..38246d9 100644 --- a/tools/h5diff/testfiles/h5diff_10.txt +++ b/tools/h5diff/testfiles/h5diff_10.txt @@ -9,10 +9,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -28,7 +29,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_16_1.txt b/tools/h5diff/testfiles/h5diff_16_1.txt index 6155ebf..39569fe 100644 --- a/tools/h5diff/testfiles/h5diff_16_1.txt +++ b/tools/h5diff/testfiles/h5diff_16_1.txt @@ -11,3 +11,4 @@ position dset5 dset6 difference relative -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_16_3.txt b/tools/h5diff/testfiles/h5diff_16_3.txt index 6da24cf..349963a 100644 --- a/tools/h5diff/testfiles/h5diff_16_3.txt +++ b/tools/h5diff/testfiles/h5diff_16_3.txt @@ -11,3 +11,4 @@ position dset9 dset10 difference relative -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_17.txt b/tools/h5diff/testfiles/h5diff_17.txt index 9c81c68..8437440 100644 --- a/tools/h5diff/testfiles/h5diff_17.txt +++ b/tools/h5diff/testfiles/h5diff_17.txt @@ -22,6 +22,15 @@ file1 file2 x /g1/fp2 x /g1/ld x /g2 + x /g2/dset1 + x /g2/dset2 + x /g2/dset3 + x /g2/dset4 + x /g2/dset5 + x /g2/dset6 + x /g2/dset7 + x /g2/dset8 + x /g2/dset9 group : and 0 differences found diff --git a/tools/h5diff/testfiles/h5diff_20.txt b/tools/h5diff/testfiles/h5diff_20.txt index e383972..b05d4ff 100644 --- a/tools/h5diff/testfiles/h5diff_20.txt +++ b/tools/h5diff/testfiles/h5diff_20.txt @@ -2,3 +2,4 @@ Comparison not possible: is of type H5G_DATASET and is of type H5G -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_200.txt b/tools/h5diff/testfiles/h5diff_200.txt new file mode 100644 index 0000000..56d723d --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_200.txt @@ -0,0 +1,4 @@ +-------------------------------- +Some objects are not comparable +-------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_201.txt b/tools/h5diff/testfiles/h5diff_201.txt new file mode 100644 index 0000000..599cc2b --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_201.txt @@ -0,0 +1 @@ + or are empty datasets diff --git a/tools/h5diff/testfiles/h5diff_202.txt b/tools/h5diff/testfiles/h5diff_202.txt new file mode 100644 index 0000000..a881cf5 --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_202.txt @@ -0,0 +1,2 @@ + is of class H5T_FLOAT and is of class H5T_INTEGER + has sign H5T_SGN_ERROR and has sign H5T_SGN_2 diff --git a/tools/h5diff/testfiles/h5diff_203.txt b/tools/h5diff/testfiles/h5diff_203.txt new file mode 100644 index 0000000..aea1891 --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_203.txt @@ -0,0 +1,2 @@ + has rank 1, dimensions [6], max dimensions [6] + has rank 2, dimensions [3x2], max dimensions [3x2] diff --git a/tools/h5diff/testfiles/h5diff_204.txt b/tools/h5diff/testfiles/h5diff_204.txt new file mode 100644 index 0000000..66b9e63 --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_204.txt @@ -0,0 +1,2 @@ + has rank 2, dimensions [3x2], max dimensions [3x2] + has rank 2, dimensions [2x2], max dimensions [2x2] diff --git a/tools/h5diff/testfiles/h5diff_205.txt b/tools/h5diff/testfiles/h5diff_205.txt new file mode 100644 index 0000000..f7360ab --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_205.txt @@ -0,0 +1,3 @@ + has rank 2, dimensions [2x2], max dimensions [2x2] + has rank 2, dimensions [3x2], max dimensions [3x2] + has sign H5T_SGN_2 and has sign H5T_SGN_NONE diff --git a/tools/h5diff/testfiles/h5diff_206.txt b/tools/h5diff/testfiles/h5diff_206.txt new file mode 100644 index 0000000..8bbbb9a --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_206.txt @@ -0,0 +1 @@ + has a class H5T_FLOAT and has a class H5T_INTEGER diff --git a/tools/h5diff/testfiles/h5diff_207.txt b/tools/h5diff/testfiles/h5diff_207.txt new file mode 100644 index 0000000..833afe8 --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_207.txt @@ -0,0 +1,2 @@ + or are empty datasets + has 2 members has 1 members diff --git a/tools/h5diff/testfiles/h5diff_21.txt b/tools/h5diff/testfiles/h5diff_21.txt index d5b0443..f259d06 100644 --- a/tools/h5diff/testfiles/h5diff_21.txt +++ b/tools/h5diff/testfiles/h5diff_21.txt @@ -2,3 +2,4 @@ Comparison not possible: is of type H5G_DATASET and is of type H5G -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_22.txt b/tools/h5diff/testfiles/h5diff_22.txt index d8714a0..690147a 100644 --- a/tools/h5diff/testfiles/h5diff_22.txt +++ b/tools/h5diff/testfiles/h5diff_22.txt @@ -2,3 +2,4 @@ Comparison not possible: is of type H5G_DATASET and is of type H5G -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_57.txt b/tools/h5diff/testfiles/h5diff_57.txt index 590d355..c1a0d64 100644 --- a/tools/h5diff/testfiles/h5diff_57.txt +++ b/tools/h5diff/testfiles/h5diff_57.txt @@ -2,8 +2,9 @@ dataset: and Warning: different storage datatype has file datatype H5T_STD_I8LE has file datatype H5T_STD_U8LE -Comparison not supported: has sign H5T_SGN_2 and has sign H5T_SGN_NONE + has sign H5T_SGN_2 and has sign H5T_SGN_NONE 0 differences found -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_600.txt b/tools/h5diff/testfiles/h5diff_600.txt index 8f29888..17af208 100644 --- a/tools/h5diff/testfiles/h5diff_600.txt +++ b/tools/h5diff/testfiles/h5diff_600.txt @@ -9,10 +9,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -28,7 +29,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_603.txt b/tools/h5diff/testfiles/h5diff_603.txt index ce5057c..30fe246 100644 --- a/tools/h5diff/testfiles/h5diff_603.txt +++ b/tools/h5diff/testfiles/h5diff_603.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_604.txt b/tools/h5diff/testfiles/h5diff_604.txt index ba31fd5..9357b26 100644 --- a/tools/h5diff/testfiles/h5diff_604.txt +++ b/tools/h5diff/testfiles/h5diff_604.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_605.txt b/tools/h5diff/testfiles/h5diff_605.txt index c4aa9e6..1c99713 100644 --- a/tools/h5diff/testfiles/h5diff_605.txt +++ b/tools/h5diff/testfiles/h5diff_605.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_606.txt b/tools/h5diff/testfiles/h5diff_606.txt index bf7f1bf..0567106 100644 --- a/tools/h5diff/testfiles/h5diff_606.txt +++ b/tools/h5diff/testfiles/h5diff_606.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_612.txt b/tools/h5diff/testfiles/h5diff_612.txt index d2b1941..505705b 100644 --- a/tools/h5diff/testfiles/h5diff_612.txt +++ b/tools/h5diff/testfiles/h5diff_612.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_613.txt b/tools/h5diff/testfiles/h5diff_613.txt index 7fd1b04..1a89746 100644 --- a/tools/h5diff/testfiles/h5diff_613.txt +++ b/tools/h5diff/testfiles/h5diff_613.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_614.txt b/tools/h5diff/testfiles/h5diff_614.txt index b085c75..ec12818 100644 --- a/tools/h5diff/testfiles/h5diff_614.txt +++ b/tools/h5diff/testfiles/h5diff_614.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_615.txt b/tools/h5diff/testfiles/h5diff_615.txt index 2b34700..8528c0e 100644 --- a/tools/h5diff/testfiles/h5diff_615.txt +++ b/tools/h5diff/testfiles/h5diff_615.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_621.txt b/tools/h5diff/testfiles/h5diff_621.txt index 4903963..96d6c3f 100644 --- a/tools/h5diff/testfiles/h5diff_621.txt +++ b/tools/h5diff/testfiles/h5diff_621.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_622.txt b/tools/h5diff/testfiles/h5diff_622.txt index 4da5041..9dc3751 100644 --- a/tools/h5diff/testfiles/h5diff_622.txt +++ b/tools/h5diff/testfiles/h5diff_622.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_623.txt b/tools/h5diff/testfiles/h5diff_623.txt index cf8db3f..a02f5ea 100644 --- a/tools/h5diff/testfiles/h5diff_623.txt +++ b/tools/h5diff/testfiles/h5diff_623.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_624.txt b/tools/h5diff/testfiles/h5diff_624.txt index b07033b..396a007 100644 --- a/tools/h5diff/testfiles/h5diff_624.txt +++ b/tools/h5diff/testfiles/h5diff_624.txt @@ -10,10 +10,11 @@ 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, --compare List objects that are not comparable + -N, --nan Avoid NaNs detection -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 - -N, --nan Avoid NaNs detection C - is a positive integer D - is a positive number. Compare criteria is |a - b| > D @@ -29,7 +30,7 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] Compare criteria If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files. + with the same absolute path in both files The compare criteria is: 1) datasets: numerical array differences 2) groups: name string difference diff --git a/tools/h5diff/testfiles/h5diff_70.txt b/tools/h5diff/testfiles/h5diff_70.txt index a89cfdc..84df239 100644 --- a/tools/h5diff/testfiles/h5diff_70.txt +++ b/tools/h5diff/testfiles/h5diff_70.txt @@ -1793,3 +1793,4 @@ position float3D of float3D of difference -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_80.txt b/tools/h5diff/testfiles/h5diff_80.txt index 3051ba4..59d3914 100644 --- a/tools/h5diff/testfiles/h5diff_80.txt +++ b/tools/h5diff/testfiles/h5diff_80.txt @@ -872,3 +872,4 @@ group : and -------------------------------- Some objects are not comparable -------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_90.txt b/tools/h5diff/testfiles/h5diff_90.txt index 0a9f86e..e787c21 100644 --- a/tools/h5diff/testfiles/h5diff_90.txt +++ b/tools/h5diff/testfiles/h5diff_90.txt @@ -6,6 +6,15 @@ file1 file2 x x /g1/dset2 x x /g1/dset4 x x /g2 + x x /g2/dset1 + x x /g2/dset2 + x x /g2/dset3 + x x /g2/dset4 + x x /g2/dset5 + x x /g2/dset6 + x x /g2/dset7 + x x /g2/dset8 + x x /g2/dset9 group : and 0 differences found @@ -17,5 +26,29 @@ dataset: and 0 differences found group : and 0 differences found +dataset: and + or are empty datasets +0 differences found +dataset: and +0 differences found +dataset: and +0 differences found +dataset: and +0 differences found +dataset: and +0 differences found +dataset: and +0 differences found +dataset: and +0 differences found +dataset: and +0 differences found +dataset: and + or are empty datasets +0 differences found group : and 0 differences found +-------------------------------- +Some objects are not comparable +-------------------------------- +Use -c for a list of objects. diff --git a/tools/h5diff/testfiles/h5diff_basic2.h5 b/tools/h5diff/testfiles/h5diff_basic2.h5 index 46285cf..932c34d 100644 Binary files a/tools/h5diff/testfiles/h5diff_basic2.h5 and b/tools/h5diff/testfiles/h5diff_basic2.h5 differ diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh index 2fc677e..594b505 100755 --- a/tools/h5diff/testh5diff.sh +++ b/tools/h5diff/testh5diff.sh @@ -570,6 +570,32 @@ TOOLTEST h5diff_101.txt -v $FILE1 $FILE1 g1/d1 g1/d2 TESTING $H5DIFF -v $SRCFILE1 $SRCFILE1 g1/fp1 g1/fp2 TOOLTEST h5diff_102.txt -v $FILE1 $FILE1 g1/fp1 g1/fp2 +# not comparable -c flag +TESTING $H5DIFF $SRCFILE2 $SRCFILE2 g2/dset1 g2/dset2 +TOOLTEST h5diff_200.txt $FILE2 $FILE2 g2/dset1 g2/dset2 + +TESTING $H5DIFF -c $SRCFILE2 $SRCFILE2 g2/dset1 g2/dset2 +TOOLTEST h5diff_201.txt -c $FILE2 $FILE2 g2/dset1 g2/dset2 + +TESTING $H5DIFF -c $SRCFILE2 $SRCFILE2 g2/dset2 g2/dset3 +TOOLTEST h5diff_202.txt -c $FILE2 $FILE2 g2/dset2 g2/dset3 + +TESTING $H5DIFF -c $SRCFILE2 $SRCFILE2 g2/dset3 g2/dset4 +TOOLTEST h5diff_203.txt -c $FILE2 $FILE2 g2/dset3 g2/dset4 + +TESTING $H5DIFF -c $SRCFILE2 $SRCFILE2 g2/dset4 g2/dset5 +TOOLTEST h5diff_204.txt -c $FILE2 $FILE2 g2/dset4 g2/dset5 + +TESTING $H5DIFF -c $SRCFILE2 $SRCFILE2 g2/dset5 g2/dset6 +TOOLTEST h5diff_205.txt -c $FILE2 $FILE2 g2/dset5 g2/dset6 + + +# not comparable in compound +TESTING $H5DIFF -c $SRCFILE2 $SRCFILE2 g2/dset7 g2/dset8 +TOOLTEST h5diff_206.txt -c $FILE2 $FILE2 g2/dset7 g2/dset8 + +TESTING $H5DIFF -c $SRCFILE2 $SRCFILE2 g2/dset8 g2/dset9 +TOOLTEST h5diff_207.txt -c $FILE2 $FILE2 g2/dset8 g2/dset9 # ############################################################################## diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h index bdad702..27e688d 100644 --- a/tools/lib/h5diff.h +++ b/tools/lib/h5diff.h @@ -25,7 +25,7 @@ */ typedef struct { - int m_quiet; /* quiet mide: no output at all */ + int m_quiet; /* quiet mode: no output at all */ int m_report; /* report mode: print the data */ int m_verbose; /* verbose mode: print the data, list of objcets, warnings */ int d; /* delta, absolute value to compare */ @@ -35,10 +35,11 @@ typedef struct { int n; /* count, compare up to count */ hsize_t count; /* count value */ int err_stat; /* an error ocurred (1, error, 0, no error) */ - int cmn_objs; /* do we have comparable objects */ + int cmn_objs; /* do we have common objects */ int not_cmp; /* are the objects comparable */ int contents; /* equal contents */ int do_nans; /* consider Nans while diffing floats */ + int m_list_not_cmp; /* list not comparable messages */ } diff_opt_t; @@ -133,7 +134,8 @@ int diff_can_type( hid_t f_type1, /* file data type */ hsize_t *maxdim2, const char *obj1_name, const char *obj2_name, - diff_opt_t *options ); + diff_opt_t *options, + int is_compound); hsize_t diff_attr(hid_t loc1_id, diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c index a8ac816..83a23cd 100644 --- a/tools/lib/h5diff_attr.c +++ b/tools/lib/h5diff_attr.c @@ -146,15 +146,11 @@ hsize_t diff_attr(hid_t loc1_id, NULL, name1, name2, - options)!=1) + options, + 0)!=1) { - if (options->m_verbose) - printf("Comparison not possible for attribute <%s>\n", - name1); - - options->not_cmp=1; - + if (H5Tclose(ftype1_id)<0) goto error; if (H5Tclose(ftype2_id)<0) diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c index 197ebd5..3b5527a 100644 --- a/tools/lib/h5diff_dset.c +++ b/tools/lib/h5diff_dset.c @@ -204,7 +204,7 @@ hsize_t diff_datasetid( hid_t did1, hsize_t storage_size1; hsize_t storage_size2; hsize_t nfound=0; /* number of differences found */ - int cmp=1; /* do diff or not */ + int can_compare=1; /* do diff or not */ void *buf1=NULL; void *buf2=NULL; void *sm_buf1=NULL; @@ -256,14 +256,12 @@ hsize_t diff_datasetid( hid_t did1, storage_size1=H5Dget_storage_size(did1); storage_size2=H5Dget_storage_size(did2); - if (storage_size1<0 || storage_size2<0) - goto error; if (storage_size1==0 || storage_size2==0) { - if (options->m_verbose && obj1_name && obj2_name) + if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) printf("<%s> or <%s> are empty datasets\n", obj1_name, obj2_name); - cmp=0; + can_compare=0; options->not_cmp=1; } @@ -282,10 +280,10 @@ hsize_t diff_datasetid( hid_t did1, maxdim2, obj1_name, obj2_name, - options)!=1) + options, + 0)!=1) { - cmp=0; - options->not_cmp=1; + can_compare=0; } /*------------------------------------------------------------------------- @@ -310,13 +308,13 @@ hsize_t diff_datasetid( hid_t did1, sign2=H5Tget_sign(m_tid2); if ( sign1 != sign2 ) { - if (options->m_verbose && obj1_name) + if ((options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) { - printf("Comparison not supported: <%s> has sign %s ", obj1_name, get_sign(sign1)); + printf("<%s> has sign %s ", obj1_name, get_sign(sign1)); printf("and <%s> has sign %s\n", obj2_name, get_sign(sign2)); } - cmp=0; + can_compare=0; options->not_cmp=1; } @@ -324,7 +322,7 @@ hsize_t diff_datasetid( hid_t did1, * only attempt to compare if possible *------------------------------------------------------------------------- */ - if (cmp) + if (can_compare ) /* it is possible to compare */ { /*------------------------------------------------------------------------- @@ -494,10 +492,8 @@ hsize_t diff_datasetid( hid_t did1, if ( H5Dread(did2,m_tid2,sm_space,sid2,H5P_DEFAULT,sm_buf2) < 0 ) goto error; - /* get array differences. in the case of hyperslab read, increment the - number of differences found in each hyperslab and pass the - position at the beggining for printing - */ + /* get array differences. in the case of hyperslab read, increment the number of differences + found in each hyperslab and pass the position at the beggining for printing */ nfound += diff_array(sm_buf1, sm_buf2, hs_nelmts, @@ -543,8 +539,7 @@ hsize_t diff_datasetid( hid_t did1, } } /* hyperslab read */ - - }/*cmp*/ + }/*can_compare*/ /*------------------------------------------------------------------------- * compare attributes @@ -635,21 +630,21 @@ error: } /*------------------------------------------------------------------------- - * Function: diff_can_type - * - * Purpose: check for comparable TYPE and SPACE - * - * Return: - * 1, can compare - * 0, cannot compare - * -1, error - * - * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu - * - * Date: November 3, 2003 - * - *------------------------------------------------------------------------- - */ +* Function: diff_can_type +* +* Purpose: check for comparable TYPE and SPACE +* +* Return: +* 1, can compare +* 0, cannot compare +* -1, error +* +* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu +* +* Date: November 3, 2003 +* +*------------------------------------------------------------------------- +*/ int diff_can_type( hid_t f_tid1, /* file data type */ hid_t f_tid2, /* file data type */ @@ -661,20 +656,24 @@ int diff_can_type( hid_t f_tid1, /* file data type */ hsize_t *maxdim2, const char *obj1_name, const char *obj2_name, - diff_opt_t *options ) + diff_opt_t *options, + int is_compound) { + + H5T_class_t tclass1; H5T_class_t tclass2; int maxdim_diff=0; /* maximum dimensions are different */ int dim_diff=0; /* current dimensions are different */ int i; + int can_compare = 1; /* return value */ - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * check for the same class *------------------------------------------------------------------------- */ - if ((tclass1=H5Tget_class(f_tid1)) < 0) + if ((tclass1=H5Tget_class(f_tid1)) < 0) return -1; if ((tclass2=H5Tget_class(f_tid2)) < 0) @@ -682,16 +681,38 @@ int diff_can_type( hid_t f_tid1, /* file data type */ if ( tclass1 != tclass2 ) { - if (options->m_verbose && obj1_name) + + if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) { - printf("Comparison not possible: <%s> is of class %s and <%s> is of class %s\n", - obj1_name, get_class(tclass1), - obj2_name, get_class(tclass2) ); + + if ( is_compound ) + { + + printf("<%s> has a class %s and <%s> has a class %s\n", + obj1_name, get_class(tclass1), + obj2_name, get_class(tclass2) ); + + } + + else + + { + + printf("<%s> is of class %s and <%s> is of class %s\n", + obj1_name, get_class(tclass1), + obj2_name, get_class(tclass2) ); + + } + } - return 0; + + + can_compare = 0; + options->not_cmp = 1; + return can_compare; } - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * check for non supported classes *------------------------------------------------------------------------- */ @@ -713,22 +734,30 @@ int diff_can_type( hid_t f_tid1, /* file data type */ break; default: /*H5T_TIME */ - if (options->m_verbose && obj1_name ) - printf("Comparison not supported: <%s> and <%s> are of class %s\n", - obj1_name,obj2_name,get_class(tclass2) ); - return 0; + + + if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) + { + printf("<%s> and <%s> are of class %s\n", + obj1_name,obj2_name,get_class(tclass2) ); + } + can_compare = 0; + options->not_cmp = 1; + return can_compare; } - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * check for equal file datatype; warning only *------------------------------------------------------------------------- */ - if ( (H5Tequal(f_tid1, f_tid2)==0) && options->m_verbose && obj1_name) + if ( (H5Tequal(f_tid1, f_tid2)==0) && + (options->m_verbose) && obj1_name && obj2_name) { H5T_class_t cl = H5Tget_class(f_tid1); - + + printf("Warning: different storage datatype\n"); if ( cl == H5T_INTEGER || cl == H5T_FLOAT ) { @@ -739,18 +768,22 @@ int diff_can_type( hid_t f_tid1, /* file data type */ print_type(f_tid2); printf("\n"); } + + + } - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * check for the same rank *------------------------------------------------------------------------- */ if ( rank1 != rank2 ) { - if (options->m_verbose && obj1_name) + + if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) { - printf("Comparison not supported: <%s> has rank %d, dimensions ", obj1_name, rank1); + printf("<%s> has rank %d, dimensions ", obj1_name, rank1); print_dimensions(rank1,dims1); printf(", max dimensions "); print_dimensions(rank1,maxdim1); @@ -759,11 +792,15 @@ int diff_can_type( hid_t f_tid1, /* file data type */ print_dimensions(rank2,dims2); printf(", max dimensions "); print_dimensions(rank2,maxdim2); + printf("\n"); } - return 0; + + can_compare = 0; + options->not_cmp = 1; + return can_compare; } - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * check for different dimensions *------------------------------------------------------------------------- */ @@ -780,16 +817,16 @@ int diff_can_type( hid_t f_tid1, /* file data type */ dim_diff=1; } - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * current dimensions *------------------------------------------------------------------------- */ if (dim_diff==1) { - if (options->m_verbose && obj1_name) + if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) { - printf("Comparison not supported: <%s> has rank %d, dimensions ", obj1_name, rank1); + printf("<%s> has rank %d, dimensions ", obj1_name, rank1); print_dimensions(rank1,dims1); if (maxdim1 && maxdim2) { @@ -800,19 +837,26 @@ int diff_can_type( hid_t f_tid1, /* file data type */ print_dimensions(rank2,dims2); printf(", max dimensions "); print_dimensions(rank2,maxdim2); + printf("\n"); } } - return 0; + + + can_compare = 0; + options->not_cmp = 1; + return can_compare; + + + } - /*------------------------------------------------------------------------- + /*------------------------------------------------------------------------- * maximum dimensions; just give a warning *------------------------------------------------------------------------- */ if (maxdim1 && maxdim2 && maxdim_diff==1 && obj1_name ) { - if (options->m_verbose) - { + if (options->m_verbose) { printf( "Warning: different maximum dimensions\n"); printf("<%s> has max dimensions ", obj1_name); print_dimensions(rank1,maxdim1); @@ -822,10 +866,79 @@ int diff_can_type( hid_t f_tid1, /* file data type */ printf("\n"); } } + + + if ( tclass1 == H5T_COMPOUND ) + { + + int nmembs1; + int nmembs2; + int j; + hid_t memb_type1; + hid_t memb_type2; + + nmembs1 = H5Tget_nmembers(f_tid1); + nmembs2 = H5Tget_nmembers(f_tid2); + + if ( nmembs1 != nmembs2 ) + { + + if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) + { + printf("<%s> has %d members ", obj1_name, nmembs1); + printf("<%s> has %d members ", obj2_name, nmembs2); + printf("\n"); + } + + can_compare = 0; + options->not_cmp = 1; + return can_compare; + } + + for (j = 0; j < nmembs1; j++) + { + memb_type1 = H5Tget_member_type(f_tid1, (unsigned)j); + memb_type2 = H5Tget_member_type(f_tid2, (unsigned)j); + + if (diff_can_type(memb_type1, + memb_type2, + rank1, + rank2, + dims1, + dims2, + maxdim1, + maxdim2, + obj1_name, + obj2_name, + options, + 1)!=1) + { + can_compare = 0; + options->not_cmp = 1; + H5Tclose(memb_type1); + H5Tclose(memb_type2); + return can_compare; + } + + H5Tclose(memb_type1); + H5Tclose(memb_type2); + + } + + + + + + } - return 1; + + + + + return can_compare; } + /*------------------------------------------------------------------------- * Function: print_sizes * -- cgit v0.12