gucoordinates
fff.h
Go to the documentation of this file.
1/*
2LICENSE
3
4The MIT License (MIT)
5
6Copyright (c) 2010 Michael Long
7
8Permission is hereby granted, free of charge, to any person obtaining a copy
9of this software and associated documentation files (the "Software"), to deal
10in the Software without restriction, including without limitation the rights
11to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12copies of the Software, and to permit persons to whom the Software is
13furnished to do so, subject to the following conditions:
14
15The above copyright notice and this permission notice shall be included in all
16copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24SOFTWARE.
25*/
26#ifndef FAKE_FUNCTIONS
27#define FAKE_FUNCTIONS
28
29#include <stdarg.h>
30#include <string.h> /* For memset and memcpy */
31
32#define FFF_MAX_ARGS (20u)
33#ifndef FFF_ARG_HISTORY_LEN
34 #define FFF_ARG_HISTORY_LEN (50u)
35#endif
36#ifndef FFF_CALL_HISTORY_LEN
37 #define FFF_CALL_HISTORY_LEN (50u)
38#endif
39#ifndef FFF_GCC_FUNCTION_ATTRIBUTES
40 #define FFF_GCC_FUNCTION_ATTRIBUTES
41#endif
42/* -- INTERNAL HELPER MACROS -- */
43#define SET_RETURN_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \
44 FUNCNAME##_fake.return_val_seq = ARRAY_POINTER; \
45 FUNCNAME##_fake.return_val_seq_len = ARRAY_LEN;
46#define SET_CUSTOM_FAKE_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \
47 FUNCNAME##_fake.custom_fake_seq = ARRAY_POINTER; \
48 FUNCNAME##_fake.custom_fake_seq_len = ARRAY_LEN;
49
50/* Defining a function to reset a fake function */
51#define RESET_FAKE(FUNCNAME) { \
52 FUNCNAME##_reset(); \
53} \
54
55
56#define DECLARE_ARG(type, n, FUNCNAME) \
57 type arg##n##_val; \
58 type arg##n##_history[FFF_ARG_HISTORY_LEN];
59
60#define DECLARE_ALL_FUNC_COMMON \
61 unsigned int call_count; \
62 unsigned int arg_history_len; \
63 unsigned int arg_histories_dropped; \
64
65#define DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
66 RETURN_TYPE return_val_history[FFF_ARG_HISTORY_LEN];
67
68#define SAVE_ARG(FUNCNAME, n) \
69 memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));
70
71#define ROOM_FOR_MORE_HISTORY(FUNCNAME) \
72 FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN
73
74#define SAVE_RET_HISTORY(FUNCNAME, RETVAL) \
75 if ((FUNCNAME##_fake.call_count - 1) < FFF_ARG_HISTORY_LEN) \
76 memcpy((void *)&FUNCNAME##_fake.return_val_history[FUNCNAME##_fake.call_count - 1], (const void *) &RETVAL, sizeof(RETVAL)); \
77
78#define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \
79 memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));
80
81#define HISTORY_DROPPED(FUNCNAME) \
82 FUNCNAME##_fake.arg_histories_dropped++
83
84#define DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
85 RETURN_TYPE return_val; \
86 int return_val_seq_len; \
87 int return_val_seq_idx; \
88 RETURN_TYPE * return_val_seq; \
89
90#define DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
91 int custom_fake_seq_len; \
92 int custom_fake_seq_idx; \
93
94#define INCREMENT_CALL_COUNT(FUNCNAME) \
95 FUNCNAME##_fake.call_count++
96
97#define RETURN_FAKE_RESULT(FUNCNAME) \
98 if (FUNCNAME##_fake.return_val_seq_len){ /* then its a sequence */ \
99 if(FUNCNAME##_fake.return_val_seq_idx < FUNCNAME##_fake.return_val_seq_len) { \
100 SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx]) \
101 return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx++]; \
102 } \
103 SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]) \
104 return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]; /* return last element */ \
105 } \
106 SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val) \
107 return FUNCNAME##_fake.return_val; \
108
109#ifdef __cplusplus
110 #define FFF_EXTERN_C extern "C"{
111 #define FFF_END_EXTERN_C }
112#else /* ansi c */
113 #define FFF_EXTERN_C
114 #define FFF_END_EXTERN_C
115#endif /* cpp/ansi c */
116
117#define DEFINE_RESET_FUNCTION(FUNCNAME) \
118 void FUNCNAME##_reset(void){ \
119 memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake)); \
120 FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN; \
121 }
122/* -- END INTERNAL HELPER MACROS -- */
123
124typedef void (*fff_function_t)(void);
125typedef struct {
127 unsigned int call_history_idx;
129
131extern fff_globals_t fff;
133
134#define DEFINE_FFF_GLOBALS \
135 FFF_EXTERN_C \
136 fff_globals_t fff; \
137 FFF_END_EXTERN_C
138
139#define FFF_RESET_HISTORY() \
140 fff.call_history_idx = 0; \
141 memset(fff.call_history, 0, sizeof(fff.call_history));
142
143#define REGISTER_CALL(function) \
144 if(fff.call_history_idx < FFF_CALL_HISTORY_LEN) \
145 fff.call_history[fff.call_history_idx++] = (fff_function_t)function;
146
147#define DECLARE_FAKE_VOID_FUNC0(FUNCNAME) \
148 typedef struct FUNCNAME##_Fake { \
149 DECLARE_ALL_FUNC_COMMON \
150 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
151 void(*custom_fake)(void); \
152 void(**custom_fake_seq)(void); \
153 } FUNCNAME##_Fake; \
154 extern FUNCNAME##_Fake FUNCNAME##_fake; \
155 void FUNCNAME##_reset(void); \
156 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void); \
157
158#define DEFINE_FAKE_VOID_FUNC0(FUNCNAME) \
159 FUNCNAME##_Fake FUNCNAME##_fake; \
160 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void){ \
161 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
162 } \
163 else{ \
164 HISTORY_DROPPED(FUNCNAME); \
165 } \
166 INCREMENT_CALL_COUNT(FUNCNAME); \
167 REGISTER_CALL(FUNCNAME); \
168 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
169 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
170 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](); \
171 } \
172 else{ \
173 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \
174 } \
175 } \
176 if (FUNCNAME##_fake.custom_fake){ \
177 FUNCNAME##_fake.custom_fake(); \
178 } \
179 } \
180 DEFINE_RESET_FUNCTION(FUNCNAME) \
181
182#define FAKE_VOID_FUNC0(FUNCNAME) \
183 DECLARE_FAKE_VOID_FUNC0(FUNCNAME) \
184 DEFINE_FAKE_VOID_FUNC0(FUNCNAME) \
185
186
187#define DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
188 typedef struct FUNCNAME##_Fake { \
189 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
190 DECLARE_ALL_FUNC_COMMON \
191 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
192 void(*custom_fake)(ARG0_TYPE arg0); \
193 void(**custom_fake_seq)(ARG0_TYPE arg0); \
194 } FUNCNAME##_Fake; \
195 extern FUNCNAME##_Fake FUNCNAME##_fake; \
196 void FUNCNAME##_reset(void); \
197 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0); \
198
199#define DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
200 FUNCNAME##_Fake FUNCNAME##_fake; \
201 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0){ \
202 SAVE_ARG(FUNCNAME, 0); \
203 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
204 SAVE_ARG_HISTORY(FUNCNAME, 0); \
205 } \
206 else{ \
207 HISTORY_DROPPED(FUNCNAME); \
208 } \
209 INCREMENT_CALL_COUNT(FUNCNAME); \
210 REGISTER_CALL(FUNCNAME); \
211 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
212 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
213 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0); \
214 } \
215 else{ \
216 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \
217 } \
218 } \
219 if (FUNCNAME##_fake.custom_fake){ \
220 FUNCNAME##_fake.custom_fake(arg0); \
221 } \
222 } \
223 DEFINE_RESET_FUNCTION(FUNCNAME) \
224
225#define FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
226 DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
227 DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
228
229
230#define DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
231 typedef struct FUNCNAME##_Fake { \
232 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
233 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
234 DECLARE_ALL_FUNC_COMMON \
235 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
236 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
237 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
238 } FUNCNAME##_Fake; \
239 extern FUNCNAME##_Fake FUNCNAME##_fake; \
240 void FUNCNAME##_reset(void); \
241 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1); \
242
243#define DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
244 FUNCNAME##_Fake FUNCNAME##_fake; \
245 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1){ \
246 SAVE_ARG(FUNCNAME, 0); \
247 SAVE_ARG(FUNCNAME, 1); \
248 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
249 SAVE_ARG_HISTORY(FUNCNAME, 0); \
250 SAVE_ARG_HISTORY(FUNCNAME, 1); \
251 } \
252 else{ \
253 HISTORY_DROPPED(FUNCNAME); \
254 } \
255 INCREMENT_CALL_COUNT(FUNCNAME); \
256 REGISTER_CALL(FUNCNAME); \
257 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
258 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
259 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1); \
260 } \
261 else{ \
262 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \
263 } \
264 } \
265 if (FUNCNAME##_fake.custom_fake){ \
266 FUNCNAME##_fake.custom_fake(arg0, arg1); \
267 } \
268 } \
269 DEFINE_RESET_FUNCTION(FUNCNAME) \
270
271#define FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
272 DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
273 DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
274
275
276#define DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
277 typedef struct FUNCNAME##_Fake { \
278 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
279 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
280 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
281 DECLARE_ALL_FUNC_COMMON \
282 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
283 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
284 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
285 } FUNCNAME##_Fake; \
286 extern FUNCNAME##_Fake FUNCNAME##_fake; \
287 void FUNCNAME##_reset(void); \
288 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
289
290#define DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
291 FUNCNAME##_Fake FUNCNAME##_fake; \
292 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2){ \
293 SAVE_ARG(FUNCNAME, 0); \
294 SAVE_ARG(FUNCNAME, 1); \
295 SAVE_ARG(FUNCNAME, 2); \
296 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
297 SAVE_ARG_HISTORY(FUNCNAME, 0); \
298 SAVE_ARG_HISTORY(FUNCNAME, 1); \
299 SAVE_ARG_HISTORY(FUNCNAME, 2); \
300 } \
301 else{ \
302 HISTORY_DROPPED(FUNCNAME); \
303 } \
304 INCREMENT_CALL_COUNT(FUNCNAME); \
305 REGISTER_CALL(FUNCNAME); \
306 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
307 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
308 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2); \
309 } \
310 else{ \
311 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \
312 } \
313 } \
314 if (FUNCNAME##_fake.custom_fake){ \
315 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2); \
316 } \
317 } \
318 DEFINE_RESET_FUNCTION(FUNCNAME) \
319
320#define FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
321 DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
322 DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
323
324
325#define DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
326 typedef struct FUNCNAME##_Fake { \
327 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
328 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
329 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
330 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
331 DECLARE_ALL_FUNC_COMMON \
332 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
333 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
334 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
335 } FUNCNAME##_Fake; \
336 extern FUNCNAME##_Fake FUNCNAME##_fake; \
337 void FUNCNAME##_reset(void); \
338 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
339
340#define DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
341 FUNCNAME##_Fake FUNCNAME##_fake; \
342 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3){ \
343 SAVE_ARG(FUNCNAME, 0); \
344 SAVE_ARG(FUNCNAME, 1); \
345 SAVE_ARG(FUNCNAME, 2); \
346 SAVE_ARG(FUNCNAME, 3); \
347 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
348 SAVE_ARG_HISTORY(FUNCNAME, 0); \
349 SAVE_ARG_HISTORY(FUNCNAME, 1); \
350 SAVE_ARG_HISTORY(FUNCNAME, 2); \
351 SAVE_ARG_HISTORY(FUNCNAME, 3); \
352 } \
353 else{ \
354 HISTORY_DROPPED(FUNCNAME); \
355 } \
356 INCREMENT_CALL_COUNT(FUNCNAME); \
357 REGISTER_CALL(FUNCNAME); \
358 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
359 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
360 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3); \
361 } \
362 else{ \
363 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \
364 } \
365 } \
366 if (FUNCNAME##_fake.custom_fake){ \
367 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3); \
368 } \
369 } \
370 DEFINE_RESET_FUNCTION(FUNCNAME) \
371
372#define FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
373 DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
374 DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
375
376
377#define DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
378 typedef struct FUNCNAME##_Fake { \
379 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
380 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
381 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
382 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
383 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
384 DECLARE_ALL_FUNC_COMMON \
385 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
386 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
387 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
388 } FUNCNAME##_Fake; \
389 extern FUNCNAME##_Fake FUNCNAME##_fake; \
390 void FUNCNAME##_reset(void); \
391 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
392
393#define DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
394 FUNCNAME##_Fake FUNCNAME##_fake; \
395 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4){ \
396 SAVE_ARG(FUNCNAME, 0); \
397 SAVE_ARG(FUNCNAME, 1); \
398 SAVE_ARG(FUNCNAME, 2); \
399 SAVE_ARG(FUNCNAME, 3); \
400 SAVE_ARG(FUNCNAME, 4); \
401 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
402 SAVE_ARG_HISTORY(FUNCNAME, 0); \
403 SAVE_ARG_HISTORY(FUNCNAME, 1); \
404 SAVE_ARG_HISTORY(FUNCNAME, 2); \
405 SAVE_ARG_HISTORY(FUNCNAME, 3); \
406 SAVE_ARG_HISTORY(FUNCNAME, 4); \
407 } \
408 else{ \
409 HISTORY_DROPPED(FUNCNAME); \
410 } \
411 INCREMENT_CALL_COUNT(FUNCNAME); \
412 REGISTER_CALL(FUNCNAME); \
413 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
414 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
415 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4); \
416 } \
417 else{ \
418 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \
419 } \
420 } \
421 if (FUNCNAME##_fake.custom_fake){ \
422 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4); \
423 } \
424 } \
425 DEFINE_RESET_FUNCTION(FUNCNAME) \
426
427#define FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
428 DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
429 DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
430
431
432#define DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
433 typedef struct FUNCNAME##_Fake { \
434 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
435 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
436 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
437 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
438 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
439 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
440 DECLARE_ALL_FUNC_COMMON \
441 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
442 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
443 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
444 } FUNCNAME##_Fake; \
445 extern FUNCNAME##_Fake FUNCNAME##_fake; \
446 void FUNCNAME##_reset(void); \
447 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
448
449#define DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
450 FUNCNAME##_Fake FUNCNAME##_fake; \
451 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5){ \
452 SAVE_ARG(FUNCNAME, 0); \
453 SAVE_ARG(FUNCNAME, 1); \
454 SAVE_ARG(FUNCNAME, 2); \
455 SAVE_ARG(FUNCNAME, 3); \
456 SAVE_ARG(FUNCNAME, 4); \
457 SAVE_ARG(FUNCNAME, 5); \
458 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
459 SAVE_ARG_HISTORY(FUNCNAME, 0); \
460 SAVE_ARG_HISTORY(FUNCNAME, 1); \
461 SAVE_ARG_HISTORY(FUNCNAME, 2); \
462 SAVE_ARG_HISTORY(FUNCNAME, 3); \
463 SAVE_ARG_HISTORY(FUNCNAME, 4); \
464 SAVE_ARG_HISTORY(FUNCNAME, 5); \
465 } \
466 else{ \
467 HISTORY_DROPPED(FUNCNAME); \
468 } \
469 INCREMENT_CALL_COUNT(FUNCNAME); \
470 REGISTER_CALL(FUNCNAME); \
471 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
472 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
473 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5); \
474 } \
475 else{ \
476 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \
477 } \
478 } \
479 if (FUNCNAME##_fake.custom_fake){ \
480 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5); \
481 } \
482 } \
483 DEFINE_RESET_FUNCTION(FUNCNAME) \
484
485#define FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
486 DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
487 DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
488
489
490#define DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
491 typedef struct FUNCNAME##_Fake { \
492 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
493 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
494 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
495 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
496 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
497 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
498 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
499 DECLARE_ALL_FUNC_COMMON \
500 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
501 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
502 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
503 } FUNCNAME##_Fake; \
504 extern FUNCNAME##_Fake FUNCNAME##_fake; \
505 void FUNCNAME##_reset(void); \
506 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
507
508#define DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
509 FUNCNAME##_Fake FUNCNAME##_fake; \
510 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6){ \
511 SAVE_ARG(FUNCNAME, 0); \
512 SAVE_ARG(FUNCNAME, 1); \
513 SAVE_ARG(FUNCNAME, 2); \
514 SAVE_ARG(FUNCNAME, 3); \
515 SAVE_ARG(FUNCNAME, 4); \
516 SAVE_ARG(FUNCNAME, 5); \
517 SAVE_ARG(FUNCNAME, 6); \
518 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
519 SAVE_ARG_HISTORY(FUNCNAME, 0); \
520 SAVE_ARG_HISTORY(FUNCNAME, 1); \
521 SAVE_ARG_HISTORY(FUNCNAME, 2); \
522 SAVE_ARG_HISTORY(FUNCNAME, 3); \
523 SAVE_ARG_HISTORY(FUNCNAME, 4); \
524 SAVE_ARG_HISTORY(FUNCNAME, 5); \
525 SAVE_ARG_HISTORY(FUNCNAME, 6); \
526 } \
527 else{ \
528 HISTORY_DROPPED(FUNCNAME); \
529 } \
530 INCREMENT_CALL_COUNT(FUNCNAME); \
531 REGISTER_CALL(FUNCNAME); \
532 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
533 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
534 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
535 } \
536 else{ \
537 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
538 } \
539 } \
540 if (FUNCNAME##_fake.custom_fake){ \
541 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
542 } \
543 } \
544 DEFINE_RESET_FUNCTION(FUNCNAME) \
545
546#define FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
547 DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
548 DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
549
550
551#define DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
552 typedef struct FUNCNAME##_Fake { \
553 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
554 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
555 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
556 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
557 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
558 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
559 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
560 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
561 DECLARE_ALL_FUNC_COMMON \
562 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
563 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
564 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
565 } FUNCNAME##_Fake; \
566 extern FUNCNAME##_Fake FUNCNAME##_fake; \
567 void FUNCNAME##_reset(void); \
568 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
569
570#define DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
571 FUNCNAME##_Fake FUNCNAME##_fake; \
572 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7){ \
573 SAVE_ARG(FUNCNAME, 0); \
574 SAVE_ARG(FUNCNAME, 1); \
575 SAVE_ARG(FUNCNAME, 2); \
576 SAVE_ARG(FUNCNAME, 3); \
577 SAVE_ARG(FUNCNAME, 4); \
578 SAVE_ARG(FUNCNAME, 5); \
579 SAVE_ARG(FUNCNAME, 6); \
580 SAVE_ARG(FUNCNAME, 7); \
581 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
582 SAVE_ARG_HISTORY(FUNCNAME, 0); \
583 SAVE_ARG_HISTORY(FUNCNAME, 1); \
584 SAVE_ARG_HISTORY(FUNCNAME, 2); \
585 SAVE_ARG_HISTORY(FUNCNAME, 3); \
586 SAVE_ARG_HISTORY(FUNCNAME, 4); \
587 SAVE_ARG_HISTORY(FUNCNAME, 5); \
588 SAVE_ARG_HISTORY(FUNCNAME, 6); \
589 SAVE_ARG_HISTORY(FUNCNAME, 7); \
590 } \
591 else{ \
592 HISTORY_DROPPED(FUNCNAME); \
593 } \
594 INCREMENT_CALL_COUNT(FUNCNAME); \
595 REGISTER_CALL(FUNCNAME); \
596 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
597 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
598 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
599 } \
600 else{ \
601 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
602 } \
603 } \
604 if (FUNCNAME##_fake.custom_fake){ \
605 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
606 } \
607 } \
608 DEFINE_RESET_FUNCTION(FUNCNAME) \
609
610#define FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
611 DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
612 DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
613
614
615#define DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
616 typedef struct FUNCNAME##_Fake { \
617 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
618 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
619 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
620 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
621 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
622 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
623 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
624 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
625 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
626 DECLARE_ALL_FUNC_COMMON \
627 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
628 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
629 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
630 } FUNCNAME##_Fake; \
631 extern FUNCNAME##_Fake FUNCNAME##_fake; \
632 void FUNCNAME##_reset(void); \
633 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
634
635#define DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
636 FUNCNAME##_Fake FUNCNAME##_fake; \
637 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8){ \
638 SAVE_ARG(FUNCNAME, 0); \
639 SAVE_ARG(FUNCNAME, 1); \
640 SAVE_ARG(FUNCNAME, 2); \
641 SAVE_ARG(FUNCNAME, 3); \
642 SAVE_ARG(FUNCNAME, 4); \
643 SAVE_ARG(FUNCNAME, 5); \
644 SAVE_ARG(FUNCNAME, 6); \
645 SAVE_ARG(FUNCNAME, 7); \
646 SAVE_ARG(FUNCNAME, 8); \
647 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
648 SAVE_ARG_HISTORY(FUNCNAME, 0); \
649 SAVE_ARG_HISTORY(FUNCNAME, 1); \
650 SAVE_ARG_HISTORY(FUNCNAME, 2); \
651 SAVE_ARG_HISTORY(FUNCNAME, 3); \
652 SAVE_ARG_HISTORY(FUNCNAME, 4); \
653 SAVE_ARG_HISTORY(FUNCNAME, 5); \
654 SAVE_ARG_HISTORY(FUNCNAME, 6); \
655 SAVE_ARG_HISTORY(FUNCNAME, 7); \
656 SAVE_ARG_HISTORY(FUNCNAME, 8); \
657 } \
658 else{ \
659 HISTORY_DROPPED(FUNCNAME); \
660 } \
661 INCREMENT_CALL_COUNT(FUNCNAME); \
662 REGISTER_CALL(FUNCNAME); \
663 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
664 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
665 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
666 } \
667 else{ \
668 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
669 } \
670 } \
671 if (FUNCNAME##_fake.custom_fake){ \
672 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
673 } \
674 } \
675 DEFINE_RESET_FUNCTION(FUNCNAME) \
676
677#define FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
678 DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
679 DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
680
681
682#define DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
683 typedef struct FUNCNAME##_Fake { \
684 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
685 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
686 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
687 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
688 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
689 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
690 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
691 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
692 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
693 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
694 DECLARE_ALL_FUNC_COMMON \
695 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
696 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
697 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
698 } FUNCNAME##_Fake; \
699 extern FUNCNAME##_Fake FUNCNAME##_fake; \
700 void FUNCNAME##_reset(void); \
701 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
702
703#define DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
704 FUNCNAME##_Fake FUNCNAME##_fake; \
705 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9){ \
706 SAVE_ARG(FUNCNAME, 0); \
707 SAVE_ARG(FUNCNAME, 1); \
708 SAVE_ARG(FUNCNAME, 2); \
709 SAVE_ARG(FUNCNAME, 3); \
710 SAVE_ARG(FUNCNAME, 4); \
711 SAVE_ARG(FUNCNAME, 5); \
712 SAVE_ARG(FUNCNAME, 6); \
713 SAVE_ARG(FUNCNAME, 7); \
714 SAVE_ARG(FUNCNAME, 8); \
715 SAVE_ARG(FUNCNAME, 9); \
716 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
717 SAVE_ARG_HISTORY(FUNCNAME, 0); \
718 SAVE_ARG_HISTORY(FUNCNAME, 1); \
719 SAVE_ARG_HISTORY(FUNCNAME, 2); \
720 SAVE_ARG_HISTORY(FUNCNAME, 3); \
721 SAVE_ARG_HISTORY(FUNCNAME, 4); \
722 SAVE_ARG_HISTORY(FUNCNAME, 5); \
723 SAVE_ARG_HISTORY(FUNCNAME, 6); \
724 SAVE_ARG_HISTORY(FUNCNAME, 7); \
725 SAVE_ARG_HISTORY(FUNCNAME, 8); \
726 SAVE_ARG_HISTORY(FUNCNAME, 9); \
727 } \
728 else{ \
729 HISTORY_DROPPED(FUNCNAME); \
730 } \
731 INCREMENT_CALL_COUNT(FUNCNAME); \
732 REGISTER_CALL(FUNCNAME); \
733 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
734 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
735 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
736 } \
737 else{ \
738 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
739 } \
740 } \
741 if (FUNCNAME##_fake.custom_fake){ \
742 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
743 } \
744 } \
745 DEFINE_RESET_FUNCTION(FUNCNAME) \
746
747#define FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
748 DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
749 DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
750
751
752#define DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
753 typedef struct FUNCNAME##_Fake { \
754 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
755 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
756 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
757 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
758 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
759 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
760 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
761 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
762 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
763 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
764 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
765 DECLARE_ALL_FUNC_COMMON \
766 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
767 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
768 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
769 } FUNCNAME##_Fake; \
770 extern FUNCNAME##_Fake FUNCNAME##_fake; \
771 void FUNCNAME##_reset(void); \
772 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
773
774#define DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
775 FUNCNAME##_Fake FUNCNAME##_fake; \
776 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10){ \
777 SAVE_ARG(FUNCNAME, 0); \
778 SAVE_ARG(FUNCNAME, 1); \
779 SAVE_ARG(FUNCNAME, 2); \
780 SAVE_ARG(FUNCNAME, 3); \
781 SAVE_ARG(FUNCNAME, 4); \
782 SAVE_ARG(FUNCNAME, 5); \
783 SAVE_ARG(FUNCNAME, 6); \
784 SAVE_ARG(FUNCNAME, 7); \
785 SAVE_ARG(FUNCNAME, 8); \
786 SAVE_ARG(FUNCNAME, 9); \
787 SAVE_ARG(FUNCNAME, 10); \
788 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
789 SAVE_ARG_HISTORY(FUNCNAME, 0); \
790 SAVE_ARG_HISTORY(FUNCNAME, 1); \
791 SAVE_ARG_HISTORY(FUNCNAME, 2); \
792 SAVE_ARG_HISTORY(FUNCNAME, 3); \
793 SAVE_ARG_HISTORY(FUNCNAME, 4); \
794 SAVE_ARG_HISTORY(FUNCNAME, 5); \
795 SAVE_ARG_HISTORY(FUNCNAME, 6); \
796 SAVE_ARG_HISTORY(FUNCNAME, 7); \
797 SAVE_ARG_HISTORY(FUNCNAME, 8); \
798 SAVE_ARG_HISTORY(FUNCNAME, 9); \
799 SAVE_ARG_HISTORY(FUNCNAME, 10); \
800 } \
801 else{ \
802 HISTORY_DROPPED(FUNCNAME); \
803 } \
804 INCREMENT_CALL_COUNT(FUNCNAME); \
805 REGISTER_CALL(FUNCNAME); \
806 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
807 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
808 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
809 } \
810 else{ \
811 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
812 } \
813 } \
814 if (FUNCNAME##_fake.custom_fake){ \
815 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
816 } \
817 } \
818 DEFINE_RESET_FUNCTION(FUNCNAME) \
819
820#define FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
821 DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
822 DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
823
824
825#define DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
826 typedef struct FUNCNAME##_Fake { \
827 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
828 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
829 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
830 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
831 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
832 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
833 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
834 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
835 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
836 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
837 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
838 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
839 DECLARE_ALL_FUNC_COMMON \
840 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
841 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
842 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
843 } FUNCNAME##_Fake; \
844 extern FUNCNAME##_Fake FUNCNAME##_fake; \
845 void FUNCNAME##_reset(void); \
846 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
847
848#define DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
849 FUNCNAME##_Fake FUNCNAME##_fake; \
850 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11){ \
851 SAVE_ARG(FUNCNAME, 0); \
852 SAVE_ARG(FUNCNAME, 1); \
853 SAVE_ARG(FUNCNAME, 2); \
854 SAVE_ARG(FUNCNAME, 3); \
855 SAVE_ARG(FUNCNAME, 4); \
856 SAVE_ARG(FUNCNAME, 5); \
857 SAVE_ARG(FUNCNAME, 6); \
858 SAVE_ARG(FUNCNAME, 7); \
859 SAVE_ARG(FUNCNAME, 8); \
860 SAVE_ARG(FUNCNAME, 9); \
861 SAVE_ARG(FUNCNAME, 10); \
862 SAVE_ARG(FUNCNAME, 11); \
863 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
864 SAVE_ARG_HISTORY(FUNCNAME, 0); \
865 SAVE_ARG_HISTORY(FUNCNAME, 1); \
866 SAVE_ARG_HISTORY(FUNCNAME, 2); \
867 SAVE_ARG_HISTORY(FUNCNAME, 3); \
868 SAVE_ARG_HISTORY(FUNCNAME, 4); \
869 SAVE_ARG_HISTORY(FUNCNAME, 5); \
870 SAVE_ARG_HISTORY(FUNCNAME, 6); \
871 SAVE_ARG_HISTORY(FUNCNAME, 7); \
872 SAVE_ARG_HISTORY(FUNCNAME, 8); \
873 SAVE_ARG_HISTORY(FUNCNAME, 9); \
874 SAVE_ARG_HISTORY(FUNCNAME, 10); \
875 SAVE_ARG_HISTORY(FUNCNAME, 11); \
876 } \
877 else{ \
878 HISTORY_DROPPED(FUNCNAME); \
879 } \
880 INCREMENT_CALL_COUNT(FUNCNAME); \
881 REGISTER_CALL(FUNCNAME); \
882 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
883 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
884 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
885 } \
886 else{ \
887 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
888 } \
889 } \
890 if (FUNCNAME##_fake.custom_fake){ \
891 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
892 } \
893 } \
894 DEFINE_RESET_FUNCTION(FUNCNAME) \
895
896#define FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
897 DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
898 DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
899
900
901#define DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
902 typedef struct FUNCNAME##_Fake { \
903 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
904 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
905 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
906 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
907 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
908 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
909 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
910 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
911 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
912 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
913 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
914 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
915 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
916 DECLARE_ALL_FUNC_COMMON \
917 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
918 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
919 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
920 } FUNCNAME##_Fake; \
921 extern FUNCNAME##_Fake FUNCNAME##_fake; \
922 void FUNCNAME##_reset(void); \
923 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
924
925#define DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
926 FUNCNAME##_Fake FUNCNAME##_fake; \
927 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12){ \
928 SAVE_ARG(FUNCNAME, 0); \
929 SAVE_ARG(FUNCNAME, 1); \
930 SAVE_ARG(FUNCNAME, 2); \
931 SAVE_ARG(FUNCNAME, 3); \
932 SAVE_ARG(FUNCNAME, 4); \
933 SAVE_ARG(FUNCNAME, 5); \
934 SAVE_ARG(FUNCNAME, 6); \
935 SAVE_ARG(FUNCNAME, 7); \
936 SAVE_ARG(FUNCNAME, 8); \
937 SAVE_ARG(FUNCNAME, 9); \
938 SAVE_ARG(FUNCNAME, 10); \
939 SAVE_ARG(FUNCNAME, 11); \
940 SAVE_ARG(FUNCNAME, 12); \
941 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
942 SAVE_ARG_HISTORY(FUNCNAME, 0); \
943 SAVE_ARG_HISTORY(FUNCNAME, 1); \
944 SAVE_ARG_HISTORY(FUNCNAME, 2); \
945 SAVE_ARG_HISTORY(FUNCNAME, 3); \
946 SAVE_ARG_HISTORY(FUNCNAME, 4); \
947 SAVE_ARG_HISTORY(FUNCNAME, 5); \
948 SAVE_ARG_HISTORY(FUNCNAME, 6); \
949 SAVE_ARG_HISTORY(FUNCNAME, 7); \
950 SAVE_ARG_HISTORY(FUNCNAME, 8); \
951 SAVE_ARG_HISTORY(FUNCNAME, 9); \
952 SAVE_ARG_HISTORY(FUNCNAME, 10); \
953 SAVE_ARG_HISTORY(FUNCNAME, 11); \
954 SAVE_ARG_HISTORY(FUNCNAME, 12); \
955 } \
956 else{ \
957 HISTORY_DROPPED(FUNCNAME); \
958 } \
959 INCREMENT_CALL_COUNT(FUNCNAME); \
960 REGISTER_CALL(FUNCNAME); \
961 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
962 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
963 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
964 } \
965 else{ \
966 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
967 } \
968 } \
969 if (FUNCNAME##_fake.custom_fake){ \
970 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
971 } \
972 } \
973 DEFINE_RESET_FUNCTION(FUNCNAME) \
974
975#define FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
976 DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
977 DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
978
979
980#define DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
981 typedef struct FUNCNAME##_Fake { \
982 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
983 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
984 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
985 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
986 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
987 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
988 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
989 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
990 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
991 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
992 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
993 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
994 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
995 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
996 DECLARE_ALL_FUNC_COMMON \
997 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
998 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
999 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
1000 } FUNCNAME##_Fake; \
1001 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1002 void FUNCNAME##_reset(void); \
1003 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
1004
1005#define DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
1006 FUNCNAME##_Fake FUNCNAME##_fake; \
1007 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13){ \
1008 SAVE_ARG(FUNCNAME, 0); \
1009 SAVE_ARG(FUNCNAME, 1); \
1010 SAVE_ARG(FUNCNAME, 2); \
1011 SAVE_ARG(FUNCNAME, 3); \
1012 SAVE_ARG(FUNCNAME, 4); \
1013 SAVE_ARG(FUNCNAME, 5); \
1014 SAVE_ARG(FUNCNAME, 6); \
1015 SAVE_ARG(FUNCNAME, 7); \
1016 SAVE_ARG(FUNCNAME, 8); \
1017 SAVE_ARG(FUNCNAME, 9); \
1018 SAVE_ARG(FUNCNAME, 10); \
1019 SAVE_ARG(FUNCNAME, 11); \
1020 SAVE_ARG(FUNCNAME, 12); \
1021 SAVE_ARG(FUNCNAME, 13); \
1022 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1023 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1024 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1025 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1026 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1027 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1028 SAVE_ARG_HISTORY(FUNCNAME, 5); \
1029 SAVE_ARG_HISTORY(FUNCNAME, 6); \
1030 SAVE_ARG_HISTORY(FUNCNAME, 7); \
1031 SAVE_ARG_HISTORY(FUNCNAME, 8); \
1032 SAVE_ARG_HISTORY(FUNCNAME, 9); \
1033 SAVE_ARG_HISTORY(FUNCNAME, 10); \
1034 SAVE_ARG_HISTORY(FUNCNAME, 11); \
1035 SAVE_ARG_HISTORY(FUNCNAME, 12); \
1036 SAVE_ARG_HISTORY(FUNCNAME, 13); \
1037 } \
1038 else{ \
1039 HISTORY_DROPPED(FUNCNAME); \
1040 } \
1041 INCREMENT_CALL_COUNT(FUNCNAME); \
1042 REGISTER_CALL(FUNCNAME); \
1043 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1044 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1045 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
1046 } \
1047 else{ \
1048 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
1049 } \
1050 } \
1051 if (FUNCNAME##_fake.custom_fake){ \
1052 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
1053 } \
1054 } \
1055 DEFINE_RESET_FUNCTION(FUNCNAME) \
1056
1057#define FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
1058 DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
1059 DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
1060
1061
1062#define DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
1063 typedef struct FUNCNAME##_Fake { \
1064 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1065 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1066 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1067 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1068 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1069 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
1070 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
1071 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
1072 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
1073 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
1074 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
1075 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
1076 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
1077 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
1078 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
1079 DECLARE_ALL_FUNC_COMMON \
1080 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1081 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
1082 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
1083 } FUNCNAME##_Fake; \
1084 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1085 void FUNCNAME##_reset(void); \
1086 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
1087
1088#define DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
1089 FUNCNAME##_Fake FUNCNAME##_fake; \
1090 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14){ \
1091 SAVE_ARG(FUNCNAME, 0); \
1092 SAVE_ARG(FUNCNAME, 1); \
1093 SAVE_ARG(FUNCNAME, 2); \
1094 SAVE_ARG(FUNCNAME, 3); \
1095 SAVE_ARG(FUNCNAME, 4); \
1096 SAVE_ARG(FUNCNAME, 5); \
1097 SAVE_ARG(FUNCNAME, 6); \
1098 SAVE_ARG(FUNCNAME, 7); \
1099 SAVE_ARG(FUNCNAME, 8); \
1100 SAVE_ARG(FUNCNAME, 9); \
1101 SAVE_ARG(FUNCNAME, 10); \
1102 SAVE_ARG(FUNCNAME, 11); \
1103 SAVE_ARG(FUNCNAME, 12); \
1104 SAVE_ARG(FUNCNAME, 13); \
1105 SAVE_ARG(FUNCNAME, 14); \
1106 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1107 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1108 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1109 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1110 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1111 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1112 SAVE_ARG_HISTORY(FUNCNAME, 5); \
1113 SAVE_ARG_HISTORY(FUNCNAME, 6); \
1114 SAVE_ARG_HISTORY(FUNCNAME, 7); \
1115 SAVE_ARG_HISTORY(FUNCNAME, 8); \
1116 SAVE_ARG_HISTORY(FUNCNAME, 9); \
1117 SAVE_ARG_HISTORY(FUNCNAME, 10); \
1118 SAVE_ARG_HISTORY(FUNCNAME, 11); \
1119 SAVE_ARG_HISTORY(FUNCNAME, 12); \
1120 SAVE_ARG_HISTORY(FUNCNAME, 13); \
1121 SAVE_ARG_HISTORY(FUNCNAME, 14); \
1122 } \
1123 else{ \
1124 HISTORY_DROPPED(FUNCNAME); \
1125 } \
1126 INCREMENT_CALL_COUNT(FUNCNAME); \
1127 REGISTER_CALL(FUNCNAME); \
1128 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1129 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1130 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
1131 } \
1132 else{ \
1133 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
1134 } \
1135 } \
1136 if (FUNCNAME##_fake.custom_fake){ \
1137 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
1138 } \
1139 } \
1140 DEFINE_RESET_FUNCTION(FUNCNAME) \
1141
1142#define FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
1143 DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
1144 DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
1145
1146
1147#define DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
1148 typedef struct FUNCNAME##_Fake { \
1149 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1150 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1151 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1152 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1153 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1154 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
1155 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
1156 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
1157 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
1158 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
1159 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
1160 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
1161 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
1162 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
1163 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
1164 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
1165 DECLARE_ALL_FUNC_COMMON \
1166 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1167 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
1168 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
1169 } FUNCNAME##_Fake; \
1170 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1171 void FUNCNAME##_reset(void); \
1172 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
1173
1174#define DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
1175 FUNCNAME##_Fake FUNCNAME##_fake; \
1176 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15){ \
1177 SAVE_ARG(FUNCNAME, 0); \
1178 SAVE_ARG(FUNCNAME, 1); \
1179 SAVE_ARG(FUNCNAME, 2); \
1180 SAVE_ARG(FUNCNAME, 3); \
1181 SAVE_ARG(FUNCNAME, 4); \
1182 SAVE_ARG(FUNCNAME, 5); \
1183 SAVE_ARG(FUNCNAME, 6); \
1184 SAVE_ARG(FUNCNAME, 7); \
1185 SAVE_ARG(FUNCNAME, 8); \
1186 SAVE_ARG(FUNCNAME, 9); \
1187 SAVE_ARG(FUNCNAME, 10); \
1188 SAVE_ARG(FUNCNAME, 11); \
1189 SAVE_ARG(FUNCNAME, 12); \
1190 SAVE_ARG(FUNCNAME, 13); \
1191 SAVE_ARG(FUNCNAME, 14); \
1192 SAVE_ARG(FUNCNAME, 15); \
1193 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1194 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1195 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1196 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1197 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1198 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1199 SAVE_ARG_HISTORY(FUNCNAME, 5); \
1200 SAVE_ARG_HISTORY(FUNCNAME, 6); \
1201 SAVE_ARG_HISTORY(FUNCNAME, 7); \
1202 SAVE_ARG_HISTORY(FUNCNAME, 8); \
1203 SAVE_ARG_HISTORY(FUNCNAME, 9); \
1204 SAVE_ARG_HISTORY(FUNCNAME, 10); \
1205 SAVE_ARG_HISTORY(FUNCNAME, 11); \
1206 SAVE_ARG_HISTORY(FUNCNAME, 12); \
1207 SAVE_ARG_HISTORY(FUNCNAME, 13); \
1208 SAVE_ARG_HISTORY(FUNCNAME, 14); \
1209 SAVE_ARG_HISTORY(FUNCNAME, 15); \
1210 } \
1211 else{ \
1212 HISTORY_DROPPED(FUNCNAME); \
1213 } \
1214 INCREMENT_CALL_COUNT(FUNCNAME); \
1215 REGISTER_CALL(FUNCNAME); \
1216 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1217 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1218 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
1219 } \
1220 else{ \
1221 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
1222 } \
1223 } \
1224 if (FUNCNAME##_fake.custom_fake){ \
1225 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
1226 } \
1227 } \
1228 DEFINE_RESET_FUNCTION(FUNCNAME) \
1229
1230#define FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
1231 DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
1232 DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
1233
1234
1235#define DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
1236 typedef struct FUNCNAME##_Fake { \
1237 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1238 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1239 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1240 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1241 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1242 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
1243 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
1244 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
1245 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
1246 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
1247 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
1248 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
1249 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
1250 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
1251 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
1252 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
1253 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
1254 DECLARE_ALL_FUNC_COMMON \
1255 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1256 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
1257 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
1258 } FUNCNAME##_Fake; \
1259 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1260 void FUNCNAME##_reset(void); \
1261 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
1262
1263#define DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
1264 FUNCNAME##_Fake FUNCNAME##_fake; \
1265 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16){ \
1266 SAVE_ARG(FUNCNAME, 0); \
1267 SAVE_ARG(FUNCNAME, 1); \
1268 SAVE_ARG(FUNCNAME, 2); \
1269 SAVE_ARG(FUNCNAME, 3); \
1270 SAVE_ARG(FUNCNAME, 4); \
1271 SAVE_ARG(FUNCNAME, 5); \
1272 SAVE_ARG(FUNCNAME, 6); \
1273 SAVE_ARG(FUNCNAME, 7); \
1274 SAVE_ARG(FUNCNAME, 8); \
1275 SAVE_ARG(FUNCNAME, 9); \
1276 SAVE_ARG(FUNCNAME, 10); \
1277 SAVE_ARG(FUNCNAME, 11); \
1278 SAVE_ARG(FUNCNAME, 12); \
1279 SAVE_ARG(FUNCNAME, 13); \
1280 SAVE_ARG(FUNCNAME, 14); \
1281 SAVE_ARG(FUNCNAME, 15); \
1282 SAVE_ARG(FUNCNAME, 16); \
1283 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1284 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1285 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1286 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1287 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1288 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1289 SAVE_ARG_HISTORY(FUNCNAME, 5); \
1290 SAVE_ARG_HISTORY(FUNCNAME, 6); \
1291 SAVE_ARG_HISTORY(FUNCNAME, 7); \
1292 SAVE_ARG_HISTORY(FUNCNAME, 8); \
1293 SAVE_ARG_HISTORY(FUNCNAME, 9); \
1294 SAVE_ARG_HISTORY(FUNCNAME, 10); \
1295 SAVE_ARG_HISTORY(FUNCNAME, 11); \
1296 SAVE_ARG_HISTORY(FUNCNAME, 12); \
1297 SAVE_ARG_HISTORY(FUNCNAME, 13); \
1298 SAVE_ARG_HISTORY(FUNCNAME, 14); \
1299 SAVE_ARG_HISTORY(FUNCNAME, 15); \
1300 SAVE_ARG_HISTORY(FUNCNAME, 16); \
1301 } \
1302 else{ \
1303 HISTORY_DROPPED(FUNCNAME); \
1304 } \
1305 INCREMENT_CALL_COUNT(FUNCNAME); \
1306 REGISTER_CALL(FUNCNAME); \
1307 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1308 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1309 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
1310 } \
1311 else{ \
1312 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
1313 } \
1314 } \
1315 if (FUNCNAME##_fake.custom_fake){ \
1316 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
1317 } \
1318 } \
1319 DEFINE_RESET_FUNCTION(FUNCNAME) \
1320
1321#define FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
1322 DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
1323 DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
1324
1325
1326#define DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
1327 typedef struct FUNCNAME##_Fake { \
1328 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1329 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1330 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1331 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1332 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1333 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
1334 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
1335 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
1336 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
1337 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
1338 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
1339 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
1340 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
1341 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
1342 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
1343 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
1344 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
1345 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
1346 DECLARE_ALL_FUNC_COMMON \
1347 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1348 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
1349 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
1350 } FUNCNAME##_Fake; \
1351 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1352 void FUNCNAME##_reset(void); \
1353 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
1354
1355#define DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
1356 FUNCNAME##_Fake FUNCNAME##_fake; \
1357 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17){ \
1358 SAVE_ARG(FUNCNAME, 0); \
1359 SAVE_ARG(FUNCNAME, 1); \
1360 SAVE_ARG(FUNCNAME, 2); \
1361 SAVE_ARG(FUNCNAME, 3); \
1362 SAVE_ARG(FUNCNAME, 4); \
1363 SAVE_ARG(FUNCNAME, 5); \
1364 SAVE_ARG(FUNCNAME, 6); \
1365 SAVE_ARG(FUNCNAME, 7); \
1366 SAVE_ARG(FUNCNAME, 8); \
1367 SAVE_ARG(FUNCNAME, 9); \
1368 SAVE_ARG(FUNCNAME, 10); \
1369 SAVE_ARG(FUNCNAME, 11); \
1370 SAVE_ARG(FUNCNAME, 12); \
1371 SAVE_ARG(FUNCNAME, 13); \
1372 SAVE_ARG(FUNCNAME, 14); \
1373 SAVE_ARG(FUNCNAME, 15); \
1374 SAVE_ARG(FUNCNAME, 16); \
1375 SAVE_ARG(FUNCNAME, 17); \
1376 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1377 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1378 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1379 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1380 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1381 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1382 SAVE_ARG_HISTORY(FUNCNAME, 5); \
1383 SAVE_ARG_HISTORY(FUNCNAME, 6); \
1384 SAVE_ARG_HISTORY(FUNCNAME, 7); \
1385 SAVE_ARG_HISTORY(FUNCNAME, 8); \
1386 SAVE_ARG_HISTORY(FUNCNAME, 9); \
1387 SAVE_ARG_HISTORY(FUNCNAME, 10); \
1388 SAVE_ARG_HISTORY(FUNCNAME, 11); \
1389 SAVE_ARG_HISTORY(FUNCNAME, 12); \
1390 SAVE_ARG_HISTORY(FUNCNAME, 13); \
1391 SAVE_ARG_HISTORY(FUNCNAME, 14); \
1392 SAVE_ARG_HISTORY(FUNCNAME, 15); \
1393 SAVE_ARG_HISTORY(FUNCNAME, 16); \
1394 SAVE_ARG_HISTORY(FUNCNAME, 17); \
1395 } \
1396 else{ \
1397 HISTORY_DROPPED(FUNCNAME); \
1398 } \
1399 INCREMENT_CALL_COUNT(FUNCNAME); \
1400 REGISTER_CALL(FUNCNAME); \
1401 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1402 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1403 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
1404 } \
1405 else{ \
1406 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
1407 } \
1408 } \
1409 if (FUNCNAME##_fake.custom_fake){ \
1410 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
1411 } \
1412 } \
1413 DEFINE_RESET_FUNCTION(FUNCNAME) \
1414
1415#define FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
1416 DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
1417 DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
1418
1419
1420#define DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
1421 typedef struct FUNCNAME##_Fake { \
1422 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1423 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1424 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1425 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1426 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1427 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
1428 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
1429 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
1430 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
1431 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
1432 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
1433 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
1434 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
1435 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
1436 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
1437 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
1438 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
1439 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
1440 DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
1441 DECLARE_ALL_FUNC_COMMON \
1442 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1443 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
1444 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
1445 } FUNCNAME##_Fake; \
1446 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1447 void FUNCNAME##_reset(void); \
1448 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
1449
1450#define DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
1451 FUNCNAME##_Fake FUNCNAME##_fake; \
1452 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18){ \
1453 SAVE_ARG(FUNCNAME, 0); \
1454 SAVE_ARG(FUNCNAME, 1); \
1455 SAVE_ARG(FUNCNAME, 2); \
1456 SAVE_ARG(FUNCNAME, 3); \
1457 SAVE_ARG(FUNCNAME, 4); \
1458 SAVE_ARG(FUNCNAME, 5); \
1459 SAVE_ARG(FUNCNAME, 6); \
1460 SAVE_ARG(FUNCNAME, 7); \
1461 SAVE_ARG(FUNCNAME, 8); \
1462 SAVE_ARG(FUNCNAME, 9); \
1463 SAVE_ARG(FUNCNAME, 10); \
1464 SAVE_ARG(FUNCNAME, 11); \
1465 SAVE_ARG(FUNCNAME, 12); \
1466 SAVE_ARG(FUNCNAME, 13); \
1467 SAVE_ARG(FUNCNAME, 14); \
1468 SAVE_ARG(FUNCNAME, 15); \
1469 SAVE_ARG(FUNCNAME, 16); \
1470 SAVE_ARG(FUNCNAME, 17); \
1471 SAVE_ARG(FUNCNAME, 18); \
1472 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1473 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1474 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1475 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1476 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1477 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1478 SAVE_ARG_HISTORY(FUNCNAME, 5); \
1479 SAVE_ARG_HISTORY(FUNCNAME, 6); \
1480 SAVE_ARG_HISTORY(FUNCNAME, 7); \
1481 SAVE_ARG_HISTORY(FUNCNAME, 8); \
1482 SAVE_ARG_HISTORY(FUNCNAME, 9); \
1483 SAVE_ARG_HISTORY(FUNCNAME, 10); \
1484 SAVE_ARG_HISTORY(FUNCNAME, 11); \
1485 SAVE_ARG_HISTORY(FUNCNAME, 12); \
1486 SAVE_ARG_HISTORY(FUNCNAME, 13); \
1487 SAVE_ARG_HISTORY(FUNCNAME, 14); \
1488 SAVE_ARG_HISTORY(FUNCNAME, 15); \
1489 SAVE_ARG_HISTORY(FUNCNAME, 16); \
1490 SAVE_ARG_HISTORY(FUNCNAME, 17); \
1491 SAVE_ARG_HISTORY(FUNCNAME, 18); \
1492 } \
1493 else{ \
1494 HISTORY_DROPPED(FUNCNAME); \
1495 } \
1496 INCREMENT_CALL_COUNT(FUNCNAME); \
1497 REGISTER_CALL(FUNCNAME); \
1498 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1499 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1500 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
1501 } \
1502 else{ \
1503 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
1504 } \
1505 } \
1506 if (FUNCNAME##_fake.custom_fake){ \
1507 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
1508 } \
1509 } \
1510 DEFINE_RESET_FUNCTION(FUNCNAME) \
1511
1512#define FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
1513 DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
1514 DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
1515
1516
1517#define DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
1518 typedef struct FUNCNAME##_Fake { \
1519 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1520 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1521 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1522 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1523 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1524 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
1525 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
1526 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
1527 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
1528 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
1529 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
1530 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
1531 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
1532 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
1533 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
1534 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
1535 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
1536 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
1537 DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
1538 DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
1539 DECLARE_ALL_FUNC_COMMON \
1540 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1541 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
1542 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
1543 } FUNCNAME##_Fake; \
1544 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1545 void FUNCNAME##_reset(void); \
1546 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
1547
1548#define DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
1549 FUNCNAME##_Fake FUNCNAME##_fake; \
1550 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19){ \
1551 SAVE_ARG(FUNCNAME, 0); \
1552 SAVE_ARG(FUNCNAME, 1); \
1553 SAVE_ARG(FUNCNAME, 2); \
1554 SAVE_ARG(FUNCNAME, 3); \
1555 SAVE_ARG(FUNCNAME, 4); \
1556 SAVE_ARG(FUNCNAME, 5); \
1557 SAVE_ARG(FUNCNAME, 6); \
1558 SAVE_ARG(FUNCNAME, 7); \
1559 SAVE_ARG(FUNCNAME, 8); \
1560 SAVE_ARG(FUNCNAME, 9); \
1561 SAVE_ARG(FUNCNAME, 10); \
1562 SAVE_ARG(FUNCNAME, 11); \
1563 SAVE_ARG(FUNCNAME, 12); \
1564 SAVE_ARG(FUNCNAME, 13); \
1565 SAVE_ARG(FUNCNAME, 14); \
1566 SAVE_ARG(FUNCNAME, 15); \
1567 SAVE_ARG(FUNCNAME, 16); \
1568 SAVE_ARG(FUNCNAME, 17); \
1569 SAVE_ARG(FUNCNAME, 18); \
1570 SAVE_ARG(FUNCNAME, 19); \
1571 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1572 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1573 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1574 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1575 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1576 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1577 SAVE_ARG_HISTORY(FUNCNAME, 5); \
1578 SAVE_ARG_HISTORY(FUNCNAME, 6); \
1579 SAVE_ARG_HISTORY(FUNCNAME, 7); \
1580 SAVE_ARG_HISTORY(FUNCNAME, 8); \
1581 SAVE_ARG_HISTORY(FUNCNAME, 9); \
1582 SAVE_ARG_HISTORY(FUNCNAME, 10); \
1583 SAVE_ARG_HISTORY(FUNCNAME, 11); \
1584 SAVE_ARG_HISTORY(FUNCNAME, 12); \
1585 SAVE_ARG_HISTORY(FUNCNAME, 13); \
1586 SAVE_ARG_HISTORY(FUNCNAME, 14); \
1587 SAVE_ARG_HISTORY(FUNCNAME, 15); \
1588 SAVE_ARG_HISTORY(FUNCNAME, 16); \
1589 SAVE_ARG_HISTORY(FUNCNAME, 17); \
1590 SAVE_ARG_HISTORY(FUNCNAME, 18); \
1591 SAVE_ARG_HISTORY(FUNCNAME, 19); \
1592 } \
1593 else{ \
1594 HISTORY_DROPPED(FUNCNAME); \
1595 } \
1596 INCREMENT_CALL_COUNT(FUNCNAME); \
1597 REGISTER_CALL(FUNCNAME); \
1598 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1599 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1600 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
1601 } \
1602 else{ \
1603 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
1604 } \
1605 } \
1606 if (FUNCNAME##_fake.custom_fake){ \
1607 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
1608 } \
1609 } \
1610 DEFINE_RESET_FUNCTION(FUNCNAME) \
1611
1612#define FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
1613 DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
1614 DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
1615
1616
1617#define DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
1618 typedef struct FUNCNAME##_Fake { \
1619 DECLARE_ALL_FUNC_COMMON \
1620 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
1621 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
1622 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1623 RETURN_TYPE(*custom_fake)(void); \
1624 RETURN_TYPE(**custom_fake_seq)(void); \
1625 } FUNCNAME##_Fake; \
1626 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1627 void FUNCNAME##_reset(void); \
1628 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void); \
1629
1630#define DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
1631 FUNCNAME##_Fake FUNCNAME##_fake; \
1632 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void){ \
1633 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1634 } \
1635 else{ \
1636 HISTORY_DROPPED(FUNCNAME); \
1637 } \
1638 INCREMENT_CALL_COUNT(FUNCNAME); \
1639 REGISTER_CALL(FUNCNAME); \
1640 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1641 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1642 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](); \
1643 SAVE_RET_HISTORY(FUNCNAME, ret); \
1644 return ret; \
1645 } \
1646 else{ \
1647 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \
1648 SAVE_RET_HISTORY(FUNCNAME, ret); \
1649 return ret; \
1650 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \
1651 } \
1652 } \
1653 if (FUNCNAME##_fake.custom_fake){ \
1654 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(); \
1655 SAVE_RET_HISTORY(FUNCNAME, ret); \
1656 return ret; \
1657 return FUNCNAME##_fake.custom_fake(); \
1658 } \
1659 RETURN_FAKE_RESULT(FUNCNAME) \
1660 } \
1661 DEFINE_RESET_FUNCTION(FUNCNAME) \
1662
1663#define FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
1664 DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
1665 DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
1666
1667
1668#define DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
1669 typedef struct FUNCNAME##_Fake { \
1670 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1671 DECLARE_ALL_FUNC_COMMON \
1672 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
1673 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
1674 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1675 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0); \
1676 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0); \
1677 } FUNCNAME##_Fake; \
1678 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1679 void FUNCNAME##_reset(void); \
1680 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0); \
1681
1682#define DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
1683 FUNCNAME##_Fake FUNCNAME##_fake; \
1684 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0){ \
1685 SAVE_ARG(FUNCNAME, 0); \
1686 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1687 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1688 } \
1689 else{ \
1690 HISTORY_DROPPED(FUNCNAME); \
1691 } \
1692 INCREMENT_CALL_COUNT(FUNCNAME); \
1693 REGISTER_CALL(FUNCNAME); \
1694 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1695 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1696 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0); \
1697 SAVE_RET_HISTORY(FUNCNAME, ret); \
1698 return ret; \
1699 } \
1700 else{ \
1701 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \
1702 SAVE_RET_HISTORY(FUNCNAME, ret); \
1703 return ret; \
1704 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \
1705 } \
1706 } \
1707 if (FUNCNAME##_fake.custom_fake){ \
1708 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0); \
1709 SAVE_RET_HISTORY(FUNCNAME, ret); \
1710 return ret; \
1711 return FUNCNAME##_fake.custom_fake(arg0); \
1712 } \
1713 RETURN_FAKE_RESULT(FUNCNAME) \
1714 } \
1715 DEFINE_RESET_FUNCTION(FUNCNAME) \
1716
1717#define FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
1718 DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
1719 DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
1720
1721
1722#define DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
1723 typedef struct FUNCNAME##_Fake { \
1724 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1725 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1726 DECLARE_ALL_FUNC_COMMON \
1727 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
1728 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
1729 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1730 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
1731 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
1732 } FUNCNAME##_Fake; \
1733 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1734 void FUNCNAME##_reset(void); \
1735 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1); \
1736
1737#define DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
1738 FUNCNAME##_Fake FUNCNAME##_fake; \
1739 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1){ \
1740 SAVE_ARG(FUNCNAME, 0); \
1741 SAVE_ARG(FUNCNAME, 1); \
1742 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1743 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1744 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1745 } \
1746 else{ \
1747 HISTORY_DROPPED(FUNCNAME); \
1748 } \
1749 INCREMENT_CALL_COUNT(FUNCNAME); \
1750 REGISTER_CALL(FUNCNAME); \
1751 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1752 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1753 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1); \
1754 SAVE_RET_HISTORY(FUNCNAME, ret); \
1755 return ret; \
1756 } \
1757 else{ \
1758 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \
1759 SAVE_RET_HISTORY(FUNCNAME, ret); \
1760 return ret; \
1761 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \
1762 } \
1763 } \
1764 if (FUNCNAME##_fake.custom_fake){ \
1765 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1); \
1766 SAVE_RET_HISTORY(FUNCNAME, ret); \
1767 return ret; \
1768 return FUNCNAME##_fake.custom_fake(arg0, arg1); \
1769 } \
1770 RETURN_FAKE_RESULT(FUNCNAME) \
1771 } \
1772 DEFINE_RESET_FUNCTION(FUNCNAME) \
1773
1774#define FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
1775 DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
1776 DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
1777
1778
1779#define DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
1780 typedef struct FUNCNAME##_Fake { \
1781 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1782 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1783 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1784 DECLARE_ALL_FUNC_COMMON \
1785 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
1786 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
1787 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1788 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
1789 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
1790 } FUNCNAME##_Fake; \
1791 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1792 void FUNCNAME##_reset(void); \
1793 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
1794
1795#define DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
1796 FUNCNAME##_Fake FUNCNAME##_fake; \
1797 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2){ \
1798 SAVE_ARG(FUNCNAME, 0); \
1799 SAVE_ARG(FUNCNAME, 1); \
1800 SAVE_ARG(FUNCNAME, 2); \
1801 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1802 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1803 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1804 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1805 } \
1806 else{ \
1807 HISTORY_DROPPED(FUNCNAME); \
1808 } \
1809 INCREMENT_CALL_COUNT(FUNCNAME); \
1810 REGISTER_CALL(FUNCNAME); \
1811 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1812 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1813 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2); \
1814 SAVE_RET_HISTORY(FUNCNAME, ret); \
1815 return ret; \
1816 } \
1817 else{ \
1818 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \
1819 SAVE_RET_HISTORY(FUNCNAME, ret); \
1820 return ret; \
1821 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \
1822 } \
1823 } \
1824 if (FUNCNAME##_fake.custom_fake){ \
1825 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2); \
1826 SAVE_RET_HISTORY(FUNCNAME, ret); \
1827 return ret; \
1828 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2); \
1829 } \
1830 RETURN_FAKE_RESULT(FUNCNAME) \
1831 } \
1832 DEFINE_RESET_FUNCTION(FUNCNAME) \
1833
1834#define FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
1835 DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
1836 DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
1837
1838
1839#define DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
1840 typedef struct FUNCNAME##_Fake { \
1841 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1842 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1843 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1844 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1845 DECLARE_ALL_FUNC_COMMON \
1846 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
1847 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
1848 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1849 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
1850 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
1851 } FUNCNAME##_Fake; \
1852 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1853 void FUNCNAME##_reset(void); \
1854 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
1855
1856#define DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
1857 FUNCNAME##_Fake FUNCNAME##_fake; \
1858 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3){ \
1859 SAVE_ARG(FUNCNAME, 0); \
1860 SAVE_ARG(FUNCNAME, 1); \
1861 SAVE_ARG(FUNCNAME, 2); \
1862 SAVE_ARG(FUNCNAME, 3); \
1863 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1864 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1865 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1866 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1867 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1868 } \
1869 else{ \
1870 HISTORY_DROPPED(FUNCNAME); \
1871 } \
1872 INCREMENT_CALL_COUNT(FUNCNAME); \
1873 REGISTER_CALL(FUNCNAME); \
1874 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1875 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1876 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3); \
1877 SAVE_RET_HISTORY(FUNCNAME, ret); \
1878 return ret; \
1879 } \
1880 else{ \
1881 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \
1882 SAVE_RET_HISTORY(FUNCNAME, ret); \
1883 return ret; \
1884 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \
1885 } \
1886 } \
1887 if (FUNCNAME##_fake.custom_fake){ \
1888 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3); \
1889 SAVE_RET_HISTORY(FUNCNAME, ret); \
1890 return ret; \
1891 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3); \
1892 } \
1893 RETURN_FAKE_RESULT(FUNCNAME) \
1894 } \
1895 DEFINE_RESET_FUNCTION(FUNCNAME) \
1896
1897#define FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
1898 DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
1899 DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
1900
1901
1902#define DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
1903 typedef struct FUNCNAME##_Fake { \
1904 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1905 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1906 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1907 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1908 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1909 DECLARE_ALL_FUNC_COMMON \
1910 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
1911 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
1912 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1913 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
1914 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
1915 } FUNCNAME##_Fake; \
1916 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1917 void FUNCNAME##_reset(void); \
1918 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
1919
1920#define DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
1921 FUNCNAME##_Fake FUNCNAME##_fake; \
1922 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4){ \
1923 SAVE_ARG(FUNCNAME, 0); \
1924 SAVE_ARG(FUNCNAME, 1); \
1925 SAVE_ARG(FUNCNAME, 2); \
1926 SAVE_ARG(FUNCNAME, 3); \
1927 SAVE_ARG(FUNCNAME, 4); \
1928 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1929 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1930 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1931 SAVE_ARG_HISTORY(FUNCNAME, 2); \
1932 SAVE_ARG_HISTORY(FUNCNAME, 3); \
1933 SAVE_ARG_HISTORY(FUNCNAME, 4); \
1934 } \
1935 else{ \
1936 HISTORY_DROPPED(FUNCNAME); \
1937 } \
1938 INCREMENT_CALL_COUNT(FUNCNAME); \
1939 REGISTER_CALL(FUNCNAME); \
1940 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
1941 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
1942 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4); \
1943 SAVE_RET_HISTORY(FUNCNAME, ret); \
1944 return ret; \
1945 } \
1946 else{ \
1947 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \
1948 SAVE_RET_HISTORY(FUNCNAME, ret); \
1949 return ret; \
1950 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \
1951 } \
1952 } \
1953 if (FUNCNAME##_fake.custom_fake){ \
1954 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4); \
1955 SAVE_RET_HISTORY(FUNCNAME, ret); \
1956 return ret; \
1957 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4); \
1958 } \
1959 RETURN_FAKE_RESULT(FUNCNAME) \
1960 } \
1961 DEFINE_RESET_FUNCTION(FUNCNAME) \
1962
1963#define FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
1964 DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
1965 DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
1966
1967
1968#define DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
1969 typedef struct FUNCNAME##_Fake { \
1970 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
1971 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
1972 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
1973 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
1974 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
1975 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
1976 DECLARE_ALL_FUNC_COMMON \
1977 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
1978 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
1979 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
1980 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
1981 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
1982 } FUNCNAME##_Fake; \
1983 extern FUNCNAME##_Fake FUNCNAME##_fake; \
1984 void FUNCNAME##_reset(void); \
1985 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
1986
1987#define DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
1988 FUNCNAME##_Fake FUNCNAME##_fake; \
1989 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5){ \
1990 SAVE_ARG(FUNCNAME, 0); \
1991 SAVE_ARG(FUNCNAME, 1); \
1992 SAVE_ARG(FUNCNAME, 2); \
1993 SAVE_ARG(FUNCNAME, 3); \
1994 SAVE_ARG(FUNCNAME, 4); \
1995 SAVE_ARG(FUNCNAME, 5); \
1996 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
1997 SAVE_ARG_HISTORY(FUNCNAME, 0); \
1998 SAVE_ARG_HISTORY(FUNCNAME, 1); \
1999 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2000 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2001 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2002 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2003 } \
2004 else{ \
2005 HISTORY_DROPPED(FUNCNAME); \
2006 } \
2007 INCREMENT_CALL_COUNT(FUNCNAME); \
2008 REGISTER_CALL(FUNCNAME); \
2009 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2010 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2011 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5); \
2012 SAVE_RET_HISTORY(FUNCNAME, ret); \
2013 return ret; \
2014 } \
2015 else{ \
2016 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \
2017 SAVE_RET_HISTORY(FUNCNAME, ret); \
2018 return ret; \
2019 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \
2020 } \
2021 } \
2022 if (FUNCNAME##_fake.custom_fake){ \
2023 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5); \
2024 SAVE_RET_HISTORY(FUNCNAME, ret); \
2025 return ret; \
2026 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5); \
2027 } \
2028 RETURN_FAKE_RESULT(FUNCNAME) \
2029 } \
2030 DEFINE_RESET_FUNCTION(FUNCNAME) \
2031
2032#define FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
2033 DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
2034 DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
2035
2036
2037#define DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
2038 typedef struct FUNCNAME##_Fake { \
2039 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2040 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2041 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2042 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2043 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2044 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2045 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2046 DECLARE_ALL_FUNC_COMMON \
2047 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2048 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2049 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2050 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
2051 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
2052 } FUNCNAME##_Fake; \
2053 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2054 void FUNCNAME##_reset(void); \
2055 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
2056
2057#define DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
2058 FUNCNAME##_Fake FUNCNAME##_fake; \
2059 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6){ \
2060 SAVE_ARG(FUNCNAME, 0); \
2061 SAVE_ARG(FUNCNAME, 1); \
2062 SAVE_ARG(FUNCNAME, 2); \
2063 SAVE_ARG(FUNCNAME, 3); \
2064 SAVE_ARG(FUNCNAME, 4); \
2065 SAVE_ARG(FUNCNAME, 5); \
2066 SAVE_ARG(FUNCNAME, 6); \
2067 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2068 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2069 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2070 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2071 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2072 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2073 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2074 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2075 } \
2076 else{ \
2077 HISTORY_DROPPED(FUNCNAME); \
2078 } \
2079 INCREMENT_CALL_COUNT(FUNCNAME); \
2080 REGISTER_CALL(FUNCNAME); \
2081 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2082 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2083 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
2084 SAVE_RET_HISTORY(FUNCNAME, ret); \
2085 return ret; \
2086 } \
2087 else{ \
2088 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
2089 SAVE_RET_HISTORY(FUNCNAME, ret); \
2090 return ret; \
2091 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
2092 } \
2093 } \
2094 if (FUNCNAME##_fake.custom_fake){ \
2095 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
2096 SAVE_RET_HISTORY(FUNCNAME, ret); \
2097 return ret; \
2098 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
2099 } \
2100 RETURN_FAKE_RESULT(FUNCNAME) \
2101 } \
2102 DEFINE_RESET_FUNCTION(FUNCNAME) \
2103
2104#define FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
2105 DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
2106 DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
2107
2108
2109#define DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
2110 typedef struct FUNCNAME##_Fake { \
2111 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2112 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2113 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2114 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2115 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2116 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2117 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2118 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2119 DECLARE_ALL_FUNC_COMMON \
2120 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2121 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2122 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2123 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
2124 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
2125 } FUNCNAME##_Fake; \
2126 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2127 void FUNCNAME##_reset(void); \
2128 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
2129
2130#define DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
2131 FUNCNAME##_Fake FUNCNAME##_fake; \
2132 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7){ \
2133 SAVE_ARG(FUNCNAME, 0); \
2134 SAVE_ARG(FUNCNAME, 1); \
2135 SAVE_ARG(FUNCNAME, 2); \
2136 SAVE_ARG(FUNCNAME, 3); \
2137 SAVE_ARG(FUNCNAME, 4); \
2138 SAVE_ARG(FUNCNAME, 5); \
2139 SAVE_ARG(FUNCNAME, 6); \
2140 SAVE_ARG(FUNCNAME, 7); \
2141 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2142 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2143 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2144 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2145 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2146 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2147 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2148 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2149 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2150 } \
2151 else{ \
2152 HISTORY_DROPPED(FUNCNAME); \
2153 } \
2154 INCREMENT_CALL_COUNT(FUNCNAME); \
2155 REGISTER_CALL(FUNCNAME); \
2156 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2157 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2158 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
2159 SAVE_RET_HISTORY(FUNCNAME, ret); \
2160 return ret; \
2161 } \
2162 else{ \
2163 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
2164 SAVE_RET_HISTORY(FUNCNAME, ret); \
2165 return ret; \
2166 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
2167 } \
2168 } \
2169 if (FUNCNAME##_fake.custom_fake){ \
2170 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
2171 SAVE_RET_HISTORY(FUNCNAME, ret); \
2172 return ret; \
2173 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
2174 } \
2175 RETURN_FAKE_RESULT(FUNCNAME) \
2176 } \
2177 DEFINE_RESET_FUNCTION(FUNCNAME) \
2178
2179#define FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
2180 DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
2181 DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
2182
2183
2184#define DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
2185 typedef struct FUNCNAME##_Fake { \
2186 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2187 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2188 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2189 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2190 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2191 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2192 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2193 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2194 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2195 DECLARE_ALL_FUNC_COMMON \
2196 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2197 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2198 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2199 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
2200 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
2201 } FUNCNAME##_Fake; \
2202 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2203 void FUNCNAME##_reset(void); \
2204 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
2205
2206#define DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
2207 FUNCNAME##_Fake FUNCNAME##_fake; \
2208 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8){ \
2209 SAVE_ARG(FUNCNAME, 0); \
2210 SAVE_ARG(FUNCNAME, 1); \
2211 SAVE_ARG(FUNCNAME, 2); \
2212 SAVE_ARG(FUNCNAME, 3); \
2213 SAVE_ARG(FUNCNAME, 4); \
2214 SAVE_ARG(FUNCNAME, 5); \
2215 SAVE_ARG(FUNCNAME, 6); \
2216 SAVE_ARG(FUNCNAME, 7); \
2217 SAVE_ARG(FUNCNAME, 8); \
2218 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2219 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2220 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2221 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2222 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2223 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2224 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2225 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2226 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2227 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2228 } \
2229 else{ \
2230 HISTORY_DROPPED(FUNCNAME); \
2231 } \
2232 INCREMENT_CALL_COUNT(FUNCNAME); \
2233 REGISTER_CALL(FUNCNAME); \
2234 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2235 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2236 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
2237 SAVE_RET_HISTORY(FUNCNAME, ret); \
2238 return ret; \
2239 } \
2240 else{ \
2241 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
2242 SAVE_RET_HISTORY(FUNCNAME, ret); \
2243 return ret; \
2244 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
2245 } \
2246 } \
2247 if (FUNCNAME##_fake.custom_fake){ \
2248 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
2249 SAVE_RET_HISTORY(FUNCNAME, ret); \
2250 return ret; \
2251 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
2252 } \
2253 RETURN_FAKE_RESULT(FUNCNAME) \
2254 } \
2255 DEFINE_RESET_FUNCTION(FUNCNAME) \
2256
2257#define FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
2258 DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
2259 DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
2260
2261
2262#define DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
2263 typedef struct FUNCNAME##_Fake { \
2264 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2265 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2266 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2267 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2268 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2269 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2270 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2271 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2272 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2273 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2274 DECLARE_ALL_FUNC_COMMON \
2275 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2276 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2277 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2278 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
2279 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
2280 } FUNCNAME##_Fake; \
2281 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2282 void FUNCNAME##_reset(void); \
2283 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
2284
2285#define DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
2286 FUNCNAME##_Fake FUNCNAME##_fake; \
2287 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9){ \
2288 SAVE_ARG(FUNCNAME, 0); \
2289 SAVE_ARG(FUNCNAME, 1); \
2290 SAVE_ARG(FUNCNAME, 2); \
2291 SAVE_ARG(FUNCNAME, 3); \
2292 SAVE_ARG(FUNCNAME, 4); \
2293 SAVE_ARG(FUNCNAME, 5); \
2294 SAVE_ARG(FUNCNAME, 6); \
2295 SAVE_ARG(FUNCNAME, 7); \
2296 SAVE_ARG(FUNCNAME, 8); \
2297 SAVE_ARG(FUNCNAME, 9); \
2298 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2299 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2300 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2301 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2302 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2303 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2304 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2305 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2306 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2307 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2308 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2309 } \
2310 else{ \
2311 HISTORY_DROPPED(FUNCNAME); \
2312 } \
2313 INCREMENT_CALL_COUNT(FUNCNAME); \
2314 REGISTER_CALL(FUNCNAME); \
2315 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2316 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2317 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
2318 SAVE_RET_HISTORY(FUNCNAME, ret); \
2319 return ret; \
2320 } \
2321 else{ \
2322 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
2323 SAVE_RET_HISTORY(FUNCNAME, ret); \
2324 return ret; \
2325 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
2326 } \
2327 } \
2328 if (FUNCNAME##_fake.custom_fake){ \
2329 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
2330 SAVE_RET_HISTORY(FUNCNAME, ret); \
2331 return ret; \
2332 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
2333 } \
2334 RETURN_FAKE_RESULT(FUNCNAME) \
2335 } \
2336 DEFINE_RESET_FUNCTION(FUNCNAME) \
2337
2338#define FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
2339 DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
2340 DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
2341
2342
2343#define DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
2344 typedef struct FUNCNAME##_Fake { \
2345 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2346 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2347 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2348 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2349 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2350 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2351 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2352 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2353 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2354 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2355 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
2356 DECLARE_ALL_FUNC_COMMON \
2357 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2358 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2359 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2360 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
2361 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
2362 } FUNCNAME##_Fake; \
2363 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2364 void FUNCNAME##_reset(void); \
2365 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
2366
2367#define DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
2368 FUNCNAME##_Fake FUNCNAME##_fake; \
2369 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10){ \
2370 SAVE_ARG(FUNCNAME, 0); \
2371 SAVE_ARG(FUNCNAME, 1); \
2372 SAVE_ARG(FUNCNAME, 2); \
2373 SAVE_ARG(FUNCNAME, 3); \
2374 SAVE_ARG(FUNCNAME, 4); \
2375 SAVE_ARG(FUNCNAME, 5); \
2376 SAVE_ARG(FUNCNAME, 6); \
2377 SAVE_ARG(FUNCNAME, 7); \
2378 SAVE_ARG(FUNCNAME, 8); \
2379 SAVE_ARG(FUNCNAME, 9); \
2380 SAVE_ARG(FUNCNAME, 10); \
2381 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2382 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2383 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2384 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2385 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2386 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2387 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2388 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2389 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2390 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2391 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2392 SAVE_ARG_HISTORY(FUNCNAME, 10); \
2393 } \
2394 else{ \
2395 HISTORY_DROPPED(FUNCNAME); \
2396 } \
2397 INCREMENT_CALL_COUNT(FUNCNAME); \
2398 REGISTER_CALL(FUNCNAME); \
2399 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2400 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2401 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
2402 SAVE_RET_HISTORY(FUNCNAME, ret); \
2403 return ret; \
2404 } \
2405 else{ \
2406 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
2407 SAVE_RET_HISTORY(FUNCNAME, ret); \
2408 return ret; \
2409 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
2410 } \
2411 } \
2412 if (FUNCNAME##_fake.custom_fake){ \
2413 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
2414 SAVE_RET_HISTORY(FUNCNAME, ret); \
2415 return ret; \
2416 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
2417 } \
2418 RETURN_FAKE_RESULT(FUNCNAME) \
2419 } \
2420 DEFINE_RESET_FUNCTION(FUNCNAME) \
2421
2422#define FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
2423 DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
2424 DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
2425
2426
2427#define DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
2428 typedef struct FUNCNAME##_Fake { \
2429 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2430 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2431 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2432 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2433 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2434 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2435 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2436 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2437 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2438 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2439 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
2440 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
2441 DECLARE_ALL_FUNC_COMMON \
2442 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2443 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2444 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2445 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
2446 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
2447 } FUNCNAME##_Fake; \
2448 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2449 void FUNCNAME##_reset(void); \
2450 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
2451
2452#define DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
2453 FUNCNAME##_Fake FUNCNAME##_fake; \
2454 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11){ \
2455 SAVE_ARG(FUNCNAME, 0); \
2456 SAVE_ARG(FUNCNAME, 1); \
2457 SAVE_ARG(FUNCNAME, 2); \
2458 SAVE_ARG(FUNCNAME, 3); \
2459 SAVE_ARG(FUNCNAME, 4); \
2460 SAVE_ARG(FUNCNAME, 5); \
2461 SAVE_ARG(FUNCNAME, 6); \
2462 SAVE_ARG(FUNCNAME, 7); \
2463 SAVE_ARG(FUNCNAME, 8); \
2464 SAVE_ARG(FUNCNAME, 9); \
2465 SAVE_ARG(FUNCNAME, 10); \
2466 SAVE_ARG(FUNCNAME, 11); \
2467 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2468 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2469 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2470 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2471 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2472 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2473 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2474 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2475 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2476 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2477 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2478 SAVE_ARG_HISTORY(FUNCNAME, 10); \
2479 SAVE_ARG_HISTORY(FUNCNAME, 11); \
2480 } \
2481 else{ \
2482 HISTORY_DROPPED(FUNCNAME); \
2483 } \
2484 INCREMENT_CALL_COUNT(FUNCNAME); \
2485 REGISTER_CALL(FUNCNAME); \
2486 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2487 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2488 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
2489 SAVE_RET_HISTORY(FUNCNAME, ret); \
2490 return ret; \
2491 } \
2492 else{ \
2493 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
2494 SAVE_RET_HISTORY(FUNCNAME, ret); \
2495 return ret; \
2496 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
2497 } \
2498 } \
2499 if (FUNCNAME##_fake.custom_fake){ \
2500 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
2501 SAVE_RET_HISTORY(FUNCNAME, ret); \
2502 return ret; \
2503 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
2504 } \
2505 RETURN_FAKE_RESULT(FUNCNAME) \
2506 } \
2507 DEFINE_RESET_FUNCTION(FUNCNAME) \
2508
2509#define FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
2510 DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
2511 DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
2512
2513
2514#define DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
2515 typedef struct FUNCNAME##_Fake { \
2516 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2517 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2518 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2519 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2520 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2521 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2522 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2523 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2524 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2525 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2526 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
2527 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
2528 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
2529 DECLARE_ALL_FUNC_COMMON \
2530 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2531 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2532 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2533 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
2534 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
2535 } FUNCNAME##_Fake; \
2536 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2537 void FUNCNAME##_reset(void); \
2538 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
2539
2540#define DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
2541 FUNCNAME##_Fake FUNCNAME##_fake; \
2542 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12){ \
2543 SAVE_ARG(FUNCNAME, 0); \
2544 SAVE_ARG(FUNCNAME, 1); \
2545 SAVE_ARG(FUNCNAME, 2); \
2546 SAVE_ARG(FUNCNAME, 3); \
2547 SAVE_ARG(FUNCNAME, 4); \
2548 SAVE_ARG(FUNCNAME, 5); \
2549 SAVE_ARG(FUNCNAME, 6); \
2550 SAVE_ARG(FUNCNAME, 7); \
2551 SAVE_ARG(FUNCNAME, 8); \
2552 SAVE_ARG(FUNCNAME, 9); \
2553 SAVE_ARG(FUNCNAME, 10); \
2554 SAVE_ARG(FUNCNAME, 11); \
2555 SAVE_ARG(FUNCNAME, 12); \
2556 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2557 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2558 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2559 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2560 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2561 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2562 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2563 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2564 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2565 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2566 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2567 SAVE_ARG_HISTORY(FUNCNAME, 10); \
2568 SAVE_ARG_HISTORY(FUNCNAME, 11); \
2569 SAVE_ARG_HISTORY(FUNCNAME, 12); \
2570 } \
2571 else{ \
2572 HISTORY_DROPPED(FUNCNAME); \
2573 } \
2574 INCREMENT_CALL_COUNT(FUNCNAME); \
2575 REGISTER_CALL(FUNCNAME); \
2576 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2577 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2578 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
2579 SAVE_RET_HISTORY(FUNCNAME, ret); \
2580 return ret; \
2581 } \
2582 else{ \
2583 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
2584 SAVE_RET_HISTORY(FUNCNAME, ret); \
2585 return ret; \
2586 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
2587 } \
2588 } \
2589 if (FUNCNAME##_fake.custom_fake){ \
2590 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
2591 SAVE_RET_HISTORY(FUNCNAME, ret); \
2592 return ret; \
2593 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
2594 } \
2595 RETURN_FAKE_RESULT(FUNCNAME) \
2596 } \
2597 DEFINE_RESET_FUNCTION(FUNCNAME) \
2598
2599#define FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
2600 DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
2601 DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
2602
2603
2604#define DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
2605 typedef struct FUNCNAME##_Fake { \
2606 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2607 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2608 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2609 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2610 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2611 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2612 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2613 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2614 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2615 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2616 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
2617 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
2618 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
2619 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
2620 DECLARE_ALL_FUNC_COMMON \
2621 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2622 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2623 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2624 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
2625 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
2626 } FUNCNAME##_Fake; \
2627 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2628 void FUNCNAME##_reset(void); \
2629 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
2630
2631#define DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
2632 FUNCNAME##_Fake FUNCNAME##_fake; \
2633 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13){ \
2634 SAVE_ARG(FUNCNAME, 0); \
2635 SAVE_ARG(FUNCNAME, 1); \
2636 SAVE_ARG(FUNCNAME, 2); \
2637 SAVE_ARG(FUNCNAME, 3); \
2638 SAVE_ARG(FUNCNAME, 4); \
2639 SAVE_ARG(FUNCNAME, 5); \
2640 SAVE_ARG(FUNCNAME, 6); \
2641 SAVE_ARG(FUNCNAME, 7); \
2642 SAVE_ARG(FUNCNAME, 8); \
2643 SAVE_ARG(FUNCNAME, 9); \
2644 SAVE_ARG(FUNCNAME, 10); \
2645 SAVE_ARG(FUNCNAME, 11); \
2646 SAVE_ARG(FUNCNAME, 12); \
2647 SAVE_ARG(FUNCNAME, 13); \
2648 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2649 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2650 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2651 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2652 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2653 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2654 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2655 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2656 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2657 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2658 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2659 SAVE_ARG_HISTORY(FUNCNAME, 10); \
2660 SAVE_ARG_HISTORY(FUNCNAME, 11); \
2661 SAVE_ARG_HISTORY(FUNCNAME, 12); \
2662 SAVE_ARG_HISTORY(FUNCNAME, 13); \
2663 } \
2664 else{ \
2665 HISTORY_DROPPED(FUNCNAME); \
2666 } \
2667 INCREMENT_CALL_COUNT(FUNCNAME); \
2668 REGISTER_CALL(FUNCNAME); \
2669 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2670 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2671 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
2672 SAVE_RET_HISTORY(FUNCNAME, ret); \
2673 return ret; \
2674 } \
2675 else{ \
2676 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
2677 SAVE_RET_HISTORY(FUNCNAME, ret); \
2678 return ret; \
2679 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
2680 } \
2681 } \
2682 if (FUNCNAME##_fake.custom_fake){ \
2683 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
2684 SAVE_RET_HISTORY(FUNCNAME, ret); \
2685 return ret; \
2686 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
2687 } \
2688 RETURN_FAKE_RESULT(FUNCNAME) \
2689 } \
2690 DEFINE_RESET_FUNCTION(FUNCNAME) \
2691
2692#define FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
2693 DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
2694 DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
2695
2696
2697#define DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
2698 typedef struct FUNCNAME##_Fake { \
2699 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2700 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2701 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2702 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2703 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2704 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2705 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2706 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2707 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2708 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2709 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
2710 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
2711 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
2712 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
2713 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
2714 DECLARE_ALL_FUNC_COMMON \
2715 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2716 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2717 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2718 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
2719 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
2720 } FUNCNAME##_Fake; \
2721 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2722 void FUNCNAME##_reset(void); \
2723 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
2724
2725#define DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
2726 FUNCNAME##_Fake FUNCNAME##_fake; \
2727 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14){ \
2728 SAVE_ARG(FUNCNAME, 0); \
2729 SAVE_ARG(FUNCNAME, 1); \
2730 SAVE_ARG(FUNCNAME, 2); \
2731 SAVE_ARG(FUNCNAME, 3); \
2732 SAVE_ARG(FUNCNAME, 4); \
2733 SAVE_ARG(FUNCNAME, 5); \
2734 SAVE_ARG(FUNCNAME, 6); \
2735 SAVE_ARG(FUNCNAME, 7); \
2736 SAVE_ARG(FUNCNAME, 8); \
2737 SAVE_ARG(FUNCNAME, 9); \
2738 SAVE_ARG(FUNCNAME, 10); \
2739 SAVE_ARG(FUNCNAME, 11); \
2740 SAVE_ARG(FUNCNAME, 12); \
2741 SAVE_ARG(FUNCNAME, 13); \
2742 SAVE_ARG(FUNCNAME, 14); \
2743 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2744 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2745 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2746 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2747 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2748 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2749 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2750 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2751 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2752 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2753 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2754 SAVE_ARG_HISTORY(FUNCNAME, 10); \
2755 SAVE_ARG_HISTORY(FUNCNAME, 11); \
2756 SAVE_ARG_HISTORY(FUNCNAME, 12); \
2757 SAVE_ARG_HISTORY(FUNCNAME, 13); \
2758 SAVE_ARG_HISTORY(FUNCNAME, 14); \
2759 } \
2760 else{ \
2761 HISTORY_DROPPED(FUNCNAME); \
2762 } \
2763 INCREMENT_CALL_COUNT(FUNCNAME); \
2764 REGISTER_CALL(FUNCNAME); \
2765 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2766 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2767 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
2768 SAVE_RET_HISTORY(FUNCNAME, ret); \
2769 return ret; \
2770 } \
2771 else{ \
2772 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
2773 SAVE_RET_HISTORY(FUNCNAME, ret); \
2774 return ret; \
2775 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
2776 } \
2777 } \
2778 if (FUNCNAME##_fake.custom_fake){ \
2779 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
2780 SAVE_RET_HISTORY(FUNCNAME, ret); \
2781 return ret; \
2782 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
2783 } \
2784 RETURN_FAKE_RESULT(FUNCNAME) \
2785 } \
2786 DEFINE_RESET_FUNCTION(FUNCNAME) \
2787
2788#define FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
2789 DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
2790 DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
2791
2792
2793#define DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
2794 typedef struct FUNCNAME##_Fake { \
2795 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2796 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2797 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2798 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2799 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2800 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2801 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2802 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2803 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2804 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2805 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
2806 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
2807 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
2808 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
2809 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
2810 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
2811 DECLARE_ALL_FUNC_COMMON \
2812 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2813 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2814 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2815 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
2816 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
2817 } FUNCNAME##_Fake; \
2818 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2819 void FUNCNAME##_reset(void); \
2820 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
2821
2822#define DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
2823 FUNCNAME##_Fake FUNCNAME##_fake; \
2824 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15){ \
2825 SAVE_ARG(FUNCNAME, 0); \
2826 SAVE_ARG(FUNCNAME, 1); \
2827 SAVE_ARG(FUNCNAME, 2); \
2828 SAVE_ARG(FUNCNAME, 3); \
2829 SAVE_ARG(FUNCNAME, 4); \
2830 SAVE_ARG(FUNCNAME, 5); \
2831 SAVE_ARG(FUNCNAME, 6); \
2832 SAVE_ARG(FUNCNAME, 7); \
2833 SAVE_ARG(FUNCNAME, 8); \
2834 SAVE_ARG(FUNCNAME, 9); \
2835 SAVE_ARG(FUNCNAME, 10); \
2836 SAVE_ARG(FUNCNAME, 11); \
2837 SAVE_ARG(FUNCNAME, 12); \
2838 SAVE_ARG(FUNCNAME, 13); \
2839 SAVE_ARG(FUNCNAME, 14); \
2840 SAVE_ARG(FUNCNAME, 15); \
2841 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2842 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2843 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2844 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2845 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2846 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2847 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2848 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2849 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2850 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2851 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2852 SAVE_ARG_HISTORY(FUNCNAME, 10); \
2853 SAVE_ARG_HISTORY(FUNCNAME, 11); \
2854 SAVE_ARG_HISTORY(FUNCNAME, 12); \
2855 SAVE_ARG_HISTORY(FUNCNAME, 13); \
2856 SAVE_ARG_HISTORY(FUNCNAME, 14); \
2857 SAVE_ARG_HISTORY(FUNCNAME, 15); \
2858 } \
2859 else{ \
2860 HISTORY_DROPPED(FUNCNAME); \
2861 } \
2862 INCREMENT_CALL_COUNT(FUNCNAME); \
2863 REGISTER_CALL(FUNCNAME); \
2864 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2865 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2866 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
2867 SAVE_RET_HISTORY(FUNCNAME, ret); \
2868 return ret; \
2869 } \
2870 else{ \
2871 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
2872 SAVE_RET_HISTORY(FUNCNAME, ret); \
2873 return ret; \
2874 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
2875 } \
2876 } \
2877 if (FUNCNAME##_fake.custom_fake){ \
2878 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
2879 SAVE_RET_HISTORY(FUNCNAME, ret); \
2880 return ret; \
2881 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
2882 } \
2883 RETURN_FAKE_RESULT(FUNCNAME) \
2884 } \
2885 DEFINE_RESET_FUNCTION(FUNCNAME) \
2886
2887#define FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
2888 DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
2889 DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
2890
2891
2892#define DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
2893 typedef struct FUNCNAME##_Fake { \
2894 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2895 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2896 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2897 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
2898 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
2899 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
2900 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
2901 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
2902 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
2903 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
2904 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
2905 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
2906 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
2907 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
2908 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
2909 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
2910 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
2911 DECLARE_ALL_FUNC_COMMON \
2912 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
2913 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
2914 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
2915 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
2916 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
2917 } FUNCNAME##_Fake; \
2918 extern FUNCNAME##_Fake FUNCNAME##_fake; \
2919 void FUNCNAME##_reset(void); \
2920 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
2921
2922#define DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
2923 FUNCNAME##_Fake FUNCNAME##_fake; \
2924 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16){ \
2925 SAVE_ARG(FUNCNAME, 0); \
2926 SAVE_ARG(FUNCNAME, 1); \
2927 SAVE_ARG(FUNCNAME, 2); \
2928 SAVE_ARG(FUNCNAME, 3); \
2929 SAVE_ARG(FUNCNAME, 4); \
2930 SAVE_ARG(FUNCNAME, 5); \
2931 SAVE_ARG(FUNCNAME, 6); \
2932 SAVE_ARG(FUNCNAME, 7); \
2933 SAVE_ARG(FUNCNAME, 8); \
2934 SAVE_ARG(FUNCNAME, 9); \
2935 SAVE_ARG(FUNCNAME, 10); \
2936 SAVE_ARG(FUNCNAME, 11); \
2937 SAVE_ARG(FUNCNAME, 12); \
2938 SAVE_ARG(FUNCNAME, 13); \
2939 SAVE_ARG(FUNCNAME, 14); \
2940 SAVE_ARG(FUNCNAME, 15); \
2941 SAVE_ARG(FUNCNAME, 16); \
2942 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
2943 SAVE_ARG_HISTORY(FUNCNAME, 0); \
2944 SAVE_ARG_HISTORY(FUNCNAME, 1); \
2945 SAVE_ARG_HISTORY(FUNCNAME, 2); \
2946 SAVE_ARG_HISTORY(FUNCNAME, 3); \
2947 SAVE_ARG_HISTORY(FUNCNAME, 4); \
2948 SAVE_ARG_HISTORY(FUNCNAME, 5); \
2949 SAVE_ARG_HISTORY(FUNCNAME, 6); \
2950 SAVE_ARG_HISTORY(FUNCNAME, 7); \
2951 SAVE_ARG_HISTORY(FUNCNAME, 8); \
2952 SAVE_ARG_HISTORY(FUNCNAME, 9); \
2953 SAVE_ARG_HISTORY(FUNCNAME, 10); \
2954 SAVE_ARG_HISTORY(FUNCNAME, 11); \
2955 SAVE_ARG_HISTORY(FUNCNAME, 12); \
2956 SAVE_ARG_HISTORY(FUNCNAME, 13); \
2957 SAVE_ARG_HISTORY(FUNCNAME, 14); \
2958 SAVE_ARG_HISTORY(FUNCNAME, 15); \
2959 SAVE_ARG_HISTORY(FUNCNAME, 16); \
2960 } \
2961 else{ \
2962 HISTORY_DROPPED(FUNCNAME); \
2963 } \
2964 INCREMENT_CALL_COUNT(FUNCNAME); \
2965 REGISTER_CALL(FUNCNAME); \
2966 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
2967 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
2968 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
2969 SAVE_RET_HISTORY(FUNCNAME, ret); \
2970 return ret; \
2971 } \
2972 else{ \
2973 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
2974 SAVE_RET_HISTORY(FUNCNAME, ret); \
2975 return ret; \
2976 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
2977 } \
2978 } \
2979 if (FUNCNAME##_fake.custom_fake){ \
2980 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
2981 SAVE_RET_HISTORY(FUNCNAME, ret); \
2982 return ret; \
2983 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
2984 } \
2985 RETURN_FAKE_RESULT(FUNCNAME) \
2986 } \
2987 DEFINE_RESET_FUNCTION(FUNCNAME) \
2988
2989#define FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
2990 DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
2991 DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
2992
2993
2994#define DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
2995 typedef struct FUNCNAME##_Fake { \
2996 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
2997 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
2998 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
2999 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3000 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3001 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3002 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3003 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
3004 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
3005 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
3006 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
3007 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
3008 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
3009 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
3010 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
3011 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
3012 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
3013 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
3014 DECLARE_ALL_FUNC_COMMON \
3015 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
3016 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
3017 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3018 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
3019 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
3020 } FUNCNAME##_Fake; \
3021 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3022 void FUNCNAME##_reset(void); \
3023 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
3024
3025#define DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
3026 FUNCNAME##_Fake FUNCNAME##_fake; \
3027 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17){ \
3028 SAVE_ARG(FUNCNAME, 0); \
3029 SAVE_ARG(FUNCNAME, 1); \
3030 SAVE_ARG(FUNCNAME, 2); \
3031 SAVE_ARG(FUNCNAME, 3); \
3032 SAVE_ARG(FUNCNAME, 4); \
3033 SAVE_ARG(FUNCNAME, 5); \
3034 SAVE_ARG(FUNCNAME, 6); \
3035 SAVE_ARG(FUNCNAME, 7); \
3036 SAVE_ARG(FUNCNAME, 8); \
3037 SAVE_ARG(FUNCNAME, 9); \
3038 SAVE_ARG(FUNCNAME, 10); \
3039 SAVE_ARG(FUNCNAME, 11); \
3040 SAVE_ARG(FUNCNAME, 12); \
3041 SAVE_ARG(FUNCNAME, 13); \
3042 SAVE_ARG(FUNCNAME, 14); \
3043 SAVE_ARG(FUNCNAME, 15); \
3044 SAVE_ARG(FUNCNAME, 16); \
3045 SAVE_ARG(FUNCNAME, 17); \
3046 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3047 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3048 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3049 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3050 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3051 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3052 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3053 SAVE_ARG_HISTORY(FUNCNAME, 6); \
3054 SAVE_ARG_HISTORY(FUNCNAME, 7); \
3055 SAVE_ARG_HISTORY(FUNCNAME, 8); \
3056 SAVE_ARG_HISTORY(FUNCNAME, 9); \
3057 SAVE_ARG_HISTORY(FUNCNAME, 10); \
3058 SAVE_ARG_HISTORY(FUNCNAME, 11); \
3059 SAVE_ARG_HISTORY(FUNCNAME, 12); \
3060 SAVE_ARG_HISTORY(FUNCNAME, 13); \
3061 SAVE_ARG_HISTORY(FUNCNAME, 14); \
3062 SAVE_ARG_HISTORY(FUNCNAME, 15); \
3063 SAVE_ARG_HISTORY(FUNCNAME, 16); \
3064 SAVE_ARG_HISTORY(FUNCNAME, 17); \
3065 } \
3066 else{ \
3067 HISTORY_DROPPED(FUNCNAME); \
3068 } \
3069 INCREMENT_CALL_COUNT(FUNCNAME); \
3070 REGISTER_CALL(FUNCNAME); \
3071 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3072 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3073 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
3074 SAVE_RET_HISTORY(FUNCNAME, ret); \
3075 return ret; \
3076 } \
3077 else{ \
3078 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
3079 SAVE_RET_HISTORY(FUNCNAME, ret); \
3080 return ret; \
3081 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
3082 } \
3083 } \
3084 if (FUNCNAME##_fake.custom_fake){ \
3085 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
3086 SAVE_RET_HISTORY(FUNCNAME, ret); \
3087 return ret; \
3088 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
3089 } \
3090 RETURN_FAKE_RESULT(FUNCNAME) \
3091 } \
3092 DEFINE_RESET_FUNCTION(FUNCNAME) \
3093
3094#define FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
3095 DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
3096 DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
3097
3098
3099#define DECLARE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
3100 typedef struct FUNCNAME##_Fake { \
3101 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3102 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3103 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3104 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3105 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3106 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3107 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3108 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
3109 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
3110 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
3111 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
3112 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
3113 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
3114 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
3115 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
3116 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
3117 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
3118 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
3119 DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
3120 DECLARE_ALL_FUNC_COMMON \
3121 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
3122 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
3123 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3124 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
3125 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
3126 } FUNCNAME##_Fake; \
3127 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3128 void FUNCNAME##_reset(void); \
3129 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
3130
3131#define DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
3132 FUNCNAME##_Fake FUNCNAME##_fake; \
3133 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18){ \
3134 SAVE_ARG(FUNCNAME, 0); \
3135 SAVE_ARG(FUNCNAME, 1); \
3136 SAVE_ARG(FUNCNAME, 2); \
3137 SAVE_ARG(FUNCNAME, 3); \
3138 SAVE_ARG(FUNCNAME, 4); \
3139 SAVE_ARG(FUNCNAME, 5); \
3140 SAVE_ARG(FUNCNAME, 6); \
3141 SAVE_ARG(FUNCNAME, 7); \
3142 SAVE_ARG(FUNCNAME, 8); \
3143 SAVE_ARG(FUNCNAME, 9); \
3144 SAVE_ARG(FUNCNAME, 10); \
3145 SAVE_ARG(FUNCNAME, 11); \
3146 SAVE_ARG(FUNCNAME, 12); \
3147 SAVE_ARG(FUNCNAME, 13); \
3148 SAVE_ARG(FUNCNAME, 14); \
3149 SAVE_ARG(FUNCNAME, 15); \
3150 SAVE_ARG(FUNCNAME, 16); \
3151 SAVE_ARG(FUNCNAME, 17); \
3152 SAVE_ARG(FUNCNAME, 18); \
3153 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3154 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3155 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3156 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3157 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3158 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3159 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3160 SAVE_ARG_HISTORY(FUNCNAME, 6); \
3161 SAVE_ARG_HISTORY(FUNCNAME, 7); \
3162 SAVE_ARG_HISTORY(FUNCNAME, 8); \
3163 SAVE_ARG_HISTORY(FUNCNAME, 9); \
3164 SAVE_ARG_HISTORY(FUNCNAME, 10); \
3165 SAVE_ARG_HISTORY(FUNCNAME, 11); \
3166 SAVE_ARG_HISTORY(FUNCNAME, 12); \
3167 SAVE_ARG_HISTORY(FUNCNAME, 13); \
3168 SAVE_ARG_HISTORY(FUNCNAME, 14); \
3169 SAVE_ARG_HISTORY(FUNCNAME, 15); \
3170 SAVE_ARG_HISTORY(FUNCNAME, 16); \
3171 SAVE_ARG_HISTORY(FUNCNAME, 17); \
3172 SAVE_ARG_HISTORY(FUNCNAME, 18); \
3173 } \
3174 else{ \
3175 HISTORY_DROPPED(FUNCNAME); \
3176 } \
3177 INCREMENT_CALL_COUNT(FUNCNAME); \
3178 REGISTER_CALL(FUNCNAME); \
3179 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3180 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3181 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
3182 SAVE_RET_HISTORY(FUNCNAME, ret); \
3183 return ret; \
3184 } \
3185 else{ \
3186 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
3187 SAVE_RET_HISTORY(FUNCNAME, ret); \
3188 return ret; \
3189 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
3190 } \
3191 } \
3192 if (FUNCNAME##_fake.custom_fake){ \
3193 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
3194 SAVE_RET_HISTORY(FUNCNAME, ret); \
3195 return ret; \
3196 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
3197 } \
3198 RETURN_FAKE_RESULT(FUNCNAME) \
3199 } \
3200 DEFINE_RESET_FUNCTION(FUNCNAME) \
3201
3202#define FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
3203 DECLARE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
3204 DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
3205
3206
3207#define DECLARE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
3208 typedef struct FUNCNAME##_Fake { \
3209 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3210 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3211 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3212 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3213 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3214 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3215 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3216 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
3217 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
3218 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
3219 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
3220 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
3221 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
3222 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
3223 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
3224 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
3225 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
3226 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
3227 DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
3228 DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
3229 DECLARE_ALL_FUNC_COMMON \
3230 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
3231 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
3232 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3233 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
3234 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
3235 } FUNCNAME##_Fake; \
3236 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3237 void FUNCNAME##_reset(void); \
3238 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
3239
3240#define DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
3241 FUNCNAME##_Fake FUNCNAME##_fake; \
3242 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19){ \
3243 SAVE_ARG(FUNCNAME, 0); \
3244 SAVE_ARG(FUNCNAME, 1); \
3245 SAVE_ARG(FUNCNAME, 2); \
3246 SAVE_ARG(FUNCNAME, 3); \
3247 SAVE_ARG(FUNCNAME, 4); \
3248 SAVE_ARG(FUNCNAME, 5); \
3249 SAVE_ARG(FUNCNAME, 6); \
3250 SAVE_ARG(FUNCNAME, 7); \
3251 SAVE_ARG(FUNCNAME, 8); \
3252 SAVE_ARG(FUNCNAME, 9); \
3253 SAVE_ARG(FUNCNAME, 10); \
3254 SAVE_ARG(FUNCNAME, 11); \
3255 SAVE_ARG(FUNCNAME, 12); \
3256 SAVE_ARG(FUNCNAME, 13); \
3257 SAVE_ARG(FUNCNAME, 14); \
3258 SAVE_ARG(FUNCNAME, 15); \
3259 SAVE_ARG(FUNCNAME, 16); \
3260 SAVE_ARG(FUNCNAME, 17); \
3261 SAVE_ARG(FUNCNAME, 18); \
3262 SAVE_ARG(FUNCNAME, 19); \
3263 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3264 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3265 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3266 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3267 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3268 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3269 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3270 SAVE_ARG_HISTORY(FUNCNAME, 6); \
3271 SAVE_ARG_HISTORY(FUNCNAME, 7); \
3272 SAVE_ARG_HISTORY(FUNCNAME, 8); \
3273 SAVE_ARG_HISTORY(FUNCNAME, 9); \
3274 SAVE_ARG_HISTORY(FUNCNAME, 10); \
3275 SAVE_ARG_HISTORY(FUNCNAME, 11); \
3276 SAVE_ARG_HISTORY(FUNCNAME, 12); \
3277 SAVE_ARG_HISTORY(FUNCNAME, 13); \
3278 SAVE_ARG_HISTORY(FUNCNAME, 14); \
3279 SAVE_ARG_HISTORY(FUNCNAME, 15); \
3280 SAVE_ARG_HISTORY(FUNCNAME, 16); \
3281 SAVE_ARG_HISTORY(FUNCNAME, 17); \
3282 SAVE_ARG_HISTORY(FUNCNAME, 18); \
3283 SAVE_ARG_HISTORY(FUNCNAME, 19); \
3284 } \
3285 else{ \
3286 HISTORY_DROPPED(FUNCNAME); \
3287 } \
3288 INCREMENT_CALL_COUNT(FUNCNAME); \
3289 REGISTER_CALL(FUNCNAME); \
3290 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3291 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3292 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
3293 SAVE_RET_HISTORY(FUNCNAME, ret); \
3294 return ret; \
3295 } \
3296 else{ \
3297 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
3298 SAVE_RET_HISTORY(FUNCNAME, ret); \
3299 return ret; \
3300 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
3301 } \
3302 } \
3303 if (FUNCNAME##_fake.custom_fake){ \
3304 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
3305 SAVE_RET_HISTORY(FUNCNAME, ret); \
3306 return ret; \
3307 return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
3308 } \
3309 RETURN_FAKE_RESULT(FUNCNAME) \
3310 } \
3311 DEFINE_RESET_FUNCTION(FUNCNAME) \
3312
3313#define FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
3314 DECLARE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
3315 DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
3316
3317
3318#define DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
3319 typedef struct FUNCNAME##_Fake { \
3320 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3321 DECLARE_ALL_FUNC_COMMON \
3322 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3323 void(*custom_fake)(ARG0_TYPE arg0, va_list ap); \
3324 void(**custom_fake_seq)(ARG0_TYPE arg0, va_list ap); \
3325 } FUNCNAME##_Fake; \
3326 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3327 void FUNCNAME##_reset(void); \
3328 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...); \
3329
3330#define DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
3331 FUNCNAME##_Fake FUNCNAME##_fake; \
3332 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...){ \
3333 SAVE_ARG(FUNCNAME, 0); \
3334 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3335 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3336 } \
3337 else{ \
3338 HISTORY_DROPPED(FUNCNAME); \
3339 } \
3340 INCREMENT_CALL_COUNT(FUNCNAME); \
3341 REGISTER_CALL(FUNCNAME); \
3342 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3343 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3344 va_list ap; \
3345 va_start(ap, arg0); \
3346 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, ap); \
3347 va_end(ap); \
3348 } \
3349 else{ \
3350 va_list ap; \
3351 va_start(ap, arg0); \
3352 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \
3353 va_end(ap); \
3354 } \
3355 } \
3356 if(FUNCNAME##_fake.custom_fake){ \
3357 va_list ap; \
3358 va_start(ap, arg0); \
3359 FUNCNAME##_fake.custom_fake(arg0, ap); \
3360 va_end(ap); \
3361 } \
3362 } \
3363 DEFINE_RESET_FUNCTION(FUNCNAME) \
3364
3365#define FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
3366 DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
3367 DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
3368
3369
3370#define DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
3371 typedef struct FUNCNAME##_Fake { \
3372 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3373 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3374 DECLARE_ALL_FUNC_COMMON \
3375 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3376 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
3377 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
3378 } FUNCNAME##_Fake; \
3379 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3380 void FUNCNAME##_reset(void); \
3381 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...); \
3382
3383#define DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
3384 FUNCNAME##_Fake FUNCNAME##_fake; \
3385 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...){ \
3386 SAVE_ARG(FUNCNAME, 0); \
3387 SAVE_ARG(FUNCNAME, 1); \
3388 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3389 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3390 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3391 } \
3392 else{ \
3393 HISTORY_DROPPED(FUNCNAME); \
3394 } \
3395 INCREMENT_CALL_COUNT(FUNCNAME); \
3396 REGISTER_CALL(FUNCNAME); \
3397 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3398 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3399 va_list ap; \
3400 va_start(ap, arg1); \
3401 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, ap); \
3402 va_end(ap); \
3403 } \
3404 else{ \
3405 va_list ap; \
3406 va_start(ap, arg1); \
3407 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \
3408 va_end(ap); \
3409 } \
3410 } \
3411 if(FUNCNAME##_fake.custom_fake){ \
3412 va_list ap; \
3413 va_start(ap, arg1); \
3414 FUNCNAME##_fake.custom_fake(arg0, arg1, ap); \
3415 va_end(ap); \
3416 } \
3417 } \
3418 DEFINE_RESET_FUNCTION(FUNCNAME) \
3419
3420#define FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
3421 DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
3422 DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
3423
3424
3425#define DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
3426 typedef struct FUNCNAME##_Fake { \
3427 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3428 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3429 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3430 DECLARE_ALL_FUNC_COMMON \
3431 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3432 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
3433 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
3434 } FUNCNAME##_Fake; \
3435 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3436 void FUNCNAME##_reset(void); \
3437 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...); \
3438
3439#define DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
3440 FUNCNAME##_Fake FUNCNAME##_fake; \
3441 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...){ \
3442 SAVE_ARG(FUNCNAME, 0); \
3443 SAVE_ARG(FUNCNAME, 1); \
3444 SAVE_ARG(FUNCNAME, 2); \
3445 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3446 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3447 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3448 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3449 } \
3450 else{ \
3451 HISTORY_DROPPED(FUNCNAME); \
3452 } \
3453 INCREMENT_CALL_COUNT(FUNCNAME); \
3454 REGISTER_CALL(FUNCNAME); \
3455 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3456 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3457 va_list ap; \
3458 va_start(ap, arg2); \
3459 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, ap); \
3460 va_end(ap); \
3461 } \
3462 else{ \
3463 va_list ap; \
3464 va_start(ap, arg2); \
3465 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \
3466 va_end(ap); \
3467 } \
3468 } \
3469 if(FUNCNAME##_fake.custom_fake){ \
3470 va_list ap; \
3471 va_start(ap, arg2); \
3472 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap); \
3473 va_end(ap); \
3474 } \
3475 } \
3476 DEFINE_RESET_FUNCTION(FUNCNAME) \
3477
3478#define FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
3479 DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
3480 DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
3481
3482
3483#define DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
3484 typedef struct FUNCNAME##_Fake { \
3485 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3486 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3487 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3488 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3489 DECLARE_ALL_FUNC_COMMON \
3490 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3491 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
3492 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
3493 } FUNCNAME##_Fake; \
3494 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3495 void FUNCNAME##_reset(void); \
3496 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...); \
3497
3498#define DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
3499 FUNCNAME##_Fake FUNCNAME##_fake; \
3500 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...){ \
3501 SAVE_ARG(FUNCNAME, 0); \
3502 SAVE_ARG(FUNCNAME, 1); \
3503 SAVE_ARG(FUNCNAME, 2); \
3504 SAVE_ARG(FUNCNAME, 3); \
3505 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3506 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3507 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3508 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3509 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3510 } \
3511 else{ \
3512 HISTORY_DROPPED(FUNCNAME); \
3513 } \
3514 INCREMENT_CALL_COUNT(FUNCNAME); \
3515 REGISTER_CALL(FUNCNAME); \
3516 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3517 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3518 va_list ap; \
3519 va_start(ap, arg3); \
3520 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, ap); \
3521 va_end(ap); \
3522 } \
3523 else{ \
3524 va_list ap; \
3525 va_start(ap, arg3); \
3526 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \
3527 va_end(ap); \
3528 } \
3529 } \
3530 if(FUNCNAME##_fake.custom_fake){ \
3531 va_list ap; \
3532 va_start(ap, arg3); \
3533 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap); \
3534 va_end(ap); \
3535 } \
3536 } \
3537 DEFINE_RESET_FUNCTION(FUNCNAME) \
3538
3539#define FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
3540 DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
3541 DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
3542
3543
3544#define DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
3545 typedef struct FUNCNAME##_Fake { \
3546 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3547 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3548 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3549 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3550 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3551 DECLARE_ALL_FUNC_COMMON \
3552 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3553 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
3554 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
3555 } FUNCNAME##_Fake; \
3556 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3557 void FUNCNAME##_reset(void); \
3558 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...); \
3559
3560#define DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
3561 FUNCNAME##_Fake FUNCNAME##_fake; \
3562 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...){ \
3563 SAVE_ARG(FUNCNAME, 0); \
3564 SAVE_ARG(FUNCNAME, 1); \
3565 SAVE_ARG(FUNCNAME, 2); \
3566 SAVE_ARG(FUNCNAME, 3); \
3567 SAVE_ARG(FUNCNAME, 4); \
3568 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3569 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3570 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3571 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3572 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3573 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3574 } \
3575 else{ \
3576 HISTORY_DROPPED(FUNCNAME); \
3577 } \
3578 INCREMENT_CALL_COUNT(FUNCNAME); \
3579 REGISTER_CALL(FUNCNAME); \
3580 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3581 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3582 va_list ap; \
3583 va_start(ap, arg4); \
3584 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, ap); \
3585 va_end(ap); \
3586 } \
3587 else{ \
3588 va_list ap; \
3589 va_start(ap, arg4); \
3590 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \
3591 va_end(ap); \
3592 } \
3593 } \
3594 if(FUNCNAME##_fake.custom_fake){ \
3595 va_list ap; \
3596 va_start(ap, arg4); \
3597 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap); \
3598 va_end(ap); \
3599 } \
3600 } \
3601 DEFINE_RESET_FUNCTION(FUNCNAME) \
3602
3603#define FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
3604 DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
3605 DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
3606
3607
3608#define DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
3609 typedef struct FUNCNAME##_Fake { \
3610 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3611 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3612 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3613 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3614 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3615 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3616 DECLARE_ALL_FUNC_COMMON \
3617 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3618 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
3619 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
3620 } FUNCNAME##_Fake; \
3621 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3622 void FUNCNAME##_reset(void); \
3623 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...); \
3624
3625#define DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
3626 FUNCNAME##_Fake FUNCNAME##_fake; \
3627 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...){ \
3628 SAVE_ARG(FUNCNAME, 0); \
3629 SAVE_ARG(FUNCNAME, 1); \
3630 SAVE_ARG(FUNCNAME, 2); \
3631 SAVE_ARG(FUNCNAME, 3); \
3632 SAVE_ARG(FUNCNAME, 4); \
3633 SAVE_ARG(FUNCNAME, 5); \
3634 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3635 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3636 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3637 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3638 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3639 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3640 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3641 } \
3642 else{ \
3643 HISTORY_DROPPED(FUNCNAME); \
3644 } \
3645 INCREMENT_CALL_COUNT(FUNCNAME); \
3646 REGISTER_CALL(FUNCNAME); \
3647 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3648 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3649 va_list ap; \
3650 va_start(ap, arg5); \
3651 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
3652 va_end(ap); \
3653 } \
3654 else{ \
3655 va_list ap; \
3656 va_start(ap, arg5); \
3657 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
3658 va_end(ap); \
3659 } \
3660 } \
3661 if(FUNCNAME##_fake.custom_fake){ \
3662 va_list ap; \
3663 va_start(ap, arg5); \
3664 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap); \
3665 va_end(ap); \
3666 } \
3667 } \
3668 DEFINE_RESET_FUNCTION(FUNCNAME) \
3669
3670#define FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
3671 DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
3672 DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
3673
3674
3675#define DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
3676 typedef struct FUNCNAME##_Fake { \
3677 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3678 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3679 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3680 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3681 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3682 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3683 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3684 DECLARE_ALL_FUNC_COMMON \
3685 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3686 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
3687 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
3688 } FUNCNAME##_Fake; \
3689 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3690 void FUNCNAME##_reset(void); \
3691 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...); \
3692
3693#define DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
3694 FUNCNAME##_Fake FUNCNAME##_fake; \
3695 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...){ \
3696 SAVE_ARG(FUNCNAME, 0); \
3697 SAVE_ARG(FUNCNAME, 1); \
3698 SAVE_ARG(FUNCNAME, 2); \
3699 SAVE_ARG(FUNCNAME, 3); \
3700 SAVE_ARG(FUNCNAME, 4); \
3701 SAVE_ARG(FUNCNAME, 5); \
3702 SAVE_ARG(FUNCNAME, 6); \
3703 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3704 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3705 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3706 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3707 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3708 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3709 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3710 SAVE_ARG_HISTORY(FUNCNAME, 6); \
3711 } \
3712 else{ \
3713 HISTORY_DROPPED(FUNCNAME); \
3714 } \
3715 INCREMENT_CALL_COUNT(FUNCNAME); \
3716 REGISTER_CALL(FUNCNAME); \
3717 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3718 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3719 va_list ap; \
3720 va_start(ap, arg6); \
3721 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
3722 va_end(ap); \
3723 } \
3724 else{ \
3725 va_list ap; \
3726 va_start(ap, arg6); \
3727 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
3728 va_end(ap); \
3729 } \
3730 } \
3731 if(FUNCNAME##_fake.custom_fake){ \
3732 va_list ap; \
3733 va_start(ap, arg6); \
3734 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
3735 va_end(ap); \
3736 } \
3737 } \
3738 DEFINE_RESET_FUNCTION(FUNCNAME) \
3739
3740#define FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
3741 DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
3742 DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
3743
3744
3745#define DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
3746 typedef struct FUNCNAME##_Fake { \
3747 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3748 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3749 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3750 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3751 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3752 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3753 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3754 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
3755 DECLARE_ALL_FUNC_COMMON \
3756 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3757 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
3758 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
3759 } FUNCNAME##_Fake; \
3760 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3761 void FUNCNAME##_reset(void); \
3762 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...); \
3763
3764#define DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
3765 FUNCNAME##_Fake FUNCNAME##_fake; \
3766 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...){ \
3767 SAVE_ARG(FUNCNAME, 0); \
3768 SAVE_ARG(FUNCNAME, 1); \
3769 SAVE_ARG(FUNCNAME, 2); \
3770 SAVE_ARG(FUNCNAME, 3); \
3771 SAVE_ARG(FUNCNAME, 4); \
3772 SAVE_ARG(FUNCNAME, 5); \
3773 SAVE_ARG(FUNCNAME, 6); \
3774 SAVE_ARG(FUNCNAME, 7); \
3775 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3776 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3777 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3778 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3779 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3780 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3781 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3782 SAVE_ARG_HISTORY(FUNCNAME, 6); \
3783 SAVE_ARG_HISTORY(FUNCNAME, 7); \
3784 } \
3785 else{ \
3786 HISTORY_DROPPED(FUNCNAME); \
3787 } \
3788 INCREMENT_CALL_COUNT(FUNCNAME); \
3789 REGISTER_CALL(FUNCNAME); \
3790 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3791 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3792 va_list ap; \
3793 va_start(ap, arg7); \
3794 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
3795 va_end(ap); \
3796 } \
3797 else{ \
3798 va_list ap; \
3799 va_start(ap, arg7); \
3800 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
3801 va_end(ap); \
3802 } \
3803 } \
3804 if(FUNCNAME##_fake.custom_fake){ \
3805 va_list ap; \
3806 va_start(ap, arg7); \
3807 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
3808 va_end(ap); \
3809 } \
3810 } \
3811 DEFINE_RESET_FUNCTION(FUNCNAME) \
3812
3813#define FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
3814 DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
3815 DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
3816
3817
3818#define DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
3819 typedef struct FUNCNAME##_Fake { \
3820 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3821 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3822 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3823 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3824 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3825 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3826 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3827 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
3828 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
3829 DECLARE_ALL_FUNC_COMMON \
3830 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3831 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
3832 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
3833 } FUNCNAME##_Fake; \
3834 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3835 void FUNCNAME##_reset(void); \
3836 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...); \
3837
3838#define DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
3839 FUNCNAME##_Fake FUNCNAME##_fake; \
3840 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...){ \
3841 SAVE_ARG(FUNCNAME, 0); \
3842 SAVE_ARG(FUNCNAME, 1); \
3843 SAVE_ARG(FUNCNAME, 2); \
3844 SAVE_ARG(FUNCNAME, 3); \
3845 SAVE_ARG(FUNCNAME, 4); \
3846 SAVE_ARG(FUNCNAME, 5); \
3847 SAVE_ARG(FUNCNAME, 6); \
3848 SAVE_ARG(FUNCNAME, 7); \
3849 SAVE_ARG(FUNCNAME, 8); \
3850 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3851 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3852 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3853 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3854 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3855 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3856 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3857 SAVE_ARG_HISTORY(FUNCNAME, 6); \
3858 SAVE_ARG_HISTORY(FUNCNAME, 7); \
3859 SAVE_ARG_HISTORY(FUNCNAME, 8); \
3860 } \
3861 else{ \
3862 HISTORY_DROPPED(FUNCNAME); \
3863 } \
3864 INCREMENT_CALL_COUNT(FUNCNAME); \
3865 REGISTER_CALL(FUNCNAME); \
3866 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3867 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3868 va_list ap; \
3869 va_start(ap, arg8); \
3870 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
3871 va_end(ap); \
3872 } \
3873 else{ \
3874 va_list ap; \
3875 va_start(ap, arg8); \
3876 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
3877 va_end(ap); \
3878 } \
3879 } \
3880 if(FUNCNAME##_fake.custom_fake){ \
3881 va_list ap; \
3882 va_start(ap, arg8); \
3883 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
3884 va_end(ap); \
3885 } \
3886 } \
3887 DEFINE_RESET_FUNCTION(FUNCNAME) \
3888
3889#define FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
3890 DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
3891 DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
3892
3893
3894#define DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
3895 typedef struct FUNCNAME##_Fake { \
3896 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3897 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3898 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3899 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3900 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3901 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3902 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3903 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
3904 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
3905 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
3906 DECLARE_ALL_FUNC_COMMON \
3907 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3908 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
3909 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
3910 } FUNCNAME##_Fake; \
3911 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3912 void FUNCNAME##_reset(void); \
3913 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...); \
3914
3915#define DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
3916 FUNCNAME##_Fake FUNCNAME##_fake; \
3917 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...){ \
3918 SAVE_ARG(FUNCNAME, 0); \
3919 SAVE_ARG(FUNCNAME, 1); \
3920 SAVE_ARG(FUNCNAME, 2); \
3921 SAVE_ARG(FUNCNAME, 3); \
3922 SAVE_ARG(FUNCNAME, 4); \
3923 SAVE_ARG(FUNCNAME, 5); \
3924 SAVE_ARG(FUNCNAME, 6); \
3925 SAVE_ARG(FUNCNAME, 7); \
3926 SAVE_ARG(FUNCNAME, 8); \
3927 SAVE_ARG(FUNCNAME, 9); \
3928 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
3929 SAVE_ARG_HISTORY(FUNCNAME, 0); \
3930 SAVE_ARG_HISTORY(FUNCNAME, 1); \
3931 SAVE_ARG_HISTORY(FUNCNAME, 2); \
3932 SAVE_ARG_HISTORY(FUNCNAME, 3); \
3933 SAVE_ARG_HISTORY(FUNCNAME, 4); \
3934 SAVE_ARG_HISTORY(FUNCNAME, 5); \
3935 SAVE_ARG_HISTORY(FUNCNAME, 6); \
3936 SAVE_ARG_HISTORY(FUNCNAME, 7); \
3937 SAVE_ARG_HISTORY(FUNCNAME, 8); \
3938 SAVE_ARG_HISTORY(FUNCNAME, 9); \
3939 } \
3940 else{ \
3941 HISTORY_DROPPED(FUNCNAME); \
3942 } \
3943 INCREMENT_CALL_COUNT(FUNCNAME); \
3944 REGISTER_CALL(FUNCNAME); \
3945 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
3946 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
3947 va_list ap; \
3948 va_start(ap, arg9); \
3949 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
3950 va_end(ap); \
3951 } \
3952 else{ \
3953 va_list ap; \
3954 va_start(ap, arg9); \
3955 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
3956 va_end(ap); \
3957 } \
3958 } \
3959 if(FUNCNAME##_fake.custom_fake){ \
3960 va_list ap; \
3961 va_start(ap, arg9); \
3962 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
3963 va_end(ap); \
3964 } \
3965 } \
3966 DEFINE_RESET_FUNCTION(FUNCNAME) \
3967
3968#define FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
3969 DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
3970 DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
3971
3972
3973#define DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
3974 typedef struct FUNCNAME##_Fake { \
3975 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
3976 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
3977 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
3978 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
3979 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
3980 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
3981 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
3982 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
3983 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
3984 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
3985 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
3986 DECLARE_ALL_FUNC_COMMON \
3987 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
3988 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
3989 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
3990 } FUNCNAME##_Fake; \
3991 extern FUNCNAME##_Fake FUNCNAME##_fake; \
3992 void FUNCNAME##_reset(void); \
3993 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...); \
3994
3995#define DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
3996 FUNCNAME##_Fake FUNCNAME##_fake; \
3997 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...){ \
3998 SAVE_ARG(FUNCNAME, 0); \
3999 SAVE_ARG(FUNCNAME, 1); \
4000 SAVE_ARG(FUNCNAME, 2); \
4001 SAVE_ARG(FUNCNAME, 3); \
4002 SAVE_ARG(FUNCNAME, 4); \
4003 SAVE_ARG(FUNCNAME, 5); \
4004 SAVE_ARG(FUNCNAME, 6); \
4005 SAVE_ARG(FUNCNAME, 7); \
4006 SAVE_ARG(FUNCNAME, 8); \
4007 SAVE_ARG(FUNCNAME, 9); \
4008 SAVE_ARG(FUNCNAME, 10); \
4009 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4010 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4011 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4012 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4013 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4014 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4015 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4016 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4017 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4018 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4019 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4020 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4021 } \
4022 else{ \
4023 HISTORY_DROPPED(FUNCNAME); \
4024 } \
4025 INCREMENT_CALL_COUNT(FUNCNAME); \
4026 REGISTER_CALL(FUNCNAME); \
4027 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4028 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4029 va_list ap; \
4030 va_start(ap, arg10); \
4031 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
4032 va_end(ap); \
4033 } \
4034 else{ \
4035 va_list ap; \
4036 va_start(ap, arg10); \
4037 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
4038 va_end(ap); \
4039 } \
4040 } \
4041 if(FUNCNAME##_fake.custom_fake){ \
4042 va_list ap; \
4043 va_start(ap, arg10); \
4044 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
4045 va_end(ap); \
4046 } \
4047 } \
4048 DEFINE_RESET_FUNCTION(FUNCNAME) \
4049
4050#define FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
4051 DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
4052 DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
4053
4054
4055#define DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
4056 typedef struct FUNCNAME##_Fake { \
4057 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4058 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4059 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4060 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4061 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4062 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4063 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4064 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4065 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4066 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4067 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4068 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4069 DECLARE_ALL_FUNC_COMMON \
4070 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4071 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
4072 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
4073 } FUNCNAME##_Fake; \
4074 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4075 void FUNCNAME##_reset(void); \
4076 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...); \
4077
4078#define DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
4079 FUNCNAME##_Fake FUNCNAME##_fake; \
4080 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...){ \
4081 SAVE_ARG(FUNCNAME, 0); \
4082 SAVE_ARG(FUNCNAME, 1); \
4083 SAVE_ARG(FUNCNAME, 2); \
4084 SAVE_ARG(FUNCNAME, 3); \
4085 SAVE_ARG(FUNCNAME, 4); \
4086 SAVE_ARG(FUNCNAME, 5); \
4087 SAVE_ARG(FUNCNAME, 6); \
4088 SAVE_ARG(FUNCNAME, 7); \
4089 SAVE_ARG(FUNCNAME, 8); \
4090 SAVE_ARG(FUNCNAME, 9); \
4091 SAVE_ARG(FUNCNAME, 10); \
4092 SAVE_ARG(FUNCNAME, 11); \
4093 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4094 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4095 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4096 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4097 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4098 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4099 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4100 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4101 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4102 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4103 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4104 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4105 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4106 } \
4107 else{ \
4108 HISTORY_DROPPED(FUNCNAME); \
4109 } \
4110 INCREMENT_CALL_COUNT(FUNCNAME); \
4111 REGISTER_CALL(FUNCNAME); \
4112 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4113 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4114 va_list ap; \
4115 va_start(ap, arg11); \
4116 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
4117 va_end(ap); \
4118 } \
4119 else{ \
4120 va_list ap; \
4121 va_start(ap, arg11); \
4122 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
4123 va_end(ap); \
4124 } \
4125 } \
4126 if(FUNCNAME##_fake.custom_fake){ \
4127 va_list ap; \
4128 va_start(ap, arg11); \
4129 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
4130 va_end(ap); \
4131 } \
4132 } \
4133 DEFINE_RESET_FUNCTION(FUNCNAME) \
4134
4135#define FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
4136 DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
4137 DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
4138
4139
4140#define DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
4141 typedef struct FUNCNAME##_Fake { \
4142 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4143 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4144 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4145 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4146 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4147 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4148 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4149 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4150 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4151 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4152 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4153 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4154 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
4155 DECLARE_ALL_FUNC_COMMON \
4156 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4157 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
4158 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
4159 } FUNCNAME##_Fake; \
4160 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4161 void FUNCNAME##_reset(void); \
4162 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...); \
4163
4164#define DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
4165 FUNCNAME##_Fake FUNCNAME##_fake; \
4166 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...){ \
4167 SAVE_ARG(FUNCNAME, 0); \
4168 SAVE_ARG(FUNCNAME, 1); \
4169 SAVE_ARG(FUNCNAME, 2); \
4170 SAVE_ARG(FUNCNAME, 3); \
4171 SAVE_ARG(FUNCNAME, 4); \
4172 SAVE_ARG(FUNCNAME, 5); \
4173 SAVE_ARG(FUNCNAME, 6); \
4174 SAVE_ARG(FUNCNAME, 7); \
4175 SAVE_ARG(FUNCNAME, 8); \
4176 SAVE_ARG(FUNCNAME, 9); \
4177 SAVE_ARG(FUNCNAME, 10); \
4178 SAVE_ARG(FUNCNAME, 11); \
4179 SAVE_ARG(FUNCNAME, 12); \
4180 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4181 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4182 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4183 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4184 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4185 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4186 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4187 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4188 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4189 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4190 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4191 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4192 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4193 SAVE_ARG_HISTORY(FUNCNAME, 12); \
4194 } \
4195 else{ \
4196 HISTORY_DROPPED(FUNCNAME); \
4197 } \
4198 INCREMENT_CALL_COUNT(FUNCNAME); \
4199 REGISTER_CALL(FUNCNAME); \
4200 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4201 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4202 va_list ap; \
4203 va_start(ap, arg12); \
4204 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
4205 va_end(ap); \
4206 } \
4207 else{ \
4208 va_list ap; \
4209 va_start(ap, arg12); \
4210 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
4211 va_end(ap); \
4212 } \
4213 } \
4214 if(FUNCNAME##_fake.custom_fake){ \
4215 va_list ap; \
4216 va_start(ap, arg12); \
4217 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
4218 va_end(ap); \
4219 } \
4220 } \
4221 DEFINE_RESET_FUNCTION(FUNCNAME) \
4222
4223#define FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
4224 DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
4225 DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
4226
4227
4228#define DECLARE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
4229 typedef struct FUNCNAME##_Fake { \
4230 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4231 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4232 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4233 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4234 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4235 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4236 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4237 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4238 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4239 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4240 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4241 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4242 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
4243 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
4244 DECLARE_ALL_FUNC_COMMON \
4245 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4246 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
4247 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
4248 } FUNCNAME##_Fake; \
4249 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4250 void FUNCNAME##_reset(void); \
4251 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...); \
4252
4253#define DEFINE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
4254 FUNCNAME##_Fake FUNCNAME##_fake; \
4255 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...){ \
4256 SAVE_ARG(FUNCNAME, 0); \
4257 SAVE_ARG(FUNCNAME, 1); \
4258 SAVE_ARG(FUNCNAME, 2); \
4259 SAVE_ARG(FUNCNAME, 3); \
4260 SAVE_ARG(FUNCNAME, 4); \
4261 SAVE_ARG(FUNCNAME, 5); \
4262 SAVE_ARG(FUNCNAME, 6); \
4263 SAVE_ARG(FUNCNAME, 7); \
4264 SAVE_ARG(FUNCNAME, 8); \
4265 SAVE_ARG(FUNCNAME, 9); \
4266 SAVE_ARG(FUNCNAME, 10); \
4267 SAVE_ARG(FUNCNAME, 11); \
4268 SAVE_ARG(FUNCNAME, 12); \
4269 SAVE_ARG(FUNCNAME, 13); \
4270 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4271 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4272 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4273 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4274 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4275 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4276 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4277 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4278 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4279 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4280 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4281 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4282 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4283 SAVE_ARG_HISTORY(FUNCNAME, 12); \
4284 SAVE_ARG_HISTORY(FUNCNAME, 13); \
4285 } \
4286 else{ \
4287 HISTORY_DROPPED(FUNCNAME); \
4288 } \
4289 INCREMENT_CALL_COUNT(FUNCNAME); \
4290 REGISTER_CALL(FUNCNAME); \
4291 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4292 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4293 va_list ap; \
4294 va_start(ap, arg13); \
4295 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
4296 va_end(ap); \
4297 } \
4298 else{ \
4299 va_list ap; \
4300 va_start(ap, arg13); \
4301 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
4302 va_end(ap); \
4303 } \
4304 } \
4305 if(FUNCNAME##_fake.custom_fake){ \
4306 va_list ap; \
4307 va_start(ap, arg13); \
4308 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
4309 va_end(ap); \
4310 } \
4311 } \
4312 DEFINE_RESET_FUNCTION(FUNCNAME) \
4313
4314#define FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
4315 DECLARE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
4316 DEFINE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
4317
4318
4319#define DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
4320 typedef struct FUNCNAME##_Fake { \
4321 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4322 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4323 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4324 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4325 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4326 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4327 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4328 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4329 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4330 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4331 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4332 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4333 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
4334 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
4335 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
4336 DECLARE_ALL_FUNC_COMMON \
4337 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4338 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
4339 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
4340 } FUNCNAME##_Fake; \
4341 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4342 void FUNCNAME##_reset(void); \
4343 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...); \
4344
4345#define DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
4346 FUNCNAME##_Fake FUNCNAME##_fake; \
4347 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...){ \
4348 SAVE_ARG(FUNCNAME, 0); \
4349 SAVE_ARG(FUNCNAME, 1); \
4350 SAVE_ARG(FUNCNAME, 2); \
4351 SAVE_ARG(FUNCNAME, 3); \
4352 SAVE_ARG(FUNCNAME, 4); \
4353 SAVE_ARG(FUNCNAME, 5); \
4354 SAVE_ARG(FUNCNAME, 6); \
4355 SAVE_ARG(FUNCNAME, 7); \
4356 SAVE_ARG(FUNCNAME, 8); \
4357 SAVE_ARG(FUNCNAME, 9); \
4358 SAVE_ARG(FUNCNAME, 10); \
4359 SAVE_ARG(FUNCNAME, 11); \
4360 SAVE_ARG(FUNCNAME, 12); \
4361 SAVE_ARG(FUNCNAME, 13); \
4362 SAVE_ARG(FUNCNAME, 14); \
4363 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4364 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4365 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4366 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4367 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4368 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4369 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4370 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4371 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4372 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4373 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4374 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4375 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4376 SAVE_ARG_HISTORY(FUNCNAME, 12); \
4377 SAVE_ARG_HISTORY(FUNCNAME, 13); \
4378 SAVE_ARG_HISTORY(FUNCNAME, 14); \
4379 } \
4380 else{ \
4381 HISTORY_DROPPED(FUNCNAME); \
4382 } \
4383 INCREMENT_CALL_COUNT(FUNCNAME); \
4384 REGISTER_CALL(FUNCNAME); \
4385 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4386 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4387 va_list ap; \
4388 va_start(ap, arg14); \
4389 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
4390 va_end(ap); \
4391 } \
4392 else{ \
4393 va_list ap; \
4394 va_start(ap, arg14); \
4395 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
4396 va_end(ap); \
4397 } \
4398 } \
4399 if(FUNCNAME##_fake.custom_fake){ \
4400 va_list ap; \
4401 va_start(ap, arg14); \
4402 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
4403 va_end(ap); \
4404 } \
4405 } \
4406 DEFINE_RESET_FUNCTION(FUNCNAME) \
4407
4408#define FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
4409 DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
4410 DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
4411
4412
4413#define DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
4414 typedef struct FUNCNAME##_Fake { \
4415 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4416 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4417 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4418 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4419 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4420 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4421 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4422 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4423 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4424 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4425 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4426 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4427 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
4428 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
4429 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
4430 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
4431 DECLARE_ALL_FUNC_COMMON \
4432 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4433 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
4434 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
4435 } FUNCNAME##_Fake; \
4436 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4437 void FUNCNAME##_reset(void); \
4438 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...); \
4439
4440#define DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
4441 FUNCNAME##_Fake FUNCNAME##_fake; \
4442 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...){ \
4443 SAVE_ARG(FUNCNAME, 0); \
4444 SAVE_ARG(FUNCNAME, 1); \
4445 SAVE_ARG(FUNCNAME, 2); \
4446 SAVE_ARG(FUNCNAME, 3); \
4447 SAVE_ARG(FUNCNAME, 4); \
4448 SAVE_ARG(FUNCNAME, 5); \
4449 SAVE_ARG(FUNCNAME, 6); \
4450 SAVE_ARG(FUNCNAME, 7); \
4451 SAVE_ARG(FUNCNAME, 8); \
4452 SAVE_ARG(FUNCNAME, 9); \
4453 SAVE_ARG(FUNCNAME, 10); \
4454 SAVE_ARG(FUNCNAME, 11); \
4455 SAVE_ARG(FUNCNAME, 12); \
4456 SAVE_ARG(FUNCNAME, 13); \
4457 SAVE_ARG(FUNCNAME, 14); \
4458 SAVE_ARG(FUNCNAME, 15); \
4459 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4460 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4461 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4462 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4463 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4464 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4465 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4466 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4467 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4468 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4469 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4470 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4471 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4472 SAVE_ARG_HISTORY(FUNCNAME, 12); \
4473 SAVE_ARG_HISTORY(FUNCNAME, 13); \
4474 SAVE_ARG_HISTORY(FUNCNAME, 14); \
4475 SAVE_ARG_HISTORY(FUNCNAME, 15); \
4476 } \
4477 else{ \
4478 HISTORY_DROPPED(FUNCNAME); \
4479 } \
4480 INCREMENT_CALL_COUNT(FUNCNAME); \
4481 REGISTER_CALL(FUNCNAME); \
4482 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4483 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4484 va_list ap; \
4485 va_start(ap, arg15); \
4486 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
4487 va_end(ap); \
4488 } \
4489 else{ \
4490 va_list ap; \
4491 va_start(ap, arg15); \
4492 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
4493 va_end(ap); \
4494 } \
4495 } \
4496 if(FUNCNAME##_fake.custom_fake){ \
4497 va_list ap; \
4498 va_start(ap, arg15); \
4499 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
4500 va_end(ap); \
4501 } \
4502 } \
4503 DEFINE_RESET_FUNCTION(FUNCNAME) \
4504
4505#define FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
4506 DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
4507 DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
4508
4509
4510#define DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
4511 typedef struct FUNCNAME##_Fake { \
4512 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4513 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4514 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4515 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4516 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4517 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4518 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4519 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4520 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4521 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4522 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4523 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4524 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
4525 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
4526 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
4527 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
4528 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
4529 DECLARE_ALL_FUNC_COMMON \
4530 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4531 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
4532 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
4533 } FUNCNAME##_Fake; \
4534 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4535 void FUNCNAME##_reset(void); \
4536 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...); \
4537
4538#define DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
4539 FUNCNAME##_Fake FUNCNAME##_fake; \
4540 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...){ \
4541 SAVE_ARG(FUNCNAME, 0); \
4542 SAVE_ARG(FUNCNAME, 1); \
4543 SAVE_ARG(FUNCNAME, 2); \
4544 SAVE_ARG(FUNCNAME, 3); \
4545 SAVE_ARG(FUNCNAME, 4); \
4546 SAVE_ARG(FUNCNAME, 5); \
4547 SAVE_ARG(FUNCNAME, 6); \
4548 SAVE_ARG(FUNCNAME, 7); \
4549 SAVE_ARG(FUNCNAME, 8); \
4550 SAVE_ARG(FUNCNAME, 9); \
4551 SAVE_ARG(FUNCNAME, 10); \
4552 SAVE_ARG(FUNCNAME, 11); \
4553 SAVE_ARG(FUNCNAME, 12); \
4554 SAVE_ARG(FUNCNAME, 13); \
4555 SAVE_ARG(FUNCNAME, 14); \
4556 SAVE_ARG(FUNCNAME, 15); \
4557 SAVE_ARG(FUNCNAME, 16); \
4558 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4559 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4560 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4561 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4562 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4563 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4564 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4565 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4566 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4567 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4568 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4569 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4570 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4571 SAVE_ARG_HISTORY(FUNCNAME, 12); \
4572 SAVE_ARG_HISTORY(FUNCNAME, 13); \
4573 SAVE_ARG_HISTORY(FUNCNAME, 14); \
4574 SAVE_ARG_HISTORY(FUNCNAME, 15); \
4575 SAVE_ARG_HISTORY(FUNCNAME, 16); \
4576 } \
4577 else{ \
4578 HISTORY_DROPPED(FUNCNAME); \
4579 } \
4580 INCREMENT_CALL_COUNT(FUNCNAME); \
4581 REGISTER_CALL(FUNCNAME); \
4582 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4583 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4584 va_list ap; \
4585 va_start(ap, arg16); \
4586 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
4587 va_end(ap); \
4588 } \
4589 else{ \
4590 va_list ap; \
4591 va_start(ap, arg16); \
4592 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
4593 va_end(ap); \
4594 } \
4595 } \
4596 if(FUNCNAME##_fake.custom_fake){ \
4597 va_list ap; \
4598 va_start(ap, arg16); \
4599 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
4600 va_end(ap); \
4601 } \
4602 } \
4603 DEFINE_RESET_FUNCTION(FUNCNAME) \
4604
4605#define FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
4606 DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
4607 DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
4608
4609
4610#define DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
4611 typedef struct FUNCNAME##_Fake { \
4612 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4613 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4614 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4615 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4616 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4617 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4618 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4619 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4620 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4621 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4622 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4623 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4624 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
4625 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
4626 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
4627 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
4628 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
4629 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
4630 DECLARE_ALL_FUNC_COMMON \
4631 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4632 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
4633 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
4634 } FUNCNAME##_Fake; \
4635 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4636 void FUNCNAME##_reset(void); \
4637 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...); \
4638
4639#define DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
4640 FUNCNAME##_Fake FUNCNAME##_fake; \
4641 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...){ \
4642 SAVE_ARG(FUNCNAME, 0); \
4643 SAVE_ARG(FUNCNAME, 1); \
4644 SAVE_ARG(FUNCNAME, 2); \
4645 SAVE_ARG(FUNCNAME, 3); \
4646 SAVE_ARG(FUNCNAME, 4); \
4647 SAVE_ARG(FUNCNAME, 5); \
4648 SAVE_ARG(FUNCNAME, 6); \
4649 SAVE_ARG(FUNCNAME, 7); \
4650 SAVE_ARG(FUNCNAME, 8); \
4651 SAVE_ARG(FUNCNAME, 9); \
4652 SAVE_ARG(FUNCNAME, 10); \
4653 SAVE_ARG(FUNCNAME, 11); \
4654 SAVE_ARG(FUNCNAME, 12); \
4655 SAVE_ARG(FUNCNAME, 13); \
4656 SAVE_ARG(FUNCNAME, 14); \
4657 SAVE_ARG(FUNCNAME, 15); \
4658 SAVE_ARG(FUNCNAME, 16); \
4659 SAVE_ARG(FUNCNAME, 17); \
4660 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4661 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4662 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4663 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4664 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4665 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4666 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4667 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4668 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4669 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4670 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4671 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4672 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4673 SAVE_ARG_HISTORY(FUNCNAME, 12); \
4674 SAVE_ARG_HISTORY(FUNCNAME, 13); \
4675 SAVE_ARG_HISTORY(FUNCNAME, 14); \
4676 SAVE_ARG_HISTORY(FUNCNAME, 15); \
4677 SAVE_ARG_HISTORY(FUNCNAME, 16); \
4678 SAVE_ARG_HISTORY(FUNCNAME, 17); \
4679 } \
4680 else{ \
4681 HISTORY_DROPPED(FUNCNAME); \
4682 } \
4683 INCREMENT_CALL_COUNT(FUNCNAME); \
4684 REGISTER_CALL(FUNCNAME); \
4685 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4686 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4687 va_list ap; \
4688 va_start(ap, arg17); \
4689 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
4690 va_end(ap); \
4691 } \
4692 else{ \
4693 va_list ap; \
4694 va_start(ap, arg17); \
4695 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
4696 va_end(ap); \
4697 } \
4698 } \
4699 if(FUNCNAME##_fake.custom_fake){ \
4700 va_list ap; \
4701 va_start(ap, arg17); \
4702 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
4703 va_end(ap); \
4704 } \
4705 } \
4706 DEFINE_RESET_FUNCTION(FUNCNAME) \
4707
4708#define FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
4709 DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
4710 DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
4711
4712
4713#define DECLARE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
4714 typedef struct FUNCNAME##_Fake { \
4715 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4716 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4717 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4718 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
4719 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
4720 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
4721 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
4722 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
4723 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
4724 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
4725 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
4726 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
4727 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
4728 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
4729 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
4730 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
4731 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
4732 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
4733 DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
4734 DECLARE_ALL_FUNC_COMMON \
4735 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4736 void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
4737 void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
4738 } FUNCNAME##_Fake; \
4739 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4740 void FUNCNAME##_reset(void); \
4741 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...); \
4742
4743#define DEFINE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
4744 FUNCNAME##_Fake FUNCNAME##_fake; \
4745 void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...){ \
4746 SAVE_ARG(FUNCNAME, 0); \
4747 SAVE_ARG(FUNCNAME, 1); \
4748 SAVE_ARG(FUNCNAME, 2); \
4749 SAVE_ARG(FUNCNAME, 3); \
4750 SAVE_ARG(FUNCNAME, 4); \
4751 SAVE_ARG(FUNCNAME, 5); \
4752 SAVE_ARG(FUNCNAME, 6); \
4753 SAVE_ARG(FUNCNAME, 7); \
4754 SAVE_ARG(FUNCNAME, 8); \
4755 SAVE_ARG(FUNCNAME, 9); \
4756 SAVE_ARG(FUNCNAME, 10); \
4757 SAVE_ARG(FUNCNAME, 11); \
4758 SAVE_ARG(FUNCNAME, 12); \
4759 SAVE_ARG(FUNCNAME, 13); \
4760 SAVE_ARG(FUNCNAME, 14); \
4761 SAVE_ARG(FUNCNAME, 15); \
4762 SAVE_ARG(FUNCNAME, 16); \
4763 SAVE_ARG(FUNCNAME, 17); \
4764 SAVE_ARG(FUNCNAME, 18); \
4765 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4766 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4767 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4768 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4769 SAVE_ARG_HISTORY(FUNCNAME, 3); \
4770 SAVE_ARG_HISTORY(FUNCNAME, 4); \
4771 SAVE_ARG_HISTORY(FUNCNAME, 5); \
4772 SAVE_ARG_HISTORY(FUNCNAME, 6); \
4773 SAVE_ARG_HISTORY(FUNCNAME, 7); \
4774 SAVE_ARG_HISTORY(FUNCNAME, 8); \
4775 SAVE_ARG_HISTORY(FUNCNAME, 9); \
4776 SAVE_ARG_HISTORY(FUNCNAME, 10); \
4777 SAVE_ARG_HISTORY(FUNCNAME, 11); \
4778 SAVE_ARG_HISTORY(FUNCNAME, 12); \
4779 SAVE_ARG_HISTORY(FUNCNAME, 13); \
4780 SAVE_ARG_HISTORY(FUNCNAME, 14); \
4781 SAVE_ARG_HISTORY(FUNCNAME, 15); \
4782 SAVE_ARG_HISTORY(FUNCNAME, 16); \
4783 SAVE_ARG_HISTORY(FUNCNAME, 17); \
4784 SAVE_ARG_HISTORY(FUNCNAME, 18); \
4785 } \
4786 else{ \
4787 HISTORY_DROPPED(FUNCNAME); \
4788 } \
4789 INCREMENT_CALL_COUNT(FUNCNAME); \
4790 REGISTER_CALL(FUNCNAME); \
4791 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4792 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4793 va_list ap; \
4794 va_start(ap, arg18); \
4795 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
4796 va_end(ap); \
4797 } \
4798 else{ \
4799 va_list ap; \
4800 va_start(ap, arg18); \
4801 FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
4802 va_end(ap); \
4803 } \
4804 } \
4805 if(FUNCNAME##_fake.custom_fake){ \
4806 va_list ap; \
4807 va_start(ap, arg18); \
4808 FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
4809 va_end(ap); \
4810 } \
4811 } \
4812 DEFINE_RESET_FUNCTION(FUNCNAME) \
4813
4814#define FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
4815 DECLARE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
4816 DEFINE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
4817
4818
4819#define DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
4820 typedef struct FUNCNAME##_Fake { \
4821 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4822 DECLARE_ALL_FUNC_COMMON \
4823 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
4824 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
4825 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4826 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, va_list ap); \
4827 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, va_list ap); \
4828 } FUNCNAME##_Fake; \
4829 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4830 void FUNCNAME##_reset(void); \
4831 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...); \
4832
4833#define DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
4834 FUNCNAME##_Fake FUNCNAME##_fake; \
4835 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...){ \
4836 SAVE_ARG(FUNCNAME, 0); \
4837 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4838 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4839 } \
4840 else{ \
4841 HISTORY_DROPPED(FUNCNAME); \
4842 } \
4843 INCREMENT_CALL_COUNT(FUNCNAME); \
4844 REGISTER_CALL(FUNCNAME); \
4845 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4846 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4847 va_list ap; \
4848 va_start(ap, arg0); \
4849 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, ap); \
4850 SAVE_RET_HISTORY(FUNCNAME, ret); \
4851 va_end(ap); \
4852 return ret; \
4853 } \
4854 else{ \
4855 va_list ap; \
4856 va_start(ap, arg0); \
4857 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \
4858 SAVE_RET_HISTORY(FUNCNAME, ret); \
4859 va_end(ap); \
4860 return ret; \
4861 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \
4862 } \
4863 } \
4864 if(FUNCNAME##_fake.custom_fake){ \
4865 RETURN_TYPE ret; \
4866 va_list ap; \
4867 va_start(ap, arg0); \
4868 ret = FUNCNAME##_fake.custom_fake(arg0, ap); \
4869 va_end(ap); \
4870 SAVE_RET_HISTORY(FUNCNAME, ret); \
4871 return ret; \
4872 } \
4873 RETURN_FAKE_RESULT(FUNCNAME) \
4874 } \
4875 DEFINE_RESET_FUNCTION(FUNCNAME) \
4876
4877#define FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
4878 DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
4879 DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
4880
4881
4882#define DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
4883 typedef struct FUNCNAME##_Fake { \
4884 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4885 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4886 DECLARE_ALL_FUNC_COMMON \
4887 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
4888 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
4889 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4890 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
4891 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
4892 } FUNCNAME##_Fake; \
4893 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4894 void FUNCNAME##_reset(void); \
4895 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...); \
4896
4897#define DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
4898 FUNCNAME##_Fake FUNCNAME##_fake; \
4899 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...){ \
4900 SAVE_ARG(FUNCNAME, 0); \
4901 SAVE_ARG(FUNCNAME, 1); \
4902 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4903 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4904 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4905 } \
4906 else{ \
4907 HISTORY_DROPPED(FUNCNAME); \
4908 } \
4909 INCREMENT_CALL_COUNT(FUNCNAME); \
4910 REGISTER_CALL(FUNCNAME); \
4911 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4912 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4913 va_list ap; \
4914 va_start(ap, arg1); \
4915 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, ap); \
4916 SAVE_RET_HISTORY(FUNCNAME, ret); \
4917 va_end(ap); \
4918 return ret; \
4919 } \
4920 else{ \
4921 va_list ap; \
4922 va_start(ap, arg1); \
4923 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \
4924 SAVE_RET_HISTORY(FUNCNAME, ret); \
4925 va_end(ap); \
4926 return ret; \
4927 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \
4928 } \
4929 } \
4930 if(FUNCNAME##_fake.custom_fake){ \
4931 RETURN_TYPE ret; \
4932 va_list ap; \
4933 va_start(ap, arg1); \
4934 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, ap); \
4935 va_end(ap); \
4936 SAVE_RET_HISTORY(FUNCNAME, ret); \
4937 return ret; \
4938 } \
4939 RETURN_FAKE_RESULT(FUNCNAME) \
4940 } \
4941 DEFINE_RESET_FUNCTION(FUNCNAME) \
4942
4943#define FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
4944 DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
4945 DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
4946
4947
4948#define DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
4949 typedef struct FUNCNAME##_Fake { \
4950 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
4951 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
4952 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
4953 DECLARE_ALL_FUNC_COMMON \
4954 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
4955 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
4956 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
4957 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
4958 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
4959 } FUNCNAME##_Fake; \
4960 extern FUNCNAME##_Fake FUNCNAME##_fake; \
4961 void FUNCNAME##_reset(void); \
4962 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...); \
4963
4964#define DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
4965 FUNCNAME##_Fake FUNCNAME##_fake; \
4966 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...){ \
4967 SAVE_ARG(FUNCNAME, 0); \
4968 SAVE_ARG(FUNCNAME, 1); \
4969 SAVE_ARG(FUNCNAME, 2); \
4970 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
4971 SAVE_ARG_HISTORY(FUNCNAME, 0); \
4972 SAVE_ARG_HISTORY(FUNCNAME, 1); \
4973 SAVE_ARG_HISTORY(FUNCNAME, 2); \
4974 } \
4975 else{ \
4976 HISTORY_DROPPED(FUNCNAME); \
4977 } \
4978 INCREMENT_CALL_COUNT(FUNCNAME); \
4979 REGISTER_CALL(FUNCNAME); \
4980 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
4981 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
4982 va_list ap; \
4983 va_start(ap, arg2); \
4984 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, ap); \
4985 SAVE_RET_HISTORY(FUNCNAME, ret); \
4986 va_end(ap); \
4987 return ret; \
4988 } \
4989 else{ \
4990 va_list ap; \
4991 va_start(ap, arg2); \
4992 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \
4993 SAVE_RET_HISTORY(FUNCNAME, ret); \
4994 va_end(ap); \
4995 return ret; \
4996 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \
4997 } \
4998 } \
4999 if(FUNCNAME##_fake.custom_fake){ \
5000 RETURN_TYPE ret; \
5001 va_list ap; \
5002 va_start(ap, arg2); \
5003 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap); \
5004 va_end(ap); \
5005 SAVE_RET_HISTORY(FUNCNAME, ret); \
5006 return ret; \
5007 } \
5008 RETURN_FAKE_RESULT(FUNCNAME) \
5009 } \
5010 DEFINE_RESET_FUNCTION(FUNCNAME) \
5011
5012#define FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
5013 DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
5014 DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
5015
5016
5017#define DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
5018 typedef struct FUNCNAME##_Fake { \
5019 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5020 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5021 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5022 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5023 DECLARE_ALL_FUNC_COMMON \
5024 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5025 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5026 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5027 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
5028 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
5029 } FUNCNAME##_Fake; \
5030 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5031 void FUNCNAME##_reset(void); \
5032 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...); \
5033
5034#define DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
5035 FUNCNAME##_Fake FUNCNAME##_fake; \
5036 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...){ \
5037 SAVE_ARG(FUNCNAME, 0); \
5038 SAVE_ARG(FUNCNAME, 1); \
5039 SAVE_ARG(FUNCNAME, 2); \
5040 SAVE_ARG(FUNCNAME, 3); \
5041 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5042 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5043 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5044 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5045 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5046 } \
5047 else{ \
5048 HISTORY_DROPPED(FUNCNAME); \
5049 } \
5050 INCREMENT_CALL_COUNT(FUNCNAME); \
5051 REGISTER_CALL(FUNCNAME); \
5052 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5053 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5054 va_list ap; \
5055 va_start(ap, arg3); \
5056 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, ap); \
5057 SAVE_RET_HISTORY(FUNCNAME, ret); \
5058 va_end(ap); \
5059 return ret; \
5060 } \
5061 else{ \
5062 va_list ap; \
5063 va_start(ap, arg3); \
5064 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \
5065 SAVE_RET_HISTORY(FUNCNAME, ret); \
5066 va_end(ap); \
5067 return ret; \
5068 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \
5069 } \
5070 } \
5071 if(FUNCNAME##_fake.custom_fake){ \
5072 RETURN_TYPE ret; \
5073 va_list ap; \
5074 va_start(ap, arg3); \
5075 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap); \
5076 va_end(ap); \
5077 SAVE_RET_HISTORY(FUNCNAME, ret); \
5078 return ret; \
5079 } \
5080 RETURN_FAKE_RESULT(FUNCNAME) \
5081 } \
5082 DEFINE_RESET_FUNCTION(FUNCNAME) \
5083
5084#define FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
5085 DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
5086 DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
5087
5088
5089#define DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
5090 typedef struct FUNCNAME##_Fake { \
5091 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5092 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5093 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5094 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5095 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5096 DECLARE_ALL_FUNC_COMMON \
5097 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5098 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5099 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5100 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
5101 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
5102 } FUNCNAME##_Fake; \
5103 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5104 void FUNCNAME##_reset(void); \
5105 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...); \
5106
5107#define DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
5108 FUNCNAME##_Fake FUNCNAME##_fake; \
5109 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...){ \
5110 SAVE_ARG(FUNCNAME, 0); \
5111 SAVE_ARG(FUNCNAME, 1); \
5112 SAVE_ARG(FUNCNAME, 2); \
5113 SAVE_ARG(FUNCNAME, 3); \
5114 SAVE_ARG(FUNCNAME, 4); \
5115 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5116 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5117 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5118 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5119 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5120 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5121 } \
5122 else{ \
5123 HISTORY_DROPPED(FUNCNAME); \
5124 } \
5125 INCREMENT_CALL_COUNT(FUNCNAME); \
5126 REGISTER_CALL(FUNCNAME); \
5127 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5128 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5129 va_list ap; \
5130 va_start(ap, arg4); \
5131 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, ap); \
5132 SAVE_RET_HISTORY(FUNCNAME, ret); \
5133 va_end(ap); \
5134 return ret; \
5135 } \
5136 else{ \
5137 va_list ap; \
5138 va_start(ap, arg4); \
5139 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \
5140 SAVE_RET_HISTORY(FUNCNAME, ret); \
5141 va_end(ap); \
5142 return ret; \
5143 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \
5144 } \
5145 } \
5146 if(FUNCNAME##_fake.custom_fake){ \
5147 RETURN_TYPE ret; \
5148 va_list ap; \
5149 va_start(ap, arg4); \
5150 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap); \
5151 va_end(ap); \
5152 SAVE_RET_HISTORY(FUNCNAME, ret); \
5153 return ret; \
5154 } \
5155 RETURN_FAKE_RESULT(FUNCNAME) \
5156 } \
5157 DEFINE_RESET_FUNCTION(FUNCNAME) \
5158
5159#define FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
5160 DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
5161 DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
5162
5163
5164#define DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
5165 typedef struct FUNCNAME##_Fake { \
5166 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5167 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5168 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5169 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5170 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5171 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5172 DECLARE_ALL_FUNC_COMMON \
5173 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5174 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5175 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5176 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
5177 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
5178 } FUNCNAME##_Fake; \
5179 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5180 void FUNCNAME##_reset(void); \
5181 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...); \
5182
5183#define DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
5184 FUNCNAME##_Fake FUNCNAME##_fake; \
5185 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...){ \
5186 SAVE_ARG(FUNCNAME, 0); \
5187 SAVE_ARG(FUNCNAME, 1); \
5188 SAVE_ARG(FUNCNAME, 2); \
5189 SAVE_ARG(FUNCNAME, 3); \
5190 SAVE_ARG(FUNCNAME, 4); \
5191 SAVE_ARG(FUNCNAME, 5); \
5192 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5193 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5194 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5195 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5196 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5197 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5198 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5199 } \
5200 else{ \
5201 HISTORY_DROPPED(FUNCNAME); \
5202 } \
5203 INCREMENT_CALL_COUNT(FUNCNAME); \
5204 REGISTER_CALL(FUNCNAME); \
5205 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5206 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5207 va_list ap; \
5208 va_start(ap, arg5); \
5209 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
5210 SAVE_RET_HISTORY(FUNCNAME, ret); \
5211 va_end(ap); \
5212 return ret; \
5213 } \
5214 else{ \
5215 va_list ap; \
5216 va_start(ap, arg5); \
5217 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
5218 SAVE_RET_HISTORY(FUNCNAME, ret); \
5219 va_end(ap); \
5220 return ret; \
5221 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
5222 } \
5223 } \
5224 if(FUNCNAME##_fake.custom_fake){ \
5225 RETURN_TYPE ret; \
5226 va_list ap; \
5227 va_start(ap, arg5); \
5228 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap); \
5229 va_end(ap); \
5230 SAVE_RET_HISTORY(FUNCNAME, ret); \
5231 return ret; \
5232 } \
5233 RETURN_FAKE_RESULT(FUNCNAME) \
5234 } \
5235 DEFINE_RESET_FUNCTION(FUNCNAME) \
5236
5237#define FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
5238 DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
5239 DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
5240
5241
5242#define DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
5243 typedef struct FUNCNAME##_Fake { \
5244 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5245 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5246 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5247 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5248 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5249 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5250 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5251 DECLARE_ALL_FUNC_COMMON \
5252 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5253 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5254 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5255 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
5256 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
5257 } FUNCNAME##_Fake; \
5258 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5259 void FUNCNAME##_reset(void); \
5260 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...); \
5261
5262#define DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
5263 FUNCNAME##_Fake FUNCNAME##_fake; \
5264 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...){ \
5265 SAVE_ARG(FUNCNAME, 0); \
5266 SAVE_ARG(FUNCNAME, 1); \
5267 SAVE_ARG(FUNCNAME, 2); \
5268 SAVE_ARG(FUNCNAME, 3); \
5269 SAVE_ARG(FUNCNAME, 4); \
5270 SAVE_ARG(FUNCNAME, 5); \
5271 SAVE_ARG(FUNCNAME, 6); \
5272 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5273 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5274 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5275 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5276 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5277 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5278 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5279 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5280 } \
5281 else{ \
5282 HISTORY_DROPPED(FUNCNAME); \
5283 } \
5284 INCREMENT_CALL_COUNT(FUNCNAME); \
5285 REGISTER_CALL(FUNCNAME); \
5286 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5287 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5288 va_list ap; \
5289 va_start(ap, arg6); \
5290 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
5291 SAVE_RET_HISTORY(FUNCNAME, ret); \
5292 va_end(ap); \
5293 return ret; \
5294 } \
5295 else{ \
5296 va_list ap; \
5297 va_start(ap, arg6); \
5298 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
5299 SAVE_RET_HISTORY(FUNCNAME, ret); \
5300 va_end(ap); \
5301 return ret; \
5302 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
5303 } \
5304 } \
5305 if(FUNCNAME##_fake.custom_fake){ \
5306 RETURN_TYPE ret; \
5307 va_list ap; \
5308 va_start(ap, arg6); \
5309 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
5310 va_end(ap); \
5311 SAVE_RET_HISTORY(FUNCNAME, ret); \
5312 return ret; \
5313 } \
5314 RETURN_FAKE_RESULT(FUNCNAME) \
5315 } \
5316 DEFINE_RESET_FUNCTION(FUNCNAME) \
5317
5318#define FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
5319 DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
5320 DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
5321
5322
5323#define DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
5324 typedef struct FUNCNAME##_Fake { \
5325 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5326 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5327 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5328 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5329 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5330 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5331 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5332 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5333 DECLARE_ALL_FUNC_COMMON \
5334 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5335 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5336 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5337 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
5338 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
5339 } FUNCNAME##_Fake; \
5340 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5341 void FUNCNAME##_reset(void); \
5342 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...); \
5343
5344#define DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
5345 FUNCNAME##_Fake FUNCNAME##_fake; \
5346 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...){ \
5347 SAVE_ARG(FUNCNAME, 0); \
5348 SAVE_ARG(FUNCNAME, 1); \
5349 SAVE_ARG(FUNCNAME, 2); \
5350 SAVE_ARG(FUNCNAME, 3); \
5351 SAVE_ARG(FUNCNAME, 4); \
5352 SAVE_ARG(FUNCNAME, 5); \
5353 SAVE_ARG(FUNCNAME, 6); \
5354 SAVE_ARG(FUNCNAME, 7); \
5355 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5356 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5357 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5358 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5359 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5360 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5361 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5362 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5363 SAVE_ARG_HISTORY(FUNCNAME, 7); \
5364 } \
5365 else{ \
5366 HISTORY_DROPPED(FUNCNAME); \
5367 } \
5368 INCREMENT_CALL_COUNT(FUNCNAME); \
5369 REGISTER_CALL(FUNCNAME); \
5370 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5371 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5372 va_list ap; \
5373 va_start(ap, arg7); \
5374 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
5375 SAVE_RET_HISTORY(FUNCNAME, ret); \
5376 va_end(ap); \
5377 return ret; \
5378 } \
5379 else{ \
5380 va_list ap; \
5381 va_start(ap, arg7); \
5382 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
5383 SAVE_RET_HISTORY(FUNCNAME, ret); \
5384 va_end(ap); \
5385 return ret; \
5386 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
5387 } \
5388 } \
5389 if(FUNCNAME##_fake.custom_fake){ \
5390 RETURN_TYPE ret; \
5391 va_list ap; \
5392 va_start(ap, arg7); \
5393 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
5394 va_end(ap); \
5395 SAVE_RET_HISTORY(FUNCNAME, ret); \
5396 return ret; \
5397 } \
5398 RETURN_FAKE_RESULT(FUNCNAME) \
5399 } \
5400 DEFINE_RESET_FUNCTION(FUNCNAME) \
5401
5402#define FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
5403 DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
5404 DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
5405
5406
5407#define DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
5408 typedef struct FUNCNAME##_Fake { \
5409 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5410 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5411 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5412 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5413 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5414 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5415 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5416 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5417 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
5418 DECLARE_ALL_FUNC_COMMON \
5419 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5420 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5421 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5422 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
5423 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
5424 } FUNCNAME##_Fake; \
5425 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5426 void FUNCNAME##_reset(void); \
5427 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...); \
5428
5429#define DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
5430 FUNCNAME##_Fake FUNCNAME##_fake; \
5431 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...){ \
5432 SAVE_ARG(FUNCNAME, 0); \
5433 SAVE_ARG(FUNCNAME, 1); \
5434 SAVE_ARG(FUNCNAME, 2); \
5435 SAVE_ARG(FUNCNAME, 3); \
5436 SAVE_ARG(FUNCNAME, 4); \
5437 SAVE_ARG(FUNCNAME, 5); \
5438 SAVE_ARG(FUNCNAME, 6); \
5439 SAVE_ARG(FUNCNAME, 7); \
5440 SAVE_ARG(FUNCNAME, 8); \
5441 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5442 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5443 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5444 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5445 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5446 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5447 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5448 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5449 SAVE_ARG_HISTORY(FUNCNAME, 7); \
5450 SAVE_ARG_HISTORY(FUNCNAME, 8); \
5451 } \
5452 else{ \
5453 HISTORY_DROPPED(FUNCNAME); \
5454 } \
5455 INCREMENT_CALL_COUNT(FUNCNAME); \
5456 REGISTER_CALL(FUNCNAME); \
5457 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5458 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5459 va_list ap; \
5460 va_start(ap, arg8); \
5461 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
5462 SAVE_RET_HISTORY(FUNCNAME, ret); \
5463 va_end(ap); \
5464 return ret; \
5465 } \
5466 else{ \
5467 va_list ap; \
5468 va_start(ap, arg8); \
5469 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
5470 SAVE_RET_HISTORY(FUNCNAME, ret); \
5471 va_end(ap); \
5472 return ret; \
5473 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
5474 } \
5475 } \
5476 if(FUNCNAME##_fake.custom_fake){ \
5477 RETURN_TYPE ret; \
5478 va_list ap; \
5479 va_start(ap, arg8); \
5480 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
5481 va_end(ap); \
5482 SAVE_RET_HISTORY(FUNCNAME, ret); \
5483 return ret; \
5484 } \
5485 RETURN_FAKE_RESULT(FUNCNAME) \
5486 } \
5487 DEFINE_RESET_FUNCTION(FUNCNAME) \
5488
5489#define FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
5490 DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
5491 DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
5492
5493
5494#define DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
5495 typedef struct FUNCNAME##_Fake { \
5496 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5497 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5498 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5499 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5500 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5501 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5502 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5503 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5504 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
5505 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
5506 DECLARE_ALL_FUNC_COMMON \
5507 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5508 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5509 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5510 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
5511 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
5512 } FUNCNAME##_Fake; \
5513 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5514 void FUNCNAME##_reset(void); \
5515 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...); \
5516
5517#define DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
5518 FUNCNAME##_Fake FUNCNAME##_fake; \
5519 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...){ \
5520 SAVE_ARG(FUNCNAME, 0); \
5521 SAVE_ARG(FUNCNAME, 1); \
5522 SAVE_ARG(FUNCNAME, 2); \
5523 SAVE_ARG(FUNCNAME, 3); \
5524 SAVE_ARG(FUNCNAME, 4); \
5525 SAVE_ARG(FUNCNAME, 5); \
5526 SAVE_ARG(FUNCNAME, 6); \
5527 SAVE_ARG(FUNCNAME, 7); \
5528 SAVE_ARG(FUNCNAME, 8); \
5529 SAVE_ARG(FUNCNAME, 9); \
5530 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5531 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5532 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5533 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5534 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5535 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5536 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5537 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5538 SAVE_ARG_HISTORY(FUNCNAME, 7); \
5539 SAVE_ARG_HISTORY(FUNCNAME, 8); \
5540 SAVE_ARG_HISTORY(FUNCNAME, 9); \
5541 } \
5542 else{ \
5543 HISTORY_DROPPED(FUNCNAME); \
5544 } \
5545 INCREMENT_CALL_COUNT(FUNCNAME); \
5546 REGISTER_CALL(FUNCNAME); \
5547 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5548 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5549 va_list ap; \
5550 va_start(ap, arg9); \
5551 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
5552 SAVE_RET_HISTORY(FUNCNAME, ret); \
5553 va_end(ap); \
5554 return ret; \
5555 } \
5556 else{ \
5557 va_list ap; \
5558 va_start(ap, arg9); \
5559 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
5560 SAVE_RET_HISTORY(FUNCNAME, ret); \
5561 va_end(ap); \
5562 return ret; \
5563 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
5564 } \
5565 } \
5566 if(FUNCNAME##_fake.custom_fake){ \
5567 RETURN_TYPE ret; \
5568 va_list ap; \
5569 va_start(ap, arg9); \
5570 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
5571 va_end(ap); \
5572 SAVE_RET_HISTORY(FUNCNAME, ret); \
5573 return ret; \
5574 } \
5575 RETURN_FAKE_RESULT(FUNCNAME) \
5576 } \
5577 DEFINE_RESET_FUNCTION(FUNCNAME) \
5578
5579#define FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
5580 DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
5581 DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
5582
5583
5584#define DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
5585 typedef struct FUNCNAME##_Fake { \
5586 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5587 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5588 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5589 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5590 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5591 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5592 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5593 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5594 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
5595 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
5596 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
5597 DECLARE_ALL_FUNC_COMMON \
5598 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5599 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5600 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5601 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
5602 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
5603 } FUNCNAME##_Fake; \
5604 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5605 void FUNCNAME##_reset(void); \
5606 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...); \
5607
5608#define DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
5609 FUNCNAME##_Fake FUNCNAME##_fake; \
5610 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...){ \
5611 SAVE_ARG(FUNCNAME, 0); \
5612 SAVE_ARG(FUNCNAME, 1); \
5613 SAVE_ARG(FUNCNAME, 2); \
5614 SAVE_ARG(FUNCNAME, 3); \
5615 SAVE_ARG(FUNCNAME, 4); \
5616 SAVE_ARG(FUNCNAME, 5); \
5617 SAVE_ARG(FUNCNAME, 6); \
5618 SAVE_ARG(FUNCNAME, 7); \
5619 SAVE_ARG(FUNCNAME, 8); \
5620 SAVE_ARG(FUNCNAME, 9); \
5621 SAVE_ARG(FUNCNAME, 10); \
5622 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5623 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5624 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5625 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5626 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5627 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5628 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5629 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5630 SAVE_ARG_HISTORY(FUNCNAME, 7); \
5631 SAVE_ARG_HISTORY(FUNCNAME, 8); \
5632 SAVE_ARG_HISTORY(FUNCNAME, 9); \
5633 SAVE_ARG_HISTORY(FUNCNAME, 10); \
5634 } \
5635 else{ \
5636 HISTORY_DROPPED(FUNCNAME); \
5637 } \
5638 INCREMENT_CALL_COUNT(FUNCNAME); \
5639 REGISTER_CALL(FUNCNAME); \
5640 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5641 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5642 va_list ap; \
5643 va_start(ap, arg10); \
5644 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
5645 SAVE_RET_HISTORY(FUNCNAME, ret); \
5646 va_end(ap); \
5647 return ret; \
5648 } \
5649 else{ \
5650 va_list ap; \
5651 va_start(ap, arg10); \
5652 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
5653 SAVE_RET_HISTORY(FUNCNAME, ret); \
5654 va_end(ap); \
5655 return ret; \
5656 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
5657 } \
5658 } \
5659 if(FUNCNAME##_fake.custom_fake){ \
5660 RETURN_TYPE ret; \
5661 va_list ap; \
5662 va_start(ap, arg10); \
5663 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
5664 va_end(ap); \
5665 SAVE_RET_HISTORY(FUNCNAME, ret); \
5666 return ret; \
5667 } \
5668 RETURN_FAKE_RESULT(FUNCNAME) \
5669 } \
5670 DEFINE_RESET_FUNCTION(FUNCNAME) \
5671
5672#define FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
5673 DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
5674 DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
5675
5676
5677#define DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
5678 typedef struct FUNCNAME##_Fake { \
5679 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5680 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5681 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5682 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5683 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5684 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5685 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5686 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5687 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
5688 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
5689 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
5690 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
5691 DECLARE_ALL_FUNC_COMMON \
5692 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5693 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5694 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5695 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
5696 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
5697 } FUNCNAME##_Fake; \
5698 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5699 void FUNCNAME##_reset(void); \
5700 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...); \
5701
5702#define DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
5703 FUNCNAME##_Fake FUNCNAME##_fake; \
5704 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...){ \
5705 SAVE_ARG(FUNCNAME, 0); \
5706 SAVE_ARG(FUNCNAME, 1); \
5707 SAVE_ARG(FUNCNAME, 2); \
5708 SAVE_ARG(FUNCNAME, 3); \
5709 SAVE_ARG(FUNCNAME, 4); \
5710 SAVE_ARG(FUNCNAME, 5); \
5711 SAVE_ARG(FUNCNAME, 6); \
5712 SAVE_ARG(FUNCNAME, 7); \
5713 SAVE_ARG(FUNCNAME, 8); \
5714 SAVE_ARG(FUNCNAME, 9); \
5715 SAVE_ARG(FUNCNAME, 10); \
5716 SAVE_ARG(FUNCNAME, 11); \
5717 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5718 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5719 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5720 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5721 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5722 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5723 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5724 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5725 SAVE_ARG_HISTORY(FUNCNAME, 7); \
5726 SAVE_ARG_HISTORY(FUNCNAME, 8); \
5727 SAVE_ARG_HISTORY(FUNCNAME, 9); \
5728 SAVE_ARG_HISTORY(FUNCNAME, 10); \
5729 SAVE_ARG_HISTORY(FUNCNAME, 11); \
5730 } \
5731 else{ \
5732 HISTORY_DROPPED(FUNCNAME); \
5733 } \
5734 INCREMENT_CALL_COUNT(FUNCNAME); \
5735 REGISTER_CALL(FUNCNAME); \
5736 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5737 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5738 va_list ap; \
5739 va_start(ap, arg11); \
5740 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
5741 SAVE_RET_HISTORY(FUNCNAME, ret); \
5742 va_end(ap); \
5743 return ret; \
5744 } \
5745 else{ \
5746 va_list ap; \
5747 va_start(ap, arg11); \
5748 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
5749 SAVE_RET_HISTORY(FUNCNAME, ret); \
5750 va_end(ap); \
5751 return ret; \
5752 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
5753 } \
5754 } \
5755 if(FUNCNAME##_fake.custom_fake){ \
5756 RETURN_TYPE ret; \
5757 va_list ap; \
5758 va_start(ap, arg11); \
5759 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
5760 va_end(ap); \
5761 SAVE_RET_HISTORY(FUNCNAME, ret); \
5762 return ret; \
5763 } \
5764 RETURN_FAKE_RESULT(FUNCNAME) \
5765 } \
5766 DEFINE_RESET_FUNCTION(FUNCNAME) \
5767
5768#define FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
5769 DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
5770 DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
5771
5772
5773#define DECLARE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
5774 typedef struct FUNCNAME##_Fake { \
5775 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5776 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5777 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5778 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5779 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5780 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5781 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5782 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5783 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
5784 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
5785 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
5786 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
5787 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
5788 DECLARE_ALL_FUNC_COMMON \
5789 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5790 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5791 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5792 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
5793 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
5794 } FUNCNAME##_Fake; \
5795 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5796 void FUNCNAME##_reset(void); \
5797 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...); \
5798
5799#define DEFINE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
5800 FUNCNAME##_Fake FUNCNAME##_fake; \
5801 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...){ \
5802 SAVE_ARG(FUNCNAME, 0); \
5803 SAVE_ARG(FUNCNAME, 1); \
5804 SAVE_ARG(FUNCNAME, 2); \
5805 SAVE_ARG(FUNCNAME, 3); \
5806 SAVE_ARG(FUNCNAME, 4); \
5807 SAVE_ARG(FUNCNAME, 5); \
5808 SAVE_ARG(FUNCNAME, 6); \
5809 SAVE_ARG(FUNCNAME, 7); \
5810 SAVE_ARG(FUNCNAME, 8); \
5811 SAVE_ARG(FUNCNAME, 9); \
5812 SAVE_ARG(FUNCNAME, 10); \
5813 SAVE_ARG(FUNCNAME, 11); \
5814 SAVE_ARG(FUNCNAME, 12); \
5815 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5816 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5817 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5818 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5819 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5820 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5821 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5822 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5823 SAVE_ARG_HISTORY(FUNCNAME, 7); \
5824 SAVE_ARG_HISTORY(FUNCNAME, 8); \
5825 SAVE_ARG_HISTORY(FUNCNAME, 9); \
5826 SAVE_ARG_HISTORY(FUNCNAME, 10); \
5827 SAVE_ARG_HISTORY(FUNCNAME, 11); \
5828 SAVE_ARG_HISTORY(FUNCNAME, 12); \
5829 } \
5830 else{ \
5831 HISTORY_DROPPED(FUNCNAME); \
5832 } \
5833 INCREMENT_CALL_COUNT(FUNCNAME); \
5834 REGISTER_CALL(FUNCNAME); \
5835 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5836 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5837 va_list ap; \
5838 va_start(ap, arg12); \
5839 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
5840 SAVE_RET_HISTORY(FUNCNAME, ret); \
5841 va_end(ap); \
5842 return ret; \
5843 } \
5844 else{ \
5845 va_list ap; \
5846 va_start(ap, arg12); \
5847 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
5848 SAVE_RET_HISTORY(FUNCNAME, ret); \
5849 va_end(ap); \
5850 return ret; \
5851 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
5852 } \
5853 } \
5854 if(FUNCNAME##_fake.custom_fake){ \
5855 RETURN_TYPE ret; \
5856 va_list ap; \
5857 va_start(ap, arg12); \
5858 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
5859 va_end(ap); \
5860 SAVE_RET_HISTORY(FUNCNAME, ret); \
5861 return ret; \
5862 } \
5863 RETURN_FAKE_RESULT(FUNCNAME) \
5864 } \
5865 DEFINE_RESET_FUNCTION(FUNCNAME) \
5866
5867#define FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
5868 DECLARE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
5869 DEFINE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
5870
5871
5872#define DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
5873 typedef struct FUNCNAME##_Fake { \
5874 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5875 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5876 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5877 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5878 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5879 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5880 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5881 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5882 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
5883 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
5884 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
5885 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
5886 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
5887 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
5888 DECLARE_ALL_FUNC_COMMON \
5889 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5890 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5891 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5892 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
5893 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
5894 } FUNCNAME##_Fake; \
5895 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5896 void FUNCNAME##_reset(void); \
5897 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...); \
5898
5899#define DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
5900 FUNCNAME##_Fake FUNCNAME##_fake; \
5901 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...){ \
5902 SAVE_ARG(FUNCNAME, 0); \
5903 SAVE_ARG(FUNCNAME, 1); \
5904 SAVE_ARG(FUNCNAME, 2); \
5905 SAVE_ARG(FUNCNAME, 3); \
5906 SAVE_ARG(FUNCNAME, 4); \
5907 SAVE_ARG(FUNCNAME, 5); \
5908 SAVE_ARG(FUNCNAME, 6); \
5909 SAVE_ARG(FUNCNAME, 7); \
5910 SAVE_ARG(FUNCNAME, 8); \
5911 SAVE_ARG(FUNCNAME, 9); \
5912 SAVE_ARG(FUNCNAME, 10); \
5913 SAVE_ARG(FUNCNAME, 11); \
5914 SAVE_ARG(FUNCNAME, 12); \
5915 SAVE_ARG(FUNCNAME, 13); \
5916 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
5917 SAVE_ARG_HISTORY(FUNCNAME, 0); \
5918 SAVE_ARG_HISTORY(FUNCNAME, 1); \
5919 SAVE_ARG_HISTORY(FUNCNAME, 2); \
5920 SAVE_ARG_HISTORY(FUNCNAME, 3); \
5921 SAVE_ARG_HISTORY(FUNCNAME, 4); \
5922 SAVE_ARG_HISTORY(FUNCNAME, 5); \
5923 SAVE_ARG_HISTORY(FUNCNAME, 6); \
5924 SAVE_ARG_HISTORY(FUNCNAME, 7); \
5925 SAVE_ARG_HISTORY(FUNCNAME, 8); \
5926 SAVE_ARG_HISTORY(FUNCNAME, 9); \
5927 SAVE_ARG_HISTORY(FUNCNAME, 10); \
5928 SAVE_ARG_HISTORY(FUNCNAME, 11); \
5929 SAVE_ARG_HISTORY(FUNCNAME, 12); \
5930 SAVE_ARG_HISTORY(FUNCNAME, 13); \
5931 } \
5932 else{ \
5933 HISTORY_DROPPED(FUNCNAME); \
5934 } \
5935 INCREMENT_CALL_COUNT(FUNCNAME); \
5936 REGISTER_CALL(FUNCNAME); \
5937 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
5938 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
5939 va_list ap; \
5940 va_start(ap, arg13); \
5941 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
5942 SAVE_RET_HISTORY(FUNCNAME, ret); \
5943 va_end(ap); \
5944 return ret; \
5945 } \
5946 else{ \
5947 va_list ap; \
5948 va_start(ap, arg13); \
5949 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
5950 SAVE_RET_HISTORY(FUNCNAME, ret); \
5951 va_end(ap); \
5952 return ret; \
5953 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
5954 } \
5955 } \
5956 if(FUNCNAME##_fake.custom_fake){ \
5957 RETURN_TYPE ret; \
5958 va_list ap; \
5959 va_start(ap, arg13); \
5960 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
5961 va_end(ap); \
5962 SAVE_RET_HISTORY(FUNCNAME, ret); \
5963 return ret; \
5964 } \
5965 RETURN_FAKE_RESULT(FUNCNAME) \
5966 } \
5967 DEFINE_RESET_FUNCTION(FUNCNAME) \
5968
5969#define FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
5970 DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
5971 DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
5972
5973
5974#define DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
5975 typedef struct FUNCNAME##_Fake { \
5976 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
5977 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
5978 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
5979 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
5980 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
5981 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
5982 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
5983 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
5984 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
5985 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
5986 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
5987 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
5988 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
5989 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
5990 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
5991 DECLARE_ALL_FUNC_COMMON \
5992 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
5993 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
5994 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
5995 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
5996 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
5997 } FUNCNAME##_Fake; \
5998 extern FUNCNAME##_Fake FUNCNAME##_fake; \
5999 void FUNCNAME##_reset(void); \
6000 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...); \
6001
6002#define DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
6003 FUNCNAME##_Fake FUNCNAME##_fake; \
6004 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...){ \
6005 SAVE_ARG(FUNCNAME, 0); \
6006 SAVE_ARG(FUNCNAME, 1); \
6007 SAVE_ARG(FUNCNAME, 2); \
6008 SAVE_ARG(FUNCNAME, 3); \
6009 SAVE_ARG(FUNCNAME, 4); \
6010 SAVE_ARG(FUNCNAME, 5); \
6011 SAVE_ARG(FUNCNAME, 6); \
6012 SAVE_ARG(FUNCNAME, 7); \
6013 SAVE_ARG(FUNCNAME, 8); \
6014 SAVE_ARG(FUNCNAME, 9); \
6015 SAVE_ARG(FUNCNAME, 10); \
6016 SAVE_ARG(FUNCNAME, 11); \
6017 SAVE_ARG(FUNCNAME, 12); \
6018 SAVE_ARG(FUNCNAME, 13); \
6019 SAVE_ARG(FUNCNAME, 14); \
6020 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
6021 SAVE_ARG_HISTORY(FUNCNAME, 0); \
6022 SAVE_ARG_HISTORY(FUNCNAME, 1); \
6023 SAVE_ARG_HISTORY(FUNCNAME, 2); \
6024 SAVE_ARG_HISTORY(FUNCNAME, 3); \
6025 SAVE_ARG_HISTORY(FUNCNAME, 4); \
6026 SAVE_ARG_HISTORY(FUNCNAME, 5); \
6027 SAVE_ARG_HISTORY(FUNCNAME, 6); \
6028 SAVE_ARG_HISTORY(FUNCNAME, 7); \
6029 SAVE_ARG_HISTORY(FUNCNAME, 8); \
6030 SAVE_ARG_HISTORY(FUNCNAME, 9); \
6031 SAVE_ARG_HISTORY(FUNCNAME, 10); \
6032 SAVE_ARG_HISTORY(FUNCNAME, 11); \
6033 SAVE_ARG_HISTORY(FUNCNAME, 12); \
6034 SAVE_ARG_HISTORY(FUNCNAME, 13); \
6035 SAVE_ARG_HISTORY(FUNCNAME, 14); \
6036 } \
6037 else{ \
6038 HISTORY_DROPPED(FUNCNAME); \
6039 } \
6040 INCREMENT_CALL_COUNT(FUNCNAME); \
6041 REGISTER_CALL(FUNCNAME); \
6042 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
6043 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
6044 va_list ap; \
6045 va_start(ap, arg14); \
6046 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
6047 SAVE_RET_HISTORY(FUNCNAME, ret); \
6048 va_end(ap); \
6049 return ret; \
6050 } \
6051 else{ \
6052 va_list ap; \
6053 va_start(ap, arg14); \
6054 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
6055 SAVE_RET_HISTORY(FUNCNAME, ret); \
6056 va_end(ap); \
6057 return ret; \
6058 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
6059 } \
6060 } \
6061 if(FUNCNAME##_fake.custom_fake){ \
6062 RETURN_TYPE ret; \
6063 va_list ap; \
6064 va_start(ap, arg14); \
6065 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
6066 va_end(ap); \
6067 SAVE_RET_HISTORY(FUNCNAME, ret); \
6068 return ret; \
6069 } \
6070 RETURN_FAKE_RESULT(FUNCNAME) \
6071 } \
6072 DEFINE_RESET_FUNCTION(FUNCNAME) \
6073
6074#define FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
6075 DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
6076 DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
6077
6078
6079#define DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
6080 typedef struct FUNCNAME##_Fake { \
6081 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
6082 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
6083 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
6084 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
6085 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
6086 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
6087 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
6088 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
6089 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
6090 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
6091 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
6092 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
6093 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
6094 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
6095 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
6096 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
6097 DECLARE_ALL_FUNC_COMMON \
6098 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
6099 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
6100 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
6101 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
6102 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
6103 } FUNCNAME##_Fake; \
6104 extern FUNCNAME##_Fake FUNCNAME##_fake; \
6105 void FUNCNAME##_reset(void); \
6106 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...); \
6107
6108#define DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
6109 FUNCNAME##_Fake FUNCNAME##_fake; \
6110 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...){ \
6111 SAVE_ARG(FUNCNAME, 0); \
6112 SAVE_ARG(FUNCNAME, 1); \
6113 SAVE_ARG(FUNCNAME, 2); \
6114 SAVE_ARG(FUNCNAME, 3); \
6115 SAVE_ARG(FUNCNAME, 4); \
6116 SAVE_ARG(FUNCNAME, 5); \
6117 SAVE_ARG(FUNCNAME, 6); \
6118 SAVE_ARG(FUNCNAME, 7); \
6119 SAVE_ARG(FUNCNAME, 8); \
6120 SAVE_ARG(FUNCNAME, 9); \
6121 SAVE_ARG(FUNCNAME, 10); \
6122 SAVE_ARG(FUNCNAME, 11); \
6123 SAVE_ARG(FUNCNAME, 12); \
6124 SAVE_ARG(FUNCNAME, 13); \
6125 SAVE_ARG(FUNCNAME, 14); \
6126 SAVE_ARG(FUNCNAME, 15); \
6127 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
6128 SAVE_ARG_HISTORY(FUNCNAME, 0); \
6129 SAVE_ARG_HISTORY(FUNCNAME, 1); \
6130 SAVE_ARG_HISTORY(FUNCNAME, 2); \
6131 SAVE_ARG_HISTORY(FUNCNAME, 3); \
6132 SAVE_ARG_HISTORY(FUNCNAME, 4); \
6133 SAVE_ARG_HISTORY(FUNCNAME, 5); \
6134 SAVE_ARG_HISTORY(FUNCNAME, 6); \
6135 SAVE_ARG_HISTORY(FUNCNAME, 7); \
6136 SAVE_ARG_HISTORY(FUNCNAME, 8); \
6137 SAVE_ARG_HISTORY(FUNCNAME, 9); \
6138 SAVE_ARG_HISTORY(FUNCNAME, 10); \
6139 SAVE_ARG_HISTORY(FUNCNAME, 11); \
6140 SAVE_ARG_HISTORY(FUNCNAME, 12); \
6141 SAVE_ARG_HISTORY(FUNCNAME, 13); \
6142 SAVE_ARG_HISTORY(FUNCNAME, 14); \
6143 SAVE_ARG_HISTORY(FUNCNAME, 15); \
6144 } \
6145 else{ \
6146 HISTORY_DROPPED(FUNCNAME); \
6147 } \
6148 INCREMENT_CALL_COUNT(FUNCNAME); \
6149 REGISTER_CALL(FUNCNAME); \
6150 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
6151 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
6152 va_list ap; \
6153 va_start(ap, arg15); \
6154 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
6155 SAVE_RET_HISTORY(FUNCNAME, ret); \
6156 va_end(ap); \
6157 return ret; \
6158 } \
6159 else{ \
6160 va_list ap; \
6161 va_start(ap, arg15); \
6162 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
6163 SAVE_RET_HISTORY(FUNCNAME, ret); \
6164 va_end(ap); \
6165 return ret; \
6166 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
6167 } \
6168 } \
6169 if(FUNCNAME##_fake.custom_fake){ \
6170 RETURN_TYPE ret; \
6171 va_list ap; \
6172 va_start(ap, arg15); \
6173 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
6174 va_end(ap); \
6175 SAVE_RET_HISTORY(FUNCNAME, ret); \
6176 return ret; \
6177 } \
6178 RETURN_FAKE_RESULT(FUNCNAME) \
6179 } \
6180 DEFINE_RESET_FUNCTION(FUNCNAME) \
6181
6182#define FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
6183 DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
6184 DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
6185
6186
6187#define DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
6188 typedef struct FUNCNAME##_Fake { \
6189 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
6190 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
6191 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
6192 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
6193 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
6194 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
6195 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
6196 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
6197 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
6198 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
6199 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
6200 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
6201 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
6202 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
6203 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
6204 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
6205 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
6206 DECLARE_ALL_FUNC_COMMON \
6207 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
6208 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
6209 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
6210 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
6211 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
6212 } FUNCNAME##_Fake; \
6213 extern FUNCNAME##_Fake FUNCNAME##_fake; \
6214 void FUNCNAME##_reset(void); \
6215 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...); \
6216
6217#define DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
6218 FUNCNAME##_Fake FUNCNAME##_fake; \
6219 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...){ \
6220 SAVE_ARG(FUNCNAME, 0); \
6221 SAVE_ARG(FUNCNAME, 1); \
6222 SAVE_ARG(FUNCNAME, 2); \
6223 SAVE_ARG(FUNCNAME, 3); \
6224 SAVE_ARG(FUNCNAME, 4); \
6225 SAVE_ARG(FUNCNAME, 5); \
6226 SAVE_ARG(FUNCNAME, 6); \
6227 SAVE_ARG(FUNCNAME, 7); \
6228 SAVE_ARG(FUNCNAME, 8); \
6229 SAVE_ARG(FUNCNAME, 9); \
6230 SAVE_ARG(FUNCNAME, 10); \
6231 SAVE_ARG(FUNCNAME, 11); \
6232 SAVE_ARG(FUNCNAME, 12); \
6233 SAVE_ARG(FUNCNAME, 13); \
6234 SAVE_ARG(FUNCNAME, 14); \
6235 SAVE_ARG(FUNCNAME, 15); \
6236 SAVE_ARG(FUNCNAME, 16); \
6237 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
6238 SAVE_ARG_HISTORY(FUNCNAME, 0); \
6239 SAVE_ARG_HISTORY(FUNCNAME, 1); \
6240 SAVE_ARG_HISTORY(FUNCNAME, 2); \
6241 SAVE_ARG_HISTORY(FUNCNAME, 3); \
6242 SAVE_ARG_HISTORY(FUNCNAME, 4); \
6243 SAVE_ARG_HISTORY(FUNCNAME, 5); \
6244 SAVE_ARG_HISTORY(FUNCNAME, 6); \
6245 SAVE_ARG_HISTORY(FUNCNAME, 7); \
6246 SAVE_ARG_HISTORY(FUNCNAME, 8); \
6247 SAVE_ARG_HISTORY(FUNCNAME, 9); \
6248 SAVE_ARG_HISTORY(FUNCNAME, 10); \
6249 SAVE_ARG_HISTORY(FUNCNAME, 11); \
6250 SAVE_ARG_HISTORY(FUNCNAME, 12); \
6251 SAVE_ARG_HISTORY(FUNCNAME, 13); \
6252 SAVE_ARG_HISTORY(FUNCNAME, 14); \
6253 SAVE_ARG_HISTORY(FUNCNAME, 15); \
6254 SAVE_ARG_HISTORY(FUNCNAME, 16); \
6255 } \
6256 else{ \
6257 HISTORY_DROPPED(FUNCNAME); \
6258 } \
6259 INCREMENT_CALL_COUNT(FUNCNAME); \
6260 REGISTER_CALL(FUNCNAME); \
6261 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
6262 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
6263 va_list ap; \
6264 va_start(ap, arg16); \
6265 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
6266 SAVE_RET_HISTORY(FUNCNAME, ret); \
6267 va_end(ap); \
6268 return ret; \
6269 } \
6270 else{ \
6271 va_list ap; \
6272 va_start(ap, arg16); \
6273 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
6274 SAVE_RET_HISTORY(FUNCNAME, ret); \
6275 va_end(ap); \
6276 return ret; \
6277 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
6278 } \
6279 } \
6280 if(FUNCNAME##_fake.custom_fake){ \
6281 RETURN_TYPE ret; \
6282 va_list ap; \
6283 va_start(ap, arg16); \
6284 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
6285 va_end(ap); \
6286 SAVE_RET_HISTORY(FUNCNAME, ret); \
6287 return ret; \
6288 } \
6289 RETURN_FAKE_RESULT(FUNCNAME) \
6290 } \
6291 DEFINE_RESET_FUNCTION(FUNCNAME) \
6292
6293#define FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
6294 DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
6295 DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
6296
6297
6298#define DECLARE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
6299 typedef struct FUNCNAME##_Fake { \
6300 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
6301 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
6302 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
6303 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
6304 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
6305 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
6306 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
6307 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
6308 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
6309 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
6310 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
6311 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
6312 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
6313 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
6314 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
6315 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
6316 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
6317 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
6318 DECLARE_ALL_FUNC_COMMON \
6319 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
6320 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
6321 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
6322 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
6323 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
6324 } FUNCNAME##_Fake; \
6325 extern FUNCNAME##_Fake FUNCNAME##_fake; \
6326 void FUNCNAME##_reset(void); \
6327 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...); \
6328
6329#define DEFINE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
6330 FUNCNAME##_Fake FUNCNAME##_fake; \
6331 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...){ \
6332 SAVE_ARG(FUNCNAME, 0); \
6333 SAVE_ARG(FUNCNAME, 1); \
6334 SAVE_ARG(FUNCNAME, 2); \
6335 SAVE_ARG(FUNCNAME, 3); \
6336 SAVE_ARG(FUNCNAME, 4); \
6337 SAVE_ARG(FUNCNAME, 5); \
6338 SAVE_ARG(FUNCNAME, 6); \
6339 SAVE_ARG(FUNCNAME, 7); \
6340 SAVE_ARG(FUNCNAME, 8); \
6341 SAVE_ARG(FUNCNAME, 9); \
6342 SAVE_ARG(FUNCNAME, 10); \
6343 SAVE_ARG(FUNCNAME, 11); \
6344 SAVE_ARG(FUNCNAME, 12); \
6345 SAVE_ARG(FUNCNAME, 13); \
6346 SAVE_ARG(FUNCNAME, 14); \
6347 SAVE_ARG(FUNCNAME, 15); \
6348 SAVE_ARG(FUNCNAME, 16); \
6349 SAVE_ARG(FUNCNAME, 17); \
6350 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
6351 SAVE_ARG_HISTORY(FUNCNAME, 0); \
6352 SAVE_ARG_HISTORY(FUNCNAME, 1); \
6353 SAVE_ARG_HISTORY(FUNCNAME, 2); \
6354 SAVE_ARG_HISTORY(FUNCNAME, 3); \
6355 SAVE_ARG_HISTORY(FUNCNAME, 4); \
6356 SAVE_ARG_HISTORY(FUNCNAME, 5); \
6357 SAVE_ARG_HISTORY(FUNCNAME, 6); \
6358 SAVE_ARG_HISTORY(FUNCNAME, 7); \
6359 SAVE_ARG_HISTORY(FUNCNAME, 8); \
6360 SAVE_ARG_HISTORY(FUNCNAME, 9); \
6361 SAVE_ARG_HISTORY(FUNCNAME, 10); \
6362 SAVE_ARG_HISTORY(FUNCNAME, 11); \
6363 SAVE_ARG_HISTORY(FUNCNAME, 12); \
6364 SAVE_ARG_HISTORY(FUNCNAME, 13); \
6365 SAVE_ARG_HISTORY(FUNCNAME, 14); \
6366 SAVE_ARG_HISTORY(FUNCNAME, 15); \
6367 SAVE_ARG_HISTORY(FUNCNAME, 16); \
6368 SAVE_ARG_HISTORY(FUNCNAME, 17); \
6369 } \
6370 else{ \
6371 HISTORY_DROPPED(FUNCNAME); \
6372 } \
6373 INCREMENT_CALL_COUNT(FUNCNAME); \
6374 REGISTER_CALL(FUNCNAME); \
6375 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
6376 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
6377 va_list ap; \
6378 va_start(ap, arg17); \
6379 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
6380 SAVE_RET_HISTORY(FUNCNAME, ret); \
6381 va_end(ap); \
6382 return ret; \
6383 } \
6384 else{ \
6385 va_list ap; \
6386 va_start(ap, arg17); \
6387 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
6388 SAVE_RET_HISTORY(FUNCNAME, ret); \
6389 va_end(ap); \
6390 return ret; \
6391 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
6392 } \
6393 } \
6394 if(FUNCNAME##_fake.custom_fake){ \
6395 RETURN_TYPE ret; \
6396 va_list ap; \
6397 va_start(ap, arg17); \
6398 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
6399 va_end(ap); \
6400 SAVE_RET_HISTORY(FUNCNAME, ret); \
6401 return ret; \
6402 } \
6403 RETURN_FAKE_RESULT(FUNCNAME) \
6404 } \
6405 DEFINE_RESET_FUNCTION(FUNCNAME) \
6406
6407#define FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
6408 DECLARE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
6409 DEFINE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
6410
6411
6412#define DECLARE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
6413 typedef struct FUNCNAME##_Fake { \
6414 DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
6415 DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
6416 DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
6417 DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
6418 DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
6419 DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
6420 DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
6421 DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
6422 DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
6423 DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
6424 DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
6425 DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
6426 DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
6427 DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
6428 DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
6429 DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
6430 DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
6431 DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
6432 DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
6433 DECLARE_ALL_FUNC_COMMON \
6434 DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
6435 DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
6436 DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
6437 RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
6438 RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
6439 } FUNCNAME##_Fake; \
6440 extern FUNCNAME##_Fake FUNCNAME##_fake; \
6441 void FUNCNAME##_reset(void); \
6442 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...); \
6443
6444#define DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
6445 FUNCNAME##_Fake FUNCNAME##_fake; \
6446 RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...){ \
6447 SAVE_ARG(FUNCNAME, 0); \
6448 SAVE_ARG(FUNCNAME, 1); \
6449 SAVE_ARG(FUNCNAME, 2); \
6450 SAVE_ARG(FUNCNAME, 3); \
6451 SAVE_ARG(FUNCNAME, 4); \
6452 SAVE_ARG(FUNCNAME, 5); \
6453 SAVE_ARG(FUNCNAME, 6); \
6454 SAVE_ARG(FUNCNAME, 7); \
6455 SAVE_ARG(FUNCNAME, 8); \
6456 SAVE_ARG(FUNCNAME, 9); \
6457 SAVE_ARG(FUNCNAME, 10); \
6458 SAVE_ARG(FUNCNAME, 11); \
6459 SAVE_ARG(FUNCNAME, 12); \
6460 SAVE_ARG(FUNCNAME, 13); \
6461 SAVE_ARG(FUNCNAME, 14); \
6462 SAVE_ARG(FUNCNAME, 15); \
6463 SAVE_ARG(FUNCNAME, 16); \
6464 SAVE_ARG(FUNCNAME, 17); \
6465 SAVE_ARG(FUNCNAME, 18); \
6466 if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
6467 SAVE_ARG_HISTORY(FUNCNAME, 0); \
6468 SAVE_ARG_HISTORY(FUNCNAME, 1); \
6469 SAVE_ARG_HISTORY(FUNCNAME, 2); \
6470 SAVE_ARG_HISTORY(FUNCNAME, 3); \
6471 SAVE_ARG_HISTORY(FUNCNAME, 4); \
6472 SAVE_ARG_HISTORY(FUNCNAME, 5); \
6473 SAVE_ARG_HISTORY(FUNCNAME, 6); \
6474 SAVE_ARG_HISTORY(FUNCNAME, 7); \
6475 SAVE_ARG_HISTORY(FUNCNAME, 8); \
6476 SAVE_ARG_HISTORY(FUNCNAME, 9); \
6477 SAVE_ARG_HISTORY(FUNCNAME, 10); \
6478 SAVE_ARG_HISTORY(FUNCNAME, 11); \
6479 SAVE_ARG_HISTORY(FUNCNAME, 12); \
6480 SAVE_ARG_HISTORY(FUNCNAME, 13); \
6481 SAVE_ARG_HISTORY(FUNCNAME, 14); \
6482 SAVE_ARG_HISTORY(FUNCNAME, 15); \
6483 SAVE_ARG_HISTORY(FUNCNAME, 16); \
6484 SAVE_ARG_HISTORY(FUNCNAME, 17); \
6485 SAVE_ARG_HISTORY(FUNCNAME, 18); \
6486 } \
6487 else{ \
6488 HISTORY_DROPPED(FUNCNAME); \
6489 } \
6490 INCREMENT_CALL_COUNT(FUNCNAME); \
6491 REGISTER_CALL(FUNCNAME); \
6492 if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
6493 if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
6494 va_list ap; \
6495 va_start(ap, arg18); \
6496 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
6497 SAVE_RET_HISTORY(FUNCNAME, ret); \
6498 va_end(ap); \
6499 return ret; \
6500 } \
6501 else{ \
6502 va_list ap; \
6503 va_start(ap, arg18); \
6504 RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
6505 SAVE_RET_HISTORY(FUNCNAME, ret); \
6506 va_end(ap); \
6507 return ret; \
6508 return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
6509 } \
6510 } \
6511 if(FUNCNAME##_fake.custom_fake){ \
6512 RETURN_TYPE ret; \
6513 va_list ap; \
6514 va_start(ap, arg18); \
6515 ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
6516 va_end(ap); \
6517 SAVE_RET_HISTORY(FUNCNAME, ret); \
6518 return ret; \
6519 } \
6520 RETURN_FAKE_RESULT(FUNCNAME) \
6521 } \
6522 DEFINE_RESET_FUNCTION(FUNCNAME) \
6523
6524#define FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
6525 DECLARE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
6526 DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
6527
6528/* MSVC expand macro fix */
6529#define EXPAND(x) x
6530
6531#define PP_NARG_MINUS2(...) EXPAND(PP_NARG_MINUS2_(__VA_ARGS__, PP_RSEQ_N_MINUS2()))
6532
6533#define PP_NARG_MINUS2_(...) EXPAND(PP_ARG_MINUS2_N(__VA_ARGS__))
6534
6535#define PP_ARG_MINUS2_N(returnVal, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N
6536
6537#define PP_RSEQ_N_MINUS2() 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
6538
6539#define PP_NARG_MINUS1(...) EXPAND(PP_NARG_MINUS1_(__VA_ARGS__, PP_RSEQ_N_MINUS1()))
6540
6541#define PP_NARG_MINUS1_(...) EXPAND(PP_ARG_MINUS1_N(__VA_ARGS__))
6542
6543#define PP_ARG_MINUS1_N( _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N
6544
6545#define PP_RSEQ_N_MINUS1() 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
6546
6547
6548
6549/* DECLARE AND DEFINE FAKE FUNCTIONS - PLACE IN TEST FILES */
6550
6551#define FAKE_VALUE_FUNC(...) EXPAND(FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
6552
6553#define FUNC_VALUE_(N,...) EXPAND(FUNC_VALUE_N(N,__VA_ARGS__))
6554
6555#define FUNC_VALUE_N(N,...) EXPAND(FAKE_VALUE_FUNC ## N(__VA_ARGS__))
6556
6557
6558#define FAKE_VOID_FUNC(...) EXPAND(FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
6559
6560#define FUNC_VOID_(N,...) EXPAND(FUNC_VOID_N(N,__VA_ARGS__))
6561
6562#define FUNC_VOID_N(N,...) EXPAND(FAKE_VOID_FUNC ## N(__VA_ARGS__))
6563
6564
6565#define FAKE_VALUE_FUNC_VARARG(...) EXPAND(FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
6566
6567#define FUNC_VALUE_VARARG_(N,...) EXPAND(FUNC_VALUE_VARARG_N(N,__VA_ARGS__))
6568
6569#define FUNC_VALUE_VARARG_N(N,...) EXPAND(FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__))
6570
6571
6572#define FAKE_VOID_FUNC_VARARG(...) EXPAND(FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
6573
6574#define FUNC_VOID_VARARG_(N,...) EXPAND(FUNC_VOID_VARARG_N(N,__VA_ARGS__))
6575
6576#define FUNC_VOID_VARARG_N(N,...) EXPAND(FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__))
6577
6578
6579
6580/* DECLARE FAKE FUNCTIONS - PLACE IN HEADER FILES */
6581
6582#define DECLARE_FAKE_VALUE_FUNC(...) EXPAND(DECLARE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
6583
6584#define DECLARE_FUNC_VALUE_(N,...) EXPAND(DECLARE_FUNC_VALUE_N(N,__VA_ARGS__))
6585
6586#define DECLARE_FUNC_VALUE_N(N,...) EXPAND(DECLARE_FAKE_VALUE_FUNC ## N(__VA_ARGS__))
6587
6588
6589#define DECLARE_FAKE_VOID_FUNC(...) EXPAND(DECLARE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
6590
6591#define DECLARE_FUNC_VOID_(N,...) EXPAND(DECLARE_FUNC_VOID_N(N,__VA_ARGS__))
6592
6593#define DECLARE_FUNC_VOID_N(N,...) EXPAND(DECLARE_FAKE_VOID_FUNC ## N(__VA_ARGS__))
6594
6595
6596#define DECLARE_FAKE_VALUE_FUNC_VARARG(...) EXPAND(DECLARE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
6597
6598#define DECLARE_FUNC_VALUE_VARARG_(N,...) EXPAND(DECLARE_FUNC_VALUE_VARARG_N(N,__VA_ARGS__))
6599
6600#define DECLARE_FUNC_VALUE_VARARG_N(N,...) EXPAND(DECLARE_FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__))
6601
6602
6603#define DECLARE_FAKE_VOID_FUNC_VARARG(...) EXPAND(DECLARE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
6604
6605#define DECLARE_FUNC_VOID_VARARG_(N,...) EXPAND(DECLARE_FUNC_VOID_VARARG_N(N,__VA_ARGS__))
6606
6607#define DECLARE_FUNC_VOID_VARARG_N(N,...) EXPAND(DECLARE_FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__))
6608
6609
6610
6611/* DEFINE FAKE FUNCTIONS - PLACE IN SOURCE FILES */
6612
6613#define DEFINE_FAKE_VALUE_FUNC(...) EXPAND(DEFINE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
6614
6615#define DEFINE_FUNC_VALUE_(N,...) EXPAND(DEFINE_FUNC_VALUE_N(N,__VA_ARGS__))
6616
6617#define DEFINE_FUNC_VALUE_N(N,...) EXPAND(DEFINE_FAKE_VALUE_FUNC ## N(__VA_ARGS__))
6618
6619
6620#define DEFINE_FAKE_VOID_FUNC(...) EXPAND(DEFINE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
6621
6622#define DEFINE_FUNC_VOID_(N,...) EXPAND(DEFINE_FUNC_VOID_N(N,__VA_ARGS__))
6623
6624#define DEFINE_FUNC_VOID_N(N,...) EXPAND(DEFINE_FAKE_VOID_FUNC ## N(__VA_ARGS__))
6625
6626
6627#define DEFINE_FAKE_VALUE_FUNC_VARARG(...) EXPAND(DEFINE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
6628
6629#define DEFINE_FUNC_VALUE_VARARG_(N,...) EXPAND(DEFINE_FUNC_VALUE_VARARG_N(N,__VA_ARGS__))
6630
6631#define DEFINE_FUNC_VALUE_VARARG_N(N,...) EXPAND(DEFINE_FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__))
6632
6633
6634#define DEFINE_FAKE_VOID_FUNC_VARARG(...) EXPAND(DEFINE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
6635
6636#define DEFINE_FUNC_VOID_VARARG_(N,...) EXPAND(DEFINE_FUNC_VOID_VARARG_N(N,__VA_ARGS__))
6637
6638#define DEFINE_FUNC_VOID_VARARG_N(N,...) EXPAND(DEFINE_FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__))
6639
6640
6641
6642
6643#endif /* FAKE_FUNCTIONS */
#define FFF_END_EXTERN_C
Definition: fff.h:111
fff_globals_t fff
Definition: fff.c:61
void(* fff_function_t)(void)
Definition: fff.h:124
#define FFF_CALL_HISTORY_LEN
Definition: fff.h:37
#define FFF_EXTERN_C
Definition: fff.h:110
unsigned int call_history_idx
Definition: fff.h:127