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