backport to buster
[hcoop/debian/openafs.git] / src / opr / opr.h
CommitLineData
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()
14extern void opr_NTAbort(void);
15#else
16# define opr_abort() abort()
17#endif
18
19extern void opr_AssertionFailed(const char *, int) AFS_NORETURN;
20extern 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
72extern char *opr_lcstring(char *d, const char *s, int n) AFS_NONNULL((1,2));
73extern char *opr_ucstring(char *d, const char *s, int n) AFS_NONNULL((1,2));
74extern void opr_stolower(char *s) AFS_NONNULL(());
75extern void opr_stoupper(char *s) AFS_NONNULL(());
76extern char *opr_strcompose(char *buf, size_t len, ...) AFS_NONNULL((1));
77
78#endif