!****h* root/fortran/test/tH5E_F03.f90 ! ! NAME ! tH5E_F03.f90 ! ! FUNCTION ! Test FORTRAN HDF5 H5E APIs which are dependent on FORTRAN 2003 ! features. ! ! COPYRIGHT ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! Copyright by The HDF Group. * ! 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. * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! ! USES ! liter_cb_mod ! ! CONTAINS SUBROUTINES ! test_error ! !***** ! ***************************************** ! *** H 5 E T E S T S ! ***************************************** MODULE test_my_hdf5_error_handler USE HDF5 USE TH5_MISC USE TH5_MISC_GEN CONTAINS !*************************************************************** !** !** my_hdf5_error_handler: Custom error callback routine. !** !*************************************************************** INTEGER FUNCTION my_hdf5_error_handler(estack_id, data_inout) bind(C) ! This error function handle works with only version 2 error stack IMPLICIT NONE ! estack_id is always passed from C as: H5E_DEFAULT INTEGER(HID_T) :: estack_id ! data that was registered with H5Eset_auto_f INTEGER :: data_inout PRINT*, " " PRINT*, " Subtest: H5Eset_auto_f custom error message with callback, WITH DATA" PRINT*, " -This message should be written to standard out- " PRINT*, " Data Values Passed In =", data_inout PRINT*, " " data_inout = 10*data_inout my_hdf5_error_handler = 1 ! this is not used by the C routine END FUNCTION my_hdf5_error_handler INTEGER FUNCTION my_hdf5_error_handler_nodata(estack_id, data_inout) bind(C) ! This error function handle works with only version 2 error stack IMPLICIT NONE ! estack_id is always passed from C as: H5E_DEFAULT INTEGER(HID_T) :: estack_id ! data that was registered with H5Eset_auto_f TYPE(C_PTR) :: data_inout PRINT*, " " PRINT*, " Subtest: H5Eset_auto_f custom error message with callback, NO DATA" PRINT*, " -This message should be written to standard out- " PRINT*, " " my_hdf5_error_handler_nodata = 1 ! this is not used by the C routine END FUNCTION my_hdf5_error_handler_nodata END MODULE test_my_hdf5_error_handler MODULE TH5E_F03 CONTAINS SUBROUTINE test_error(total_error) USE ISO_C_BINDING USE test_my_hdf5_error_handler IMPLICIT NONE INTEGER(hid_t), PARAMETER :: FAKE_ID = -1 INTEGER :: total_error INTEGER(hid_t) :: file INTEGER(hid_t) :: dataset, space INTEGER(hsize_t), DIMENSION(1:2) :: dims INTEGER :: error INTEGER, DIMENSION(:), POINTER :: ptr_data INTEGER, TARGET :: my_hdf5_error_handler_data TYPE(C_PTR) :: f_ptr TYPE(C_FUNPTR) :: func TYPE(C_PTR), TARGET :: f_ptr1 INTEGER, DIMENSION(1:1) :: array_shape my_hdf5_error_handler_data = 99 CALL h5fcreate_f("terror.h5", H5F_ACC_TRUNC_F, file, error) CALL check("h5fcreate_f", error, total_error) ! Create the data space dims(1) = 10 dims(2) = 20 CALL H5Screate_simple_f(2, dims, space, error) CALL check("h5screate_simple_f", error, total_error) ! ** SET THE CUSTOMIZED PRINTING OF ERROR STACK ** ! set the customized error handling routine func = c_funloc(my_hdf5_error_handler) ! set the data sent to the customized routine f_ptr = c_loc(my_hdf5_error_handler_data) ! turn on automatic printing, and use a custom error routine with input data CALL H5Eset_auto_f(1, error, H5E_DEFAULT_F, func, f_ptr) ! Create the erring dataset CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error) CALL verify("h5dcreate_f", error, -1, total_error) !!$ CALL verify("H5Eset_auto_f",my_hdf5_error_handler_data(1),10, total_error) !!$ CALL verify("H5Eset_auto_f",my_hdf5_error_handler_data(2),20, total_error) !!$ ! Test enabling and disabling default printing !!$ !!$ CALL H5Eget_auto_f(H5E_DEFAULT_F, func1, f_ptr1, error) !!$ CALL verify("H5Eget_auto_f", error, 0, total_error) ! PRINT*,c_associated(f_ptr1) ALLOCATE(ptr_data(1:2)) ptr_data = 0 array_shape(1) = 2 CALL C_F_POINTER(f_ptr1, ptr_data, array_shape) ! ptr_data => f_ptr1(1) ! PRINT*,ptr_data(1) !!$ if(old_data != NULL) !!$ TEST_ERROR; !!$#ifdef H5_USE_16_API !!$ if (old_func != (H5E_auto_t)H5Eprint) !!$ TEST_ERROR; !!$#else H5_USE_16_API !!$ if (old_func != (H5E_auto2_t)H5Eprint2) !!$ TEST_ERROR; !!$#endif H5_USE_16_API ! set the customized error handling routine func = c_funloc(my_hdf5_error_handler_nodata) ! set the data sent to the customized routine as null f_ptr = C_NULL_PTR ! turn on automatic printing, and use a custom error routine with no input data CALL H5Eset_auto_f(1, error, H5E_DEFAULT_F, func, f_ptr) CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error) CALL verify("h5dcreate_f", error, -1, total_error) ! turn on automatic printing with h5eprint_f which prints an error stack in the default manner. ! func = c_funloc(h5eprint_f) ! CALL H5Eset_auto_f(0, error, H5E_DEFAULT_F, func, C_NULL_PTR) CALL H5Eset_auto_f(0, error) CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error) CALL H5Eset_auto_f(1, error) CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error) END SUBROUTINE test_error END MODULE TH5E_F03