| 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 | #include <stdint.h> |
| 21 | |
| 22 | #ifdef _WIN32 |
| 23 | #include <windows.h> |
| 24 | |
| 25 | #ifdef _MSC_VER |
| 26 | #include <stdio.h> /* _snprintf */ |
| 27 | |
| 28 | #undef inline |
| 29 | #define inline __inline |
| 30 | |
| 31 | #define strcasecmp _stricmp |
| 32 | #define strncasecmp _strnicmp |
| 33 | |
| 34 | #if defined(HAVE__SNPRINTF_S) |
| 35 | #undef snprintf |
| 36 | #define snprintf(d, n, ...) _snprintf_s((d), (n), _TRUNCATE, __VA_ARGS__) |
| 37 | #else /* HAVE__SNPRINTF_S */ |
| 38 | #if defined(HAVE__SNPRINTF) |
| 39 | #undef snprintf |
| 40 | #define snprintf _snprintf |
| 41 | #else /* HAVE__SNPRINTF */ |
| 42 | #if !defined(HAVE_SNPRINTF) |
| 43 | #pragma message "no snprintf compatible function found" |
| 44 | #endif /* HAVE_SNPRINTF */ |
| 45 | #endif /* HAVE__SNPRINTF */ |
| 46 | #endif /* HAVE__SNPRINTF_S */ |
| 47 | |
| 48 | #if defined(HAVE__VSNPRINTF_S) |
| 49 | #undef vsnprintf |
| 50 | #define vsnprintf(s, n, f, v) _vsnprintf_s((s), (n), _TRUNCATE, (f), (v)) |
| 51 | #else /* HAVE__VSNPRINTF_S */ |
| 52 | #if defined(HAVE__VSNPRINTF) |
| 53 | #undef vsnprintf |
| 54 | #define vsnprintf _vsnprintf |
| 55 | #else |
| 56 | #if !defined(HAVE_VSNPRINTF) |
| 57 | #pragma message "No vsnprintf compatible function found" |
| 58 | #endif /* HAVE_VSNPRINTF */ |
| 59 | #endif /* HAVE__VSNPRINTF */ |
| 60 | #endif /* HAVE__VSNPRINTF_S */ |
| 61 | #endif /* _MSC_VER */ |
| 62 | |
| 63 | /* |
| 64 | * Backwards compatibility with headers shipped with Visual Studio 2005 and |
| 65 | * earlier. |
| 66 | */ |
| 67 | WINBASEAPI BOOL WINAPI IsDebuggerPresent(VOID); |
| 68 | |
| 69 | #ifndef PRIdS |
| 70 | #define PRIdS "Id" |
| 71 | #endif |
| 72 | |
| 73 | #ifndef PRIu64 |
| 74 | #define PRIu64 "I64u" |
| 75 | #endif |
| 76 | |
| 77 | #ifndef PRIuMAX |
| 78 | #define PRIuMAX PRIu64 |
| 79 | #endif |
| 80 | |
| 81 | #ifndef PRIxMAX |
| 82 | #define PRIxMAX "I64x" |
| 83 | #endif |
| 84 | |
| 85 | #ifndef PRIXMAX |
| 86 | #define PRIXMAX "I64X" |
| 87 | #endif |
| 88 | |
| 89 | #else /* _WIN32 */ |
| 90 | |
| 91 | #ifndef __PRI64_PREFIX |
| 92 | #if __WORDSIZE == 64 |
| 93 | #define __PRI64_PREFIX "l" |
| 94 | #else |
| 95 | #define __PRI64_PREFIX "ll" |
| 96 | #endif |
| 97 | #endif |
| 98 | |
| 99 | #ifndef PRIdS |
| 100 | #define PRIdS "zd" |
| 101 | #endif |
| 102 | |
| 103 | #ifndef PRIu64 |
| 104 | #define PRIu64 __PRI64_PREFIX "u" |
| 105 | #endif |
| 106 | |
| 107 | #ifndef PRIuMAX |
| 108 | #define PRIuMAX __PRI64_PREFIX "u" |
| 109 | #endif |
| 110 | |
| 111 | #ifndef PRIxMAX |
| 112 | #define PRIxMAX __PRI64_PREFIX "x" |
| 113 | #endif |
| 114 | |
| 115 | #ifndef PRIXMAX |
| 116 | #define PRIXMAX __PRI64_PREFIX "X" |
| 117 | #endif |
| 118 | |
| 119 | #endif /* _WIN32 */ |
| 120 | |
| 121 | /** Free memory space */ |
| 122 | #define SAFE_FREE(x) \ |
| 123 | do { \ |
| 124 | if ((x) != NULL) { \ |
| 125 | free(x); \ |
| 126 | x = NULL; \ |
| 127 | } \ |
| 128 | } while (0) |
| 129 | |
| 130 | /** Zero a structure */ |
| 131 | #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x)) |
| 132 | |
| 133 | /** Zero a structure given a pointer to the structure */ |
| 134 | #define ZERO_STRUCTP(x) \ |
| 135 | do { \ |
| 136 | if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); \ |
| 137 | } while (0) |
| 138 | |
| 139 | /** Get the size of an array */ |
| 140 | #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) |
| 141 | |
| 142 | /** Overwrite the complete string with 'X' */ |
| 143 | #define BURN_STRING(x) \ |
| 144 | do { \ |
| 145 | if ((x) != NULL) memset((x), 'X', strlen((x))); \ |
| 146 | } while (0) |
| 147 | |
| 148 | /** |
| 149 | * This is a hack to fix warnings. The idea is to use this everywhere that we |
| 150 | * get the "discarding const" warning by the compiler. That doesn't actually |
| 151 | * fix the real issue, but marks the place and you can search the code for |
| 152 | * discard_const. |
| 153 | * |
| 154 | * Please use this macro only when there is no other way to fix the warning. |
| 155 | * We should use this function in only in a very few places. |
| 156 | * |
| 157 | * Also, please call this via the discard_const_p() macro interface, as that |
| 158 | * makes the return type safe. |
| 159 | */ |
| 160 | #define discard_const(ptr) ((void *)((uintptr_t)(ptr))) |
| 161 | |
| 162 | /** |
| 163 | * Type-safe version of discard_const |
| 164 | */ |
| 165 | #define discard_const_p(type, ptr) ((type *)discard_const(ptr)) |
| 166 | |
| 167 | #endif /* CMOCKA_PRIVATE_H_ */ |
| 168 | |