5891a707fe04eaa13a27b84529abffbbc4622b96
[openafs.git] / src / opr / opr.h
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