Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
tag.h
Go to the documentation of this file.
1/*
2 * The MIT License (MIT)
3 *
4 * Copyright © 2017 Franklin "Snaipe" Mathieu <http://snai.pe/>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#ifndef CRITERION_INTERNAL_ASSERT_TAG_H_
25#define CRITERION_INTERNAL_ASSERT_TAG_H_
26
27#define CRI_ASSERT_SWALLOW_KEYWORD(Tag) CRI_IF_DEFINED(CRI_ASSERT_TEST_KW_ ## Tag, CRI_ASSERT_SWALLOW_KW_ ## Tag, , Tag, )
28#define CRI_ASSERT_TEST_KW_struct ,
29#define CRI_ASSERT_SWALLOW_KW_struct
30#define CRI_ASSERT_TEST_KW_class ,
31#define CRI_ASSERT_SWALLOW_KW_class
32#define CRI_ASSERT_TEST_KW_enum ,
33#define CRI_ASSERT_SWALLOW_KW_enum
34#define CRI_ASSERT_TEST_KW_union ,
35#define CRI_ASSERT_SWALLOW_KW_union
36
37#define CRI_ASSERT_TYPE_TAG(Tag) CR_EXPAND(CRI_ASSERT_TYPE_TAG_(Tag))
38#define CRI_ASSERT_TYPE_TAG_(Tag) CRI_IF_DEFINED_NODEFER(CRI_ASSERT_TEST_TAG_ ## Tag, CR_VA_HEAD(CRI_ASSERT_TYPE_TAG_ ## Tag), , CRI_ASSERT_TYPE_TAG_UNKNOWN, (Tag))
39
40#define CRI_USER_TAG_ID(Id, Tag) CR_CONCAT(CR_CONCAT(cr_user_, CRI_ASSERT_TYPE_TAG_ID(Tag)), _ ## Id)
41
42#define CRI_ASSERT_TYPE_TAG_ID(Tag) CR_EXPAND(CRI_ASSERT_TYPE_TAG_ID_(Tag))
43#define CRI_ASSERT_TYPE_TAG_ID_(Tag) CRI_IF_DEFINED_NODEFER(CRI_ASSERT_TEST_TAG_ ## Tag, CR_VA_HEAD(CRI_ASSERT_TYPE_TAG_ID_ ## Tag), , CRI_ASSERT_SWALLOW_KEYWORD, (Tag))
44
45#define CRI_ASSERT_TYPE_TAG_ARRLEN(Tag) CR_EXPAND(CRI_ASSERT_TYPE_TAG_ARRLEN_(Tag))
46#define CRI_ASSERT_TYPE_TAG_ARRLEN_(Tag) \
47 CRI_IF_DEFINED(CRI_ASSERT_TEST_TAG_ ## Tag, \
48 ((intptr_t) &((*(char (*)[])((char volatile *) 0))CR_VA_TAIL(CRI_ASSERT_TYPE_TAG_ ## Tag))), , \
49 CRI_ASSERT_TYPE_TAG_UNKNOWN, (Tag))
50
51#define CRI_ASSERT_TYPE_TAG_UNKNOWN(Tag) COMPILE_ERROR(Unknown tag #Tag.)
52
53#define CRI_ASSERT_TEST_TAG_i8 ,
54#define CRI_ASSERT_TEST_TAGC_i8() ,
55#define CRI_ASSERT_TYPE_TAG_i8 int8_t,
56#define CRI_ASSERT_TYPE_TAG_ID_i8 i8,
57
58#define CRI_ASSERT_TEST_TAG_i16 ,
59#define CRI_ASSERT_TEST_TAGC_i16() ,
60#define CRI_ASSERT_TYPE_TAG_i16 int16_t,
61#define CRI_ASSERT_TYPE_TAG_ID_i16 i16,
62
63#define CRI_ASSERT_TEST_TAG_i32 ,
64#define CRI_ASSERT_TEST_TAGC_i32() ,
65#define CRI_ASSERT_TYPE_TAG_i32 int32_t,
66#define CRI_ASSERT_TYPE_TAG_ID_i32 i32,
67
68#define CRI_ASSERT_TEST_TAG_i64 ,
69#define CRI_ASSERT_TEST_TAGC_i64() ,
70#define CRI_ASSERT_TYPE_TAG_i64 int64_t,
71#define CRI_ASSERT_TYPE_TAG_ID_i64 i64,
72
73#define CRI_ASSERT_TEST_TAG_u8 ,
74#define CRI_ASSERT_TEST_TAGC_u8() ,
75#define CRI_ASSERT_TYPE_TAG_u8 uint8_t,
76#define CRI_ASSERT_TYPE_TAG_ID_u8 u8,
77
78#define CRI_ASSERT_TEST_TAG_u16 ,
79#define CRI_ASSERT_TEST_TAGC_u16() ,
80#define CRI_ASSERT_TYPE_TAG_u16 uint16_t,
81#define CRI_ASSERT_TYPE_TAG_ID_u16 u16,
82
83#define CRI_ASSERT_TEST_TAG_u32 ,
84#define CRI_ASSERT_TEST_TAGC_u32() ,
85#define CRI_ASSERT_TYPE_TAG_u32 uint32_t,
86#define CRI_ASSERT_TYPE_TAG_ID_u32 u32,
87
88#define CRI_ASSERT_TEST_TAG_u64 ,
89#define CRI_ASSERT_TEST_TAGC_u64() ,
90#define CRI_ASSERT_TYPE_TAG_u64 uint64_t,
91#define CRI_ASSERT_TYPE_TAG_ID_u64 u64,
92
93#define CRI_ASSERT_TEST_TAG_chr ,
94#define CRI_ASSERT_TEST_TAGC_chr() ,
95#define CRI_ASSERT_TYPE_TAG_chr char,
96#define CRI_ASSERT_TYPE_TAG_ID_chr chr,
97
98#define CRI_ASSERT_TEST_TAG_int ,
99#define CRI_ASSERT_TEST_TAGC_int() ,
100#define CRI_ASSERT_TYPE_TAG_int int,
101#define CRI_ASSERT_TYPE_TAG_ID_int int,
102
103#define CRI_ASSERT_TEST_TAG_uint ,
104#define CRI_ASSERT_TEST_TAGC_uint() ,
105#define CRI_ASSERT_TYPE_TAG_uint unsigned int,
106#define CRI_ASSERT_TYPE_TAG_ID_uint uint,
107
108#define CRI_ASSERT_TEST_TAG_long ,
109#define CRI_ASSERT_TEST_TAGC_long() ,
110#define CRI_ASSERT_TYPE_TAG_long long,
111#define CRI_ASSERT_TYPE_TAG_ID_long long,
112
113#define CRI_ASSERT_TEST_TAG_ulong ,
114#define CRI_ASSERT_TEST_TAGC_ulong() ,
115#define CRI_ASSERT_TYPE_TAG_ulong unsigned long,
116#define CRI_ASSERT_TYPE_TAG_ID_ulong ulong,
117
118#define CRI_ASSERT_TEST_TAG_llong ,
119#define CRI_ASSERT_TEST_TAGC_llong() ,
120#define CRI_ASSERT_TYPE_TAG_llong long long,
121#define CRI_ASSERT_TYPE_TAG_ID_llong llong,
122
123#define CRI_ASSERT_TEST_TAG_ullong ,
124#define CRI_ASSERT_TEST_TAGC_ullong() ,
125#define CRI_ASSERT_TYPE_TAG_ullong unsigned long long,
126#define CRI_ASSERT_TYPE_TAG_ID_ullong ullong,
127
128#define CRI_ASSERT_TEST_TAG_ptr ,
129#define CRI_ASSERT_TEST_TAGC_ptr() ,
130#define CRI_ASSERT_TYPE_TAG_ptr void *,
131#define CRI_ASSERT_TYPE_TAG_ID_ptr ptr,
132
133#define CRI_ASSERT_TEST_TAG_str ,
134#define CRI_ASSERT_TEST_TAGC_str() ,
135#ifdef __cplusplus
136# define CRI_ASSERT_TYPE_TAG_str std::string,
137#else
138# define CRI_ASSERT_TYPE_TAG_str char *,
139#endif
140#define CRI_ASSERT_TYPE_TAG_ID_str str,
141
142#define CRI_ASSERT_TEST_TAG_wcs ,
143#define CRI_ASSERT_TEST_TAGC_wcs() ,
144#ifdef __cplusplus
145# define CRI_ASSERT_TYPE_TAG_wcs std::wstring,
146#else
147# define CRI_ASSERT_TYPE_TAG_wcs wchar_t *,
148#endif
149#define CRI_ASSERT_TYPE_TAG_ID_wcs wcs,
150
151#define CRI_ASSERT_TEST_TAG_tcs ,
152#define CRI_ASSERT_TEST_TAGC_tcs() ,
153#define CRI_ASSERT_TYPE_TAG_tcs _TCHAR *,
154#define CRI_ASSERT_TYPE_TAG_ID_tcs tcs,
155
156#define CRI_ASSERT_TEST_TAG_flt ,
157#define CRI_ASSERT_TEST_TAGC_flt() ,
158#define CRI_ASSERT_TYPE_TAG_flt float,
159#define CRI_ASSERT_TYPE_TAG_ID_flt flt,
160
161#define CRI_ASSERT_TEST_TAG_dbl ,
162#define CRI_ASSERT_TEST_TAGC_dbl() ,
163#define CRI_ASSERT_TYPE_TAG_dbl double,
164#define CRI_ASSERT_TYPE_TAG_ID_dbl dbl,
165
166#define CRI_ASSERT_TEST_TAG_ldbl ,
167#define CRI_ASSERT_TEST_TAGC_ldbl() ,
168#if defined (CRI_CAPS_LDBL_IS_DBL)
169# define CRI_ASSERT_TYPE_TAG_ldbl double,
170#else
171# define CRI_ASSERT_TYPE_TAG_ldbl long double,
172#endif
173#define CRI_ASSERT_TYPE_TAG_ID_ldbl ldbl,
174
175#define CRI_ASSERT_TEST_TAG_sz ,
176#define CRI_ASSERT_TEST_TAGC_sz() ,
177#define CRI_ASSERT_TYPE_TAG_sz size_t,
178#define CRI_ASSERT_TYPE_TAG_ID_sz sz,
179
180#define CRI_ASSERT_TEST_TAG_iptr ,
181#define CRI_ASSERT_TEST_TAGC_iptr() ,
182#define CRI_ASSERT_TYPE_TAG_iptr intptr_t,
183#define CRI_ASSERT_TYPE_TAG_ID_iptr iptr,
184
185#define CRI_ASSERT_TEST_TAG_uptr ,
186#define CRI_ASSERT_TEST_TAGC_uptr() ,
187#define CRI_ASSERT_TYPE_TAG_uptr uintptr_t,
188#define CRI_ASSERT_TYPE_TAG_ID_uptr uptr,
189
190#define CRI_ASSERT_TEST_TAG_type ,
191#define CRI_ASSERT_TEST_TAGC_type(x) CRI_ASSERT_TEST_TAGC_type_
192#define CRI_ASSERT_TEST_TAGC_type_() ,
193#define CRI_ASSERT_TYPE_TAG_type(T) T,
194#define CRI_ASSERT_TYPE_TAG_ID_type(T) CRI_ASSERT_SWALLOW_KEYWORD(T),
195
196#define CRI_ASSERT_DECLARE_NATIVE_CMP_FN(Tag) \
197 static inline int CRI_USER_TAG_ID(lt, Tag)( \
198 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
199 CRI_ASSERT_TYPE_TAG(Tag) *expected) \
200 { \
201 return *actual < *expected; \
202 } \
203 static inline int CRI_USER_TAG_ID(eq, Tag)( \
204 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
205 CRI_ASSERT_TYPE_TAG(Tag) *expected) \
206 { \
207 return *actual == *expected; \
208 } \
209 static inline int CRI_USER_TAG_ID(zero, Tag)( \
210 CRI_ASSERT_TYPE_TAG(Tag) *val) \
211 { \
212 return !*val; \
213 }
214
215#define CRI_ASSERT_DECLARE_NATIVE_FN(Tag, Fmt) \
216 CRI_ASSERT_DECLARE_NATIVE_CMP_FN(Tag) \
217 static inline char *CRI_USER_TAG_ID(tostr, Tag)( \
218 CRI_ASSERT_TYPE_TAG(Tag) *e) \
219 { \
220 char *str = NULL; \
221 cr_asprintf(&str, "%" Fmt, *e); \
222 return str; \
223 }
224
225#define CRI_ASSERT_DECLARE_STR_FN(Tag, Prefix, Fmt) \
226 CR_API int CRI_USER_TAG_ID(lt, Tag)( \
227 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
228 CRI_ASSERT_TYPE_TAG(Tag) *expected); \
229 CR_API int CRI_USER_TAG_ID(eq, Tag)( \
230 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
231 CRI_ASSERT_TYPE_TAG(Tag) *expected); \
232 CR_API int CRI_USER_TAG_ID(zero, Tag)(CRI_ASSERT_TYPE_TAG(Tag) *val); \
233 CR_API char *CRI_USER_TAG_ID(tostr, Tag)(CRI_ASSERT_TYPE_TAG(Tag) *e);
234
235#ifndef __cplusplus
236# include <string.h>
237# include <wchar.h>
238# include <float.h>
239
252CRI_ASSERT_DECLARE_STR_FN(wcs, "L", "ls")
253
254#ifdef _MSC_VER
255CRI_ASSERT_DECLARE_NATIVE_FN(llong, "I64d")
256CRI_ASSERT_DECLARE_NATIVE_FN(ullong, "I64u")
257#else
259CRI_ASSERT_DECLARE_NATIVE_FN(ullong, "llu")
260#endif
261
262#ifdef _MSC_VER
263# ifdef _WIN64
264# define CRI_PRIxPTR "I64x"
265# else
266# define CRI_PRIxPTR "lx"
267# endif
270#elif defined(__MINGW32__)
271# if __WORDSIZE == 64
272# define CRI_PRI64_PREFIX "l"
273# define CRI_PRIxPTR "lx"
274# else
275# define CRI_PRI64_PREFIX "ll"
276# define CRI_PRIxPTR "llx"
277# endif
278CRI_ASSERT_DECLARE_NATIVE_FN(i64, CRI_PRI64_PREFIX "d")
279CRI_ASSERT_DECLARE_NATIVE_FN(u64, CRI_PRI64_PREFIX "u")
280#else
281# define CRI_PRIxPTR PRIxPTR
284#endif
285
289
290static inline char *CRI_USER_TAG_ID(tostr, iptr)(intptr_t *e)
291{
292 uintptr_t absptr = (uintptr_t) *e;
293 if (absptr > (uintptr_t)INTPTR_MAX)
294 absptr = -absptr;
295
296 char *str = NULL;
297 cr_asprintf(&str, "%s0x%" CRI_PRIxPTR, *e < 0 ? "-" : "", absptr);
298 return str;
299}
300
301static inline char *CRI_USER_TAG_ID(tostr, uptr)(uintptr_t *e)
302{
303 char *str = NULL;
304 cr_asprintf(&str, "0x%" CRI_PRIxPTR, *e);
305 return str;
306}
307
308static inline char *CRI_USER_TAG_ID(tostr, ptr)(void **e)
309{
310 char *str = NULL;
311 cr_asprintf(&str, "0x%" CRI_PRIxPTR, (uintptr_t) *e);
312 return str;
313}
314
315#if defined (FLT_DECIMAL_DIG)
316# define CRI_FLT_DIG CR_STR(FLT_DECIMAL_DIG)
317#elif defined (__FLT_DECIMAL_DIG__)
318# define CRI_FLT_DIG CR_STR(__FLT_DECIMAL_DIG__)
319#elif defined (DECIMAL_DIG)
320# define CRI_FLT_DIG CR_STR(DECIMAL_DIG)
321#else
322# define CRI_FLT_DIG "9"
323#endif
324
325#if defined (DBL_DECIMAL_DIG)
326# define CRI_DBL_DIG CR_STR(DBL_DECIMAL_DIG)
327#elif defined (__DBL_DECIMAL_DIG__)
328# define CRI_DBL_DIG CR_STR(__DBL_DECIMAL_DIG__)
329#elif defined (DECIMAL_DIG)
330# define CRI_DBL_DIG CR_STR(DECIMAL_DIG)
331#else
332# define CRI_DBL_DIG "17"
333#endif
334
335#if defined (CRI_CAPS_LDBL_IS_DBL)
336# define CRI_LDBL_DIG CRI_DBL_DIG
337#elif defined (LDBL_DECIMAL_DIG)
338# define CRI_LDBL_DIG CR_STR(LDBL_DECIMAL_DIG)
339#elif defined (__LDBL_DECIMAL_DIG__)
340# define CRI_LDBL_DIG CR_STR(__LDBL_DECIMAL_DIG__)
341#elif defined (DECIMAL_DIG)
342# define CRI_LDBL_DIG CR_STR(DECIMAL_DIG)
343#else
344# define CRI_LDBL_DIG "21"
345#endif
346
349
350#if defined (CRI_CAPS_LDBL_IS_DBL)
352#else
354#endif
355
357#endif
358
359#if defined (_WIN32)
360# include <tchar.h>
361# if defined (_UNICODE)
363# else
365# endif
366#endif
367
368#include "memory.h"
369
370#ifdef CRI_CAPS_COMPLEX
371# include "complex.h"
372#endif
373
374#endif /* !CRITERION_INTERNAL_ASSERT_TAG_H_ */
CR_BEGIN_C_API CR_API int cr_asprintf(char **strp, const char *fmt,...)
#define CRI_PRIuSIZE
Definition common.h:99
#define inline
Definition gmacros.h:131
#define NULL
Definition gmacros.h:924
CURL_EXTERN CURLMcode curl_socket_t s
Definition multi.h:318
UINT32_TYPE u32
Definition sqlite3.c:14331
sqlite_uint64 u64
Definition sqlite3.c:14330
UINT16_TYPE u16
Definition sqlite3.c:14332
sqlite_int64 i64
Definition sqlite3.c:14329
UINT8_TYPE u8
Definition sqlite3.c:14334
INT16_TYPE i16
Definition sqlite3.c:14333
INT8_TYPE i8
Definition sqlite3.c:14335
u64 uptr
Definition sqlite3.c:14404
#define CRI_ASSERT_DECLARE_STR_FN(Tag, Prefix, Fmt)
Definition tag.h:225
#define CRI_PRIxPTR
Definition tag.h:281
#define CRI_ASSERT_DECLARE_NATIVE_CMP_FN(Tag)
Definition tag.h:196
#define CRI_LDBL_DIG
Definition tag.h:344
#define CRI_DBL_DIG
Definition tag.h:332
#define CRI_FLT_DIG
Definition tag.h:322
#define CRI_USER_TAG_ID(Id, Tag)
Definition tag.h:40
#define CRI_ASSERT_DECLARE_NATIVE_FN(Tag, Fmt)
Definition tag.h:215