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