1 /* 2 * Copyright (c) 2017 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 /* 29 * Copyright (c) 2003, Adam Dunkels. 30 * All rights reserved. 31 * 32 * Redistribution and use in source and binary forms, with or without 33 * modification, are permitted provided that the following conditions 34 * are met: 35 * 1. Redistributions of source code must retain the above copyright 36 * notice, this list of conditions and the following disclaimer. 37 * 2. Redistributions in binary form must reproduce the above 38 * copyright notice, this list of conditions and the following 39 * disclaimer in the documentation and/or other materials provided 40 * with the distribution. 41 * 3. The name of the author may not be used to endorse or promote 42 * products derived from this software without specific prior 43 * written permission. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 46 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 47 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 49 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 51 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 52 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 53 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 54 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 55 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56 * 57 * This file is part of the Contiki desktop OS 58 * 59 * 60 */ 61 62 /** 63 * \file 64 * Default definitions of C compiler quirk work-arounds. 65 * \author Adam Dunkels <[email protected]> 66 * 67 * This file is used for making use of extra functionality of some C 68 * compilers used for Contiki, and defining work-arounds for various 69 * quirks and problems with some other C compilers. 70 */ 71 72 #ifndef CC_H_ 73 #define CC_H_ 74 75 #include "contiki-conf.h" 76 77 /** 78 * Configure if the C compiler supports the "register" keyword for 79 * function arguments. 80 */ 81 #if CC_CONF_REGISTER_ARGS 82 #define CC_REGISTER_ARG register 83 #else /* CC_CONF_REGISTER_ARGS */ 84 #define CC_REGISTER_ARG 85 #endif /* CC_CONF_REGISTER_ARGS */ 86 87 /** 88 * Configure if the C compiler supports the arguments for function 89 * pointers. 90 */ 91 #if CC_CONF_FUNCTION_POINTER_ARGS 92 #define CC_FUNCTION_POINTER_ARGS 1 93 #else /* CC_CONF_FUNCTION_POINTER_ARGS */ 94 #define CC_FUNCTION_POINTER_ARGS 0 95 #endif /* CC_CONF_FUNCTION_POINTER_ARGS */ 96 97 /** 98 * Configure if the C compiler supports fastcall function 99 * declarations. 100 */ 101 #ifdef CC_CONF_FASTCALL 102 #define CC_FASTCALL CC_CONF_FASTCALL 103 #else /* CC_CONF_FASTCALL */ 104 #define CC_FASTCALL 105 #endif /* CC_CONF_FASTCALL */ 106 107 /** 108 * Configure if the C compiler have problems with const function pointers 109 */ 110 #ifdef CC_CONF_CONST_FUNCTION_BUG 111 #define CC_CONST_FUNCTION 112 #else /* CC_CONF_FASTCALL */ 113 #define CC_CONST_FUNCTION const 114 #endif /* CC_CONF_FASTCALL */ 115 116 /** 117 * Configure work-around for unsigned char bugs with sdcc. 118 */ 119 #if CC_CONF_UNSIGNED_CHAR_BUGS 120 #define CC_UNSIGNED_CHAR_BUGS 1 121 #else /* CC_CONF_UNSIGNED_CHAR_BUGS */ 122 #define CC_UNSIGNED_CHAR_BUGS 0 123 #endif /* CC_CONF_UNSIGNED_CHAR_BUGS */ 124 125 /** 126 * Configure if C compiler supports double hash marks in C macros. 127 */ 128 #if CC_CONF_DOUBLE_HASH 129 #define CC_DOUBLE_HASH 1 130 #else /* CC_CONF_DOUBLE_HASH */ 131 #define CC_DOUBLE_HASH 0 132 #endif /* CC_CONF_DOUBLE_HASH */ 133 134 #ifdef CC_CONF_INLINE 135 #define CC_INLINE CC_CONF_INLINE 136 #else /* CC_CONF_INLINE */ 137 #define CC_INLINE 138 #endif /* CC_CONF_INLINE */ 139 140 /** 141 * Configure if the C compiler supports the assignment of struct value. 142 */ 143 #ifdef CC_CONF_ASSIGN_AGGREGATE 144 #define CC_ASSIGN_AGGREGATE(dest, src) CC_CONF_ASSIGN_AGGREGATE(dest, src) 145 #else /* CC_CONF_ASSIGN_AGGREGATE */ 146 #define CC_ASSIGN_AGGREGATE(dest, src) *dest = *src 147 #endif /* CC_CONF_ASSIGN_AGGREGATE */ 148 149 #if CC_CONF_NO_VA_ARGS 150 #define CC_NO_VA_ARGS CC_CONF_VA_ARGS 151 #endif 152 153 #ifndef NULL 154 #define NULL 0 155 #endif /* NULL */ 156 157 #ifndef MAX 158 #define MAX(n, m) (((n) < (m)) ? (m) : (n)) 159 #endif 160 161 #ifndef MIN 162 #define MIN(n, m) (((n) < (m)) ? (n) : (m)) 163 #endif 164 165 #ifndef ABS 166 #define ABS(n) (((n) < 0) ? -(n) : (n)) 167 #endif 168 169 170 #define CC_CONCAT2(s1, s2) s1##s2 171 /** 172 * A C preprocessing macro for concatenating two preprocessor tokens. 173 * 174 * We need use two macros (CC_CONCAT and CC_CONCAT2) in order to allow 175 * concatenation of two \#defined macros. 176 */ 177 #define CC_CONCAT(s1, s2) CC_CONCAT2(s1, s2) 178 #define CC_CONCAT_EXT_2(s1, s2) CC_CONCAT2(s1, s2) 179 180 /** 181 * A C preprocessing macro for concatenating three preprocessor tokens. 182 */ 183 #define CC_CONCAT3(s1, s2, s3) s1##s2##s3 184 #define CC_CONCAT_EXT_3(s1, s2, s3) CC_CONCAT3(s1, s2, s3) 185 186 #endif /* CC_H_ */ 187