xref: /xnu-10002.41.9/osfmk/corecrypto/cc_macros.h (revision 699cd48037512bf4380799317ca44ca453c82f57)
1*699cd480SApple OSS Distributions /* Copyright (c) (2012,2015,2016,2017,2019) Apple Inc. All rights reserved.
2*699cd480SApple OSS Distributions  *
3*699cd480SApple OSS Distributions  * corecrypto is licensed under Apple Inc.’s Internal Use License Agreement (which
4*699cd480SApple OSS Distributions  * is contained in the License.txt file distributed with corecrypto) and only to
5*699cd480SApple OSS Distributions  * people who accept that license. IMPORTANT:  Any license rights granted to you by
6*699cd480SApple OSS Distributions  * Apple Inc. (if any) are limited to internal use within your organization only on
7*699cd480SApple OSS Distributions  * devices and computers you own or control, for the sole purpose of verifying the
8*699cd480SApple OSS Distributions  * security characteristics and correct functioning of the Apple Software.  You may
9*699cd480SApple OSS Distributions  * not, directly or indirectly, redistribute the Apple Software or any portions thereof.
10*699cd480SApple OSS Distributions  *
11*699cd480SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
12*699cd480SApple OSS Distributions  *
13*699cd480SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
14*699cd480SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
15*699cd480SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
16*699cd480SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
17*699cd480SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
18*699cd480SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
19*699cd480SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
20*699cd480SApple OSS Distributions  * terms of an Apple operating system software license agreement.
21*699cd480SApple OSS Distributions  *
22*699cd480SApple OSS Distributions  * Please obtain a copy of the License at
23*699cd480SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
24*699cd480SApple OSS Distributions  *
25*699cd480SApple OSS Distributions  * The Original Code and all software distributed under the License are
26*699cd480SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
27*699cd480SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
28*699cd480SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
29*699cd480SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
30*699cd480SApple OSS Distributions  * Please see the License for the specific language governing rights and
31*699cd480SApple OSS Distributions  * limitations under the License.
32*699cd480SApple OSS Distributions  *
33*699cd480SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
34*699cd480SApple OSS Distributions  */
35*699cd480SApple OSS Distributions 
36*699cd480SApple OSS Distributions #ifndef _CORECRYPTO_CC_MACROS_H_
37*699cd480SApple OSS Distributions #define _CORECRYPTO_CC_MACROS_H_
38*699cd480SApple OSS Distributions 
39*699cd480SApple OSS Distributions #include <corecrypto/cc_config.h>
40*699cd480SApple OSS Distributions 
41*699cd480SApple OSS Distributions #ifndef __CC_DEBUG_ASSERT_COMPONENT_NAME_STRING
42*699cd480SApple OSS Distributions #define __CC_DEBUG_ASSERT_COMPONENT_NAME_STRING ""
43*699cd480SApple OSS Distributions #endif
44*699cd480SApple OSS Distributions 
45*699cd480SApple OSS Distributions #ifndef __CC_DEBUG_ASSERT_PRODUCTION_CODE
46*699cd480SApple OSS Distributions #define __CC_DEBUG_ASSERT_PRODUCTION_CODE !CORECRYPTO_DEBUG
47*699cd480SApple OSS Distributions #endif
48*699cd480SApple OSS Distributions 
49*699cd480SApple OSS Distributions #if CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS
50*699cd480SApple OSS Distributions 
51*699cd480SApple OSS Distributions #if !CC_KERNEL
52*699cd480SApple OSS Distributions     #include <string.h> // for strstr
53*699cd480SApple OSS Distributions #endif // !CC_KERNEL
54*699cd480SApple OSS Distributions 
55*699cd480SApple OSS Distributions CC_UNUSED static char *
cc_strstr(const char * file)56*699cd480SApple OSS Distributions cc_strstr(const char *file)
57*699cd480SApple OSS Distributions {
58*699cd480SApple OSS Distributions #if CC_KERNEL
59*699cd480SApple OSS Distributions 	(void) file;
60*699cd480SApple OSS Distributions #else
61*699cd480SApple OSS Distributions 	const char cc_char[] = "corecrypto";
62*699cd480SApple OSS Distributions 	char *p = strstr(file, cc_char);
63*699cd480SApple OSS Distributions 	if (p) {
64*699cd480SApple OSS Distributions 		return p + strlen(cc_char) + 1;
65*699cd480SApple OSS Distributions 	}
66*699cd480SApple OSS Distributions #endif
67*699cd480SApple OSS Distributions 	return NULL;
68*699cd480SApple OSS Distributions }
69*699cd480SApple OSS Distributions 
70*699cd480SApple OSS Distributions #define __CC_DEBUG_REQUIRE_MESSAGE(name, assertion, label, message, file, line, value) \
71*699cd480SApple OSS Distributions {char *___t = cc_strstr(file); cc_printf( "require: %s, %s%s:%d\n", assertion, (message!=0) ? message : "", ___t==NULL?file:___t, line);}
72*699cd480SApple OSS Distributions 
73*699cd480SApple OSS Distributions #endif // CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS
74*699cd480SApple OSS Distributions 
75*699cd480SApple OSS Distributions #ifndef cc_require
76*699cd480SApple OSS Distributions #if (__CC_DEBUG_ASSERT_PRODUCTION_CODE) || (!CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS)
77*699cd480SApple OSS Distributions   #if defined(_WIN32) && defined (__clang__)
78*699cd480SApple OSS Distributions     #define cc_require(assertion, exceptionLabel) \
79*699cd480SApple OSS Distributions        do { \
80*699cd480SApple OSS Distributions 	   if (!(assertion) ) { \
81*699cd480SApple OSS Distributions 	      goto exceptionLabel; \
82*699cd480SApple OSS Distributions 	   } \
83*699cd480SApple OSS Distributions 	} while ( 0 )
84*699cd480SApple OSS Distributions   #else
85*699cd480SApple OSS Distributions     #define cc_require(assertion, exceptionLabel) \
86*699cd480SApple OSS Distributions 	do { \
87*699cd480SApple OSS Distributions 	    if ( __builtin_expect(!(assertion), 0) ) { \
88*699cd480SApple OSS Distributions 	        goto exceptionLabel; \
89*699cd480SApple OSS Distributions 	    } \
90*699cd480SApple OSS Distributions 	} while ( 0 )
91*699cd480SApple OSS Distributions  #endif
92*699cd480SApple OSS Distributions #else
93*699cd480SApple OSS Distributions     #define cc_require(assertion, exceptionLabel) \
94*699cd480SApple OSS Distributions 	do { \
95*699cd480SApple OSS Distributions 	    if ( __builtin_expect(!(assertion), 0) ) { \
96*699cd480SApple OSS Distributions 	        __CC_DEBUG_REQUIRE_MESSAGE(__CC_DEBUG_ASSERT_COMPONENT_NAME_STRING, \
97*699cd480SApple OSS Distributions 	            #assertion, #exceptionLabel, 0, __FILE__, __LINE__,  0); \
98*699cd480SApple OSS Distributions 	        goto exceptionLabel; \
99*699cd480SApple OSS Distributions 	    } \
100*699cd480SApple OSS Distributions 	} while ( 0 )
101*699cd480SApple OSS Distributions #endif
102*699cd480SApple OSS Distributions #endif
103*699cd480SApple OSS Distributions 
104*699cd480SApple OSS Distributions #ifndef cc_require_action
105*699cd480SApple OSS Distributions #if __CC_DEBUG_ASSERT_PRODUCTION_CODE || (!CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS)
106*699cd480SApple OSS Distributions   #if defined(_WIN32) && defined(__clang__)
107*699cd480SApple OSS Distributions     #define cc_require_action(assertion, exceptionLabel, action)                \
108*699cd480SApple OSS Distributions 	do                                                                      \
109*699cd480SApple OSS Distributions 	{                                                                       \
110*699cd480SApple OSS Distributions 	    if (!(assertion))                                                   \
111*699cd480SApple OSS Distributions 	    {                                                                   \
112*699cd480SApple OSS Distributions 	        {                                                               \
113*699cd480SApple OSS Distributions 	            action;                                                     \
114*699cd480SApple OSS Distributions 	        }                                                               \
115*699cd480SApple OSS Distributions 	        goto exceptionLabel;                                            \
116*699cd480SApple OSS Distributions 	    }                                                                   \
117*699cd480SApple OSS Distributions 	} while ( 0 )
118*699cd480SApple OSS Distributions   #else
119*699cd480SApple OSS Distributions     #define cc_require_action(assertion, exceptionLabel, action)                \
120*699cd480SApple OSS Distributions 	do                                                                      \
121*699cd480SApple OSS Distributions 	{                                                                       \
122*699cd480SApple OSS Distributions 	    if ( __builtin_expect(!(assertion), 0) )                            \
123*699cd480SApple OSS Distributions 	    {                                                                   \
124*699cd480SApple OSS Distributions 	        {                                                               \
125*699cd480SApple OSS Distributions 	            action;                                                     \
126*699cd480SApple OSS Distributions 	        }                                                               \
127*699cd480SApple OSS Distributions 	        goto exceptionLabel;                                            \
128*699cd480SApple OSS Distributions 	    }                                                                   \
129*699cd480SApple OSS Distributions 	} while ( 0 )
130*699cd480SApple OSS Distributions   #endif
131*699cd480SApple OSS Distributions #else
132*699cd480SApple OSS Distributions     #define cc_require_action(assertion, exceptionLabel, action)                \
133*699cd480SApple OSS Distributions 	do                                                                      \
134*699cd480SApple OSS Distributions 	{                                                                       \
135*699cd480SApple OSS Distributions 	    if ( __builtin_expect(!(assertion), 0) )                            \
136*699cd480SApple OSS Distributions 	    {                                                                   \
137*699cd480SApple OSS Distributions 	        __CC_DEBUG_REQUIRE_MESSAGE(                                      \
138*699cd480SApple OSS Distributions 	            __CC_DEBUG_ASSERT_COMPONENT_NAME_STRING,                    \
139*699cd480SApple OSS Distributions 	            #assertion, #exceptionLabel, 0,   __FILE__, __LINE__, 0);   \
140*699cd480SApple OSS Distributions 	        {                                                               \
141*699cd480SApple OSS Distributions 	            action;                                                     \
142*699cd480SApple OSS Distributions 	        }                                                               \
143*699cd480SApple OSS Distributions 	        goto exceptionLabel;                                            \
144*699cd480SApple OSS Distributions 	    }                                                                   \
145*699cd480SApple OSS Distributions 	} while ( 0 )
146*699cd480SApple OSS Distributions #endif
147*699cd480SApple OSS Distributions #endif
148*699cd480SApple OSS Distributions 
149*699cd480SApple OSS Distributions #ifndef cc_require_or_return
150*699cd480SApple OSS Distributions #if (__CC_DEBUG_ASSERT_PRODUCTION_CODE) || (!CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS)
151*699cd480SApple OSS Distributions   #if defined(_WIN32) && defined (__clang__)
152*699cd480SApple OSS Distributions     #define cc_require_or_return(assertion, value)                                  \
153*699cd480SApple OSS Distributions        do {                                                                         \
154*699cd480SApple OSS Distributions 	   if (!(assertion) ) {                                                     \
155*699cd480SApple OSS Distributions 	      return value;                                                         \
156*699cd480SApple OSS Distributions 	   }                                                                        \
157*699cd480SApple OSS Distributions 	} while ( 0 )
158*699cd480SApple OSS Distributions   #else
159*699cd480SApple OSS Distributions     #define cc_require_or_return(assertion, value)                                  \
160*699cd480SApple OSS Distributions 	do {                                                                        \
161*699cd480SApple OSS Distributions 	    if ( __builtin_expect(!(assertion), 0) ) {                              \
162*699cd480SApple OSS Distributions 	        return value;                                                       \
163*699cd480SApple OSS Distributions 	    }                                                                       \
164*699cd480SApple OSS Distributions 	} while ( 0 )
165*699cd480SApple OSS Distributions  #endif
166*699cd480SApple OSS Distributions #else
167*699cd480SApple OSS Distributions     #define cc_require_or_return(assertion, value)                                  \
168*699cd480SApple OSS Distributions 	do {                                                                        \
169*699cd480SApple OSS Distributions 	    if ( __builtin_expect(!(assertion), 0) ) {                              \
170*699cd480SApple OSS Distributions 	        __CC_DEBUG_REQUIRE_MESSAGE(__CC_DEBUG_ASSERT_COMPONENT_NAME_STRING, \
171*699cd480SApple OSS Distributions 	            #assertion, #exceptionLabel, 0, __FILE__, __LINE__,  0);        \
172*699cd480SApple OSS Distributions 	        return value;                                                       \
173*699cd480SApple OSS Distributions 	    }                                                                       \
174*699cd480SApple OSS Distributions 	} while ( 0 )
175*699cd480SApple OSS Distributions #endif
176*699cd480SApple OSS Distributions #endif
177*699cd480SApple OSS Distributions 
178*699cd480SApple OSS Distributions #endif /* _CORECRYPTO_CC_MACROS_H_ */
179