00001
00002
00003
00004
00005 #if !defined(_INCLUDED_SUL_ERROR_H_HEADER__)
00006 #define _INCLUDED_SUL_ERROR_H_HEADER__
00007
00020 SUL_DECLARE(apr_status_t)
00021 sul_errors_initialize(apr_pool_t *pool);
00022
00031 SUL_DECLARE(apr_pool_t *)
00032 sul_pool_create(apr_pool_t *pp, const char *tag);
00033
00041 SUL_DECLARE(void)
00042 sul_error_locate(const char *file, apr_int32_t line);
00043
00050 SUL_DECLARE(sul_error_t *)
00051 sul_errprintf(const char *strf, ...);
00052
00062 SUL_DECLARE(sul_error_t *)
00063 sul_error_printf(sul_error_t *err, apr_size_t indention,
00064 sul_stringbuf_t *stream, apr_pool_t *pool);
00065
00075 SUL_DECLARE(sul_error_t *)
00076 sul_error_qualify(sul_error_t *err, apr_status_t apr_err, sul_status_t sul_err,
00077 sul_error_t *cause);
00078
00088 SUL_DECLARE(sul_error_t *)
00089 sul_error_create(apr_status_t apr_err, sul_status_t sul_err, sul_error_t *cause,
00090 const char *msg, ...);
00091
00092 #define sul_error_create \
00093 (sul_error_locate(__FILE__,__LINE__), (sul_error_create))
00094
00103 SUL_DECLARE(sul_error_t *)
00104 sul_error_quick_wrap(sul_error_t *cause, const char *msg, ...);
00105
00106 #define sul_error_quick_wrap \
00107 (sul_error_locate(__FILE__,__LINE__), (sul_error_quick_wrap))
00108
00116 SUL_DECLARE(void)
00117 sul_error_handle(sul_error_t *error, sul_boolean_t fatal);
00118
00125 SUL_DECLARE(sul_error_t *)
00126 sul_error_get_cause(sul_error_t *error);
00127
00134 SUL_DECLARE(const char *)
00135 sul_error_get_message(sul_error_t *error);
00136
00143 SUL_DECLARE(apr_status_t)
00144 sul_error_get_apr_error(sul_error_t *error);
00145
00152 SUL_DECLARE(sul_status_t)
00153 sul_error_get_sul_error(sul_error_t *error);
00154
00160 SUL_DECLARE(void)
00161 sul_error_destroy(sul_error_t *error);
00162
00168 #define SUL_ERR_WRAP0(expr, wrap_msg) \
00169 do { \
00170 sul_error_t *sul_err__temp = (expr); \
00171 if (sul_err__temp) \
00172 return (sul_error_quick_wrap(sul_err__temp, wrap_msg)); \
00173 } while (0)
00174
00175 #define SUL_ERR_WRAP1(expr, wrap_msg, a1) \
00176 do { \
00177 sul_error_t *sul_err__temp = (expr); \
00178 if (sul_err__temp) \
00179 return (sul_error_quick_wrap(sul_err__temp, wrap_msg, a1)); \
00180 } while (0)
00181
00182 #define SUL_ERR_WRAP4(expr, wrap_msg, a1, a2, a3, a4) \
00183 do { \
00184 sul_error_t *sul_err__temp = (expr); \
00185 if (sul_err__temp) \
00186 return (sul_error_quick_wrap(sul_err__temp, wrap_msg, a1, a2, a3, a4)); \
00187 } while (0)
00188
00189 #define SUL_ERR_WRAP3(expr, wrap_msg, a1, a2, a3) \
00190 do { \
00191 sul_error_t *sul_err__temp = (expr); \
00192 if (sul_err__temp) \
00193 return (sul_error_quick_wrap(sul_err__temp, wrap_msg, a1, a2, a3)); \
00194 } while (0)
00195
00196 #define SUL_ERR_WRAP2(expr, wrap_msg, a1, a2) \
00197 do { \
00198 sul_error_t *sul_err__temp = (expr); \
00199 if (sul_err__temp) \
00200 return (sul_error_quick_wrap(sul_err__temp, wrap_msg, a1, a2)); \
00201 } while (0)
00202
00207 #define SUL_ERR_HOOK(expr, code) \
00208 do { \
00209 sul_error_t *sul_err__temp = (expr); \
00210 if (sul_err__temp) { \
00211 code; \
00212 return (sul_err__temp); \
00213 } \
00214 } while (0)
00215
00220 #define SUL_ERR(expr) \
00221 do { \
00222 sul_error_t *sul_err__temp = (expr); \
00223 if (sul_err__temp) \
00224 return (sul_err__temp); \
00225 } while (0)
00226
00231 #define SUL_ERR_IGN(expr, code) \
00232 do { \
00233 sul_error_t *sul_err__temp = (expr); \
00234 if (sul_err__temp) { \
00235 if (sul_error_get_sul_error(sul_err__temp) != code) \
00236 sul_error_destroy(sul_err__temp); \
00237 } \
00238 } while (0)
00239
00243 #define SUL_WARN(expr) \
00244 do { \
00245 sul_error_t *sul_err__temp = (expr); \
00246 if (sul_err__temp) \
00247 sul_error_handle(sul_err__temp, FALSE); \
00248 } while (0)
00249
00253 #define SUL_ERR_IGN_ALL(expr) \
00254 do { \
00255 sul_error_t *sul_err__temp = (expr); \
00256 if (sul_err__temp) \
00257 sul_error_destroy(sul_err__temp); \
00258 } while (0)
00259
00263 #define APR_ERR(expr, pool, msg) \
00264 do { \
00265 apr_status_t apr_err__temp = (expr); \
00266 if (apr_err__temp != APR_SUCCESS) \
00267 return (sul_error_create(apr_err__temp, 0, \
00268 NULL, msg)); \
00269 } while (0)
00270
00274 #define SUL_NO_ERROR (NULL)
00275
00276 #define SUL_ERR_NONE (0)
00277 #define SUL_ERR_DB_NO_ROWS (1)
00278 #define SUL_ERR_DB_TOO_MANY_ROWS (2)
00279
00288 #if defined(_WIN32)
00289 # define BREAKPOINT() __asm { int 3 }
00290 #else
00291 # define BREAKPOINT() { __asm__ __volatile__ ("int $03"); }
00292
00293
00294
00295
00296
00297
00298
00299 #endif
00300
00301
00311 SUL_DECLARE(void)
00312 sul_error_log_assertion(const char *expr_str, const char *msg,
00313 const char *func, const char *file, apr_ssize_t line);
00314
00315 #define SUL_ASSERT(expr, msg) \
00316 do { \
00317 if (!(expr)) { \
00318 sul_error_log_assertion(#expr, msg, __FUNCTION__, __FILE__, __LINE__); \
00319 abort(); \
00320 } \
00321 } \
00322 while (0)
00323
00327 #define ASSERT(expr, msg) SUL_ASSERT((expr), msg)
00328
00332 #define ASSERTN(expr) SUL_ASSERT((expr), NULL)
00333
00337 #define SUL_VERIFY0(expr, msg) \
00338 do { \
00339 if (!(expr)) { \
00340 return (sul_error_create(0, 0, NULL, #expr " failed: " msg)); \
00341 } \
00342 } while (0)
00343
00344 #define SUL_VERIFY1(expr, msg, a1) \
00345 do { \
00346 if (!(expr)) { \
00347 return (sul_error_create(0, 0, NULL, #expr " failed: " msg, a1)); \
00348 } \
00349 } while (0)
00350
00351 #define SUL_VERIFY2(expr, msg, a1, a2) \
00352 do { \
00353 if (!(expr)) { \
00354 return (sul_error_create(0, 0, NULL, #expr " failed: " msg, a1, a2)); \
00355 } \
00356 } while (0)
00357
00358 #define SUL_VERIFY3(expr, msg, a1, a2, a3) \
00359 do { \
00360 if (!(expr)) { \
00361 return (sul_error_create(0, 0, NULL, #expr " failed: " msg, a1, a2, a3)); \
00362 } \
00363 } while (0)
00364
00365 #define SUL_VERIFY4(expr, msg, a1, a2, a3, a4) \
00366 do { \
00367 if (!(expr)) { \
00368 return (sul_error_create(0, 0, NULL, #expr " failed: " msg, a1, a2, a3, a4)); \
00369 } \
00370 } while (0)
00371
00375 #endif