Commit | Line | Data |
---|---|---|
805e021f CE |
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 |