summaryrefslogtreecommitdiffstats
path: root/tools/lib/h5tools_error.h
blob: 2c5e6c93ec89163b343b3406d8b843345dc47bab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 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://support.hdfgroup.org/ftp/HDF5/releases.  *
 * If you do not have access to either file, you may request a copy from     *
 * help@hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 *  Header file for error values, etc.
 */
#ifndef H5TOOLS_ERROR_H_
#define H5TOOLS_ERROR_H_

#include "H5Epublic.h"
#include "H5Eprivate.h" /* Error handling       */

/* tools-HDF5 Error variables */
H5TOOLS_DLLVAR hid_t H5tools_ERR_STACK_g;
H5TOOLS_DLLVAR hid_t H5tools_ERR_CLS_g;
H5TOOLS_DLLVAR hid_t H5E_tools_g;
H5TOOLS_DLLVAR hid_t H5E_tools_min_id_g;
H5TOOLS_DLLVAR hid_t H5E_tools_min_info_id_g;
H5TOOLS_DLLVAR hid_t H5E_tools_min_dbg_id_g;

/* Use FUNC to safely handle variations of C99 __func__ keyword handling */
#ifdef H5_HAVE_C99_FUNC
#define FUNC __func__
#elif defined(H5_HAVE_FUNCTION)
#define FUNC __FUNCTION__
#else
#error "We need __func__ or __FUNCTION__ to test function names!"
#endif

/*
 * H5TOOLS_INIT_ERROR macro, used to initialize error reporting.
 */
#define H5TOOLS_INIT_ERROR() {                                                                      \
        H5tools_ERR_CLS_g = H5Eregister_class("H5tools", "HDF5:tools", lib_str);                    \
        H5E_tools_g = H5Ecreate_msg(H5tools_ERR_CLS_g, H5E_MAJOR, "Failure in tools library");      \
        H5E_tools_min_id_g = H5Ecreate_msg(H5tools_ERR_CLS_g, H5E_MINOR, "error in function");      \
        H5E_tools_min_info_id_g = H5Ecreate_msg(H5tools_ERR_CLS_g, H5E_MINOR, "function info");     \
        H5E_tools_min_dbg_id_g = H5Ecreate_msg(H5tools_ERR_CLS_g, H5E_MINOR, "function debug");     \
}

/*
 * H5TOOLS_CLOSE_ERROR macro, used to initialize error reporting.
 */
#define H5TOOLS_CLOSE_ERROR() {                                 \
        H5Eclose_msg(H5E_tools_min_dbg_id_g);                   \
        H5Eclose_msg(H5E_tools_min_info_id_g);                  \
        H5Eclose_msg(H5E_tools_min_id_g);                       \
        H5Eclose_msg(H5E_tools_g);                              \
        H5Eunregister_class(H5tools_ERR_CLS_g);                 \
}

/*
 * H5TOOLS_ERR_INIT macro, used to facilitate error reporting. Declaration and assignments of error variables.
 * Use at the beginning of a function using error handling macros.
 */
#define H5TOOLS_ERR_INIT(ret_typ, ret_init)           \
    hid_t   pstack_id = H5I_INVALID_HID;       \
    hid_t   estack_id = H5tools_ERR_STACK_g;   \
    hbool_t past_catch = FALSE;                \
    ret_typ ret_value = ret_init;

/*
 * H5TOOLS_PUSH_STACK macro, used to create a new error stack.
 */
#define H5TOOLS_PUSH_STACK() {                \
        pstack_id = estack_id;   \
        estack_id = H5Ecreate_stack();        \
}

/*
 * H5TOOLS_POP_STACK macro, used to release a new error stack.
 */
#define H5TOOLS_POP_STACK() {                 \
        if (H5I_INVALID_HID != pstack_id) {   \
            H5Eclose_stack(estack_id);        \
            estack_id = pstack_id;            \
            pstack_id = H5I_INVALID_HID;      \
        }                                     \
}

/*
 * H5TOOLS_DEBUG macro, used to facilitate error reporting.  The arguments are the minor error number, and a description of the error.
 */
#ifdef H5_TOOLS_DEBUG
#define H5TOOLS_DEBUG(min_id, ...) {                                                                        \
        H5Epush2(estack_id, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, min_id, __VA_ARGS__);     \
}
#define H5TOOLS_ENDDEBUG(min_id, ...) {                                                                        \
        H5Epush2(estack_id, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, min_id, __VA_ARGS__);     \
        H5Eprint2(estack_id, stderr);     \
}
#else
#define H5TOOLS_DEBUG(min_id, ...) {    \
        ;                               \
}
#define H5TOOLS_ENDDEBUG(min_id, ...) {    \
        ;                               \
}
#endif

/*
 * H5TOOLS_INFO macro, used to facilitate error reporting .  The arguments are the minor error number, and a description of the error.
 */
#define H5TOOLS_INFO(min_id, ...) {                                                                        \
        H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, min_id, __VA_ARGS__);     \
}

/*
 * H5TOOLS_ERROR macro, used to facilitate error reporting .  The arguments are the major
 * error number, the minor error number, and a description of the error.
 */
#define H5TOOLS_ERROR(maj_id, min_id, ...) {                                                                        \
        H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, maj_id, min_id, __VA_ARGS__);     \
        ret_value = FAIL;                                                                                    \
}


/* Macro for "catching" flow of control when an error occurs.  Note that the
 *      H5_LEAVE macro won't jump back here once it's past this point.
 */
/* #define CATCH catch_except:; past_catch = TRUE; defined in H5Eprivate.h */

/*
 * H5_LEAVE macro, used to facilitate control flow between a
 * BEGIN_FUNC() and an END_FUNC() within a function body.  The argument is
 * the return value.
 * The return value is assigned to a variable `ret_value' and control branches
 * to the `catch_except' label, if we're not already past it.
 */
/*
 *  #define H5_LEAVE(v) {                           \
 *   ret_value = v;                              \
 *   if(!past_catch)                             \
 *        goto catch_except;                      \
 * }
 * defined in H5Eprivate.h */

/*
 * H5TOOLS_THROW macro, used to facilitate error reporting within a function body.
 * The arguments are the minor error number, and an error string.
 * The return value is assigned to a variable `ret_value' and control branches
 * to the `catch_except' label, if we're not already past it.
 */
#define H5TOOLS_THROW(fail_value, min_id, ...) {        \
    H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, min_id, __VA_ARGS__);     \
    H5_LEAVE(fail_value)                               \
}

/*
 * H5TOOLS_GOTO_ERROR macro, used to facilitate error reporting within a function body.  The arguments are
 * the major error number, the minor error number, the return value, and an
 * error string.  The return value is assigned to a variable `ret_value' and
 * control branches to the `done' label.
 */
#define H5TOOLS_GOTO_ERROR(fail_value, min_id, ...) {        \
   H5TOOLS_ERROR(H5E_tools_g, min_id, __VA_ARGS__);          \
   HGOTO_DONE(fail_value)                                    \
}

/*
 * HGOTO_DONE macro, used to facilitate normal return within a function body.
 * The argument is the return value which is assigned to the `ret_value'
 * variable.  Control branches to the `done' label.
 */
/* #define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;} defined in H5Eprivate.h */

#endif /* H5TOOLS_ERROR_H_ */