[svn-r6469] Purpose:

h5diff bug fix, enhancements
Description:
    the case for 8 byte integers was not handled
    added more checking of wrong input data
Solution:
    added the size 8 integer case
Platforms tested:
    w2000, linux, solaris (64 mode)
This commit is contained in:
Pedro Vicente Nunes
2003-03-06 12:09:41 -05:00
parent 8831302db5
commit 140ad8b106

View File

@@ -182,6 +182,11 @@ int main(int argc, const char *argv[])
for (s=argv[argno]+1; *s; s++)
{
switch (*s) {
default:
printf("-%s is an invalid option\n", s );
usage(progname);
exit(EXIT_SUCCESS);
break;
case 'h':
usage(progname);
exit(EXIT_SUCCESS);
@@ -771,41 +776,6 @@ int diff_dataset( hid_t file1_id, hid_t file2_id, const char *obj1_name,
type_mem = fixtype( type1_id );
#if 0
switch(tclass1)
{
case H5T_INTEGER:
switch(type1_size)
{
case 1:
type_native = H5T_NATIVE_CHAR;
break;
case 2:
type_native = H5T_NATIVE_SHORT;
break;
case 4:
type_native = H5T_NATIVE_INT;
break;
}
break; /*switch*/
case H5T_FLOAT:
switch(type1_size)
{
case 4:
type_native = H5T_NATIVE_FLOAT;
break;
case 8:
type_native = H5T_NATIVE_DOUBLE;
break;
} /*switch*/
break;
} /*switch*/
#endif
/*-------------------------------------------------------------------------
* read
*-------------------------------------------------------------------------
@@ -877,6 +847,7 @@ int array_diff( void *buf1, void *buf2, hsize_t tot_cnt, hid_t type_id, int rank
char *i1ptr1, *i1ptr2;
short *i2ptr1, *i2ptr2;
int *i4ptr1, *i4ptr2;
long *i8ptr1, *i8ptr2;
float *fptr1, *fptr2;
double *dptr1, *dptr2;
int nfound = 0; /* number of differences found */
@@ -904,7 +875,6 @@ int array_diff( void *buf1, void *buf2, hsize_t tot_cnt, hid_t type_id, int rank
printf("%-15s %-15s %-15s %-20s\n", "position", obj1_name, obj2_name, "difference");
printf("------------------------------------------------------------\n");
switch(type_class)
{
case H5T_INTEGER:
@@ -1068,7 +1038,7 @@ int array_diff( void *buf1, void *buf2, hsize_t tot_cnt, hid_t type_id, int rank
{
print_pos( i, acc, pos, rank );
printf(SPACES);
printf(IFORMAT, *i2ptr1, *i2ptr2, *i2ptr1 - *i2ptr2);
printf(IFORMAT, *i2ptr1, *i2ptr2, abs(*i2ptr1 - *i2ptr2));
}
nfound++;
}
@@ -1085,9 +1055,10 @@ int array_diff( void *buf1, void *buf2, hsize_t tot_cnt, hid_t type_id, int rank
case 4:
i4ptr1 = (int *) buf1;
i4ptr2 = (int *) buf2;
for ( i = 0; i < tot_cnt; i++)
{
/* delta but not percentage */
if ( options.d_ && !options.p_ )
{
@@ -1153,12 +1124,108 @@ int array_diff( void *buf1, void *buf2, hsize_t tot_cnt, hid_t type_id, int rank
printf(IFORMAT, *i4ptr1, *i4ptr2, abs(*i4ptr1 - *i4ptr2));
}
nfound++;
}
}
i4ptr1++; i4ptr2++;
}
} /*for */
break;
/*-------------------------------------------------------------------------
* H5T_INTEGER 8
*-------------------------------------------------------------------------
*/
case 8:
i8ptr1 = (long *) buf1;
i8ptr2 = (long *) buf2;
for ( i = 0; i < tot_cnt; i++)
{
#if 0
print_pos( i, acc, pos, rank );
printf(SPACES);
printf(IFORMAT, *i8ptr1, *i8ptr2, abs(*i8ptr1 - *i8ptr2));
#else
/* delta but not percentage */
if ( options.d_ && !options.p_ )
{
if ( options.n_ && nfound>=options.n_number_count)
return nfound;
if ( abs(*i8ptr1 - *i8ptr2) > options.d_delta )
{
if ( options.r_==0 )
{
print_pos( i, acc, pos, rank );
printf(SPACES);
printf(IFORMAT, *i8ptr1, *i8ptr2, abs(*i8ptr1 - *i8ptr2));
}
nfound++;
}
}
/* percentage but not delta */
else if ( !options.d_ && options.p_ )
{
if ( abs(1 - *i8ptr1 / *i8ptr2) > options.p_relative )
{
if ( options.n_ && nfound>=options.n_number_count)
return nfound;
if ( options.r_==0 )
{
print_pos( i, acc, pos, rank );
printf(SPACES);
printf(IFORMAT, *i8ptr1, *i8ptr2, abs(*i8ptr1 - *i8ptr2));
}
nfound++;
}
}
/* percentage and delta */
else if ( options.d_ && options.p_ )
{
if ( abs(1 - *i8ptr1 / *i8ptr2) > options.p_relative &&
abs(*i8ptr1 - *i8ptr2) > options.d_delta )
{
if ( options.n_ && nfound>=options.n_number_count)
return nfound;
if ( options.r_==0 )
{
print_pos( i, acc, pos, rank );
printf(SPACES);
printf(IFORMAT, *i8ptr1, *i8ptr2, abs(*i8ptr1 - *i8ptr2));
}
nfound++;
}
}
else
if (*i8ptr1 != *i8ptr2)
{
if ( options.n_ && nfound>=options.n_number_count)
return nfound;
if ( options.r_==0 )
{
print_pos( i, acc, pos, rank );
printf(SPACES);
printf(IFORMAT, *i8ptr1, *i8ptr2, abs(*i8ptr1 - *i8ptr2));
}
nfound++;
}
#endif
i8ptr1++; i8ptr2++;
} /*for */
break;
default:
printf("no valid H5T_INTEGER size found" );
break;
} /*switch*/
@@ -1346,6 +1413,10 @@ position dset5 dset6 difference
break;
default:
printf("no valid H5T_FLOAT size found" );
break;
} /*switch*/
@@ -1501,14 +1572,19 @@ hid_t fixtype(hid_t f_type)
*/
if (size <= sizeof(char)) {
m_type = H5Tcopy(H5T_NATIVE_SCHAR);
printf("using memory type H5T_NATIVE_SCHAR\n");
} else if (size <= sizeof(short)) {
m_type = H5Tcopy(H5T_NATIVE_SHORT);
printf("using memory type H5T_NATIVE_SHORT\n");
} else if (size <= sizeof(int)) {
m_type = H5Tcopy(H5T_NATIVE_INT);
printf("using memory type H5T_NATIVE_INT\n");
} else if (size <= sizeof(long)) {
m_type = H5Tcopy(H5T_NATIVE_LONG);
printf("using memory type H5T_NATIVE_LONG\n");
} else {
m_type = H5Tcopy(H5T_NATIVE_LLONG);
printf("using memory type H5T_NATIVE_LLONG\n");
}
H5Tset_sign(m_type, H5Tget_sign(f_type));
@@ -1522,10 +1598,13 @@ hid_t fixtype(hid_t f_type)
*/
if (size <= sizeof(float)) {
m_type = H5Tcopy(H5T_NATIVE_FLOAT);
printf("using memory type H5T_NATIVE_FLOAT\n");
} else if (size <= sizeof(double)) {
m_type = H5Tcopy(H5T_NATIVE_DOUBLE);
printf("using memory type H5T_NATIVE_DOUBLE\n");
} else {
m_type = H5Tcopy(H5T_NATIVE_LDOUBLE);
printf("using memory type H5T_NATIVE_LDOUBLE\n");
}
break;
@@ -1563,11 +1642,6 @@ int do_test_files()
char data10[] = {"A string"};
long data11[7] = {1,1,1,1,1,1,1};
long data12[7] = {1,1,1,4,5,6,7};
/* attribute */
size_t size_attr = 5;
float attr_data1[5] = {1,2,3,4,5};
float attr_data2[5] = {1,2.1f,3.01f,4.001f,5.00001f};
herr_t status;
/*-------------------------------------------------------------------------