| 1 | #ifndef OPENAFS_OPR_OPR_H |
| 2 | #define OPENAFS_OPR_OPR_H 1 |
| 3 | |
| 4 | /* macros */ |
| 5 | |
| 6 | /* should use offsetof() if available */ |
| 7 | #define opr_containerof(ptr, structure, member) \ |
| 8 | ((structure *)((char *)(ptr)-(char *)(&((structure *)NULL)->member))) |
| 9 | |
| 10 | /* assert.c */ |
| 11 | |
| 12 | #ifdef AFS_NT40_ENV |
| 13 | # define opr_abort() opr_NTAbort() |
| 14 | extern void opr_NTAbort(void); |
| 15 | #else |
| 16 | # define opr_abort() abort() |
| 17 | #endif |
| 18 | |
| 19 | extern void opr_AssertionFailed(const char *, int) AFS_NORETURN; |
| 20 | extern void opr_AssertFailU(const char *, const char *, int) AFS_NORETURN; |
| 21 | |
| 22 | /* opr_Assert is designed to work in a similar way to the operating |
| 23 | * system's assert function. This means that in future, it may compile |
| 24 | * to a no-op if NDEBUG is defined |
| 25 | */ |
| 26 | |
| 27 | #define __opr_Assert(ex) \ |
| 28 | do {if (!(ex)) opr_AssertionFailed(__FILE__, __LINE__);} while(0) |
| 29 | |
| 30 | #if defined(HAVE__PRAGMA_TAUTOLOGICAL_POINTER_COMPARE) && defined(__clang__) |
| 31 | # define opr_Assert(ex) \ |
| 32 | _Pragma("clang diagnostic push") \ |
| 33 | _Pragma("clang diagnostic ignored \"-Wtautological-pointer-compare\"") \ |
| 34 | __opr_Assert(ex) \ |
| 35 | _Pragma("clang diagnostic pop") |
| 36 | #else |
| 37 | # define opr_Assert(ex) __opr_Assert(ex) |
| 38 | #endif |
| 39 | |
| 40 | /* opr_Verify is an assertion function which is guaranteed to always |
| 41 | * invoke its expression, regardless of the debugging level selected |
| 42 | * at compile time */ |
| 43 | |
| 44 | #define __opr_Verify(ex) \ |
| 45 | do {if (!(ex)) opr_AssertionFailed(__FILE__, __LINE__);} while(0) |
| 46 | |
| 47 | #if defined(HAVE__PRAGMA_TAUTOLOGICAL_POINTER_COMPARE) && defined(__clang__) |
| 48 | # define opr_Verify(ex) \ |
| 49 | _Pragma("clang diagnostic push") \ |
| 50 | _Pragma("clang diagnostic ignored \"-Wtautological-pointer-compare\"") \ |
| 51 | __opr_Verify(ex) \ |
| 52 | _Pragma("clang diagnostic pop") |
| 53 | #else |
| 54 | # define opr_Verify(ex) __opr_Verify(ex) |
| 55 | #endif |
| 56 | |
| 57 | /* opr_StaticAssert is a static build-time assertion, to assert certain |
| 58 | * static values (such as sizeof results). If the assertion fails, the |
| 59 | * build will fail. */ |
| 60 | |
| 61 | #define opr_StaticAssert(ex) \ |
| 62 | ((void)(sizeof(char[1 - 2 * !(ex)]))) |
| 63 | |
| 64 | /* casestrcpy.c */ |
| 65 | #define lcstring opr_lcstring |
| 66 | #define ucstring opr_ucstring |
| 67 | #define stolower opr_stolower |
| 68 | #define stoupper opr_stoupper |
| 69 | /* XXX str* is in the implementation namespace when <string.h> is included */ |
| 70 | #define strcompose opr_strcompose |
| 71 | |
| 72 | extern char *opr_lcstring(char *d, const char *s, int n) AFS_NONNULL((1,2)); |
| 73 | extern char *opr_ucstring(char *d, const char *s, int n) AFS_NONNULL((1,2)); |
| 74 | extern void opr_stolower(char *s) AFS_NONNULL(()); |
| 75 | extern void opr_stoupper(char *s) AFS_NONNULL(()); |
| 76 | extern char *opr_strcompose(char *buf, size_t len, ...) AFS_NONNULL((1)); |
| 77 | |
| 78 | #endif |