hdf5/tools/lib/h5diff_util.c
Allen Byrne 333a79c1b2
Cleanup tools debug build warnings (#627)
* OESS-98 convert plugin option to FetchContent, add tests

* Fixes for pkcfg files because of plugin option

* OESS-98 fix tools test for plugins

* Keep doxygen comments under 100 chars long - format hint

* Whitespace

* HDFFV-11144 - Reclassify CMake messages

* HDFFV-11099/11100 added help text

* Reworked switch statement to compare string instead

* Fix typo

* Update CDash mode

* Correct name of threadsafe

* Correct option name

* Undo accidental commit

* Note LLVM 10 to 11 format default changes

* Update format plugin

* Undo clang-format version 11 changes

* One more correction

* Update supported platforms

* Revert whitespace changes

* Correct whitespace

* Changes from PR#3

* HDFFV-11213 added option to control gcc10 warnings diagnostics

* HDFFV-11212 Use the new references correctly in JNI utility and tests

* format source

* Fix typo

* Add new test file

* HDFFV-11212 - update test and remove unused arg

* Minor non-space formatting changes

* Use H5I_INVALID_ID instead of "-1"

* source formatting

* add missing testfile, update jni function

* Undo commit of debug code

* remove mislocated file

* Fix h5repack test for handling of fapls and id close

* Update h5diff test files usage text

* HDFFV-11212 add new ref tests for JNI export dataset

* src format update

* Remove blank line typo

* src format typo

* long double requires %Lg

* Another long double foramt specifer S.B. %Lg

* issue with t128bit test

* Windows issue with h5dump and type.

* Fix review issues

* refactor function nesting and fix error checks

* format fixes

* Remove untested functions and javadoc quiet comments

* Restore TRY block.

* Change string append errors to memory exception

* revert to H5_JNI_FATAL_ERROR - support functions need work

* Add assertion error for h5util functions

* remove duplicate function

* format fix

* Revert HD function error handling

* Update copyright comments

* GH #386 java folder copyright corrections

* Whitespace

* GH #359 implement and fix tools 1.6 API usage

* remove excessive comments

* Flip inits to correct ifdef section

* rework ifdef to be simpler

* format issue

* Reformat ifdef inits

* remove static attribute

* format compliance

* Update names

* Revert because logic relies on float not being int

* Changes noticed from creating merge of #412

* Double underscore change

* Correct compiler version variable used

* Remove header guard underscores

* Whitespace cleanup

* Split format source and commit changes on repo push

* remove pre-split setting

* Change windows TS to use older VS.

* correct window os name

* HDFFV-11212 JNI export util and Javadoc

* Suggested review changes

* Another change found

* Committing clang-format changes

* HDFFV-11113 long double in tools

* HDFFV-11113 add note

* Disable long double tests for now

* HDFFV-11228 remove arbitrary CMake warning groups.

* Make each flag a string

* Some Javadoc warning fixes

* Updated javadoc fixes

* # WARNING: head commit changed in the meantime

HDFFV-11229 Fix long double usage in tools and java

Changed h5dump and h5ls to just print 128-bit for long double type.
Added test and file for dataset and attributes with all three float
types.

* Committing clang-format changes

* HDFFV-11229 Add release note

* HDFFV-11229 windows testfile needed

* fix typo

* Remove non supported message text

* HDFFV-11229 - change ldouble test to check both native and general

* HDFFV-11229 add second file compare

* HDFFV-11229 fix reference file

* HDFFV-11229 autotools check two refs

* HDFFV-11229 revert back to removal of NATIVE_LDOUBLE in tools output

* Committing clang-format changes

* Update release note

* Update attribute type of ref file

* Change source of ninja for macs

* try port instead of brew

* Recommended is to use brew.

* Undo non long double changes

* remove unneeded file

* Fix perl and doxygen CMake code

* Add "option" command for clang options

* Rework CMake add_custom to use the BYPRODUCTS argument

* Add stamp files to BYPRODUCTS

* Only one copy of file exists

* Fix custom cmmand depends targets

* Fix fortran custom command DEPENDS

* Add LD_LIBRARY_PATH to tests

* Add custom target for DEPENDS

* Add h5detect conditionaly to generated target DEPENDS

* Correct DEPENDS targets

* Parallel builds need the mpi compiler for pkgconfig scripts.

* install only if MPI build

* Fortran target depends

* Remove incorrect source attribute

* doxygen adjustments

* doxygen build updates

* Correct version

* Correct function version - function has been merged to 1.12

* Correct version string for map functions

* Cleanup warnings for tools debug builds

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2021-05-05 17:08:10 -05:00

368 lines
12 KiB
C

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* 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 COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://www.hdfgroup.org/licenses. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "H5private.h"
#include "h5tools.h"
#include "h5tools_utils.h"
#include "h5diff.h"
#include "ph5diff.h"
/* global variables */
int g_nTasks = 1;
/*-------------------------------------------------------------------------
* Function: print_dimensions
*
* Purpose: print dimensions
*-------------------------------------------------------------------------
*/
void
print_dimensions(int rank, hsize_t *dims)
{
int i;
if (rank <= 0)
parallel_print("H5S_SCALAR");
else {
if (!dims)
parallel_print("dimension is NULL");
else {
parallel_print("[");
for (i = 0; i < rank - 1; i++) {
parallel_print(HSIZE_T_FORMAT, dims[i]);
parallel_print("x");
}
parallel_print(HSIZE_T_FORMAT, dims[rank - 1]);
parallel_print("]");
}
}
}
/*-------------------------------------------------------------------------
* Function: print_type
*
* Purpose: Print name of datatype
*
* Return: void
*
* Comments: Adapted from h5dump for H5T_INTEGER and H5T_FLOAT classes only
*-------------------------------------------------------------------------
*/
void
print_type(hid_t type)
{
switch (H5Tget_class(type)) {
case H5T_INTEGER:
if (H5Tequal(type, H5T_STD_I8BE))
parallel_print("H5T_STD_I8BE");
else if (H5Tequal(type, H5T_STD_I8LE))
parallel_print("H5T_STD_I8LE");
else if (H5Tequal(type, H5T_STD_I16BE))
parallel_print("H5T_STD_I16BE");
else if (H5Tequal(type, H5T_STD_I16LE))
parallel_print("H5T_STD_I16LE");
else if (H5Tequal(type, H5T_STD_I32BE))
parallel_print("H5T_STD_I32BE");
else if (H5Tequal(type, H5T_STD_I32LE))
parallel_print("H5T_STD_I32LE");
else if (H5Tequal(type, H5T_STD_I64BE))
parallel_print("H5T_STD_I64BE");
else if (H5Tequal(type, H5T_STD_I64LE))
parallel_print("H5T_STD_I64LE");
else if (H5Tequal(type, H5T_STD_U8BE))
parallel_print("H5T_STD_U8BE");
else if (H5Tequal(type, H5T_STD_U8LE))
parallel_print("H5T_STD_U8LE");
else if (H5Tequal(type, H5T_STD_U16BE))
parallel_print("H5T_STD_U16BE");
else if (H5Tequal(type, H5T_STD_U16LE))
parallel_print("H5T_STD_U16LE");
else if (H5Tequal(type, H5T_STD_U32BE))
parallel_print("H5T_STD_U32BE");
else if (H5Tequal(type, H5T_STD_U32LE))
parallel_print("H5T_STD_U32LE");
else if (H5Tequal(type, H5T_STD_U64BE))
parallel_print("H5T_STD_U64BE");
else if (H5Tequal(type, H5T_STD_U64LE))
parallel_print("H5T_STD_U64LE");
else if (H5Tequal(type, H5T_NATIVE_SCHAR))
parallel_print("H5T_NATIVE_SCHAR");
else if (H5Tequal(type, H5T_NATIVE_UCHAR))
parallel_print("H5T_NATIVE_UCHAR");
else if (H5Tequal(type, H5T_NATIVE_SHORT))
parallel_print("H5T_NATIVE_SHORT");
else if (H5Tequal(type, H5T_NATIVE_USHORT))
parallel_print("H5T_NATIVE_USHORT");
else if (H5Tequal(type, H5T_NATIVE_INT))
parallel_print("H5T_NATIVE_INT");
else if (H5Tequal(type, H5T_NATIVE_UINT))
parallel_print("H5T_NATIVE_UINT");
else if (H5Tequal(type, H5T_NATIVE_LONG))
parallel_print("H5T_NATIVE_LONG");
else if (H5Tequal(type, H5T_NATIVE_ULONG))
parallel_print("H5T_NATIVE_ULONG");
else if (H5Tequal(type, H5T_NATIVE_LLONG))
parallel_print("H5T_NATIVE_LLONG");
else if (H5Tequal(type, H5T_NATIVE_ULLONG))
parallel_print("H5T_NATIVE_ULLONG");
else
parallel_print("undefined integer");
break;
case H5T_FLOAT:
if (H5Tequal(type, H5T_IEEE_F32BE))
parallel_print("H5T_IEEE_F32BE");
else if (H5Tequal(type, H5T_IEEE_F32LE))
parallel_print("H5T_IEEE_F32LE");
else if (H5Tequal(type, H5T_IEEE_F64BE))
parallel_print("H5T_IEEE_F64BE");
else if (H5Tequal(type, H5T_IEEE_F64LE))
parallel_print("H5T_IEEE_F64LE");
else if (H5Tequal(type, H5T_NATIVE_FLOAT))
parallel_print("H5T_NATIVE_FLOAT");
else if (H5Tequal(type, H5T_NATIVE_DOUBLE))
parallel_print("H5T_NATIVE_DOUBLE");
#if H5_SIZEOF_LONG_DOUBLE != 0
else if (H5Tequal(type, H5T_NATIVE_LDOUBLE))
parallel_print("H5T_NATIVE_LDOUBLE");
#endif
else
parallel_print("undefined float");
break;
case H5T_BITFIELD:
if (H5Tequal(type, H5T_STD_B8BE))
parallel_print("H5T_STD_B8BE");
else if (H5Tequal(type, H5T_STD_B8LE))
parallel_print("H5T_STD_B8LE");
else if (H5Tequal(type, H5T_STD_B16BE))
parallel_print("H5T_STD_B16BE");
else if (H5Tequal(type, H5T_STD_B16LE))
parallel_print("H5T_STD_B16LE");
else if (H5Tequal(type, H5T_STD_B32BE))
parallel_print("H5T_STD_B32BE");
else if (H5Tequal(type, H5T_STD_B32LE))
parallel_print("H5T_STD_B32LE");
else if (H5Tequal(type, H5T_STD_B64BE))
parallel_print("H5T_STD_B64BE");
else if (H5Tequal(type, H5T_STD_B64LE))
parallel_print("H5T_STD_B64LE");
else
parallel_print("undefined bitfield");
break;
case H5T_TIME:
case H5T_STRING:
case H5T_OPAQUE:
case H5T_COMPOUND:
case H5T_REFERENCE:
case H5T_ENUM:
case H5T_VLEN:
case H5T_ARRAY:
case H5T_NO_CLASS:
case H5T_NCLASSES:
default:
return;
} /* end switch */
}
/*-------------------------------------------------------------------------
* Function: diff_basename
*
* Purpose: Returns a pointer to the last component absolute name
*-------------------------------------------------------------------------
*/
H5_ATTR_PURE const char *
diff_basename(const char *name)
{
size_t i;
if (name == NULL)
return NULL;
/* Find the end of the base name */
i = HDstrlen(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
*-------------------------------------------------------------------------
*/
H5_ATTR_CONST const char *
get_type(h5trav_type_t type)
{
switch (type) {
case H5TRAV_TYPE_DATASET:
return ("H5G_DATASET");
case H5TRAV_TYPE_GROUP:
return ("H5G_GROUP");
case H5TRAV_TYPE_NAMED_DATATYPE:
return ("H5G_TYPE");
case H5TRAV_TYPE_LINK:
return ("H5G_LINK");
case H5TRAV_TYPE_UDLINK:
return ("H5G_UDLINK");
case H5TRAV_TYPE_UNKNOWN:
default:
return ("unknown type");
}
}
/*-------------------------------------------------------------------------
* Function: get_sign
*
* Purpose: Returns the sign as a string
*-------------------------------------------------------------------------
*/
H5_ATTR_CONST const char *
get_sign(H5T_sign_t sign)
{
switch (sign) {
case H5T_SGN_NONE:
return "H5T_SGN_NONE";
case H5T_SGN_2:
return "H5T_SGN_2";
case H5T_SGN_ERROR:
return "H5T_SGN_ERROR";
case H5T_NSGN:
return "H5T_NSGN";
default:
return "unknown sign value";
} /* end switch */
}
/*-------------------------------------------------------------------------
* Function: get_class
*
* Purpose: Returns the class as a string
*-------------------------------------------------------------------------
*/
H5_ATTR_CONST const char *
get_class(H5T_class_t tclass)
{
switch (tclass) {
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");
case H5T_NO_CLASS:
case H5T_NCLASSES:
default:
return ("Invalid class");
} /* end switch */
} /* end get_class() */
/*-------------------------------------------------------------------------
* Function: print_found
*
* Purpose: print number of differences found
*-------------------------------------------------------------------------
*/
void
print_found(hsize_t nfound)
{
if (g_Parallel)
parallel_print("%" PRIuHSIZE " differences found\n", nfound);
else
HDfprintf(stdout, "%" PRIuHSIZE " differences found\n", nfound);
}
/*-----------------------------------------------------------------
* Function: match_up_memsize
*
* Purpose: match smaller memory size up to bigger memory size
*------------------------------------------------------------------
*/
herr_t
match_up_memsize(hid_t f_tid1_id, hid_t f_tid2_id, hid_t *m_tid1, hid_t *m_tid2, size_t *m_size1,
size_t *m_size2)
{
herr_t ret_value = SUCCEED;
H5TOOLS_START_DEBUG(" ");
if ((*m_size1) != (*m_size2)) {
if ((*m_size1) < (*m_size2)) {
H5Tclose(*m_tid1);
if (((*m_tid1) = H5Tget_native_type(f_tid2_id, H5T_DIR_DEFAULT)) < 0)
H5TOOLS_GOTO_ERROR(FAIL, "H5Tget_native_type failed");
*m_size1 = H5Tget_size(*m_tid1);
} /* end if */
else {
H5Tclose(*m_tid2);
if (((*m_tid2) = H5Tget_native_type(f_tid1_id, H5T_DIR_DEFAULT)) < 0)
H5TOOLS_GOTO_ERROR(FAIL, "H5Tget_native_type failed");
*m_size2 = H5Tget_size(*m_tid2);
} /* end else */
} /* end if */
if ((*m_size1) != (*m_size2))
H5TOOLS_GOTO_ERROR(FAIL, "native type sizes do not compare");
done:
H5TOOLS_ENDDEBUG(" ");
return ret_value;
}