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