summaryrefslogtreecommitdiffstats
path: root/tools/h5diff/h5diff_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h5diff/h5diff_util.c')
-rw-r--r--tools/h5diff/h5diff_util.c421
1 files changed, 421 insertions, 0 deletions
diff --git a/tools/h5diff/h5diff_util.c b/tools/h5diff/h5diff_util.c
new file mode 100644
index 0000000..6ecd988
--- /dev/null
+++ b/tools/h5diff/h5diff_util.c
@@ -0,0 +1,421 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5diff.h"
+#include <assert.h>
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: h5diff_can_diff
+ *
+ * Purpose: Check if TYPE_ID is supported; only the listed types are
+ * supported in the current version
+ *
+ *-------------------------------------------------------------------------
+ */
+int h5diff_can_diff(hid_t type_id)
+{
+ int ret=0;
+ if ( (H5Tequal(type_id, H5T_NATIVE_FLOAT)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_DOUBLE)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_INT)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_UINT)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_SCHAR)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_UCHAR)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_SHORT)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_USHORT)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_LONG)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_ULONG)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_LLONG)==1)||
+ (H5Tequal(type_id, H5T_NATIVE_ULLONG)==1)
+ )
+ ret=1;
+ return ret;
+}
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_pos
+ *
+ * Purpose: convert an array index position to matrix notation
+ *
+ * Return: pos matrix array
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void print_pos( int *ph, int p, unsigned int curr_pos, int *acc,
+ int *pos, int rank, const char *obj1, const char *obj2 )
+{
+ int i;
+
+ /* print header */
+ if ( *ph==1 )
+ {
+ *ph=0;
+ if (p)
+ {
+ printf("%-15s %-15s %-15s %-15s %-15s\n", "position", obj1, obj2, "difference",
+ "relative");
+ printf("------------------------------------------------------------------------\n");
+ }
+ else
+ {
+ printf("%-15s %-15s %-15s %-20s\n", "position", obj1, obj2, "difference");
+ printf("------------------------------------------------------------\n");
+ }
+ }
+
+ for ( i = 0; i < rank; i++)
+ pos[i]=0;
+
+ for ( i = 0; i < rank; i++)
+ {
+ pos[i] = curr_pos/acc[i];
+ curr_pos -= acc[i]*pos[i];
+ }
+ assert( curr_pos == 0 );
+
+ printf("[ " );
+ for ( i = 0; i < rank; i++)
+ {
+ printf("%d ", pos[i] );
+ }
+ printf("]" );
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_dims
+ *
+ * Purpose: print dimensions
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ *-------------------------------------------------------------------------
+ */
+void print_dims( int r, hsize_t *d )
+{
+ int i;
+ printf("[ " );
+ for ( i=0; i<r; i++ )
+ printf("%d ",(int)d[i] );
+ printf("] " );
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_datatype
+ *
+ * Purpose: Print name of datatype
+ *
+ * Return:
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments: Adapted from h5dump for H5T_INTEGER and H5T_FLOAT classes only
+ *
+ *-------------------------------------------------------------------------
+ */
+void print_datatype(hid_t type)
+{
+ switch (H5Tget_class(type))
+ {
+ default:
+ return;
+ case H5T_INTEGER:
+ if (H5Tequal(type, H5T_STD_I8BE)) {
+ printf("H5T_STD_I8BE");
+ } else if (H5Tequal(type, H5T_STD_I8LE)) {
+ printf("H5T_STD_I8LE");
+ } else if (H5Tequal(type, H5T_STD_I16BE)) {
+ printf("H5T_STD_I16BE");
+ } else if (H5Tequal(type, H5T_STD_I16LE)) {
+ printf("H5T_STD_I16LE");
+ } else if (H5Tequal(type, H5T_STD_I32BE)) {
+ printf("H5T_STD_I32BE");
+ } else if (H5Tequal(type, H5T_STD_I32LE)) {
+ printf("H5T_STD_I32LE");
+ } else if (H5Tequal(type, H5T_STD_I64BE)) {
+ printf("H5T_STD_I64BE");
+ } else if (H5Tequal(type, H5T_STD_I64LE)) {
+ printf("H5T_STD_I64LE");
+ } else if (H5Tequal(type, H5T_STD_U8BE)) {
+ printf("H5T_STD_U8BE");
+ } else if (H5Tequal(type, H5T_STD_U8LE)) {
+ printf("H5T_STD_U8LE");
+ } else if (H5Tequal(type, H5T_STD_U16BE)) {
+ printf("H5T_STD_U16BE");
+ } else if (H5Tequal(type, H5T_STD_U16LE)) {
+ printf("H5T_STD_U16LE");
+ } else if (H5Tequal(type, H5T_STD_U32BE)) {
+ printf("H5T_STD_U32BE");
+ } else if (H5Tequal(type, H5T_STD_U32LE)) {
+ printf("H5T_STD_U32LE");
+ } else if (H5Tequal(type, H5T_STD_U64BE)) {
+ printf("H5T_STD_U64BE");
+ } else if (H5Tequal(type, H5T_STD_U64LE)) {
+ printf("H5T_STD_U64LE");
+ } else if (H5Tequal(type, H5T_NATIVE_SCHAR)) {
+ printf("H5T_NATIVE_SCHAR");
+ } else if (H5Tequal(type, H5T_NATIVE_UCHAR)) {
+ printf("H5T_NATIVE_UCHAR");
+ } else if (H5Tequal(type, H5T_NATIVE_SHORT)) {
+ printf("H5T_NATIVE_SHORT");
+ } else if (H5Tequal(type, H5T_NATIVE_USHORT)) {
+ printf("H5T_NATIVE_USHORT");
+ } else if (H5Tequal(type, H5T_NATIVE_INT)) {
+ printf("H5T_NATIVE_INT");
+ } else if (H5Tequal(type, H5T_NATIVE_UINT)) {
+ printf("H5T_NATIVE_UINT");
+ } else if (H5Tequal(type, H5T_NATIVE_LONG)) {
+ printf("H5T_NATIVE_LONG");
+ } else if (H5Tequal(type, H5T_NATIVE_ULONG)) {
+ printf("H5T_NATIVE_ULONG");
+ } else if (H5Tequal(type, H5T_NATIVE_LLONG)) {
+ printf("H5T_NATIVE_LLONG");
+ } else if (H5Tequal(type, H5T_NATIVE_ULLONG)) {
+ printf("H5T_NATIVE_ULLONG");
+ } else {
+ printf("undefined integer");
+ }
+ break;
+
+ case H5T_FLOAT:
+ if (H5Tequal(type, H5T_IEEE_F32BE)) {
+ printf("H5T_IEEE_F32BE");
+ } else if (H5Tequal(type, H5T_IEEE_F32LE)) {
+ printf("H5T_IEEE_F32LE");
+ } else if (H5Tequal(type, H5T_IEEE_F64BE)) {
+ printf("H5T_IEEE_F64BE");
+ } else if (H5Tequal(type, H5T_IEEE_F64LE)) {
+ printf("H5T_IEEE_F64LE");
+ } else if (H5Tequal(type, H5T_NATIVE_FLOAT)) {
+ printf("H5T_NATIVE_FLOAT");
+ } else if (H5Tequal(type, H5T_NATIVE_DOUBLE)) {
+ printf("H5T_NATIVE_DOUBLE");
+ } else if (H5Tequal(type, H5T_NATIVE_LDOUBLE)) {
+ printf("H5T_NATIVE_LDOUBLE");
+ } else {
+ printf("undefined float");
+ }
+ break;
+
+ }/*switch*/
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: h5diff_basename
+ *
+ * Purpose: Returns a pointer to the last component absolute name
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+h5diff_basename(const char *name)
+{
+ size_t i;
+
+ /* Find the end of the base name */
+ i = strlen(name);
+ while (i>0 && '/'==name[i-1])
+ --i;
+
+ /* Skip backward over base name */
+ while (i>0 && '/'!=name[i-1])
+ --i;
+
+ return(name+i);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: get_type
+ *
+ * Purpose: Returns the type as a string
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+get_type(int type)
+{
+ switch (type)
+ {
+ case H5G_DATASET:
+ return("H5G_DATASET");
+ case H5G_GROUP:
+ return("H5G_GROUP");
+ case H5G_TYPE:
+ return("H5G_TYPE");
+ case H5G_LINK:
+ return("H5G_LINK");
+ default:
+ return("user defined type");
+ }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: get_sign
+ *
+ * Purpose: Returns the sign as a string
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+get_sign(H5T_sign_t sign)
+{
+ switch (sign)
+ {
+ default:
+ return("H5T_SGN_ERROR");
+ case H5T_SGN_NONE:
+ return("H5T_SGN_NONE");
+ case H5T_SGN_2:
+ return("H5T_SGN_2");
+ }
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: get_class
+ *
+ * Purpose: Returns the class as a string
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+get_class(H5T_class_t tclass)
+{
+ switch (tclass)
+ {
+ default:
+ return("Invalid class");
+ case H5T_TIME:
+ return("H5T_TIME");
+ case H5T_INTEGER:
+ return("H5T_INTEGER");
+ case H5T_FLOAT:
+ return("H5T_FLOAT");
+ case H5T_STRING:
+ return("H5T_STRING");
+ case H5T_BITFIELD:
+ return("H5T_BITFIELD");
+ case H5T_OPAQUE:
+ return("H5T_OPAQUE");
+ case H5T_COMPOUND:
+ return("H5T_COMPOUND");
+ case H5T_REFERENCE:
+ return("H5T_REFERENCE");
+ case H5T_ENUM:
+ return("H5T_ENUM");
+ case H5T_VLEN:
+ return("H5T_VLEN");
+ case H5T_ARRAY:
+ return("H5T_ARRAY");
+ }
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_sizes
+ *
+ * Purpose: Print datatype sizes
+ *
+ *-------------------------------------------------------------------------
+ */
+#if defined (H5DIFF_DEBUG)
+void print_sizes( const char *obj1, const char *obj2,
+ hid_t f_type1, hid_t f_type2,
+ hid_t m_type1, hid_t m_type2 )
+{
+ size_t f_size1, f_size2; /* size of type in file */
+ size_t m_size1, m_size2; /* size of type in memory */
+
+ f_size1 = H5Tget_size( f_type1 );
+ f_size2 = H5Tget_size( f_type2 );
+ m_size1 = H5Tget_size( m_type1 );
+ m_size2 = H5Tget_size( m_type2 );
+
+ printf("\n");
+ printf("------------------\n");
+ printf("sizeof(char) %u\n", sizeof(char) );
+ printf("sizeof(short) %u\n", sizeof(short) );
+ printf("sizeof(int) %u\n", sizeof(int) );
+ printf("sizeof(long) %u\n", sizeof(long) );
+ printf("<%s> ------------------\n", obj1);
+ printf("type on file ");
+ print_datatype(f_type1);
+ printf("\n");
+ printf("size on file %u\n", f_size1 );
+
+ printf("type on memory ");
+ print_datatype(m_type1);
+ printf("\n");
+ printf("size on memory %u\n", m_size1 );
+
+ printf("<%s> ------------------\n", obj2);
+ printf("type on file ");
+ print_datatype(f_type2);
+ printf("\n");
+ printf("size on file %u\n", f_size2 );
+
+ printf("type on memory ");
+ print_datatype(m_type2);
+ printf("\n");
+ printf("size on memory %u\n", m_size2 );
+ printf("\n");
+}
+#endif /* H5DIFF_DEBUG */
+
+