2026-07-27 16:18:17 -04:00
|
|
|
#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);
|
2026-07-29 17:09:45 -04:00
|
|
|
AKERR_CHECK_STATUS(r, AKERR_VALUE);
|
2026-07-27 16:18:17 -04:00
|
|
|
r = akerr_release_error(r);
|
|
|
|
|
AKERR_CHECK(zero_break(7) == NULL);
|
|
|
|
|
|
|
|
|
|
r = nonzero_break(7);
|
2026-07-29 17:09:45 -04:00
|
|
|
AKERR_CHECK_STATUS(r, AKERR_INDEX);
|
2026-07-27 16:18:17 -04:00
|
|
|
r = akerr_release_error(r);
|
|
|
|
|
AKERR_CHECK(nonzero_break(0) == NULL);
|
|
|
|
|
|
|
|
|
|
r = always_break();
|
2026-07-29 17:09:45 -04:00
|
|
|
AKERR_CHECK_STATUS(r, AKERR_IO);
|
2026-07-27 16:18:17 -04:00
|
|
|
r = akerr_release_error(r);
|
|
|
|
|
|
|
|
|
|
r = zero_return(0);
|
2026-07-29 17:09:45 -04:00
|
|
|
AKERR_CHECK_STATUS(r, AKERR_KEY);
|
2026-07-27 16:18:17 -04:00
|
|
|
r = akerr_release_error(r);
|
|
|
|
|
AKERR_CHECK(zero_return(7) == NULL);
|
|
|
|
|
|
|
|
|
|
r = nonzero_return(7);
|
2026-07-29 17:09:45 -04:00
|
|
|
AKERR_CHECK_STATUS(r, AKERR_TYPE);
|
2026-07-27 16:18:17 -04:00
|
|
|
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;
|
|
|
|
|
}
|