]> git.saurik.com Git - apple/xnu.git/blame - EXTERNAL_HEADERS/corecrypto/cc_macros.h
xnu-7195.101.1.tar.gz
[apple/xnu.git] / EXTERNAL_HEADERS / corecrypto / cc_macros.h
CommitLineData
f427ee49 1/* Copyright (c) (2012,2015,2016,2017,2019) Apple Inc. All rights reserved.
3e170ce0 2 *
f427ee49
A
3 * corecrypto is licensed under Apple Inc.’s Internal Use License Agreement (which
4 * is contained in the License.txt file distributed with corecrypto) and only to
5 * people who accept that license. IMPORTANT: Any license rights granted to you by
6 * Apple Inc. (if any) are limited to internal use within your organization only on
7 * devices and computers you own or control, for the sole purpose of verifying the
8 * security characteristics and correct functioning of the Apple Software. You may
9 * not, directly or indirectly, redistribute the Apple Software or any portions thereof.
3e170ce0
A
10 */
11
12#ifndef _CORECRYPTO_CC_MACROS_H_
13#define _CORECRYPTO_CC_MACROS_H_
14
15#include <corecrypto/cc_config.h>
16
17#ifndef __CC_DEBUG_ASSERT_COMPONENT_NAME_STRING
18#define __CC_DEBUG_ASSERT_COMPONENT_NAME_STRING ""
19#endif
20
21#ifndef __CC_DEBUG_ASSERT_PRODUCTION_CODE
22#define __CC_DEBUG_ASSERT_PRODUCTION_CODE !CORECRYPTO_DEBUG
23#endif
24
39037602
A
25#if CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS
26
27#if !CC_KERNEL
28 #include <string.h> // for strstr
29#endif // !CC_KERNEL
30
31CC_UNUSED static char *cc_strstr(const char *file) {
32#if CC_KERNEL
33 (void) file;
34#else
35 const char cc_char []="corecrypto";
36 char *p=strstr(file, cc_char);
37 if (p) return (p+strlen(cc_char)+1);
3e170ce0 38#endif
39037602
A
39 return NULL;
40}
41
42#define __CC_DEBUG_REQUIRE_MESSAGE(name, assertion, label, message, file, line, value) \
43{char *___t = cc_strstr(file); cc_printf( "require: %s, %s%s:%d\n", assertion, (message!=0) ? message : "", ___t==NULL?file:___t, line);}
44
45#endif // CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS
3e170ce0
A
46
47#ifndef cc_require
39037602
A
48#if (__CC_DEBUG_ASSERT_PRODUCTION_CODE) || (!CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS)
49 #if defined(_WIN32) && defined (__clang__)
50 #define cc_require(assertion, exceptionLabel) \
51 do { \
52 if (!(assertion) ) { \
53 goto exceptionLabel; \
54 } \
55 } while ( 0 )
56 #else
3e170ce0
A
57 #define cc_require(assertion, exceptionLabel) \
58 do { \
59 if ( __builtin_expect(!(assertion), 0) ) { \
60 goto exceptionLabel; \
61 } \
62 } while ( 0 )
39037602 63 #endif
3e170ce0
A
64#else
65 #define cc_require(assertion, exceptionLabel) \
66 do { \
67 if ( __builtin_expect(!(assertion), 0) ) { \
39037602 68 __CC_DEBUG_REQUIRE_MESSAGE(__CC_DEBUG_ASSERT_COMPONENT_NAME_STRING, \
3e170ce0
A
69 #assertion, #exceptionLabel, 0, __FILE__, __LINE__, 0); \
70 goto exceptionLabel; \
71 } \
72 } while ( 0 )
73#endif
74#endif
75
76#ifndef cc_require_action
39037602
A
77#if __CC_DEBUG_ASSERT_PRODUCTION_CODE || (!CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS)
78 #if defined(_WIN32) && defined(__clang__)
79 #define cc_require_action(assertion, exceptionLabel, action) \
80 do \
81 { \
82 if (!(assertion)) \
83 { \
84 { \
85 action; \
86 } \
87 goto exceptionLabel; \
88 } \
89 } while ( 0 )
90 #else
3e170ce0
A
91 #define cc_require_action(assertion, exceptionLabel, action) \
92 do \
93 { \
94 if ( __builtin_expect(!(assertion), 0) ) \
95 { \
96 { \
97 action; \
98 } \
99 goto exceptionLabel; \
100 } \
101 } while ( 0 )
39037602 102 #endif
3e170ce0
A
103#else
104 #define cc_require_action(assertion, exceptionLabel, action) \
105 do \
106 { \
107 if ( __builtin_expect(!(assertion), 0) ) \
108 { \
39037602 109 __CC_DEBUG_REQUIRE_MESSAGE( \
3e170ce0
A
110 __CC_DEBUG_ASSERT_COMPONENT_NAME_STRING, \
111 #assertion, #exceptionLabel, 0, __FILE__, __LINE__, 0); \
112 { \
113 action; \
114 } \
115 goto exceptionLabel; \
116 } \
117 } while ( 0 )
118#endif
119#endif
120
f427ee49
A
121#ifndef cc_require_or_return
122#if (__CC_DEBUG_ASSERT_PRODUCTION_CODE) || (!CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS)
123 #if defined(_WIN32) && defined (__clang__)
124 #define cc_require_or_return(assertion, value) \
125 do { \
126 if (!(assertion) ) { \
127 return value; \
128 } \
129 } while ( 0 )
130 #else
131 #define cc_require_or_return(assertion, value) \
132 do { \
133 if ( __builtin_expect(!(assertion), 0) ) { \
134 return value; \
135 } \
136 } while ( 0 )
137 #endif
138#else
139 #define cc_require_or_return(assertion, value) \
140 do { \
141 if ( __builtin_expect(!(assertion), 0) ) { \
142 __CC_DEBUG_REQUIRE_MESSAGE(__CC_DEBUG_ASSERT_COMPONENT_NAME_STRING, \
143 #assertion, #exceptionLabel, 0, __FILE__, __LINE__, 0); \
144 return value; \
145 } \
146 } while ( 0 )
147#endif
148#endif
149
3e170ce0 150#endif /* _CORECRYPTO_CC_MACROS_H_ */