1 /* 2 * Copyright 2008 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef CMOCKA_PRIVATE_H_ 18 #define CMOCKA_PRIVATE_H_ 19 20 #ifdef HAVE_CONFIG_H 21 #include "config.h" 22 #endif 23 24 #include <stdint.h> 25 26 #ifdef _WIN32 27 #include <windows.h> 28 29 # ifdef _MSC_VER 30 # include <stdio.h> /* _snprintf */ 31 32 # undef inline 33 # define inline __inline 34 35 # ifndef va_copy 36 # define va_copy(dest, src) (dest = src) 37 # endif 38 39 # define strcasecmp _stricmp 40 # define strncasecmp _strnicmp 41 42 # if defined(HAVE__SNPRINTF_S) 43 # undef snprintf 44 # define snprintf(d, n, ...) _snprintf_s((d), (n), _TRUNCATE, __VA_ARGS__) 45 # else /* HAVE__SNPRINTF_S */ 46 # if defined(HAVE__SNPRINTF) 47 # undef snprintf 48 # define snprintf _snprintf 49 # else /* HAVE__SNPRINTF */ 50 # if !defined(HAVE_SNPRINTF) 51 # error "no snprintf compatible function found" 52 # endif /* HAVE_SNPRINTF */ 53 # endif /* HAVE__SNPRINTF */ 54 # endif /* HAVE__SNPRINTF_S */ 55 56 # if defined(HAVE__VSNPRINTF_S) 57 # undef vsnprintf 58 # define vsnprintf(s, n, f, v) _vsnprintf_s((s), (n), _TRUNCATE, (f), (v)) 59 # else /* HAVE__VSNPRINTF_S */ 60 # if defined(HAVE__VSNPRINTF) 61 # undef vsnprintf 62 # define vsnprintf _vsnprintf 63 # else 64 # if !defined(HAVE_VSNPRINTF) 65 # error "No vsnprintf compatible function found" 66 # endif /* HAVE_VSNPRINTF */ 67 # endif /* HAVE__VSNPRINTF */ 68 # endif /* HAVE__VSNPRINTF_S */ 69 # endif /* _MSC_VER */ 70 71 /* 72 * Backwards compatibility with headers shipped with Visual Studio 2005 and 73 * earlier. 74 */ 75 WINBASEAPI BOOL WINAPI IsDebuggerPresent(VOID); 76 77 #ifndef PRIdS 78 # define PRIdS "Id" 79 #endif 80 81 #ifndef PRIu64 82 # define PRIu64 "I64u" 83 #endif 84 85 #ifndef PRIuMAX 86 # define PRIuMAX PRIu64 87 #endif 88 89 #ifndef PRIxMAX 90 #define PRIxMAX "I64x" 91 #endif 92 93 #ifndef PRIXMAX 94 #define PRIXMAX "I64X" 95 #endif 96 97 #else /* _WIN32 */ 98 99 #ifndef __PRI64_PREFIX 100 # if __WORDSIZE == 64 101 # define __PRI64_PREFIX "l" 102 # else 103 # define __PRI64_PREFIX "ll" 104 # endif 105 #endif 106 107 #ifndef PRIdS 108 # define PRIdS "zd" 109 #endif 110 111 #ifndef PRIu64 112 # define PRIu64 __PRI64_PREFIX "u" 113 #endif 114 115 #ifndef PRIuMAX 116 # define PRIuMAX __PRI64_PREFIX "u" 117 #endif 118 119 #ifndef PRIxMAX 120 #define PRIxMAX __PRI64_PREFIX "x" 121 #endif 122 123 #ifndef PRIXMAX 124 #define PRIXMAX __PRI64_PREFIX "X" 125 #endif 126 127 #endif /* _WIN32 */ 128 129 /** Free memory space */ 130 #define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0) 131 132 /** Zero a structure */ 133 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x)) 134 135 /** Zero a structure given a pointer to the structure */ 136 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0) 137 138 /** Get the size of an array */ 139 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) 140 141 /** Overwrite the complete string with 'X' */ 142 #define BURN_STRING(x) do { if ((x) != NULL) memset((x), 'X', strlen((x))); } while(0) 143 144 /** 145 * This is a hack to fix warnings. The idea is to use this everywhere that we 146 * get the "discarding const" warning by the compiler. That doesn't actually 147 * fix the real issue, but marks the place and you can search the code for 148 * discard_const. 149 * 150 * Please use this macro only when there is no other way to fix the warning. 151 * We should use this function in only in a very few places. 152 * 153 * Also, please call this via the discard_const_p() macro interface, as that 154 * makes the return type safe. 155 */ 156 #define discard_const(ptr) ((void *)((uintptr_t)(ptr))) 157 158 /** 159 * Type-safe version of discard_const 160 */ 161 #define discard_const_p(type, ptr) ((type *)discard_const(ptr)) 162 163 #endif /* CMOCKA_PRIVATE_H_ */ 164