X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/49c0d26358a08666c00b885839a1d104a808a953..985e3d1e091b8be222876a311497df9d3d93f3b5:/Exception.hpp diff --git a/Exception.hpp b/Exception.hpp index da35468..e72800e 100644 --- a/Exception.hpp +++ b/Exception.hpp @@ -70,20 +70,37 @@ while (false) #define _assert(test) \ _assert_("assert", (test), #test, "") +#define _require(expr) ({ \ + __typeof__(expr) _value = (expr); \ + _assert_("require", _value != NULL, #expr, ""); \ +_value; }) + #define _trace() do { \ fprintf(stderr, "_trace():%u\n", __LINE__); \ } while (false) -#define _syscall(expr) ({ \ +static _finline bool CYContains(int value, size_t many, const int *okay) { + for (size_t i(0); i != many; ++i) + if (value == okay[i]) + return true; + return false; +} + +#define _syscall_(expr, many, okay) ({ \ __typeof__(expr) _value; \ do if ((long) (_value = (expr)) != -1) \ break; \ + else if (CYContains(errno, many, ((const int [many]) okay))) \ + break; \ else \ _assert_("syscall", errno == EINTR, #expr, " [errno=%d]", errno); \ while (true); \ _value; \ }) +#define _syscall(expr) \ + _syscall_(expr, 0, {}) + #define _aprcall(expr) \ do { \ apr_status_t _aprstatus((expr)); \