From 82a6293f2184aba23ba9abe053be503412721d53 Mon Sep 17 00:00:00 2001 From: Timerix Date: Tue, 13 Jan 2026 18:20:01 +0500 Subject: [PATCH] added macro try_handle() --- include/tlibc/errors.h | 81 ++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/include/tlibc/errors.h b/include/tlibc/errors.h index 1f6308e..40d49df 100755 --- a/include/tlibc/errors.h +++ b/include/tlibc/errors.h @@ -100,55 +100,61 @@ typedef struct Result_ { #define RESULT_VOID (Result_){ .error = NULL, .u = 0 } #define RESULT_VALUE(FIELD, V) (Result_){ .error = NULL, .FIELD = V } +#define try(VAR, RESULT_FIELD, RSLT_CALL) \ + _try(VAR, RESULT_FIELD, RSLT_CALL, __LINE__) +#define try_void(RSLT_CALL) \ + _try_void(RSLT_CALL, __LINE__) +#define try_fatal(VAR, RESULT_FIELD, RSLT_CALL) \ + _try_fatal(VAR, RESULT_FIELD, RSLT_CALL, __LINE__) +#define try_fatal_void(RSLT_CALL) \ + _try_fatal_void(RSLT_CALL, __LINE__) +#define try_handle(VAR, RESULT_FIELD, RSLT_CALL, HANDLER) \ + _try_handle(VAR, RESULT_FIELD, RSLT_CALL, HANDLER, __LINE__) +#define try_handle_void(RSLT_CALL, HANDLER) \ + _try_handle_void(RSLT_CALL, HANDLER, __LINE__) +#define try_stderrcode(RSLT_CALL) \ + _try_stderrcode(RSLT_CALL, __LINE__) +#define try_fatal_stderrcode(RSLT_CALL) \ + _try_fatal_stderrcode(RSLT_CALL, __LINE__) + + #define _rname(N) __r_##N -#define try(VAR, RESULT_FIELD, RSLT_CALL) _try(VAR, RESULT_FIELD, RSLT_CALL, __LINE__) -#define try_fatal(VAR, RESULT_FIELD, RSLT_CALL) _try_fatal(VAR, RESULT_FIELD, RSLT_CALL, __LINE__) -#define try_void(RSLT_CALL) _try_void(RSLT_CALL, __LINE__) -#define try_fatal_void(RSLT_CALL) _try_fatal_void(RSLT_CALL, __LINE__) -#define try_stderrcode(RSLT_CALL) _try_stderrcode(RSLT_CALL, __LINE__) -#define try_fatal_stderrcode(RSLT_CALL) _try_fatal_stderrcode(RSLT_CALL, __LINE__) +#define _try_handle(VAR, RESULT_FIELD, RSLT_CALL, HANDLER, N) \ + Result_ _rname(N) = RSLT_CALL;\ + if(_rname(N).error){\ + Error_addCallPos(_rname(N).error, ErrorCallPos_here());\ + HANDLER(_rname(N));\ + }\ + VAR = _rname(N).RESULT_FIELD; +#define _try_handle_void(RSLT_CALL, HANDLER, N) \ + Result_ _rname(N) = RSLT_CALL;\ + if(_rname(N).error){\ + Error_addCallPos(_rname(N).error, ErrorCallPos_here());\ + HANDLER(_rname(N));\ + }\ + + +#define _try__handler(R) Return R #define _try(VAR, RESULT_FIELD, RSLT_CALL, N) \ - Result_ _rname(N) = RSLT_CALL;\ - if(_rname(N).error){\ - Error_addCallPos(_rname(N).error, ErrorCallPos_here());\ - Return _rname(N);\ - };\ - VAR = _rname(N).RESULT_FIELD; - -#define _try_void(RSLT_CALL, N) do {\ - Result_ _rname(N) = RSLT_CALL;\ - if(_rname(N).error){\ - Error_addCallPos(_rname(N).error, ErrorCallPos_here());\ - Return _rname(N);\ - };\ -} while(0) + _try_handle(VAR, RESULT_FIELD, RSLT_CALL, _try__handler, N) +#define _try_void(RSLT_CALL, N) \ + _try_handle_void(RSLT_CALL, _try__handler, N) +#define _try_fatal__handler(R) Error_printAndExit(R.error) #define _try_fatal(VAR, RESULT_FIELD, RSLT_CALL, N) \ - Result_ _rname(N) = RSLT_CALL;\ - if(_rname(N).error){\ - Error_addCallPos(_rname(N).error, ErrorCallPos_here());\ - Error_printAndExit(_rname(N).error);\ - };\ - VAR = _rname(N).RESULT_FIELD; + _try_handle(VAR, RESULT_FIELD, RSLT_CALL, _try_fatal__handler, N) +#define _try_fatal_void(RSLT_CALL, N) \ + _try_handle_void(RSLT_CALL, _try_fatal__handler, N) -#define _try_fatal_void(RSLT_CALL, N) do {\ - Result_ _rname(N) = RSLT_CALL;\ - if(_rname(N).error){\ - Error_addCallPos(_rname(N).error, ErrorCallPos_here());\ - Error_printAndExit(_rname(N).error);\ - };\ -} while(0) - -#define _try_stderrcode(CALL, N) do {\ +#define _try_stderrcode(CALL, N) \ int _rname(N) = CALL;\ if(_rname(N) != 0){\ Return RESULT_ERROR_CODE(LIBC_ERRNO, _rname(N), str_from_cstr(strerror_malloc(_rname(N))), true);\ }\ -} while(0) -#define _try_fatal_stderrcode(CALL, N) do {\ +#define _try_fatal_stderrcode(CALL, N) \ int _rname(N) = CALL;\ if(_rname(N) != 0){\ Error_printAndExit(Error_create(\ @@ -157,6 +163,5 @@ typedef struct Result_ { ErrorCodePage_name(LIBC_ERRNO), _rname(N)\ ));\ }\ -} while(0) #define try_assert(EXPR) if(!(EXPR)) { Return RESULT_ERROR_LITERAL("assertion must be true: " #EXPR); }