#include "akerror.h" #include "err_capture.h" /* * Cover the conditional break/return failure macros: * FAIL_ZERO_BREAK / FAIL_NONZERO_BREAK / FAIL_BREAK (inside ATTEMPT) * FAIL_ZERO_RETURN / FAIL_NONZERO_RETURN / FAIL_RETURN (direct return) * Each is checked in both its failing and its non-failing (pass-through) state. */ akerr_ErrorContext *zero_break(int x) { PREPARE_ERROR(e); ATTEMPT { FAIL_ZERO_BREAK(e, x, AKERR_VALUE, "x was zero"); } CLEANUP { } PROCESS(e) { } FINISH(e, true); SUCCEED_RETURN(e); } akerr_ErrorContext *nonzero_break(int x) { PREPARE_ERROR(e); ATTEMPT { FAIL_NONZERO_BREAK(e, x, AKERR_INDEX, "x was nonzero"); } CLEANUP { } PROCESS(e) { } FINISH(e, true); SUCCEED_RETURN(e); } akerr_ErrorContext *always_break(void) { PREPARE_ERROR(e); ATTEMPT { FAIL_BREAK(e, AKERR_IO, "always"); } CLEANUP { } PROCESS(e) { } FINISH(e, true); SUCCEED_RETURN(e); } akerr_ErrorContext *zero_return(int x) { PREPARE_ERROR(e); FAIL_ZERO_RETURN(e, x, AKERR_KEY, "x was zero"); SUCCEED_RETURN(e); } akerr_ErrorContext *nonzero_return(int x) { PREPARE_ERROR(e); FAIL_NONZERO_RETURN(e, x, AKERR_TYPE, "x was nonzero"); SUCCEED_RETURN(e); } int main(void) { akerr_capture_install(); akerr_init(); akerr_ErrorContext *r; r = zero_break(0); AKERR_CHECK_STATUS(r, AKERR_VALUE); r = akerr_release_error(r); AKERR_CHECK(zero_break(7) == NULL); r = nonzero_break(7); AKERR_CHECK_STATUS(r, AKERR_INDEX); r = akerr_release_error(r); AKERR_CHECK(nonzero_break(0) == NULL); r = always_break(); AKERR_CHECK_STATUS(r, AKERR_IO); r = akerr_release_error(r); r = zero_return(0); AKERR_CHECK_STATUS(r, AKERR_KEY); r = akerr_release_error(r); AKERR_CHECK(zero_return(7) == NULL); r = nonzero_return(7); AKERR_CHECK_STATUS(r, AKERR_TYPE); r = akerr_release_error(r); AKERR_CHECK(nonzero_return(0) == NULL); AKERR_CHECK(akerr_slots_in_use() == 0); fprintf(stderr, "err_break_variants ok\n"); return 0; }