]> git.saurik.com Git - cycript.git/blobdiff - Exception.hpp
Correct "error: taking address of temporary array".
[cycript.git] / Exception.hpp
index da3546839098b101762448d84275a35fff5caa9d..e72800eca303225f81eca667022a0e37293bcea4 100644 (file)
@@ -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)); \