From 5b5ce1f7d4743b3edef7680c28b444d9d1959e8f Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Wed, 11 Jan 2006 14:23:38 -0500 Subject: [svn-r11879] Purpose: bug fix a call to sprintf was giving incorrect output in the system Fedora Core 4 with gcc 4.0 (not supported by us, but user reported) Solution: the call was using the same buffer for source and destination variables, used different ones Platforms tested: linux (mir) solaris (sol) Misc. update: --- tools/lib/h5diff_attr.c | 461 ++++++++++++++++++++++++------------------------ 1 file changed, 232 insertions(+), 229 deletions(-) diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c index aa52d8b..439bc9c 100644 --- a/tools/lib/h5diff_attr.c +++ b/tools/lib/h5diff_attr.c @@ -38,11 +38,11 @@ */ int diff_attr(hid_t loc1_id, - hid_t loc2_id, - const char *path1, - const char *path2, - diff_opt_t *options - ) + hid_t loc2_id, + const char *path1, + const char *path2, + diff_opt_t *options + ) { hid_t attr1_id=-1; /* attr ID */ hid_t attr2_id=-1; /* attr ID */ @@ -61,252 +61,255 @@ int diff_attr(hid_t loc1_id, int rank2; /* rank of dataset */ hsize_t dims1[H5S_MAX_RANK];/* dimensions of dataset */ hsize_t dims2[H5S_MAX_RANK];/* dimensions of dataset */ - char name1[255]; - char name2[255]; + char name1[512]; + char name2[512]; + char np1[512]; + char np2[512]; int n1, n2, i, j; int ret=0; hsize_t nfound; int cmp=1; if ((n1 = H5Aget_num_attrs(loc1_id))<0) - goto error; + goto error; if ((n2 = H5Aget_num_attrs(loc2_id))<0) - goto error; + goto error; if (n1!=n2) - return 1; + return 1; for ( i = 0; i < n1; i++) { - /* reset buffers for every attribute, we might goto out and call free */ - buf1=NULL; - buf2=NULL; - - /*------------------------------------------------------------------------- - * open - *------------------------------------------------------------------------- - */ - /* open attribute */ - if ((attr1_id = H5Aopen_idx(loc1_id, (unsigned)i))<0) - goto error; - if ((attr2_id = H5Aopen_idx(loc2_id, (unsigned)i))<0) - goto error; - - /* get name */ - if (H5Aget_name( attr1_id, 255, name1 )<0) - goto error; - if (H5Aget_name( attr2_id, 255, name2 )<0) - goto error; - - if (HDstrcmp(name1,name2)!=0) - { - if (options->m_verbose) - { - parallel_print("Different name for attributes: <%s> and <%s>\n", name1, name2); - } - H5Aclose(attr1_id); - H5Aclose(attr2_id); - ret=1; - continue; - } - - /* get the file datatype */ - if ((ftype1_id = H5Aget_type( attr1_id )) < 0 ) - goto error; - if ((ftype2_id = H5Aget_type( attr2_id )) < 0 ) - goto error; - - /* get the dataspace handle */ - if ((space1_id = H5Aget_space( attr1_id )) < 0 ) - goto error; - if ((space2_id = H5Aget_space( attr2_id )) < 0 ) - goto error; - - /* get dimensions */ - if ( (rank1 = H5Sget_simple_extent_dims(space1_id, dims1, NULL)) < 0 ) - goto error; - if ( (rank2 = H5Sget_simple_extent_dims(space2_id, dims2, NULL)) < 0 ) - goto error; - - - /*------------------------------------------------------------------------- - * check for comparable TYPE and SPACE - *------------------------------------------------------------------------- - */ - - if (diff_can_type(ftype1_id, - ftype2_id, - rank1, - rank2, - dims1, - dims2, - NULL, - NULL, - name1, - name2, - options)!=1) + /* reset buffers for every attribute, we might goto out and call free */ + buf1=NULL; + buf2=NULL; + + /*------------------------------------------------------------------------- + * open + *------------------------------------------------------------------------- + */ + /* open attribute */ + if ((attr1_id = H5Aopen_idx(loc1_id, (unsigned)i))<0) + goto error; + if ((attr2_id = H5Aopen_idx(loc2_id, (unsigned)i))<0) + goto error; + + /* get name */ + if (H5Aget_name( attr1_id, 255, name1 )<0) + goto error; + if (H5Aget_name( attr2_id, 255, name2 )<0) + goto error; + + if (HDstrcmp(name1,name2)!=0) { - cmp=0; + if (options->m_verbose) + { + parallel_print("Different name for attributes: <%s> and <%s>\n", name1, name2); + } + H5Aclose(attr1_id); + H5Aclose(attr2_id); + ret=1; + continue; + } + + /* get the file datatype */ + if ((ftype1_id = H5Aget_type( attr1_id )) < 0 ) + goto error; + if ((ftype2_id = H5Aget_type( attr2_id )) < 0 ) + goto error; + + /* get the dataspace handle */ + if ((space1_id = H5Aget_space( attr1_id )) < 0 ) + goto error; + if ((space2_id = H5Aget_space( attr2_id )) < 0 ) + goto error; + + /* get dimensions */ + if ( (rank1 = H5Sget_simple_extent_dims(space1_id, dims1, NULL)) < 0 ) + goto error; + if ( (rank2 = H5Sget_simple_extent_dims(space2_id, dims2, NULL)) < 0 ) + goto error; + + + /*------------------------------------------------------------------------- + * check for comparable TYPE and SPACE + *------------------------------------------------------------------------- + */ + + if (diff_can_type(ftype1_id, + ftype2_id, + rank1, + rank2, + dims1, + dims2, + NULL, + NULL, + name1, + name2, + options)!=1) + { + cmp=0; options->not_cmp=1; } - /*------------------------------------------------------------------------- - * only attempt to compare if possible - *------------------------------------------------------------------------- - */ - if (cmp) - { - - /*------------------------------------------------------------------------- - * read to memory - *------------------------------------------------------------------------- - */ - nelmts1=1; - for (j=0; j",name1,path1); - sprintf(name2,"%s of <%s>",name2,path2); - - /* always print name */ - if (options->m_verbose) - { - parallel_print( "Attribute: <%s> and <%s>\n",name1,name2); - nfound = diff_array(buf1, - buf2, - nelmts1, - rank1, - dims1, - options, - name1, - name2, - mtype1_id, - attr1_id, - attr2_id); - print_found(nfound); - - } - /* check first if we have differences */ - else - { - if (options->m_quiet==0) - { - /* shut up temporarily */ - options->m_quiet=1; - nfound = diff_array(buf1, - buf2, - nelmts1, - rank1, - dims1, - options, - name1, - name2, - mtype1_id, - attr1_id, - attr2_id); - /* print again */ - options->m_quiet=0; - if (nfound) - { - parallel_print( "Attribute: <%s> and <%s>\n",name1,name2); - nfound = diff_array(buf1, - buf2, - nelmts1, - rank1, - dims1, - options, - name1, - name2, - mtype1_id, - attr1_id, - attr2_id); - print_found(nfound); - } /*if*/ - } /*if*/ - /* in quiet mode, just count differences */ - else - { - nfound = diff_array(buf1, - buf2, - nelmts1, - rank1, - dims1, - options, - name1, - name2, - mtype1_id, - attr1_id, - attr2_id); - } /*else quiet */ - } /*else verbose */ - }/*cmp*/ - - - - /*------------------------------------------------------------------------- - * close - *------------------------------------------------------------------------- - */ - - if (H5Tclose(ftype1_id)<0) goto error; - if (H5Tclose(ftype2_id)<0) goto error; - if (H5Tclose(mtype1_id)<0) goto error; - if (H5Tclose(mtype2_id)<0) goto error; - if (H5Sclose(space1_id)<0) goto error; - if (H5Sclose(space2_id)<0) goto error; - if (H5Aclose(attr1_id)<0) goto error; - if (H5Aclose(attr2_id)<0) goto error; - if (buf1) - HDfree(buf1); - if (buf2) - HDfree(buf2); + /*------------------------------------------------------------------------- + * only attempt to compare if possible + *------------------------------------------------------------------------- + */ + if (cmp) + { + + /*------------------------------------------------------------------------- + * read to memory + *------------------------------------------------------------------------- + */ + nelmts1=1; + for (j=0; j",name1,path1); + sprintf(np2,"%s of <%s>",name2,path2); + + /*------------------------------------------------------------------------- + * array compare + *------------------------------------------------------------------------- + */ + + /* always print name */ + if (options->m_verbose) + { + parallel_print( "Attribute: <%s> and <%s>\n",np1,np2); + nfound = diff_array(buf1, + buf2, + nelmts1, + rank1, + dims1, + options, + np1, + np2, + mtype1_id, + attr1_id, + attr2_id); + print_found(nfound); + + } + /* check first if we have differences */ + else + { + if (options->m_quiet==0) + { + /* shut up temporarily */ + options->m_quiet=1; + nfound = diff_array(buf1, + buf2, + nelmts1, + rank1, + dims1, + options, + np1, + np2, + mtype1_id, + attr1_id, + attr2_id); + /* print again */ + options->m_quiet=0; + if (nfound) + { + parallel_print( "Attribute: <%s> and <%s>\n",np1,np2); + nfound = diff_array(buf1, + buf2, + nelmts1, + rank1, + dims1, + options, + np1, + np2, + mtype1_id, + attr1_id, + attr2_id); + print_found(nfound); + } /*if*/ + } /*if*/ + /* in quiet mode, just count differences */ + else + { + nfound = diff_array(buf1, + buf2, + nelmts1, + rank1, + dims1, + options, + np1, + np2, + mtype1_id, + attr1_id, + attr2_id); + } /*else quiet */ + } /*else verbose */ + }/*cmp*/ + + + + /*------------------------------------------------------------------------- + * close + *------------------------------------------------------------------------- + */ + + if (H5Tclose(ftype1_id)<0) goto error; + if (H5Tclose(ftype2_id)<0) goto error; + if (H5Tclose(mtype1_id)<0) goto error; + if (H5Tclose(mtype2_id)<0) goto error; + if (H5Sclose(space1_id)<0) goto error; + if (H5Sclose(space2_id)<0) goto error; + if (H5Aclose(attr1_id)<0) goto error; + if (H5Aclose(attr2_id)<0) goto error; + if (buf1) + HDfree(buf1); + if (buf2) + HDfree(buf2); } /* i */ return ret; error: H5E_BEGIN_TRY { - H5Tclose(ftype1_id); - H5Tclose(ftype2_id); - H5Tclose(mtype1_id); - H5Tclose(mtype2_id); - H5Sclose(space1_id); - H5Sclose(space2_id); - H5Aclose(attr1_id); - H5Aclose(attr2_id); - if (buf1) - HDfree(buf1); - if (buf2) - HDfree(buf2); + H5Tclose(ftype1_id); + H5Tclose(ftype2_id); + H5Tclose(mtype1_id); + H5Tclose(mtype2_id); + H5Sclose(space1_id); + H5Sclose(space2_id); + H5Aclose(attr1_id); + H5Aclose(attr2_id); + if (buf1) + HDfree(buf1); + if (buf2) + HDfree(buf2); } H5E_END_TRY; options->err_stat=1; -- cgit v0.12