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 #ifndef FFF_GCC_FUNCTION_ATTRIBUTES
40 #define FFF_GCC_FUNCTION_ATTRIBUTES
41 #endif
42 #ifndef CUSTOM_FFF_FUNCTION_TEMPLATE
43 #define CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN, FUNCNAME, ...) RETURN (*FUNCNAME)(__VA_ARGS__)
44 #endif /* CUSTOM_FFF_FUNCTION_TEMPLATE */
45 /* -- INTERNAL HELPER MACROS -- */
46 #define SET_RETURN_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN)                                         \
47 	FUNCNAME##_fake.return_val_seq = ARRAY_POINTER;                                            \
48 	FUNCNAME##_fake.return_val_seq_len = ARRAY_LEN;
49 #define SET_CUSTOM_FAKE_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN)                                    \
50 	FUNCNAME##_fake.custom_fake_seq = ARRAY_POINTER;                                           \
51 	FUNCNAME##_fake.custom_fake_seq_len = ARRAY_LEN;
52 
53 /* Defining a function to reset a fake function */
54 #define RESET_FAKE(FUNCNAME)                                                                       \
55 	{                                                                                          \
56 		FUNCNAME##_reset();                                                                \
57 	}
58 
59 #define DECLARE_ARG(type, n, FUNCNAME)                                                             \
60 	type arg##n##_val;                                                                         \
61 	type arg##n##_history[FFF_ARG_HISTORY_LEN];
62 
63 #define DECLARE_ALL_FUNC_COMMON                                                                    \
64 	unsigned int call_count;                                                                   \
65 	unsigned int arg_history_len;                                                              \
66 	unsigned int arg_histories_dropped;
67 
68 #define DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                                  \
69 	RETURN_TYPE return_val_history[FFF_ARG_HISTORY_LEN];
70 
71 #define SAVE_ARG(FUNCNAME, n)                                                                      \
72 	memcpy((void *)&FUNCNAME##_fake.arg##n##_val, (void *)&arg##n, sizeof(arg##n));
73 
74 #define ROOM_FOR_MORE_HISTORY(FUNCNAME) FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN
75 
76 #define SAVE_RET_HISTORY(FUNCNAME, RETVAL)                                                         \
77 	if ((FUNCNAME##_fake.call_count - 1) < FFF_ARG_HISTORY_LEN)                                \
78 		memcpy((void *)&FUNCNAME##_fake                                                    \
79 			       .return_val_history[FUNCNAME##_fake.call_count - 1],                \
80 		       (const void *)&RETVAL, sizeof(RETVAL));
81 
82 #define SAVE_ARG_HISTORY(FUNCNAME, ARGN)                                                           \
83 	memcpy((void *)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count],           \
84 	       (void *)&arg##ARGN, sizeof(arg##ARGN));
85 
86 #define HISTORY_DROPPED(FUNCNAME) FUNCNAME##_fake.arg_histories_dropped++
87 
88 #define DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                              \
89 	RETURN_TYPE return_val;                                                                    \
90 	int return_val_seq_len;                                                                    \
91 	int return_val_seq_idx;                                                                    \
92 	RETURN_TYPE *return_val_seq;
93 
94 #define DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                          \
95 	int custom_fake_seq_len;                                                                   \
96 	int custom_fake_seq_idx;
97 
98 #define INCREMENT_CALL_COUNT(FUNCNAME) FUNCNAME##_fake.call_count++
99 
100 #define RETURN_FAKE_RESULT(FUNCNAME)                                                               \
101 	if (FUNCNAME##_fake.return_val_seq_len) { /* then its a sequence */                        \
102 		if (FUNCNAME##_fake.return_val_seq_idx < FUNCNAME##_fake.return_val_seq_len) {     \
103 			SAVE_RET_HISTORY(                                                          \
104 				FUNCNAME,                                                          \
105 				FUNCNAME##_fake                                                    \
106 					.return_val_seq[FUNCNAME##_fake.return_val_seq_idx])       \
107 			return FUNCNAME##_fake                                                     \
108 				.return_val_seq[FUNCNAME##_fake.return_val_seq_idx++];             \
109 		}                                                                                  \
110 		SAVE_RET_HISTORY(                                                                  \
111 			FUNCNAME,                                                                  \
112 			FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len - 1])    \
113 		return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len -         \
114 						      1]; /* return last element */                \
115 	}                                                                                          \
116 	SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val)                                     \
117 	return FUNCNAME##_fake.return_val;
118 
119 #ifdef __cplusplus
120 #define FFF_EXTERN_C	 extern "C" {
121 #define FFF_END_EXTERN_C }
122 #else /* ansi c */
123 #define FFF_EXTERN_C
124 #define FFF_END_EXTERN_C
125 #endif /* cpp/ansi c */
126 
127 #define DEFINE_RESET_FUNCTION(FUNCNAME)                                                            \
128 	void FUNCNAME##_reset(void)                                                                \
129 	{                                                                                          \
130 		memset((void *)&FUNCNAME##_fake, 0,                                                \
131 		       sizeof(FUNCNAME##_fake) - sizeof(FUNCNAME##_fake.custom_fake) -             \
132 			       sizeof(FUNCNAME##_fake.custom_fake_seq));                           \
133 		FUNCNAME##_fake.custom_fake = NULL;                                                \
134 		FUNCNAME##_fake.custom_fake_seq = NULL;                                            \
135 		FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN;                             \
136 	}
137 /* -- END INTERNAL HELPER MACROS -- */
138 
139 typedef void (*fff_function_t)(void);
140 typedef struct {
141 	fff_function_t call_history[FFF_CALL_HISTORY_LEN];
142 	unsigned int call_history_idx;
143 } fff_globals_t;
144 
145 FFF_EXTERN_C
146 extern fff_globals_t fff;
147 FFF_END_EXTERN_C
148 
149 #define DEFINE_FFF_GLOBALS                                                                         \
150 	FFF_EXTERN_C                                                                               \
151 	fff_globals_t fff;                                                                         \
152 	FFF_END_EXTERN_C
153 
154 #define FFF_RESET_HISTORY()                                                                        \
155 	fff.call_history_idx = 0;                                                                  \
156 	memset(fff.call_history, 0, sizeof(fff.call_history));
157 
158 #define REGISTER_CALL(function)                                                                    \
159 	if (fff.call_history_idx < FFF_CALL_HISTORY_LEN)                                           \
160 		fff.call_history[fff.call_history_idx++] = (fff_function_t)function;
161 
162 #define DECLARE_FAKE_VOID_FUNC0(FUNCNAME)                                                          \
163 	typedef struct FUNCNAME##_Fake {                                                           \
164 		DECLARE_ALL_FUNC_COMMON                                                            \
165 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
166 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, void);                             \
167 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, void);                        \
168 	} FUNCNAME##_Fake;                                                                         \
169 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
170 	void FUNCNAME##_reset(void);                                                               \
171 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void);
172 
173 #define DEFINE_FAKE_VOID_FUNC0(FUNCNAME)                                                           \
174 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
175 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void)                                            \
176 	{                                                                                          \
177 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
178 		} else {                                                                           \
179 			HISTORY_DROPPED(FUNCNAME);                                                 \
180 		}                                                                                  \
181 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
182 		REGISTER_CALL(FUNCNAME);                                                           \
183 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
184 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
185 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
186 				FUNCNAME##_fake                                                    \
187 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](); \
188 			} else {                                                                   \
189 				FUNCNAME##_fake                                                    \
190 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len -     \
191 							 1]();                                     \
192 			}                                                                          \
193 		}                                                                                  \
194 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
195 			FUNCNAME##_fake.custom_fake();                                             \
196 		}                                                                                  \
197 	}                                                                                          \
198 	DEFINE_RESET_FUNCTION(FUNCNAME)
199 
200 #define FAKE_VOID_FUNC0(FUNCNAME)                                                                  \
201 	DECLARE_FAKE_VOID_FUNC0(FUNCNAME)                                                          \
202 	DEFINE_FAKE_VOID_FUNC0(FUNCNAME)
203 
204 #define DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE)                                               \
205 	typedef struct FUNCNAME##_Fake {                                                           \
206 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
207 		DECLARE_ALL_FUNC_COMMON                                                            \
208 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
209 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE);                        \
210 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE);                   \
211 	} FUNCNAME##_Fake;                                                                         \
212 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
213 	void FUNCNAME##_reset(void);                                                               \
214 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0);
215 
216 #define DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE)                                                \
217 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
218 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0)                                  \
219 	{                                                                                          \
220 		SAVE_ARG(FUNCNAME, 0);                                                             \
221 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
222 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
223 		} else {                                                                           \
224 			HISTORY_DROPPED(FUNCNAME);                                                 \
225 		}                                                                                  \
226 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
227 		REGISTER_CALL(FUNCNAME);                                                           \
228 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
229 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
230 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
231 				FUNCNAME##_fake                                                    \
232 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
233 						arg0);                                             \
234 			} else {                                                                   \
235 				FUNCNAME##_fake                                                    \
236 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
237 						arg0);                                             \
238 			}                                                                          \
239 		}                                                                                  \
240 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
241 			FUNCNAME##_fake.custom_fake(arg0);                                         \
242 		}                                                                                  \
243 	}                                                                                          \
244 	DEFINE_RESET_FUNCTION(FUNCNAME)
245 
246 #define FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE)                                                       \
247 	DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE)                                               \
248 	DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE)
249 
250 #define DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE)                                    \
251 	typedef struct FUNCNAME##_Fake {                                                           \
252 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
253 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
254 		DECLARE_ALL_FUNC_COMMON                                                            \
255 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
256 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE);             \
257 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE);        \
258 	} FUNCNAME##_Fake;                                                                         \
259 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
260 	void FUNCNAME##_reset(void);                                                               \
261 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1);
262 
263 #define DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE)                                     \
264 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
265 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1)                  \
266 	{                                                                                          \
267 		SAVE_ARG(FUNCNAME, 0);                                                             \
268 		SAVE_ARG(FUNCNAME, 1);                                                             \
269 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
270 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
271 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
272 		} else {                                                                           \
273 			HISTORY_DROPPED(FUNCNAME);                                                 \
274 		}                                                                                  \
275 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
276 		REGISTER_CALL(FUNCNAME);                                                           \
277 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
278 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
279 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
280 				FUNCNAME##_fake                                                    \
281 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
282 						arg0, arg1);                                       \
283 			} else {                                                                   \
284 				FUNCNAME##_fake                                                    \
285 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
286 						arg0, arg1);                                       \
287 			}                                                                          \
288 		}                                                                                  \
289 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
290 			FUNCNAME##_fake.custom_fake(arg0, arg1);                                   \
291 		}                                                                                  \
292 	}                                                                                          \
293 	DEFINE_RESET_FUNCTION(FUNCNAME)
294 
295 #define FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE)                                            \
296 	DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE)                                    \
297 	DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE)
298 
299 #define DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)                         \
300 	typedef struct FUNCNAME##_Fake {                                                           \
301 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
302 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
303 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
304 		DECLARE_ALL_FUNC_COMMON                                                            \
305 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
306 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE);  \
307 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
308 					     ARG2_TYPE);                                           \
309 	} FUNCNAME##_Fake;                                                                         \
310 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
311 	void FUNCNAME##_reset(void);                                                               \
312 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2);
313 
314 #define DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)                          \
315 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
316 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2)  \
317 	{                                                                                          \
318 		SAVE_ARG(FUNCNAME, 0);                                                             \
319 		SAVE_ARG(FUNCNAME, 1);                                                             \
320 		SAVE_ARG(FUNCNAME, 2);                                                             \
321 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
322 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
323 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
324 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
325 		} else {                                                                           \
326 			HISTORY_DROPPED(FUNCNAME);                                                 \
327 		}                                                                                  \
328 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
329 		REGISTER_CALL(FUNCNAME);                                                           \
330 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
331 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
332 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
333 				FUNCNAME##_fake                                                    \
334 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
335 						arg0, arg1, arg2);                                 \
336 			} else {                                                                   \
337 				FUNCNAME##_fake                                                    \
338 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
339 						arg0, arg1, arg2);                                 \
340 			}                                                                          \
341 		}                                                                                  \
342 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
343 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2);                             \
344 		}                                                                                  \
345 	}                                                                                          \
346 	DEFINE_RESET_FUNCTION(FUNCNAME)
347 
348 #define FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)                                 \
349 	DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)                         \
350 	DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)
351 
352 #define DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE)              \
353 	typedef struct FUNCNAME##_Fake {                                                           \
354 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
355 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
356 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
357 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
358 		DECLARE_ALL_FUNC_COMMON                                                            \
359 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
360 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
361 					     ARG3_TYPE);                                           \
362 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
363 					     ARG2_TYPE, ARG3_TYPE);                                \
364 	} FUNCNAME##_Fake;                                                                         \
365 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
366 	void FUNCNAME##_reset(void);                                                               \
367 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
368 						  ARG3_TYPE arg3);
369 
370 #define DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE)               \
371 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
372 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
373 						  ARG3_TYPE arg3)                                  \
374 	{                                                                                          \
375 		SAVE_ARG(FUNCNAME, 0);                                                             \
376 		SAVE_ARG(FUNCNAME, 1);                                                             \
377 		SAVE_ARG(FUNCNAME, 2);                                                             \
378 		SAVE_ARG(FUNCNAME, 3);                                                             \
379 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
380 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
381 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
382 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
383 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
384 		} else {                                                                           \
385 			HISTORY_DROPPED(FUNCNAME);                                                 \
386 		}                                                                                  \
387 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
388 		REGISTER_CALL(FUNCNAME);                                                           \
389 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
390 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
391 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
392 				FUNCNAME##_fake                                                    \
393 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
394 						arg0, arg1, arg2, arg3);                           \
395 			} else {                                                                   \
396 				FUNCNAME##_fake                                                    \
397 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
398 						arg0, arg1, arg2, arg3);                           \
399 			}                                                                          \
400 		}                                                                                  \
401 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
402 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3);                       \
403 		}                                                                                  \
404 	}                                                                                          \
405 	DEFINE_RESET_FUNCTION(FUNCNAME)
406 
407 #define FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE)                      \
408 	DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE)              \
409 	DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE)
410 
411 #define DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE)   \
412 	typedef struct FUNCNAME##_Fake {                                                           \
413 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
414 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
415 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
416 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
417 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
418 		DECLARE_ALL_FUNC_COMMON                                                            \
419 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
420 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
421 					     ARG3_TYPE, ARG4_TYPE);                                \
422 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
423 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE);                     \
424 	} FUNCNAME##_Fake;                                                                         \
425 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
426 	void FUNCNAME##_reset(void);                                                               \
427 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
428 						  ARG3_TYPE arg3, ARG4_TYPE arg4);
429 
430 #define DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE)    \
431 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
432 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
433 						  ARG3_TYPE arg3, ARG4_TYPE arg4)                  \
434 	{                                                                                          \
435 		SAVE_ARG(FUNCNAME, 0);                                                             \
436 		SAVE_ARG(FUNCNAME, 1);                                                             \
437 		SAVE_ARG(FUNCNAME, 2);                                                             \
438 		SAVE_ARG(FUNCNAME, 3);                                                             \
439 		SAVE_ARG(FUNCNAME, 4);                                                             \
440 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
441 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
442 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
443 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
444 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
445 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
446 		} else {                                                                           \
447 			HISTORY_DROPPED(FUNCNAME);                                                 \
448 		}                                                                                  \
449 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
450 		REGISTER_CALL(FUNCNAME);                                                           \
451 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
452 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
453 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
454 				FUNCNAME##_fake                                                    \
455 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
456 						arg0, arg1, arg2, arg3, arg4);                     \
457 			} else {                                                                   \
458 				FUNCNAME##_fake                                                    \
459 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
460 						arg0, arg1, arg2, arg3, arg4);                     \
461 			}                                                                          \
462 		}                                                                                  \
463 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
464 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4);                 \
465 		}                                                                                  \
466 	}                                                                                          \
467 	DEFINE_RESET_FUNCTION(FUNCNAME)
468 
469 #define FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE)           \
470 	DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE)   \
471 	DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE)
472 
473 #define DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
474 				ARG5_TYPE)                                                         \
475 	typedef struct FUNCNAME##_Fake {                                                           \
476 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
477 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
478 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
479 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
480 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
481 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
482 		DECLARE_ALL_FUNC_COMMON                                                            \
483 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
484 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
485 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE);                     \
486 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
487 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE);          \
488 	} FUNCNAME##_Fake;                                                                         \
489 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
490 	void FUNCNAME##_reset(void);                                                               \
491 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
492 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5);
493 
494 #define DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
495 			       ARG5_TYPE)                                                          \
496 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
497 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
498 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5)  \
499 	{                                                                                          \
500 		SAVE_ARG(FUNCNAME, 0);                                                             \
501 		SAVE_ARG(FUNCNAME, 1);                                                             \
502 		SAVE_ARG(FUNCNAME, 2);                                                             \
503 		SAVE_ARG(FUNCNAME, 3);                                                             \
504 		SAVE_ARG(FUNCNAME, 4);                                                             \
505 		SAVE_ARG(FUNCNAME, 5);                                                             \
506 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
507 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
508 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
509 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
510 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
511 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
512 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
513 		} else {                                                                           \
514 			HISTORY_DROPPED(FUNCNAME);                                                 \
515 		}                                                                                  \
516 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
517 		REGISTER_CALL(FUNCNAME);                                                           \
518 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
519 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
520 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
521 				FUNCNAME##_fake                                                    \
522 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
523 						arg0, arg1, arg2, arg3, arg4, arg5);               \
524 			} else {                                                                   \
525 				FUNCNAME##_fake                                                    \
526 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
527 						arg0, arg1, arg2, arg3, arg4, arg5);               \
528 			}                                                                          \
529 		}                                                                                  \
530 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
531 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5);           \
532 		}                                                                                  \
533 	}                                                                                          \
534 	DEFINE_RESET_FUNCTION(FUNCNAME)
535 
536 #define FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,           \
537 			ARG5_TYPE)                                                                 \
538 	DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
539 				ARG5_TYPE)                                                         \
540 	DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
541 			       ARG5_TYPE)
542 
543 #define DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
544 				ARG5_TYPE, ARG6_TYPE)                                              \
545 	typedef struct FUNCNAME##_Fake {                                                           \
546 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
547 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
548 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
549 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
550 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
551 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
552 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
553 		DECLARE_ALL_FUNC_COMMON                                                            \
554 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
555 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
556 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE);          \
557 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
558 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
559 					     ARG6_TYPE);                                           \
560 	} FUNCNAME##_Fake;                                                                         \
561 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
562 	void FUNCNAME##_reset(void);                                                               \
563 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
564 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
565 						  ARG6_TYPE arg6);
566 
567 #define DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
568 			       ARG5_TYPE, ARG6_TYPE)                                               \
569 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
570 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
571 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
572 						  ARG6_TYPE arg6)                                  \
573 	{                                                                                          \
574 		SAVE_ARG(FUNCNAME, 0);                                                             \
575 		SAVE_ARG(FUNCNAME, 1);                                                             \
576 		SAVE_ARG(FUNCNAME, 2);                                                             \
577 		SAVE_ARG(FUNCNAME, 3);                                                             \
578 		SAVE_ARG(FUNCNAME, 4);                                                             \
579 		SAVE_ARG(FUNCNAME, 5);                                                             \
580 		SAVE_ARG(FUNCNAME, 6);                                                             \
581 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
582 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
583 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
584 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
585 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
586 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
587 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
588 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
589 		} else {                                                                           \
590 			HISTORY_DROPPED(FUNCNAME);                                                 \
591 		}                                                                                  \
592 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
593 		REGISTER_CALL(FUNCNAME);                                                           \
594 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
595 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
596 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
597 				FUNCNAME##_fake                                                    \
598 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
599 						arg0, arg1, arg2, arg3, arg4, arg5, arg6);         \
600 			} else {                                                                   \
601 				FUNCNAME##_fake                                                    \
602 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
603 						arg0, arg1, arg2, arg3, arg4, arg5, arg6);         \
604 			}                                                                          \
605 		}                                                                                  \
606 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
607 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6);     \
608 		}                                                                                  \
609 	}                                                                                          \
610 	DEFINE_RESET_FUNCTION(FUNCNAME)
611 
612 #define FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,           \
613 			ARG5_TYPE, ARG6_TYPE)                                                      \
614 	DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
615 				ARG5_TYPE, ARG6_TYPE)                                              \
616 	DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
617 			       ARG5_TYPE, ARG6_TYPE)
618 
619 #define DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
620 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)                                   \
621 	typedef struct FUNCNAME##_Fake {                                                           \
622 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
623 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
624 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
625 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
626 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
627 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
628 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
629 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
630 		DECLARE_ALL_FUNC_COMMON                                                            \
631 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
632 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
633 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
634 					     ARG7_TYPE);                                           \
635 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
636 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
637 					     ARG6_TYPE, ARG7_TYPE);                                \
638 	} FUNCNAME##_Fake;                                                                         \
639 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
640 	void FUNCNAME##_reset(void);                                                               \
641 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
642 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
643 						  ARG6_TYPE arg6, ARG7_TYPE arg7);
644 
645 #define DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
646 			       ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)                                    \
647 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
648 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
649 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
650 						  ARG6_TYPE arg6, ARG7_TYPE arg7)                  \
651 	{                                                                                          \
652 		SAVE_ARG(FUNCNAME, 0);                                                             \
653 		SAVE_ARG(FUNCNAME, 1);                                                             \
654 		SAVE_ARG(FUNCNAME, 2);                                                             \
655 		SAVE_ARG(FUNCNAME, 3);                                                             \
656 		SAVE_ARG(FUNCNAME, 4);                                                             \
657 		SAVE_ARG(FUNCNAME, 5);                                                             \
658 		SAVE_ARG(FUNCNAME, 6);                                                             \
659 		SAVE_ARG(FUNCNAME, 7);                                                             \
660 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
661 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
662 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
663 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
664 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
665 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
666 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
667 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
668 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
669 		} else {                                                                           \
670 			HISTORY_DROPPED(FUNCNAME);                                                 \
671 		}                                                                                  \
672 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
673 		REGISTER_CALL(FUNCNAME);                                                           \
674 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
675 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
676 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
677 				FUNCNAME##_fake                                                    \
678 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
679 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);   \
680 			} else {                                                                   \
681 				FUNCNAME##_fake                                                    \
682 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
683 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);   \
684 			}                                                                          \
685 		}                                                                                  \
686 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
687 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
688 						    arg7);                                         \
689 		}                                                                                  \
690 	}                                                                                          \
691 	DEFINE_RESET_FUNCTION(FUNCNAME)
692 
693 #define FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,           \
694 			ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)                                           \
695 	DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
696 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)                                   \
697 	DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
698 			       ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)
699 
700 #define DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
701 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)                        \
702 	typedef struct FUNCNAME##_Fake {                                                           \
703 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
704 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
705 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
706 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
707 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
708 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
709 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
710 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
711 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
712 		DECLARE_ALL_FUNC_COMMON                                                            \
713 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
714 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
715 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
716 					     ARG7_TYPE, ARG8_TYPE);                                \
717 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
718 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
719 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE);                     \
720 	} FUNCNAME##_Fake;                                                                         \
721 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
722 	void FUNCNAME##_reset(void);                                                               \
723 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
724 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
725 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8);
726 
727 #define DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
728 			       ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)                         \
729 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
730 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
731 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
732 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8)  \
733 	{                                                                                          \
734 		SAVE_ARG(FUNCNAME, 0);                                                             \
735 		SAVE_ARG(FUNCNAME, 1);                                                             \
736 		SAVE_ARG(FUNCNAME, 2);                                                             \
737 		SAVE_ARG(FUNCNAME, 3);                                                             \
738 		SAVE_ARG(FUNCNAME, 4);                                                             \
739 		SAVE_ARG(FUNCNAME, 5);                                                             \
740 		SAVE_ARG(FUNCNAME, 6);                                                             \
741 		SAVE_ARG(FUNCNAME, 7);                                                             \
742 		SAVE_ARG(FUNCNAME, 8);                                                             \
743 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
744 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
745 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
746 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
747 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
748 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
749 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
750 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
751 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
752 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
753 		} else {                                                                           \
754 			HISTORY_DROPPED(FUNCNAME);                                                 \
755 		}                                                                                  \
756 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
757 		REGISTER_CALL(FUNCNAME);                                                           \
758 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
759 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
760 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
761 				FUNCNAME##_fake                                                    \
762 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
763 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
764 						arg8);                                             \
765 			} else {                                                                   \
766 				FUNCNAME##_fake                                                    \
767 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
768 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
769 						arg8);                                             \
770 			}                                                                          \
771 		}                                                                                  \
772 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
773 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
774 						    arg7, arg8);                                   \
775 		}                                                                                  \
776 	}                                                                                          \
777 	DEFINE_RESET_FUNCTION(FUNCNAME)
778 
779 #define FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,           \
780 			ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)                                \
781 	DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
782 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)                        \
783 	DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
784 			       ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)
785 
786 #define DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
787 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE)            \
788 	typedef struct FUNCNAME##_Fake {                                                           \
789 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
790 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
791 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
792 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
793 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
794 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
795 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
796 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
797 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
798 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
799 		DECLARE_ALL_FUNC_COMMON                                                            \
800 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
801 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
802 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
803 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE);                     \
804 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
805 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
806 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE);          \
807 	} FUNCNAME##_Fake;                                                                         \
808 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
809 	void FUNCNAME##_reset(void);                                                               \
810 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
811 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
812 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9);
813 
814 #define DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
815 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE)             \
816 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
817 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
818 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
819 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9)    \
820 	{                                                                                          \
821 		SAVE_ARG(FUNCNAME, 0);                                                             \
822 		SAVE_ARG(FUNCNAME, 1);                                                             \
823 		SAVE_ARG(FUNCNAME, 2);                                                             \
824 		SAVE_ARG(FUNCNAME, 3);                                                             \
825 		SAVE_ARG(FUNCNAME, 4);                                                             \
826 		SAVE_ARG(FUNCNAME, 5);                                                             \
827 		SAVE_ARG(FUNCNAME, 6);                                                             \
828 		SAVE_ARG(FUNCNAME, 7);                                                             \
829 		SAVE_ARG(FUNCNAME, 8);                                                             \
830 		SAVE_ARG(FUNCNAME, 9);                                                             \
831 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
832 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
833 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
834 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
835 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
836 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
837 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
838 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
839 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
840 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
841 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
842 		} else {                                                                           \
843 			HISTORY_DROPPED(FUNCNAME);                                                 \
844 		}                                                                                  \
845 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
846 		REGISTER_CALL(FUNCNAME);                                                           \
847 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
848 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
849 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
850 				FUNCNAME##_fake                                                    \
851 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
852 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
853 						arg8, arg9);                                       \
854 			} else {                                                                   \
855 				FUNCNAME##_fake                                                    \
856 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
857 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
858 						arg8, arg9);                                       \
859 			}                                                                          \
860 		}                                                                                  \
861 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
862 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
863 						    arg7, arg8, arg9);                             \
864 		}                                                                                  \
865 	}                                                                                          \
866 	DEFINE_RESET_FUNCTION(FUNCNAME)
867 
868 #define FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
869 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE)                    \
870 	DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
871 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE)            \
872 	DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
873 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE)
874 
875 #define DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
876 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
877 				 ARG10_TYPE)                                                       \
878 	typedef struct FUNCNAME##_Fake {                                                           \
879 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
880 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
881 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
882 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
883 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
884 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
885 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
886 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
887 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
888 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
889 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
890 		DECLARE_ALL_FUNC_COMMON                                                            \
891 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
892 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
893 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
894 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE);         \
895 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
896 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
897 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
898 					     ARG10_TYPE);                                          \
899 	} FUNCNAME##_Fake;                                                                         \
900 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
901 	void FUNCNAME##_reset(void);                                                               \
902 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
903 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
904 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8,  \
905 						  ARG9_TYPE arg9, ARG10_TYPE arg10);
906 
907 #define DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
908 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
909 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
910 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
911 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
912 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8,  \
913 						  ARG9_TYPE arg9, ARG10_TYPE arg10)                \
914 	{                                                                                          \
915 		SAVE_ARG(FUNCNAME, 0);                                                             \
916 		SAVE_ARG(FUNCNAME, 1);                                                             \
917 		SAVE_ARG(FUNCNAME, 2);                                                             \
918 		SAVE_ARG(FUNCNAME, 3);                                                             \
919 		SAVE_ARG(FUNCNAME, 4);                                                             \
920 		SAVE_ARG(FUNCNAME, 5);                                                             \
921 		SAVE_ARG(FUNCNAME, 6);                                                             \
922 		SAVE_ARG(FUNCNAME, 7);                                                             \
923 		SAVE_ARG(FUNCNAME, 8);                                                             \
924 		SAVE_ARG(FUNCNAME, 9);                                                             \
925 		SAVE_ARG(FUNCNAME, 10);                                                            \
926 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
927 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
928 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
929 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
930 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
931 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
932 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
933 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
934 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
935 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
936 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
937 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
938 		} else {                                                                           \
939 			HISTORY_DROPPED(FUNCNAME);                                                 \
940 		}                                                                                  \
941 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
942 		REGISTER_CALL(FUNCNAME);                                                           \
943 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
944 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
945 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
946 				FUNCNAME##_fake                                                    \
947 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
948 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
949 						arg8, arg9, arg10);                                \
950 			} else {                                                                   \
951 				FUNCNAME##_fake                                                    \
952 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
953 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
954 						arg8, arg9, arg10);                                \
955 			}                                                                          \
956 		}                                                                                  \
957 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
958 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
959 						    arg7, arg8, arg9, arg10);                      \
960 		}                                                                                  \
961 	}                                                                                          \
962 	DEFINE_RESET_FUNCTION(FUNCNAME)
963 
964 #define FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
965 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE)        \
966 	DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
967 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
968 				 ARG10_TYPE)                                                       \
969 	DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
970 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE)
971 
972 #define DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
973 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
974 				 ARG10_TYPE, ARG11_TYPE)                                           \
975 	typedef struct FUNCNAME##_Fake {                                                           \
976 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
977 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
978 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
979 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
980 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
981 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
982 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
983 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
984 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
985 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
986 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
987 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
988 		DECLARE_ALL_FUNC_COMMON                                                            \
989 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
990 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
991 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
992 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
993 					     ARG11_TYPE);                                          \
994 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
995 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
996 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
997 					     ARG10_TYPE, ARG11_TYPE);                              \
998 	} FUNCNAME##_Fake;                                                                         \
999 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1000 	void FUNCNAME##_reset(void);                                                               \
1001 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1002 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1003 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1004 		ARG10_TYPE arg10, ARG11_TYPE arg11);
1005 
1006 #define DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1007 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1008 				ARG11_TYPE)                                                        \
1009 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1010 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1011 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1012 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1013 		ARG10_TYPE arg10, ARG11_TYPE arg11)                                                \
1014 	{                                                                                          \
1015 		SAVE_ARG(FUNCNAME, 0);                                                             \
1016 		SAVE_ARG(FUNCNAME, 1);                                                             \
1017 		SAVE_ARG(FUNCNAME, 2);                                                             \
1018 		SAVE_ARG(FUNCNAME, 3);                                                             \
1019 		SAVE_ARG(FUNCNAME, 4);                                                             \
1020 		SAVE_ARG(FUNCNAME, 5);                                                             \
1021 		SAVE_ARG(FUNCNAME, 6);                                                             \
1022 		SAVE_ARG(FUNCNAME, 7);                                                             \
1023 		SAVE_ARG(FUNCNAME, 8);                                                             \
1024 		SAVE_ARG(FUNCNAME, 9);                                                             \
1025 		SAVE_ARG(FUNCNAME, 10);                                                            \
1026 		SAVE_ARG(FUNCNAME, 11);                                                            \
1027 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1028 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1029 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1030 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1031 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1032 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1033 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1034 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1035 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1036 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1037 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1038 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1039 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1040 		} else {                                                                           \
1041 			HISTORY_DROPPED(FUNCNAME);                                                 \
1042 		}                                                                                  \
1043 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1044 		REGISTER_CALL(FUNCNAME);                                                           \
1045 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1046 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1047 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1048 				FUNCNAME##_fake                                                    \
1049 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1050 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1051 						arg8, arg9, arg10, arg11);                         \
1052 			} else {                                                                   \
1053 				FUNCNAME##_fake                                                    \
1054 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1055 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1056 						arg8, arg9, arg10, arg11);                         \
1057 			}                                                                          \
1058 		}                                                                                  \
1059 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1060 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1061 						    arg7, arg8, arg9, arg10, arg11);               \
1062 		}                                                                                  \
1063 	}                                                                                          \
1064 	DEFINE_RESET_FUNCTION(FUNCNAME)
1065 
1066 #define FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1067 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1068 			 ARG11_TYPE)                                                               \
1069 	DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1070 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1071 				 ARG10_TYPE, ARG11_TYPE)                                           \
1072 	DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1073 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1074 				ARG11_TYPE)
1075 
1076 #define DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1077 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1078 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE)                               \
1079 	typedef struct FUNCNAME##_Fake {                                                           \
1080 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1081 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1082 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1083 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1084 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1085 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1086 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1087 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1088 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1089 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1090 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1091 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1092 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1093 		DECLARE_ALL_FUNC_COMMON                                                            \
1094 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1095 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1096 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1097 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1098 					     ARG11_TYPE, ARG12_TYPE);                              \
1099 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1100 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1101 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1102 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE);                  \
1103 	} FUNCNAME##_Fake;                                                                         \
1104 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1105 	void FUNCNAME##_reset(void);                                                               \
1106 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1107 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1108 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1109 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12);
1110 
1111 #define DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1112 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1113 				ARG11_TYPE, ARG12_TYPE)                                            \
1114 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1115 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1116 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1117 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1118 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12)                              \
1119 	{                                                                                          \
1120 		SAVE_ARG(FUNCNAME, 0);                                                             \
1121 		SAVE_ARG(FUNCNAME, 1);                                                             \
1122 		SAVE_ARG(FUNCNAME, 2);                                                             \
1123 		SAVE_ARG(FUNCNAME, 3);                                                             \
1124 		SAVE_ARG(FUNCNAME, 4);                                                             \
1125 		SAVE_ARG(FUNCNAME, 5);                                                             \
1126 		SAVE_ARG(FUNCNAME, 6);                                                             \
1127 		SAVE_ARG(FUNCNAME, 7);                                                             \
1128 		SAVE_ARG(FUNCNAME, 8);                                                             \
1129 		SAVE_ARG(FUNCNAME, 9);                                                             \
1130 		SAVE_ARG(FUNCNAME, 10);                                                            \
1131 		SAVE_ARG(FUNCNAME, 11);                                                            \
1132 		SAVE_ARG(FUNCNAME, 12);                                                            \
1133 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1134 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1135 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1136 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1137 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1138 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1139 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1140 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1141 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1142 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1143 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1144 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1145 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1146 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
1147 		} else {                                                                           \
1148 			HISTORY_DROPPED(FUNCNAME);                                                 \
1149 		}                                                                                  \
1150 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1151 		REGISTER_CALL(FUNCNAME);                                                           \
1152 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1153 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1154 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1155 				FUNCNAME##_fake                                                    \
1156 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1157 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1158 						arg8, arg9, arg10, arg11, arg12);                  \
1159 			} else {                                                                   \
1160 				FUNCNAME##_fake                                                    \
1161 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1162 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1163 						arg8, arg9, arg10, arg11, arg12);                  \
1164 			}                                                                          \
1165 		}                                                                                  \
1166 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1167 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1168 						    arg7, arg8, arg9, arg10, arg11, arg12);        \
1169 		}                                                                                  \
1170 	}                                                                                          \
1171 	DEFINE_RESET_FUNCTION(FUNCNAME)
1172 
1173 #define FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1174 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1175 			 ARG11_TYPE, ARG12_TYPE)                                                   \
1176 	DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1177 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1178 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE)                               \
1179 	DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1180 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1181 				ARG11_TYPE, ARG12_TYPE)
1182 
1183 #define DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1184 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1185 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)                   \
1186 	typedef struct FUNCNAME##_Fake {                                                           \
1187 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1188 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1189 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1190 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1191 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1192 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1193 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1194 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1195 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1196 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1197 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1198 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1199 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1200 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
1201 		DECLARE_ALL_FUNC_COMMON                                                            \
1202 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1203 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1204 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1205 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1206 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE);                  \
1207 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1208 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1209 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1210 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE);      \
1211 	} FUNCNAME##_Fake;                                                                         \
1212 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1213 	void FUNCNAME##_reset(void);                                                               \
1214 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1215 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1216 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1217 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13);
1218 
1219 #define DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1220 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1221 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)                                \
1222 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1223 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1224 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1225 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1226 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13)            \
1227 	{                                                                                          \
1228 		SAVE_ARG(FUNCNAME, 0);                                                             \
1229 		SAVE_ARG(FUNCNAME, 1);                                                             \
1230 		SAVE_ARG(FUNCNAME, 2);                                                             \
1231 		SAVE_ARG(FUNCNAME, 3);                                                             \
1232 		SAVE_ARG(FUNCNAME, 4);                                                             \
1233 		SAVE_ARG(FUNCNAME, 5);                                                             \
1234 		SAVE_ARG(FUNCNAME, 6);                                                             \
1235 		SAVE_ARG(FUNCNAME, 7);                                                             \
1236 		SAVE_ARG(FUNCNAME, 8);                                                             \
1237 		SAVE_ARG(FUNCNAME, 9);                                                             \
1238 		SAVE_ARG(FUNCNAME, 10);                                                            \
1239 		SAVE_ARG(FUNCNAME, 11);                                                            \
1240 		SAVE_ARG(FUNCNAME, 12);                                                            \
1241 		SAVE_ARG(FUNCNAME, 13);                                                            \
1242 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1243 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1244 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1245 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1246 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1247 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1248 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1249 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1250 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1251 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1252 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1253 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1254 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1255 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
1256 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
1257 		} else {                                                                           \
1258 			HISTORY_DROPPED(FUNCNAME);                                                 \
1259 		}                                                                                  \
1260 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1261 		REGISTER_CALL(FUNCNAME);                                                           \
1262 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1263 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1264 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1265 				FUNCNAME##_fake                                                    \
1266 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1267 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1268 						arg8, arg9, arg10, arg11, arg12, arg13);           \
1269 			} else {                                                                   \
1270 				FUNCNAME##_fake                                                    \
1271 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1272 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1273 						arg8, arg9, arg10, arg11, arg12, arg13);           \
1274 			}                                                                          \
1275 		}                                                                                  \
1276 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1277 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1278 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
1279 		}                                                                                  \
1280 	}                                                                                          \
1281 	DEFINE_RESET_FUNCTION(FUNCNAME)
1282 
1283 #define FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1284 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1285 			 ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)                                       \
1286 	DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1287 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1288 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)                   \
1289 	DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1290 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1291 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)
1292 
1293 #define DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1294 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1295 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE)       \
1296 	typedef struct FUNCNAME##_Fake {                                                           \
1297 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1298 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1299 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1300 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1301 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1302 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1303 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1304 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1305 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1306 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1307 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1308 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1309 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1310 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
1311 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
1312 		DECLARE_ALL_FUNC_COMMON                                                            \
1313 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1314 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1315 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1316 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1317 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE);      \
1318 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1319 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1320 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1321 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
1322 					     ARG14_TYPE);                                          \
1323 	} FUNCNAME##_Fake;                                                                         \
1324 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1325 	void FUNCNAME##_reset(void);                                                               \
1326 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1327 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1328 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1329 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1330 		ARG14_TYPE arg14);
1331 
1332 #define DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1333 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1334 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE)                    \
1335 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1336 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1337 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1338 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1339 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1340 		ARG14_TYPE arg14)                                                                  \
1341 	{                                                                                          \
1342 		SAVE_ARG(FUNCNAME, 0);                                                             \
1343 		SAVE_ARG(FUNCNAME, 1);                                                             \
1344 		SAVE_ARG(FUNCNAME, 2);                                                             \
1345 		SAVE_ARG(FUNCNAME, 3);                                                             \
1346 		SAVE_ARG(FUNCNAME, 4);                                                             \
1347 		SAVE_ARG(FUNCNAME, 5);                                                             \
1348 		SAVE_ARG(FUNCNAME, 6);                                                             \
1349 		SAVE_ARG(FUNCNAME, 7);                                                             \
1350 		SAVE_ARG(FUNCNAME, 8);                                                             \
1351 		SAVE_ARG(FUNCNAME, 9);                                                             \
1352 		SAVE_ARG(FUNCNAME, 10);                                                            \
1353 		SAVE_ARG(FUNCNAME, 11);                                                            \
1354 		SAVE_ARG(FUNCNAME, 12);                                                            \
1355 		SAVE_ARG(FUNCNAME, 13);                                                            \
1356 		SAVE_ARG(FUNCNAME, 14);                                                            \
1357 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1358 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1359 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1360 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1361 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1362 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1363 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1364 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1365 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1366 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1367 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1368 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1369 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1370 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
1371 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
1372 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
1373 		} else {                                                                           \
1374 			HISTORY_DROPPED(FUNCNAME);                                                 \
1375 		}                                                                                  \
1376 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1377 		REGISTER_CALL(FUNCNAME);                                                           \
1378 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1379 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1380 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1381 				FUNCNAME##_fake                                                    \
1382 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1383 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1384 						arg8, arg9, arg10, arg11, arg12, arg13, arg14);    \
1385 			} else {                                                                   \
1386 				FUNCNAME##_fake                                                    \
1387 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1388 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1389 						arg8, arg9, arg10, arg11, arg12, arg13, arg14);    \
1390 			}                                                                          \
1391 		}                                                                                  \
1392 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1393 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1394 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
1395 						    arg14);                                        \
1396 		}                                                                                  \
1397 	}                                                                                          \
1398 	DEFINE_RESET_FUNCTION(FUNCNAME)
1399 
1400 #define FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1401 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1402 			 ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE)                           \
1403 	DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1404 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1405 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE)       \
1406 	DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1407 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1408 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE)
1409 
1410 #define DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1411 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1412 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1413 				 ARG15_TYPE)                                                       \
1414 	typedef struct FUNCNAME##_Fake {                                                           \
1415 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1416 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1417 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1418 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1419 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1420 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1421 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1422 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1423 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1424 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1425 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1426 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1427 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1428 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
1429 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
1430 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
1431 		DECLARE_ALL_FUNC_COMMON                                                            \
1432 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1433 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1434 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1435 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1436 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1437 					     ARG15_TYPE);                                          \
1438 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1439 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1440 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1441 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
1442 					     ARG14_TYPE, ARG15_TYPE);                              \
1443 	} FUNCNAME##_Fake;                                                                         \
1444 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1445 	void FUNCNAME##_reset(void);                                                               \
1446 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1447 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1448 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1449 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1450 		ARG14_TYPE arg14, ARG15_TYPE arg15);
1451 
1452 #define DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1453 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1454 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE)        \
1455 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1456 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1457 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1458 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1459 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1460 		ARG14_TYPE arg14, ARG15_TYPE arg15)                                                \
1461 	{                                                                                          \
1462 		SAVE_ARG(FUNCNAME, 0);                                                             \
1463 		SAVE_ARG(FUNCNAME, 1);                                                             \
1464 		SAVE_ARG(FUNCNAME, 2);                                                             \
1465 		SAVE_ARG(FUNCNAME, 3);                                                             \
1466 		SAVE_ARG(FUNCNAME, 4);                                                             \
1467 		SAVE_ARG(FUNCNAME, 5);                                                             \
1468 		SAVE_ARG(FUNCNAME, 6);                                                             \
1469 		SAVE_ARG(FUNCNAME, 7);                                                             \
1470 		SAVE_ARG(FUNCNAME, 8);                                                             \
1471 		SAVE_ARG(FUNCNAME, 9);                                                             \
1472 		SAVE_ARG(FUNCNAME, 10);                                                            \
1473 		SAVE_ARG(FUNCNAME, 11);                                                            \
1474 		SAVE_ARG(FUNCNAME, 12);                                                            \
1475 		SAVE_ARG(FUNCNAME, 13);                                                            \
1476 		SAVE_ARG(FUNCNAME, 14);                                                            \
1477 		SAVE_ARG(FUNCNAME, 15);                                                            \
1478 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1479 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1480 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1481 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1482 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1483 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1484 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1485 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1486 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1487 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1488 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1489 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1490 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1491 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
1492 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
1493 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
1494 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
1495 		} else {                                                                           \
1496 			HISTORY_DROPPED(FUNCNAME);                                                 \
1497 		}                                                                                  \
1498 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1499 		REGISTER_CALL(FUNCNAME);                                                           \
1500 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1501 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1502 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1503 				FUNCNAME##_fake                                                    \
1504 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1505 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1506 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1507 						arg15);                                            \
1508 			} else {                                                                   \
1509 				FUNCNAME##_fake                                                    \
1510 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1511 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1512 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1513 						arg15);                                            \
1514 			}                                                                          \
1515 		}                                                                                  \
1516 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1517 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1518 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
1519 						    arg14, arg15);                                 \
1520 		}                                                                                  \
1521 	}                                                                                          \
1522 	DEFINE_RESET_FUNCTION(FUNCNAME)
1523 
1524 #define FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1525 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1526 			 ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE)               \
1527 	DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1528 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1529 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1530 				 ARG15_TYPE)                                                       \
1531 	DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1532 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1533 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE)
1534 
1535 #define DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1536 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1537 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1538 				 ARG15_TYPE, ARG16_TYPE)                                           \
1539 	typedef struct FUNCNAME##_Fake {                                                           \
1540 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1541 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1542 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1543 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1544 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1545 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1546 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1547 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1548 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1549 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1550 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1551 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1552 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1553 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
1554 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
1555 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
1556 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
1557 		DECLARE_ALL_FUNC_COMMON                                                            \
1558 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1559 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1560 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1561 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1562 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1563 					     ARG15_TYPE, ARG16_TYPE);                              \
1564 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1565 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1566 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1567 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
1568 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE);                  \
1569 	} FUNCNAME##_Fake;                                                                         \
1570 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1571 	void FUNCNAME##_reset(void);                                                               \
1572 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1573 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1574 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1575 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1576 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16);
1577 
1578 #define DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1579 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1580 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
1581 				ARG16_TYPE)                                                        \
1582 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1583 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1584 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1585 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1586 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1587 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16)                              \
1588 	{                                                                                          \
1589 		SAVE_ARG(FUNCNAME, 0);                                                             \
1590 		SAVE_ARG(FUNCNAME, 1);                                                             \
1591 		SAVE_ARG(FUNCNAME, 2);                                                             \
1592 		SAVE_ARG(FUNCNAME, 3);                                                             \
1593 		SAVE_ARG(FUNCNAME, 4);                                                             \
1594 		SAVE_ARG(FUNCNAME, 5);                                                             \
1595 		SAVE_ARG(FUNCNAME, 6);                                                             \
1596 		SAVE_ARG(FUNCNAME, 7);                                                             \
1597 		SAVE_ARG(FUNCNAME, 8);                                                             \
1598 		SAVE_ARG(FUNCNAME, 9);                                                             \
1599 		SAVE_ARG(FUNCNAME, 10);                                                            \
1600 		SAVE_ARG(FUNCNAME, 11);                                                            \
1601 		SAVE_ARG(FUNCNAME, 12);                                                            \
1602 		SAVE_ARG(FUNCNAME, 13);                                                            \
1603 		SAVE_ARG(FUNCNAME, 14);                                                            \
1604 		SAVE_ARG(FUNCNAME, 15);                                                            \
1605 		SAVE_ARG(FUNCNAME, 16);                                                            \
1606 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1607 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1608 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1609 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1610 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1611 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1612 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1613 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1614 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1615 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1616 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1617 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1618 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1619 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
1620 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
1621 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
1622 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
1623 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
1624 		} else {                                                                           \
1625 			HISTORY_DROPPED(FUNCNAME);                                                 \
1626 		}                                                                                  \
1627 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1628 		REGISTER_CALL(FUNCNAME);                                                           \
1629 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1630 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1631 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1632 				FUNCNAME##_fake                                                    \
1633 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1634 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1635 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1636 						arg15, arg16);                                     \
1637 			} else {                                                                   \
1638 				FUNCNAME##_fake                                                    \
1639 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1640 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1641 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1642 						arg15, arg16);                                     \
1643 			}                                                                          \
1644 		}                                                                                  \
1645 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1646 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1647 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
1648 						    arg14, arg15, arg16);                          \
1649 		}                                                                                  \
1650 	}                                                                                          \
1651 	DEFINE_RESET_FUNCTION(FUNCNAME)
1652 
1653 #define FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1654 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1655 			 ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE)   \
1656 	DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1657 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1658 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1659 				 ARG15_TYPE, ARG16_TYPE)                                           \
1660 	DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1661 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1662 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
1663 				ARG16_TYPE)
1664 
1665 #define DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1666 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1667 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1668 				 ARG15_TYPE, ARG16_TYPE, ARG17_TYPE)                               \
1669 	typedef struct FUNCNAME##_Fake {                                                           \
1670 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1671 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1672 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1673 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1674 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1675 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1676 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1677 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1678 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1679 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1680 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1681 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1682 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1683 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
1684 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
1685 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
1686 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
1687 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
1688 		DECLARE_ALL_FUNC_COMMON                                                            \
1689 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1690 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1691 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1692 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1693 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1694 					     ARG15_TYPE, ARG16_TYPE, ARG17_TYPE);                  \
1695 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1696 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1697 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1698 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
1699 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE);      \
1700 	} FUNCNAME##_Fake;                                                                         \
1701 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1702 	void FUNCNAME##_reset(void);                                                               \
1703 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1704 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1705 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1706 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1707 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17);
1708 
1709 #define DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1710 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1711 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
1712 				ARG16_TYPE, ARG17_TYPE)                                            \
1713 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1714 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1715 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1716 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1717 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1718 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17)            \
1719 	{                                                                                          \
1720 		SAVE_ARG(FUNCNAME, 0);                                                             \
1721 		SAVE_ARG(FUNCNAME, 1);                                                             \
1722 		SAVE_ARG(FUNCNAME, 2);                                                             \
1723 		SAVE_ARG(FUNCNAME, 3);                                                             \
1724 		SAVE_ARG(FUNCNAME, 4);                                                             \
1725 		SAVE_ARG(FUNCNAME, 5);                                                             \
1726 		SAVE_ARG(FUNCNAME, 6);                                                             \
1727 		SAVE_ARG(FUNCNAME, 7);                                                             \
1728 		SAVE_ARG(FUNCNAME, 8);                                                             \
1729 		SAVE_ARG(FUNCNAME, 9);                                                             \
1730 		SAVE_ARG(FUNCNAME, 10);                                                            \
1731 		SAVE_ARG(FUNCNAME, 11);                                                            \
1732 		SAVE_ARG(FUNCNAME, 12);                                                            \
1733 		SAVE_ARG(FUNCNAME, 13);                                                            \
1734 		SAVE_ARG(FUNCNAME, 14);                                                            \
1735 		SAVE_ARG(FUNCNAME, 15);                                                            \
1736 		SAVE_ARG(FUNCNAME, 16);                                                            \
1737 		SAVE_ARG(FUNCNAME, 17);                                                            \
1738 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1739 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1740 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1741 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1742 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1743 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1744 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1745 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1746 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1747 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1748 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1749 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1750 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1751 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
1752 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
1753 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
1754 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
1755 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
1756 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
1757 		} else {                                                                           \
1758 			HISTORY_DROPPED(FUNCNAME);                                                 \
1759 		}                                                                                  \
1760 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1761 		REGISTER_CALL(FUNCNAME);                                                           \
1762 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1763 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1764 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1765 				FUNCNAME##_fake                                                    \
1766 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1767 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1768 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1769 						arg15, arg16, arg17);                              \
1770 			} else {                                                                   \
1771 				FUNCNAME##_fake                                                    \
1772 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1773 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1774 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1775 						arg15, arg16, arg17);                              \
1776 			}                                                                          \
1777 		}                                                                                  \
1778 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1779 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1780 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
1781 						    arg14, arg15, arg16, arg17);                   \
1782 		}                                                                                  \
1783 	}                                                                                          \
1784 	DEFINE_RESET_FUNCTION(FUNCNAME)
1785 
1786 #define FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1787 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1788 			 ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE,   \
1789 			 ARG17_TYPE)                                                               \
1790 	DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1791 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1792 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1793 				 ARG15_TYPE, ARG16_TYPE, ARG17_TYPE)                               \
1794 	DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1795 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1796 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
1797 				ARG16_TYPE, ARG17_TYPE)
1798 
1799 #define DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1800 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1801 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1802 				 ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)                   \
1803 	typedef struct FUNCNAME##_Fake {                                                           \
1804 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1805 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1806 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1807 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1808 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1809 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1810 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1811 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1812 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1813 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1814 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1815 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1816 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1817 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
1818 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
1819 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
1820 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
1821 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
1822 		DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME)                                              \
1823 		DECLARE_ALL_FUNC_COMMON                                                            \
1824 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1825 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1826 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1827 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1828 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1829 					     ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE);      \
1830 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1831 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1832 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1833 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
1834 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
1835 					     ARG18_TYPE);                                          \
1836 	} FUNCNAME##_Fake;                                                                         \
1837 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1838 	void FUNCNAME##_reset(void);                                                               \
1839 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1840 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1841 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1842 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1843 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
1844 		ARG18_TYPE arg18);
1845 
1846 #define DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1847 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1848 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
1849 				ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)                                \
1850 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1851 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1852 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1853 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1854 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1855 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
1856 		ARG18_TYPE arg18)                                                                  \
1857 	{                                                                                          \
1858 		SAVE_ARG(FUNCNAME, 0);                                                             \
1859 		SAVE_ARG(FUNCNAME, 1);                                                             \
1860 		SAVE_ARG(FUNCNAME, 2);                                                             \
1861 		SAVE_ARG(FUNCNAME, 3);                                                             \
1862 		SAVE_ARG(FUNCNAME, 4);                                                             \
1863 		SAVE_ARG(FUNCNAME, 5);                                                             \
1864 		SAVE_ARG(FUNCNAME, 6);                                                             \
1865 		SAVE_ARG(FUNCNAME, 7);                                                             \
1866 		SAVE_ARG(FUNCNAME, 8);                                                             \
1867 		SAVE_ARG(FUNCNAME, 9);                                                             \
1868 		SAVE_ARG(FUNCNAME, 10);                                                            \
1869 		SAVE_ARG(FUNCNAME, 11);                                                            \
1870 		SAVE_ARG(FUNCNAME, 12);                                                            \
1871 		SAVE_ARG(FUNCNAME, 13);                                                            \
1872 		SAVE_ARG(FUNCNAME, 14);                                                            \
1873 		SAVE_ARG(FUNCNAME, 15);                                                            \
1874 		SAVE_ARG(FUNCNAME, 16);                                                            \
1875 		SAVE_ARG(FUNCNAME, 17);                                                            \
1876 		SAVE_ARG(FUNCNAME, 18);                                                            \
1877 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
1878 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
1879 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
1880 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
1881 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
1882 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
1883 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
1884 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
1885 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
1886 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
1887 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
1888 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
1889 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
1890 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
1891 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
1892 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
1893 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
1894 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
1895 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
1896 			SAVE_ARG_HISTORY(FUNCNAME, 18);                                            \
1897 		} else {                                                                           \
1898 			HISTORY_DROPPED(FUNCNAME);                                                 \
1899 		}                                                                                  \
1900 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
1901 		REGISTER_CALL(FUNCNAME);                                                           \
1902 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
1903 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
1904 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
1905 				FUNCNAME##_fake                                                    \
1906 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
1907 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1908 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1909 						arg15, arg16, arg17, arg18);                       \
1910 			} else {                                                                   \
1911 				FUNCNAME##_fake                                                    \
1912 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
1913 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
1914 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
1915 						arg15, arg16, arg17, arg18);                       \
1916 			}                                                                          \
1917 		}                                                                                  \
1918 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
1919 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
1920 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
1921 						    arg14, arg15, arg16, arg17, arg18);            \
1922 		}                                                                                  \
1923 	}                                                                                          \
1924 	DEFINE_RESET_FUNCTION(FUNCNAME)
1925 
1926 #define FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
1927 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
1928 			 ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE,   \
1929 			 ARG17_TYPE, ARG18_TYPE)                                                   \
1930 	DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1931 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1932 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1933 				 ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)                   \
1934 	DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1935 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1936 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
1937 				ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)
1938 
1939 #define DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
1940 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
1941 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1942 				 ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)       \
1943 	typedef struct FUNCNAME##_Fake {                                                           \
1944 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
1945 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
1946 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
1947 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
1948 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
1949 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
1950 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
1951 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
1952 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
1953 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
1954 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
1955 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
1956 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
1957 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
1958 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
1959 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
1960 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
1961 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
1962 		DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME)                                              \
1963 		DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME)                                              \
1964 		DECLARE_ALL_FUNC_COMMON                                                            \
1965 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
1966 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
1967 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
1968 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
1969 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
1970 					     ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE,       \
1971 					     ARG19_TYPE);                                          \
1972 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
1973 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
1974 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
1975 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
1976 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
1977 					     ARG18_TYPE, ARG19_TYPE);                              \
1978 	} FUNCNAME##_Fake;                                                                         \
1979 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
1980 	void FUNCNAME##_reset(void);                                                               \
1981 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1982 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1983 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1984 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1985 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
1986 		ARG18_TYPE arg18, ARG19_TYPE arg19);
1987 
1988 #define DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
1989 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
1990 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
1991 				ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)                    \
1992 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
1993 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
1994 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
1995 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
1996 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
1997 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
1998 		ARG18_TYPE arg18, ARG19_TYPE arg19)                                                \
1999 	{                                                                                          \
2000 		SAVE_ARG(FUNCNAME, 0);                                                             \
2001 		SAVE_ARG(FUNCNAME, 1);                                                             \
2002 		SAVE_ARG(FUNCNAME, 2);                                                             \
2003 		SAVE_ARG(FUNCNAME, 3);                                                             \
2004 		SAVE_ARG(FUNCNAME, 4);                                                             \
2005 		SAVE_ARG(FUNCNAME, 5);                                                             \
2006 		SAVE_ARG(FUNCNAME, 6);                                                             \
2007 		SAVE_ARG(FUNCNAME, 7);                                                             \
2008 		SAVE_ARG(FUNCNAME, 8);                                                             \
2009 		SAVE_ARG(FUNCNAME, 9);                                                             \
2010 		SAVE_ARG(FUNCNAME, 10);                                                            \
2011 		SAVE_ARG(FUNCNAME, 11);                                                            \
2012 		SAVE_ARG(FUNCNAME, 12);                                                            \
2013 		SAVE_ARG(FUNCNAME, 13);                                                            \
2014 		SAVE_ARG(FUNCNAME, 14);                                                            \
2015 		SAVE_ARG(FUNCNAME, 15);                                                            \
2016 		SAVE_ARG(FUNCNAME, 16);                                                            \
2017 		SAVE_ARG(FUNCNAME, 17);                                                            \
2018 		SAVE_ARG(FUNCNAME, 18);                                                            \
2019 		SAVE_ARG(FUNCNAME, 19);                                                            \
2020 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2021 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2022 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2023 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2024 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2025 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
2026 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
2027 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
2028 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
2029 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
2030 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
2031 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
2032 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
2033 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
2034 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
2035 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
2036 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
2037 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
2038 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
2039 			SAVE_ARG_HISTORY(FUNCNAME, 18);                                            \
2040 			SAVE_ARG_HISTORY(FUNCNAME, 19);                                            \
2041 		} else {                                                                           \
2042 			HISTORY_DROPPED(FUNCNAME);                                                 \
2043 		}                                                                                  \
2044 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2045 		REGISTER_CALL(FUNCNAME);                                                           \
2046 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2047 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2048 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2049 				FUNCNAME##_fake                                                    \
2050 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
2051 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
2052 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
2053 						arg15, arg16, arg17, arg18, arg19);                \
2054 			} else {                                                                   \
2055 				FUNCNAME##_fake                                                    \
2056 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2057 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
2058 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
2059 						arg15, arg16, arg17, arg18, arg19);                \
2060 			}                                                                          \
2061 		}                                                                                  \
2062 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2063 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
2064 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
2065 						    arg14, arg15, arg16, arg17, arg18, arg19);     \
2066 		}                                                                                  \
2067 	}                                                                                          \
2068 	DEFINE_RESET_FUNCTION(FUNCNAME)
2069 
2070 #define FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,          \
2071 			 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,        \
2072 			 ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE,   \
2073 			 ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)                                       \
2074 	DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,  \
2075 				 ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,            \
2076 				 ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
2077 				 ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)       \
2078 	DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
2079 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
2080 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
2081 				ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)
2082 
2083 #define DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME)                                            \
2084 	typedef struct FUNCNAME##_Fake {                                                           \
2085 		DECLARE_ALL_FUNC_COMMON                                                            \
2086 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2087 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2088 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2089 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, void);                      \
2090 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, void);                 \
2091 	} FUNCNAME##_Fake;                                                                         \
2092 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2093 	void FUNCNAME##_reset(void);                                                               \
2094 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void);
2095 
2096 #define DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME)                                             \
2097 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2098 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void)                                     \
2099 	{                                                                                          \
2100 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2101 		} else {                                                                           \
2102 			HISTORY_DROPPED(FUNCNAME);                                                 \
2103 		}                                                                                  \
2104 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2105 		REGISTER_CALL(FUNCNAME);                                                           \
2106 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2107 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2108 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2109 				RETURN_TYPE ret =                                                  \
2110 					FUNCNAME##_fake.custom_fake_seq                            \
2111 						[FUNCNAME##_fake.custom_fake_seq_idx++]();         \
2112 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2113 				return ret;                                                        \
2114 			} else {                                                                   \
2115 				RETURN_TYPE ret =                                                  \
2116 					FUNCNAME##_fake.custom_fake_seq                            \
2117 						[FUNCNAME##_fake.custom_fake_seq_len - 1]();       \
2118 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2119 				return ret;                                                        \
2120 				return FUNCNAME##_fake                                             \
2121 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len -     \
2122 							 1]();                                     \
2123 			}                                                                          \
2124 		}                                                                                  \
2125 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2126 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake();                           \
2127 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2128 			return ret;                                                                \
2129 			return FUNCNAME##_fake.custom_fake();                                      \
2130 		}                                                                                  \
2131 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2132 	}                                                                                          \
2133 	DEFINE_RESET_FUNCTION(FUNCNAME)
2134 
2135 #define FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME)                                                    \
2136 	DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME)                                            \
2137 	DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME)
2138 
2139 #define DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE)                                 \
2140 	typedef struct FUNCNAME##_Fake {                                                           \
2141 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2142 		DECLARE_ALL_FUNC_COMMON                                                            \
2143 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2144 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2145 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2146 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE);                 \
2147 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE);            \
2148 	} FUNCNAME##_Fake;                                                                         \
2149 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2150 	void FUNCNAME##_reset(void);                                                               \
2151 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0);
2152 
2153 #define DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE)                                  \
2154 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2155 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0)                           \
2156 	{                                                                                          \
2157 		SAVE_ARG(FUNCNAME, 0);                                                             \
2158 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2159 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2160 		} else {                                                                           \
2161 			HISTORY_DROPPED(FUNCNAME);                                                 \
2162 		}                                                                                  \
2163 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2164 		REGISTER_CALL(FUNCNAME);                                                           \
2165 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2166 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2167 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2168 				RETURN_TYPE ret =                                                  \
2169 					FUNCNAME##_fake.custom_fake_seq                            \
2170 						[FUNCNAME##_fake.custom_fake_seq_idx++](arg0);     \
2171 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2172 				return ret;                                                        \
2173 			} else {                                                                   \
2174 				RETURN_TYPE ret =                                                  \
2175 					FUNCNAME##_fake.custom_fake_seq                            \
2176 						[FUNCNAME##_fake.custom_fake_seq_len - 1](arg0);   \
2177 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2178 				return ret;                                                        \
2179 				return FUNCNAME##_fake                                             \
2180 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2181 						arg0);                                             \
2182 			}                                                                          \
2183 		}                                                                                  \
2184 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2185 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0);                       \
2186 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2187 			return ret;                                                                \
2188 			return FUNCNAME##_fake.custom_fake(arg0);                                  \
2189 		}                                                                                  \
2190 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2191 	}                                                                                          \
2192 	DEFINE_RESET_FUNCTION(FUNCNAME)
2193 
2194 #define FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE)                                         \
2195 	DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE)                                 \
2196 	DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE)
2197 
2198 #define DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE)                      \
2199 	typedef struct FUNCNAME##_Fake {                                                           \
2200 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2201 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2202 		DECLARE_ALL_FUNC_COMMON                                                            \
2203 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2204 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2205 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2206 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE);      \
2207 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE); \
2208 	} FUNCNAME##_Fake;                                                                         \
2209 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2210 	void FUNCNAME##_reset(void);                                                               \
2211 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1);
2212 
2213 #define DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE)                       \
2214 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2215 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1)           \
2216 	{                                                                                          \
2217 		SAVE_ARG(FUNCNAME, 0);                                                             \
2218 		SAVE_ARG(FUNCNAME, 1);                                                             \
2219 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2220 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2221 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2222 		} else {                                                                           \
2223 			HISTORY_DROPPED(FUNCNAME);                                                 \
2224 		}                                                                                  \
2225 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2226 		REGISTER_CALL(FUNCNAME);                                                           \
2227 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2228 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2229 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2230 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
2231 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
2232 								  arg0, arg1);                     \
2233 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2234 				return ret;                                                        \
2235 			} else {                                                                   \
2236 				RETURN_TYPE ret =                                                  \
2237 					FUNCNAME##_fake.custom_fake_seq                            \
2238 						[FUNCNAME##_fake.custom_fake_seq_len - 1](arg0,    \
2239 											  arg1);   \
2240 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2241 				return ret;                                                        \
2242 				return FUNCNAME##_fake                                             \
2243 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2244 						arg0, arg1);                                       \
2245 			}                                                                          \
2246 		}                                                                                  \
2247 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2248 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1);                 \
2249 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2250 			return ret;                                                                \
2251 			return FUNCNAME##_fake.custom_fake(arg0, arg1);                            \
2252 		}                                                                                  \
2253 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2254 	}                                                                                          \
2255 	DEFINE_RESET_FUNCTION(FUNCNAME)
2256 
2257 #define FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE)                              \
2258 	DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE)                      \
2259 	DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE)
2260 
2261 #define DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)           \
2262 	typedef struct FUNCNAME##_Fake {                                                           \
2263 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2264 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2265 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
2266 		DECLARE_ALL_FUNC_COMMON                                                            \
2267 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2268 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2269 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2270 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2271 					     ARG2_TYPE);                                           \
2272 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2273 					     ARG2_TYPE);                                           \
2274 	} FUNCNAME##_Fake;                                                                         \
2275 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2276 	void FUNCNAME##_reset(void);                                                               \
2277 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
2278 							 ARG2_TYPE arg2);
2279 
2280 #define DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)            \
2281 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2282 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
2283 							 ARG2_TYPE arg2)                           \
2284 	{                                                                                          \
2285 		SAVE_ARG(FUNCNAME, 0);                                                             \
2286 		SAVE_ARG(FUNCNAME, 1);                                                             \
2287 		SAVE_ARG(FUNCNAME, 2);                                                             \
2288 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2289 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2290 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2291 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2292 		} else {                                                                           \
2293 			HISTORY_DROPPED(FUNCNAME);                                                 \
2294 		}                                                                                  \
2295 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2296 		REGISTER_CALL(FUNCNAME);                                                           \
2297 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2298 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2299 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2300 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
2301 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
2302 								  arg0, arg1, arg2);               \
2303 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2304 				return ret;                                                        \
2305 			} else {                                                                   \
2306 				RETURN_TYPE ret =                                                  \
2307 					FUNCNAME##_fake.custom_fake_seq                            \
2308 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2309 							arg0, arg1, arg2);                         \
2310 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2311 				return ret;                                                        \
2312 				return FUNCNAME##_fake                                             \
2313 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2314 						arg0, arg1, arg2);                                 \
2315 			}                                                                          \
2316 		}                                                                                  \
2317 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2318 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2);           \
2319 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2320 			return ret;                                                                \
2321 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2);                      \
2322 		}                                                                                  \
2323 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2324 	}                                                                                          \
2325 	DEFINE_RESET_FUNCTION(FUNCNAME)
2326 
2327 #define FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)                   \
2328 	DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)           \
2329 	DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE)
2330 
2331 #define DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2332 				 ARG3_TYPE)                                                        \
2333 	typedef struct FUNCNAME##_Fake {                                                           \
2334 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2335 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2336 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
2337 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
2338 		DECLARE_ALL_FUNC_COMMON                                                            \
2339 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2340 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2341 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2342 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2343 					     ARG2_TYPE, ARG3_TYPE);                                \
2344 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2345 					     ARG2_TYPE, ARG3_TYPE);                                \
2346 	} FUNCNAME##_Fake;                                                                         \
2347 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2348 	void FUNCNAME##_reset(void);                                                               \
2349 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
2350 							 ARG2_TYPE arg2, ARG3_TYPE arg3);
2351 
2352 #define DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
2353 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2354 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
2355 							 ARG2_TYPE arg2, ARG3_TYPE arg3)           \
2356 	{                                                                                          \
2357 		SAVE_ARG(FUNCNAME, 0);                                                             \
2358 		SAVE_ARG(FUNCNAME, 1);                                                             \
2359 		SAVE_ARG(FUNCNAME, 2);                                                             \
2360 		SAVE_ARG(FUNCNAME, 3);                                                             \
2361 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2362 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2363 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2364 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2365 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2366 		} else {                                                                           \
2367 			HISTORY_DROPPED(FUNCNAME);                                                 \
2368 		}                                                                                  \
2369 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2370 		REGISTER_CALL(FUNCNAME);                                                           \
2371 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2372 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2373 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2374 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
2375 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
2376 								  arg0, arg1, arg2, arg3);         \
2377 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2378 				return ret;                                                        \
2379 			} else {                                                                   \
2380 				RETURN_TYPE ret =                                                  \
2381 					FUNCNAME##_fake.custom_fake_seq                            \
2382 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2383 							arg0, arg1, arg2, arg3);                   \
2384 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2385 				return ret;                                                        \
2386 				return FUNCNAME##_fake                                             \
2387 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2388 						arg0, arg1, arg2, arg3);                           \
2389 			}                                                                          \
2390 		}                                                                                  \
2391 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2392 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3);     \
2393 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2394 			return ret;                                                                \
2395 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3);                \
2396 		}                                                                                  \
2397 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2398 	}                                                                                          \
2399 	DEFINE_RESET_FUNCTION(FUNCNAME)
2400 
2401 #define FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE)        \
2402 	DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2403 				 ARG3_TYPE)                                                        \
2404 	DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE)
2405 
2406 #define DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2407 				 ARG3_TYPE, ARG4_TYPE)                                             \
2408 	typedef struct FUNCNAME##_Fake {                                                           \
2409 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2410 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2411 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
2412 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
2413 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
2414 		DECLARE_ALL_FUNC_COMMON                                                            \
2415 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2416 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2417 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2418 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2419 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE);                     \
2420 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2421 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE);                     \
2422 	} FUNCNAME##_Fake;                                                                         \
2423 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2424 	void FUNCNAME##_reset(void);                                                               \
2425 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2426 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4);
2427 
2428 #define DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2429 				ARG4_TYPE)                                                         \
2430 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2431 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2432 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4)    \
2433 	{                                                                                          \
2434 		SAVE_ARG(FUNCNAME, 0);                                                             \
2435 		SAVE_ARG(FUNCNAME, 1);                                                             \
2436 		SAVE_ARG(FUNCNAME, 2);                                                             \
2437 		SAVE_ARG(FUNCNAME, 3);                                                             \
2438 		SAVE_ARG(FUNCNAME, 4);                                                             \
2439 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2440 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2441 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2442 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2443 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2444 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
2445 		} else {                                                                           \
2446 			HISTORY_DROPPED(FUNCNAME);                                                 \
2447 		}                                                                                  \
2448 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2449 		REGISTER_CALL(FUNCNAME);                                                           \
2450 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2451 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2452 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2453 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
2454 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
2455 								  arg0, arg1, arg2, arg3, arg4);   \
2456 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2457 				return ret;                                                        \
2458 			} else {                                                                   \
2459 				RETURN_TYPE ret =                                                  \
2460 					FUNCNAME##_fake.custom_fake_seq                            \
2461 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2462 							arg0, arg1, arg2, arg3, arg4);             \
2463 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2464 				return ret;                                                        \
2465 				return FUNCNAME##_fake                                             \
2466 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2467 						arg0, arg1, arg2, arg3, arg4);                     \
2468 			}                                                                          \
2469 		}                                                                                  \
2470 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2471 			RETURN_TYPE ret =                                                          \
2472 				FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4);         \
2473 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2474 			return ret;                                                                \
2475 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4);          \
2476 		}                                                                                  \
2477 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2478 	}                                                                                          \
2479 	DEFINE_RESET_FUNCTION(FUNCNAME)
2480 
2481 #define FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
2482 			 ARG4_TYPE)                                                                \
2483 	DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2484 				 ARG3_TYPE, ARG4_TYPE)                                             \
2485 	DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2486 				ARG4_TYPE)
2487 
2488 #define DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2489 				 ARG3_TYPE, ARG4_TYPE, ARG5_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_ALL_FUNC_COMMON                                                            \
2498 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2499 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2500 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2501 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2502 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE);          \
2503 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2504 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE);          \
2505 	} FUNCNAME##_Fake;                                                                         \
2506 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2507 	void FUNCNAME##_reset(void);                                                               \
2508 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
2509 							 ARG2_TYPE arg2, ARG3_TYPE arg3,           \
2510 							 ARG4_TYPE arg4, ARG5_TYPE arg5);
2511 
2512 #define DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2513 				ARG4_TYPE, ARG5_TYPE)                                              \
2514 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2515 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
2516 							 ARG2_TYPE arg2, ARG3_TYPE arg3,           \
2517 							 ARG4_TYPE arg4, ARG5_TYPE arg5)           \
2518 	{                                                                                          \
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 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2526 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2527 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2528 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2529 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2530 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
2531 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
2532 		} else {                                                                           \
2533 			HISTORY_DROPPED(FUNCNAME);                                                 \
2534 		}                                                                                  \
2535 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2536 		REGISTER_CALL(FUNCNAME);                                                           \
2537 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2538 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2539 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2540 				RETURN_TYPE ret =                                                  \
2541 					FUNCNAME##_fake.custom_fake_seq                            \
2542 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
2543 							arg0, arg1, arg2, arg3, arg4, arg5);       \
2544 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2545 				return ret;                                                        \
2546 			} else {                                                                   \
2547 				RETURN_TYPE ret =                                                  \
2548 					FUNCNAME##_fake.custom_fake_seq                            \
2549 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2550 							arg0, arg1, arg2, arg3, arg4, arg5);       \
2551 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2552 				return ret;                                                        \
2553 				return FUNCNAME##_fake                                             \
2554 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2555 						arg0, arg1, arg2, arg3, arg4, arg5);               \
2556 			}                                                                          \
2557 		}                                                                                  \
2558 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2559 			RETURN_TYPE ret =                                                          \
2560 				FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5);   \
2561 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2562 			return ret;                                                                \
2563 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5);    \
2564 		}                                                                                  \
2565 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2566 	}                                                                                          \
2567 	DEFINE_RESET_FUNCTION(FUNCNAME)
2568 
2569 #define FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
2570 			 ARG4_TYPE, ARG5_TYPE)                                                     \
2571 	DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2572 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE)                                  \
2573 	DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2574 				ARG4_TYPE, ARG5_TYPE)
2575 
2576 #define DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2577 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_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_ALL_FUNC_COMMON                                                            \
2587 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2588 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2589 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2590 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2591 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2592 					     ARG6_TYPE);                                           \
2593 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2594 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2595 					     ARG6_TYPE);                                           \
2596 	} FUNCNAME##_Fake;                                                                         \
2597 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2598 	void FUNCNAME##_reset(void);                                                               \
2599 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2600 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2601 		ARG5_TYPE arg5, ARG6_TYPE arg6);
2602 
2603 #define DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2604 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE)                                   \
2605 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2606 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2607 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2608 		ARG5_TYPE arg5, ARG6_TYPE arg6)                                                    \
2609 	{                                                                                          \
2610 		SAVE_ARG(FUNCNAME, 0);                                                             \
2611 		SAVE_ARG(FUNCNAME, 1);                                                             \
2612 		SAVE_ARG(FUNCNAME, 2);                                                             \
2613 		SAVE_ARG(FUNCNAME, 3);                                                             \
2614 		SAVE_ARG(FUNCNAME, 4);                                                             \
2615 		SAVE_ARG(FUNCNAME, 5);                                                             \
2616 		SAVE_ARG(FUNCNAME, 6);                                                             \
2617 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2618 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2619 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2620 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2621 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2622 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
2623 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
2624 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
2625 		} else {                                                                           \
2626 			HISTORY_DROPPED(FUNCNAME);                                                 \
2627 		}                                                                                  \
2628 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2629 		REGISTER_CALL(FUNCNAME);                                                           \
2630 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2631 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2632 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2633 				RETURN_TYPE ret =                                                  \
2634 					FUNCNAME##_fake.custom_fake_seq                            \
2635 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
2636 							arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
2637 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2638 				return ret;                                                        \
2639 			} else {                                                                   \
2640 				RETURN_TYPE ret =                                                  \
2641 					FUNCNAME##_fake.custom_fake_seq                            \
2642 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2643 							arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
2644 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2645 				return ret;                                                        \
2646 				return FUNCNAME##_fake                                             \
2647 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2648 						arg0, arg1, arg2, arg3, arg4, arg5, arg6);         \
2649 			}                                                                          \
2650 		}                                                                                  \
2651 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2652 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3,      \
2653 								      arg4, arg5, arg6);           \
2654 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2655 			return ret;                                                                \
2656 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
2657 							   arg6);                                  \
2658 		}                                                                                  \
2659 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2660 	}                                                                                          \
2661 	DEFINE_RESET_FUNCTION(FUNCNAME)
2662 
2663 #define FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
2664 			 ARG4_TYPE, ARG5_TYPE, ARG6_TYPE)                                          \
2665 	DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2666 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE)                       \
2667 	DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2668 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE)
2669 
2670 #define DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2671 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)            \
2672 	typedef struct FUNCNAME##_Fake {                                                           \
2673 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2674 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2675 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
2676 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
2677 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
2678 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
2679 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
2680 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
2681 		DECLARE_ALL_FUNC_COMMON                                                            \
2682 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2683 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2684 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2685 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2686 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2687 					     ARG6_TYPE, ARG7_TYPE);                                \
2688 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2689 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2690 					     ARG6_TYPE, ARG7_TYPE);                                \
2691 	} FUNCNAME##_Fake;                                                                         \
2692 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2693 	void FUNCNAME##_reset(void);                                                               \
2694 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2695 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2696 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7);
2697 
2698 #define DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2699 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)                        \
2700 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2701 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2702 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2703 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7)                                    \
2704 	{                                                                                          \
2705 		SAVE_ARG(FUNCNAME, 0);                                                             \
2706 		SAVE_ARG(FUNCNAME, 1);                                                             \
2707 		SAVE_ARG(FUNCNAME, 2);                                                             \
2708 		SAVE_ARG(FUNCNAME, 3);                                                             \
2709 		SAVE_ARG(FUNCNAME, 4);                                                             \
2710 		SAVE_ARG(FUNCNAME, 5);                                                             \
2711 		SAVE_ARG(FUNCNAME, 6);                                                             \
2712 		SAVE_ARG(FUNCNAME, 7);                                                             \
2713 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2714 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2715 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2716 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2717 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2718 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
2719 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
2720 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
2721 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
2722 		} else {                                                                           \
2723 			HISTORY_DROPPED(FUNCNAME);                                                 \
2724 		}                                                                                  \
2725 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2726 		REGISTER_CALL(FUNCNAME);                                                           \
2727 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2728 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2729 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2730 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
2731 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
2732 								  arg0, arg1, arg2, arg3, arg4,    \
2733 								  arg5, arg6, arg7);               \
2734 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2735 				return ret;                                                        \
2736 			} else {                                                                   \
2737 				RETURN_TYPE ret =                                                  \
2738 					FUNCNAME##_fake.custom_fake_seq                            \
2739 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2740 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
2741 							arg7);                                     \
2742 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2743 				return ret;                                                        \
2744 				return FUNCNAME##_fake                                             \
2745 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2746 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);   \
2747 			}                                                                          \
2748 		}                                                                                  \
2749 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2750 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3,      \
2751 								      arg4, arg5, arg6, arg7);     \
2752 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2753 			return ret;                                                                \
2754 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
2755 							   arg6, arg7);                            \
2756 		}                                                                                  \
2757 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2758 	}                                                                                          \
2759 	DEFINE_RESET_FUNCTION(FUNCNAME)
2760 
2761 #define FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
2762 			 ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)                               \
2763 	DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2764 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)            \
2765 	DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2766 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE)
2767 
2768 #define DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2769 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
2770 	typedef struct FUNCNAME##_Fake {                                                           \
2771 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2772 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2773 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
2774 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
2775 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
2776 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
2777 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
2778 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
2779 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
2780 		DECLARE_ALL_FUNC_COMMON                                                            \
2781 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2782 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2783 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2784 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2785 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2786 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE);                     \
2787 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2788 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2789 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE);                     \
2790 	} FUNCNAME##_Fake;                                                                         \
2791 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2792 	void FUNCNAME##_reset(void);                                                               \
2793 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2794 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2795 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8);
2796 
2797 #define DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2798 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)             \
2799 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2800 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2801 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2802 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8)                    \
2803 	{                                                                                          \
2804 		SAVE_ARG(FUNCNAME, 0);                                                             \
2805 		SAVE_ARG(FUNCNAME, 1);                                                             \
2806 		SAVE_ARG(FUNCNAME, 2);                                                             \
2807 		SAVE_ARG(FUNCNAME, 3);                                                             \
2808 		SAVE_ARG(FUNCNAME, 4);                                                             \
2809 		SAVE_ARG(FUNCNAME, 5);                                                             \
2810 		SAVE_ARG(FUNCNAME, 6);                                                             \
2811 		SAVE_ARG(FUNCNAME, 7);                                                             \
2812 		SAVE_ARG(FUNCNAME, 8);                                                             \
2813 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2814 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2815 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2816 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2817 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2818 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
2819 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
2820 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
2821 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
2822 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
2823 		} else {                                                                           \
2824 			HISTORY_DROPPED(FUNCNAME);                                                 \
2825 		}                                                                                  \
2826 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2827 		REGISTER_CALL(FUNCNAME);                                                           \
2828 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2829 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2830 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2831 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
2832 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
2833 								  arg0, arg1, arg2, arg3, arg4,    \
2834 								  arg5, arg6, arg7, arg8);         \
2835 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2836 				return ret;                                                        \
2837 			} else {                                                                   \
2838 				RETURN_TYPE ret =                                                  \
2839 					FUNCNAME##_fake.custom_fake_seq                            \
2840 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2841 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
2842 							arg7, arg8);                               \
2843 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2844 				return ret;                                                        \
2845 				return FUNCNAME##_fake                                             \
2846 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2847 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
2848 						arg8);                                             \
2849 			}                                                                          \
2850 		}                                                                                  \
2851 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2852 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
2853 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);             \
2854 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2855 			return ret;                                                                \
2856 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
2857 							   arg6, arg7, arg8);                      \
2858 		}                                                                                  \
2859 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2860 	}                                                                                          \
2861 	DEFINE_RESET_FUNCTION(FUNCNAME)
2862 
2863 #define FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
2864 			 ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)                    \
2865 	DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2866 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
2867 	DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
2868 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE)
2869 
2870 #define DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
2871 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
2872 				  ARG8_TYPE, ARG9_TYPE)                                            \
2873 	typedef struct FUNCNAME##_Fake {                                                           \
2874 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2875 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2876 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
2877 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
2878 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
2879 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
2880 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
2881 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
2882 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
2883 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
2884 		DECLARE_ALL_FUNC_COMMON                                                            \
2885 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2886 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2887 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2888 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2889 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2890 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE);          \
2891 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
2892 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
2893 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE);          \
2894 	} FUNCNAME##_Fake;                                                                         \
2895 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
2896 	void FUNCNAME##_reset(void);                                                               \
2897 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2898 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2899 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9);
2900 
2901 #define DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2902 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
2903 				 ARG9_TYPE)                                                        \
2904 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
2905 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
2906 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
2907 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9)    \
2908 	{                                                                                          \
2909 		SAVE_ARG(FUNCNAME, 0);                                                             \
2910 		SAVE_ARG(FUNCNAME, 1);                                                             \
2911 		SAVE_ARG(FUNCNAME, 2);                                                             \
2912 		SAVE_ARG(FUNCNAME, 3);                                                             \
2913 		SAVE_ARG(FUNCNAME, 4);                                                             \
2914 		SAVE_ARG(FUNCNAME, 5);                                                             \
2915 		SAVE_ARG(FUNCNAME, 6);                                                             \
2916 		SAVE_ARG(FUNCNAME, 7);                                                             \
2917 		SAVE_ARG(FUNCNAME, 8);                                                             \
2918 		SAVE_ARG(FUNCNAME, 9);                                                             \
2919 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
2920 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
2921 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
2922 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
2923 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
2924 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
2925 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
2926 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
2927 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
2928 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
2929 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
2930 		} else {                                                                           \
2931 			HISTORY_DROPPED(FUNCNAME);                                                 \
2932 		}                                                                                  \
2933 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
2934 		REGISTER_CALL(FUNCNAME);                                                           \
2935 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
2936 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
2937 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
2938 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
2939 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
2940 								  arg0, arg1, arg2, arg3, arg4,    \
2941 								  arg5, arg6, arg7, arg8, arg9);   \
2942 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2943 				return ret;                                                        \
2944 			} else {                                                                   \
2945 				RETURN_TYPE ret =                                                  \
2946 					FUNCNAME##_fake.custom_fake_seq                            \
2947 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
2948 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
2949 							arg7, arg8, arg9);                         \
2950 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
2951 				return ret;                                                        \
2952 				return FUNCNAME##_fake                                             \
2953 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
2954 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
2955 						arg8, arg9);                                       \
2956 			}                                                                          \
2957 		}                                                                                  \
2958 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
2959 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
2960 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);       \
2961 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
2962 			return ret;                                                                \
2963 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
2964 							   arg6, arg7, arg8, arg9);                \
2965 		}                                                                                  \
2966 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
2967 	}                                                                                          \
2968 	DEFINE_RESET_FUNCTION(FUNCNAME)
2969 
2970 #define FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
2971 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE)        \
2972 	DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
2973 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
2974 				  ARG8_TYPE, ARG9_TYPE)                                            \
2975 	DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
2976 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
2977 				 ARG9_TYPE)
2978 
2979 #define DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
2980 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
2981 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE)                                \
2982 	typedef struct FUNCNAME##_Fake {                                                           \
2983 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
2984 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
2985 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
2986 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
2987 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
2988 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
2989 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
2990 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
2991 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
2992 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
2993 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
2994 		DECLARE_ALL_FUNC_COMMON                                                            \
2995 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
2996 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
2997 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
2998 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
2999 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3000 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3001 					     ARG10_TYPE);                                          \
3002 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3003 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3004 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3005 					     ARG10_TYPE);                                          \
3006 	} FUNCNAME##_Fake;                                                                         \
3007 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3008 	void FUNCNAME##_reset(void);                                                               \
3009 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3010 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3011 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3012 		ARG10_TYPE arg10);
3013 
3014 #define DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3015 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3016 				 ARG9_TYPE, ARG10_TYPE)                                            \
3017 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3018 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3019 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3020 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3021 		ARG10_TYPE arg10)                                                                  \
3022 	{                                                                                          \
3023 		SAVE_ARG(FUNCNAME, 0);                                                             \
3024 		SAVE_ARG(FUNCNAME, 1);                                                             \
3025 		SAVE_ARG(FUNCNAME, 2);                                                             \
3026 		SAVE_ARG(FUNCNAME, 3);                                                             \
3027 		SAVE_ARG(FUNCNAME, 4);                                                             \
3028 		SAVE_ARG(FUNCNAME, 5);                                                             \
3029 		SAVE_ARG(FUNCNAME, 6);                                                             \
3030 		SAVE_ARG(FUNCNAME, 7);                                                             \
3031 		SAVE_ARG(FUNCNAME, 8);                                                             \
3032 		SAVE_ARG(FUNCNAME, 9);                                                             \
3033 		SAVE_ARG(FUNCNAME, 10);                                                            \
3034 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3035 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3036 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3037 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3038 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3039 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3040 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3041 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3042 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
3043 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
3044 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
3045 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
3046 		} else {                                                                           \
3047 			HISTORY_DROPPED(FUNCNAME);                                                 \
3048 		}                                                                                  \
3049 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
3050 		REGISTER_CALL(FUNCNAME);                                                           \
3051 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
3052 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
3053 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
3054 				RETURN_TYPE ret =                                                  \
3055 					FUNCNAME##_fake.custom_fake_seq                            \
3056 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
3057 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3058 							arg7, arg8, arg9, arg10);                  \
3059 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3060 				return ret;                                                        \
3061 			} else {                                                                   \
3062 				RETURN_TYPE ret =                                                  \
3063 					FUNCNAME##_fake.custom_fake_seq                            \
3064 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
3065 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3066 							arg7, arg8, arg9, arg10);                  \
3067 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3068 				return ret;                                                        \
3069 				return FUNCNAME##_fake                                             \
3070 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
3071 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
3072 						arg8, arg9, arg10);                                \
3073 			}                                                                          \
3074 		}                                                                                  \
3075 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
3076 			RETURN_TYPE ret =                                                          \
3077 				FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,    \
3078 							    arg6, arg7, arg8, arg9, arg10);        \
3079 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
3080 			return ret;                                                                \
3081 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
3082 							   arg6, arg7, arg8, arg9, arg10);         \
3083 		}                                                                                  \
3084 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
3085 	}                                                                                          \
3086 	DEFINE_RESET_FUNCTION(FUNCNAME)
3087 
3088 #define FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
3089 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
3090 			  ARG10_TYPE)                                                              \
3091 	DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3092 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3093 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE)                                \
3094 	DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3095 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3096 				 ARG9_TYPE, ARG10_TYPE)
3097 
3098 #define DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3099 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3100 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE)                    \
3101 	typedef struct FUNCNAME##_Fake {                                                           \
3102 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
3103 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
3104 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
3105 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
3106 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
3107 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
3108 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
3109 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
3110 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
3111 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
3112 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
3113 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
3114 		DECLARE_ALL_FUNC_COMMON                                                            \
3115 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
3116 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
3117 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
3118 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
3119 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3120 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3121 					     ARG10_TYPE, ARG11_TYPE);                              \
3122 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3123 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3124 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3125 					     ARG10_TYPE, ARG11_TYPE);                              \
3126 	} FUNCNAME##_Fake;                                                                         \
3127 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3128 	void FUNCNAME##_reset(void);                                                               \
3129 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3130 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3131 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3132 		ARG10_TYPE arg10, ARG11_TYPE arg11);
3133 
3134 #define DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3135 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3136 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE)                                \
3137 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3138 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3139 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3140 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3141 		ARG10_TYPE arg10, ARG11_TYPE arg11)                                                \
3142 	{                                                                                          \
3143 		SAVE_ARG(FUNCNAME, 0);                                                             \
3144 		SAVE_ARG(FUNCNAME, 1);                                                             \
3145 		SAVE_ARG(FUNCNAME, 2);                                                             \
3146 		SAVE_ARG(FUNCNAME, 3);                                                             \
3147 		SAVE_ARG(FUNCNAME, 4);                                                             \
3148 		SAVE_ARG(FUNCNAME, 5);                                                             \
3149 		SAVE_ARG(FUNCNAME, 6);                                                             \
3150 		SAVE_ARG(FUNCNAME, 7);                                                             \
3151 		SAVE_ARG(FUNCNAME, 8);                                                             \
3152 		SAVE_ARG(FUNCNAME, 9);                                                             \
3153 		SAVE_ARG(FUNCNAME, 10);                                                            \
3154 		SAVE_ARG(FUNCNAME, 11);                                                            \
3155 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3156 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3157 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3158 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3159 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3160 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3161 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3162 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3163 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
3164 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
3165 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
3166 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
3167 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
3168 		} else {                                                                           \
3169 			HISTORY_DROPPED(FUNCNAME);                                                 \
3170 		}                                                                                  \
3171 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
3172 		REGISTER_CALL(FUNCNAME);                                                           \
3173 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
3174 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
3175 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
3176 				RETURN_TYPE ret =                                                  \
3177 					FUNCNAME##_fake.custom_fake_seq                            \
3178 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
3179 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3180 							arg7, arg8, arg9, arg10, arg11);           \
3181 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3182 				return ret;                                                        \
3183 			} else {                                                                   \
3184 				RETURN_TYPE ret =                                                  \
3185 					FUNCNAME##_fake.custom_fake_seq                            \
3186 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
3187 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3188 							arg7, arg8, arg9, arg10, arg11);           \
3189 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3190 				return ret;                                                        \
3191 				return FUNCNAME##_fake                                             \
3192 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
3193 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
3194 						arg8, arg9, arg10, arg11);                         \
3195 			}                                                                          \
3196 		}                                                                                  \
3197 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
3198 			RETURN_TYPE ret =                                                          \
3199 				FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,    \
3200 							    arg6, arg7, arg8, arg9, arg10, arg11); \
3201 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
3202 			return ret;                                                                \
3203 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
3204 							   arg6, arg7, arg8, arg9, arg10, arg11);  \
3205 		}                                                                                  \
3206 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
3207 	}                                                                                          \
3208 	DEFINE_RESET_FUNCTION(FUNCNAME)
3209 
3210 #define FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
3211 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
3212 			  ARG10_TYPE, ARG11_TYPE)                                                  \
3213 	DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3214 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3215 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE)                    \
3216 	DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3217 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3218 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE)
3219 
3220 #define DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3221 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3222 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE)        \
3223 	typedef struct FUNCNAME##_Fake {                                                           \
3224 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
3225 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
3226 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
3227 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
3228 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
3229 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
3230 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
3231 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
3232 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
3233 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
3234 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
3235 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
3236 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
3237 		DECLARE_ALL_FUNC_COMMON                                                            \
3238 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
3239 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
3240 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
3241 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
3242 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3243 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3244 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE);                  \
3245 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3246 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3247 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3248 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE);                  \
3249 	} FUNCNAME##_Fake;                                                                         \
3250 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3251 	void FUNCNAME##_reset(void);                                                               \
3252 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3253 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3254 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3255 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12);
3256 
3257 #define DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3258 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3259 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE)                    \
3260 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3261 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3262 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3263 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3264 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12)                              \
3265 	{                                                                                          \
3266 		SAVE_ARG(FUNCNAME, 0);                                                             \
3267 		SAVE_ARG(FUNCNAME, 1);                                                             \
3268 		SAVE_ARG(FUNCNAME, 2);                                                             \
3269 		SAVE_ARG(FUNCNAME, 3);                                                             \
3270 		SAVE_ARG(FUNCNAME, 4);                                                             \
3271 		SAVE_ARG(FUNCNAME, 5);                                                             \
3272 		SAVE_ARG(FUNCNAME, 6);                                                             \
3273 		SAVE_ARG(FUNCNAME, 7);                                                             \
3274 		SAVE_ARG(FUNCNAME, 8);                                                             \
3275 		SAVE_ARG(FUNCNAME, 9);                                                             \
3276 		SAVE_ARG(FUNCNAME, 10);                                                            \
3277 		SAVE_ARG(FUNCNAME, 11);                                                            \
3278 		SAVE_ARG(FUNCNAME, 12);                                                            \
3279 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3280 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3281 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3282 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3283 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3284 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3285 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3286 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3287 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
3288 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
3289 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
3290 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
3291 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
3292 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
3293 		} else {                                                                           \
3294 			HISTORY_DROPPED(FUNCNAME);                                                 \
3295 		}                                                                                  \
3296 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
3297 		REGISTER_CALL(FUNCNAME);                                                           \
3298 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
3299 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
3300 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
3301 				RETURN_TYPE ret =                                                  \
3302 					FUNCNAME##_fake.custom_fake_seq                            \
3303 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
3304 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3305 							arg7, arg8, arg9, arg10, arg11, arg12);    \
3306 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3307 				return ret;                                                        \
3308 			} else {                                                                   \
3309 				RETURN_TYPE ret =                                                  \
3310 					FUNCNAME##_fake.custom_fake_seq                            \
3311 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
3312 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3313 							arg7, arg8, arg9, arg10, arg11, arg12);    \
3314 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3315 				return ret;                                                        \
3316 				return FUNCNAME##_fake                                             \
3317 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
3318 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
3319 						arg8, arg9, arg10, arg11, arg12);                  \
3320 			}                                                                          \
3321 		}                                                                                  \
3322 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
3323 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
3324 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
3325 				arg11, arg12);                                                     \
3326 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
3327 			return ret;                                                                \
3328 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
3329 							   arg6, arg7, arg8, arg9, arg10, arg11,   \
3330 							   arg12);                                 \
3331 		}                                                                                  \
3332 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
3333 	}                                                                                          \
3334 	DEFINE_RESET_FUNCTION(FUNCNAME)
3335 
3336 #define FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
3337 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
3338 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE)                                      \
3339 	DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3340 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3341 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE)        \
3342 	DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3343 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3344 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE)
3345 
3346 #define DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3347 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3348 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3349 				  ARG13_TYPE)                                                      \
3350 	typedef struct FUNCNAME##_Fake {                                                           \
3351 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
3352 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
3353 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
3354 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
3355 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
3356 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
3357 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
3358 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
3359 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
3360 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
3361 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
3362 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
3363 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
3364 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
3365 		DECLARE_ALL_FUNC_COMMON                                                            \
3366 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
3367 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
3368 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
3369 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
3370 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3371 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3372 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE);      \
3373 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3374 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3375 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3376 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE);      \
3377 	} FUNCNAME##_Fake;                                                                         \
3378 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3379 	void FUNCNAME##_reset(void);                                                               \
3380 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3381 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3382 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3383 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13);
3384 
3385 #define DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3386 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3387 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)        \
3388 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3389 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3390 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3391 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3392 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13)            \
3393 	{                                                                                          \
3394 		SAVE_ARG(FUNCNAME, 0);                                                             \
3395 		SAVE_ARG(FUNCNAME, 1);                                                             \
3396 		SAVE_ARG(FUNCNAME, 2);                                                             \
3397 		SAVE_ARG(FUNCNAME, 3);                                                             \
3398 		SAVE_ARG(FUNCNAME, 4);                                                             \
3399 		SAVE_ARG(FUNCNAME, 5);                                                             \
3400 		SAVE_ARG(FUNCNAME, 6);                                                             \
3401 		SAVE_ARG(FUNCNAME, 7);                                                             \
3402 		SAVE_ARG(FUNCNAME, 8);                                                             \
3403 		SAVE_ARG(FUNCNAME, 9);                                                             \
3404 		SAVE_ARG(FUNCNAME, 10);                                                            \
3405 		SAVE_ARG(FUNCNAME, 11);                                                            \
3406 		SAVE_ARG(FUNCNAME, 12);                                                            \
3407 		SAVE_ARG(FUNCNAME, 13);                                                            \
3408 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3409 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3410 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3411 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3412 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3413 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3414 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3415 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3416 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
3417 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
3418 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
3419 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
3420 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
3421 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
3422 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
3423 		} else {                                                                           \
3424 			HISTORY_DROPPED(FUNCNAME);                                                 \
3425 		}                                                                                  \
3426 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
3427 		REGISTER_CALL(FUNCNAME);                                                           \
3428 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
3429 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
3430 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
3431 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
3432 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
3433 								  arg0, arg1, arg2, arg3, arg4,    \
3434 								  arg5, arg6, arg7, arg8, arg9,    \
3435 								  arg10, arg11, arg12, arg13);     \
3436 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3437 				return ret;                                                        \
3438 			} else {                                                                   \
3439 				RETURN_TYPE ret =                                                  \
3440 					FUNCNAME##_fake.custom_fake_seq                            \
3441 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
3442 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3443 							arg7, arg8, arg9, arg10, arg11, arg12,     \
3444 							arg13);                                    \
3445 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3446 				return ret;                                                        \
3447 				return FUNCNAME##_fake                                             \
3448 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
3449 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
3450 						arg8, arg9, arg10, arg11, arg12, arg13);           \
3451 			}                                                                          \
3452 		}                                                                                  \
3453 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
3454 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
3455 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
3456 				arg11, arg12, arg13);                                              \
3457 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
3458 			return ret;                                                                \
3459 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
3460 							   arg6, arg7, arg8, arg9, arg10, arg11,   \
3461 							   arg12, arg13);                          \
3462 		}                                                                                  \
3463 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
3464 	}                                                                                          \
3465 	DEFINE_RESET_FUNCTION(FUNCNAME)
3466 
3467 #define FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
3468 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
3469 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)                          \
3470 	DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3471 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3472 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3473 				  ARG13_TYPE)                                                      \
3474 	DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3475 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3476 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE)
3477 
3478 #define DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3479 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3480 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3481 				  ARG13_TYPE, ARG14_TYPE)                                          \
3482 	typedef struct FUNCNAME##_Fake {                                                           \
3483 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
3484 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
3485 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
3486 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
3487 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
3488 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
3489 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
3490 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
3491 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
3492 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
3493 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
3494 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
3495 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
3496 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
3497 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
3498 		DECLARE_ALL_FUNC_COMMON                                                            \
3499 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
3500 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
3501 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
3502 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
3503 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3504 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3505 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3506 					     ARG14_TYPE);                                          \
3507 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3508 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3509 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3510 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3511 					     ARG14_TYPE);                                          \
3512 	} FUNCNAME##_Fake;                                                                         \
3513 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3514 	void FUNCNAME##_reset(void);                                                               \
3515 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3516 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3517 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3518 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3519 		ARG14_TYPE arg14);
3520 
3521 #define DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3522 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3523 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
3524 				 ARG14_TYPE)                                                       \
3525 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3526 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3527 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3528 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3529 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3530 		ARG14_TYPE arg14)                                                                  \
3531 	{                                                                                          \
3532 		SAVE_ARG(FUNCNAME, 0);                                                             \
3533 		SAVE_ARG(FUNCNAME, 1);                                                             \
3534 		SAVE_ARG(FUNCNAME, 2);                                                             \
3535 		SAVE_ARG(FUNCNAME, 3);                                                             \
3536 		SAVE_ARG(FUNCNAME, 4);                                                             \
3537 		SAVE_ARG(FUNCNAME, 5);                                                             \
3538 		SAVE_ARG(FUNCNAME, 6);                                                             \
3539 		SAVE_ARG(FUNCNAME, 7);                                                             \
3540 		SAVE_ARG(FUNCNAME, 8);                                                             \
3541 		SAVE_ARG(FUNCNAME, 9);                                                             \
3542 		SAVE_ARG(FUNCNAME, 10);                                                            \
3543 		SAVE_ARG(FUNCNAME, 11);                                                            \
3544 		SAVE_ARG(FUNCNAME, 12);                                                            \
3545 		SAVE_ARG(FUNCNAME, 13);                                                            \
3546 		SAVE_ARG(FUNCNAME, 14);                                                            \
3547 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3548 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3549 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3550 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3551 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3552 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3553 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3554 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3555 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
3556 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
3557 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
3558 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
3559 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
3560 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
3561 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
3562 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
3563 		} else {                                                                           \
3564 			HISTORY_DROPPED(FUNCNAME);                                                 \
3565 		}                                                                                  \
3566 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
3567 		REGISTER_CALL(FUNCNAME);                                                           \
3568 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
3569 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
3570 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
3571 				RETURN_TYPE ret =                                                  \
3572 					FUNCNAME##_fake.custom_fake_seq                            \
3573 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
3574 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3575 							arg7, arg8, arg9, arg10, arg11, arg12,     \
3576 							arg13, arg14);                             \
3577 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3578 				return ret;                                                        \
3579 			} else {                                                                   \
3580 				RETURN_TYPE ret =                                                  \
3581 					FUNCNAME##_fake.custom_fake_seq                            \
3582 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
3583 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3584 							arg7, arg8, arg9, arg10, arg11, arg12,     \
3585 							arg13, arg14);                             \
3586 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3587 				return ret;                                                        \
3588 				return FUNCNAME##_fake                                             \
3589 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
3590 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
3591 						arg8, arg9, arg10, arg11, arg12, arg13, arg14);    \
3592 			}                                                                          \
3593 		}                                                                                  \
3594 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
3595 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
3596 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
3597 				arg11, arg12, arg13, arg14);                                       \
3598 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
3599 			return ret;                                                                \
3600 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
3601 							   arg6, arg7, arg8, arg9, arg10, arg11,   \
3602 							   arg12, arg13, arg14);                   \
3603 		}                                                                                  \
3604 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
3605 	}                                                                                          \
3606 	DEFINE_RESET_FUNCTION(FUNCNAME)
3607 
3608 #define FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
3609 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
3610 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE)              \
3611 	DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3612 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3613 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3614 				  ARG13_TYPE, ARG14_TYPE)                                          \
3615 	DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3616 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3617 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
3618 				 ARG14_TYPE)
3619 
3620 #define DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3621 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3622 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3623 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE)                              \
3624 	typedef struct FUNCNAME##_Fake {                                                           \
3625 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
3626 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
3627 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
3628 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
3629 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
3630 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
3631 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
3632 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
3633 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
3634 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
3635 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
3636 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
3637 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
3638 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
3639 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
3640 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
3641 		DECLARE_ALL_FUNC_COMMON                                                            \
3642 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
3643 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
3644 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
3645 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
3646 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3647 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3648 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3649 					     ARG14_TYPE, ARG15_TYPE);                              \
3650 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3651 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3652 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3653 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3654 					     ARG14_TYPE, ARG15_TYPE);                              \
3655 	} FUNCNAME##_Fake;                                                                         \
3656 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3657 	void FUNCNAME##_reset(void);                                                               \
3658 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3659 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3660 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3661 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3662 		ARG14_TYPE arg14, ARG15_TYPE arg15);
3663 
3664 #define DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3665 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3666 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
3667 				 ARG14_TYPE, ARG15_TYPE)                                           \
3668 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3669 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3670 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3671 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3672 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3673 		ARG14_TYPE arg14, ARG15_TYPE arg15)                                                \
3674 	{                                                                                          \
3675 		SAVE_ARG(FUNCNAME, 0);                                                             \
3676 		SAVE_ARG(FUNCNAME, 1);                                                             \
3677 		SAVE_ARG(FUNCNAME, 2);                                                             \
3678 		SAVE_ARG(FUNCNAME, 3);                                                             \
3679 		SAVE_ARG(FUNCNAME, 4);                                                             \
3680 		SAVE_ARG(FUNCNAME, 5);                                                             \
3681 		SAVE_ARG(FUNCNAME, 6);                                                             \
3682 		SAVE_ARG(FUNCNAME, 7);                                                             \
3683 		SAVE_ARG(FUNCNAME, 8);                                                             \
3684 		SAVE_ARG(FUNCNAME, 9);                                                             \
3685 		SAVE_ARG(FUNCNAME, 10);                                                            \
3686 		SAVE_ARG(FUNCNAME, 11);                                                            \
3687 		SAVE_ARG(FUNCNAME, 12);                                                            \
3688 		SAVE_ARG(FUNCNAME, 13);                                                            \
3689 		SAVE_ARG(FUNCNAME, 14);                                                            \
3690 		SAVE_ARG(FUNCNAME, 15);                                                            \
3691 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3692 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3693 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3694 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3695 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3696 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3697 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3698 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3699 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
3700 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
3701 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
3702 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
3703 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
3704 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
3705 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
3706 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
3707 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
3708 		} else {                                                                           \
3709 			HISTORY_DROPPED(FUNCNAME);                                                 \
3710 		}                                                                                  \
3711 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
3712 		REGISTER_CALL(FUNCNAME);                                                           \
3713 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
3714 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
3715 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
3716 				RETURN_TYPE ret =                                                  \
3717 					FUNCNAME##_fake.custom_fake_seq                            \
3718 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
3719 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3720 							arg7, arg8, arg9, arg10, arg11, arg12,     \
3721 							arg13, arg14, arg15);                      \
3722 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3723 				return ret;                                                        \
3724 			} else {                                                                   \
3725 				RETURN_TYPE ret =                                                  \
3726 					FUNCNAME##_fake.custom_fake_seq                            \
3727 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
3728 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3729 							arg7, arg8, arg9, arg10, arg11, arg12,     \
3730 							arg13, arg14, arg15);                      \
3731 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3732 				return ret;                                                        \
3733 				return FUNCNAME##_fake                                             \
3734 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
3735 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
3736 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
3737 						arg15);                                            \
3738 			}                                                                          \
3739 		}                                                                                  \
3740 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
3741 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
3742 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
3743 				arg11, arg12, arg13, arg14, arg15);                                \
3744 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
3745 			return ret;                                                                \
3746 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
3747 							   arg6, arg7, arg8, arg9, arg10, arg11,   \
3748 							   arg12, arg13, arg14, arg15);            \
3749 		}                                                                                  \
3750 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
3751 	}                                                                                          \
3752 	DEFINE_RESET_FUNCTION(FUNCNAME)
3753 
3754 #define FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
3755 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
3756 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE)  \
3757 	DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3758 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3759 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3760 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE)                              \
3761 	DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3762 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3763 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
3764 				 ARG14_TYPE, ARG15_TYPE)
3765 
3766 #define DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3767 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3768 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3769 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE)                  \
3770 	typedef struct FUNCNAME##_Fake {                                                           \
3771 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
3772 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
3773 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
3774 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
3775 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
3776 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
3777 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
3778 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
3779 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
3780 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
3781 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
3782 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
3783 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
3784 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
3785 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
3786 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
3787 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
3788 		DECLARE_ALL_FUNC_COMMON                                                            \
3789 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
3790 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
3791 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
3792 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
3793 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3794 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3795 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3796 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE);                  \
3797 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3798 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3799 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3800 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3801 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE);                  \
3802 	} FUNCNAME##_Fake;                                                                         \
3803 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3804 	void FUNCNAME##_reset(void);                                                               \
3805 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3806 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3807 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3808 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3809 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16);
3810 
3811 #define DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3812 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3813 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
3814 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE)                               \
3815 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3816 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3817 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3818 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3819 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3820 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16)                              \
3821 	{                                                                                          \
3822 		SAVE_ARG(FUNCNAME, 0);                                                             \
3823 		SAVE_ARG(FUNCNAME, 1);                                                             \
3824 		SAVE_ARG(FUNCNAME, 2);                                                             \
3825 		SAVE_ARG(FUNCNAME, 3);                                                             \
3826 		SAVE_ARG(FUNCNAME, 4);                                                             \
3827 		SAVE_ARG(FUNCNAME, 5);                                                             \
3828 		SAVE_ARG(FUNCNAME, 6);                                                             \
3829 		SAVE_ARG(FUNCNAME, 7);                                                             \
3830 		SAVE_ARG(FUNCNAME, 8);                                                             \
3831 		SAVE_ARG(FUNCNAME, 9);                                                             \
3832 		SAVE_ARG(FUNCNAME, 10);                                                            \
3833 		SAVE_ARG(FUNCNAME, 11);                                                            \
3834 		SAVE_ARG(FUNCNAME, 12);                                                            \
3835 		SAVE_ARG(FUNCNAME, 13);                                                            \
3836 		SAVE_ARG(FUNCNAME, 14);                                                            \
3837 		SAVE_ARG(FUNCNAME, 15);                                                            \
3838 		SAVE_ARG(FUNCNAME, 16);                                                            \
3839 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3840 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3841 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3842 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3843 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3844 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3845 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3846 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3847 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
3848 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
3849 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
3850 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
3851 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
3852 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
3853 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
3854 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
3855 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
3856 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
3857 		} else {                                                                           \
3858 			HISTORY_DROPPED(FUNCNAME);                                                 \
3859 		}                                                                                  \
3860 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
3861 		REGISTER_CALL(FUNCNAME);                                                           \
3862 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
3863 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
3864 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
3865 				RETURN_TYPE ret =                                                  \
3866 					FUNCNAME##_fake.custom_fake_seq                            \
3867 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
3868 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3869 							arg7, arg8, arg9, arg10, arg11, arg12,     \
3870 							arg13, arg14, arg15, arg16);               \
3871 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3872 				return ret;                                                        \
3873 			} else {                                                                   \
3874 				RETURN_TYPE ret =                                                  \
3875 					FUNCNAME##_fake.custom_fake_seq                            \
3876 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
3877 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
3878 							arg7, arg8, arg9, arg10, arg11, arg12,     \
3879 							arg13, arg14, arg15, arg16);               \
3880 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
3881 				return ret;                                                        \
3882 				return FUNCNAME##_fake                                             \
3883 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
3884 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
3885 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
3886 						arg15, arg16);                                     \
3887 			}                                                                          \
3888 		}                                                                                  \
3889 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
3890 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
3891 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
3892 				arg11, arg12, arg13, arg14, arg15, arg16);                         \
3893 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
3894 			return ret;                                                                \
3895 			return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,     \
3896 							   arg6, arg7, arg8, arg9, arg10, arg11,   \
3897 							   arg12, arg13, arg14, arg15, arg16);     \
3898 		}                                                                                  \
3899 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
3900 	}                                                                                          \
3901 	DEFINE_RESET_FUNCTION(FUNCNAME)
3902 
3903 #define FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
3904 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
3905 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,  \
3906 			  ARG16_TYPE)                                                              \
3907 	DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3908 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3909 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3910 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE)                  \
3911 	DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3912 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3913 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
3914 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE)
3915 
3916 #define DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
3917 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
3918 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
3919 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE)      \
3920 	typedef struct FUNCNAME##_Fake {                                                           \
3921 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
3922 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
3923 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
3924 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
3925 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
3926 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
3927 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
3928 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
3929 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
3930 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
3931 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
3932 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
3933 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
3934 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
3935 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
3936 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
3937 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
3938 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
3939 		DECLARE_ALL_FUNC_COMMON                                                            \
3940 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
3941 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
3942 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
3943 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
3944 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3945 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3946 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3947 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE);      \
3948 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
3949 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
3950 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
3951 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
3952 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE);      \
3953 	} FUNCNAME##_Fake;                                                                         \
3954 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
3955 	void FUNCNAME##_reset(void);                                                               \
3956 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3957 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3958 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3959 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3960 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17);
3961 
3962 #define DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
3963 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
3964 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
3965 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE)                   \
3966 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
3967 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
3968 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
3969 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
3970 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
3971 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17)            \
3972 	{                                                                                          \
3973 		SAVE_ARG(FUNCNAME, 0);                                                             \
3974 		SAVE_ARG(FUNCNAME, 1);                                                             \
3975 		SAVE_ARG(FUNCNAME, 2);                                                             \
3976 		SAVE_ARG(FUNCNAME, 3);                                                             \
3977 		SAVE_ARG(FUNCNAME, 4);                                                             \
3978 		SAVE_ARG(FUNCNAME, 5);                                                             \
3979 		SAVE_ARG(FUNCNAME, 6);                                                             \
3980 		SAVE_ARG(FUNCNAME, 7);                                                             \
3981 		SAVE_ARG(FUNCNAME, 8);                                                             \
3982 		SAVE_ARG(FUNCNAME, 9);                                                             \
3983 		SAVE_ARG(FUNCNAME, 10);                                                            \
3984 		SAVE_ARG(FUNCNAME, 11);                                                            \
3985 		SAVE_ARG(FUNCNAME, 12);                                                            \
3986 		SAVE_ARG(FUNCNAME, 13);                                                            \
3987 		SAVE_ARG(FUNCNAME, 14);                                                            \
3988 		SAVE_ARG(FUNCNAME, 15);                                                            \
3989 		SAVE_ARG(FUNCNAME, 16);                                                            \
3990 		SAVE_ARG(FUNCNAME, 17);                                                            \
3991 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
3992 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
3993 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
3994 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
3995 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
3996 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
3997 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
3998 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
3999 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
4000 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
4001 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
4002 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
4003 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
4004 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
4005 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
4006 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
4007 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
4008 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
4009 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
4010 		} else {                                                                           \
4011 			HISTORY_DROPPED(FUNCNAME);                                                 \
4012 		}                                                                                  \
4013 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4014 		REGISTER_CALL(FUNCNAME);                                                           \
4015 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4016 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4017 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4018 				RETURN_TYPE ret =                                                  \
4019 					FUNCNAME##_fake.custom_fake_seq                            \
4020 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
4021 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
4022 							arg7, arg8, arg9, arg10, arg11, arg12,     \
4023 							arg13, arg14, arg15, arg16, arg17);        \
4024 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
4025 				return ret;                                                        \
4026 			} else {                                                                   \
4027 				RETURN_TYPE ret =                                                  \
4028 					FUNCNAME##_fake.custom_fake_seq                            \
4029 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
4030 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
4031 							arg7, arg8, arg9, arg10, arg11, arg12,     \
4032 							arg13, arg14, arg15, arg16, arg17);        \
4033 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
4034 				return ret;                                                        \
4035 				return FUNCNAME##_fake                                             \
4036 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4037 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
4038 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
4039 						arg15, arg16, arg17);                              \
4040 			}                                                                          \
4041 		}                                                                                  \
4042 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
4043 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
4044 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
4045 				arg11, arg12, arg13, arg14, arg15, arg16, arg17);                  \
4046 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
4047 			return ret;                                                                \
4048 			return FUNCNAME##_fake.custom_fake(                                        \
4049 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
4050 				arg11, arg12, arg13, arg14, arg15, arg16, arg17);                  \
4051 		}                                                                                  \
4052 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
4053 	}                                                                                          \
4054 	DEFINE_RESET_FUNCTION(FUNCNAME)
4055 
4056 #define FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4057 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
4058 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,  \
4059 			  ARG16_TYPE, ARG17_TYPE)                                                  \
4060 	DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
4061 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
4062 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
4063 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE)      \
4064 	DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
4065 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
4066 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
4067 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE)
4068 
4069 #define DECLARE_FAKE_VALUE_FUNC19(                                                                 \
4070 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
4071 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,            \
4072 	ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)                    \
4073 	typedef struct FUNCNAME##_Fake {                                                           \
4074 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4075 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4076 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4077 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4078 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
4079 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
4080 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
4081 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
4082 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
4083 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
4084 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
4085 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
4086 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
4087 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
4088 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
4089 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
4090 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
4091 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
4092 		DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME)                                              \
4093 		DECLARE_ALL_FUNC_COMMON                                                            \
4094 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
4095 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
4096 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4097 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
4098 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
4099 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
4100 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
4101 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
4102 					     ARG18_TYPE);                                          \
4103 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
4104 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
4105 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
4106 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
4107 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
4108 					     ARG18_TYPE);                                          \
4109 	} FUNCNAME##_Fake;                                                                         \
4110 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4111 	void FUNCNAME##_reset(void);                                                               \
4112 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
4113 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
4114 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
4115 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
4116 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
4117 		ARG18_TYPE arg18);
4118 
4119 #define DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
4120 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
4121 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
4122 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)       \
4123 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4124 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
4125 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
4126 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
4127 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
4128 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
4129 		ARG18_TYPE arg18)                                                                  \
4130 	{                                                                                          \
4131 		SAVE_ARG(FUNCNAME, 0);                                                             \
4132 		SAVE_ARG(FUNCNAME, 1);                                                             \
4133 		SAVE_ARG(FUNCNAME, 2);                                                             \
4134 		SAVE_ARG(FUNCNAME, 3);                                                             \
4135 		SAVE_ARG(FUNCNAME, 4);                                                             \
4136 		SAVE_ARG(FUNCNAME, 5);                                                             \
4137 		SAVE_ARG(FUNCNAME, 6);                                                             \
4138 		SAVE_ARG(FUNCNAME, 7);                                                             \
4139 		SAVE_ARG(FUNCNAME, 8);                                                             \
4140 		SAVE_ARG(FUNCNAME, 9);                                                             \
4141 		SAVE_ARG(FUNCNAME, 10);                                                            \
4142 		SAVE_ARG(FUNCNAME, 11);                                                            \
4143 		SAVE_ARG(FUNCNAME, 12);                                                            \
4144 		SAVE_ARG(FUNCNAME, 13);                                                            \
4145 		SAVE_ARG(FUNCNAME, 14);                                                            \
4146 		SAVE_ARG(FUNCNAME, 15);                                                            \
4147 		SAVE_ARG(FUNCNAME, 16);                                                            \
4148 		SAVE_ARG(FUNCNAME, 17);                                                            \
4149 		SAVE_ARG(FUNCNAME, 18);                                                            \
4150 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4151 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4152 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4153 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4154 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
4155 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
4156 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
4157 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
4158 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
4159 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
4160 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
4161 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
4162 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
4163 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
4164 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
4165 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
4166 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
4167 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
4168 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
4169 			SAVE_ARG_HISTORY(FUNCNAME, 18);                                            \
4170 		} else {                                                                           \
4171 			HISTORY_DROPPED(FUNCNAME);                                                 \
4172 		}                                                                                  \
4173 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4174 		REGISTER_CALL(FUNCNAME);                                                           \
4175 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4176 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4177 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4178 				RETURN_TYPE ret =                                                  \
4179 					FUNCNAME##_fake.custom_fake_seq                            \
4180 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
4181 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
4182 							arg7, arg8, arg9, arg10, arg11, arg12,     \
4183 							arg13, arg14, arg15, arg16, arg17, arg18); \
4184 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
4185 				return ret;                                                        \
4186 			} else {                                                                   \
4187 				RETURN_TYPE ret =                                                  \
4188 					FUNCNAME##_fake.custom_fake_seq                            \
4189 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
4190 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
4191 							arg7, arg8, arg9, arg10, arg11, arg12,     \
4192 							arg13, arg14, arg15, arg16, arg17, arg18); \
4193 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
4194 				return ret;                                                        \
4195 				return FUNCNAME##_fake                                             \
4196 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4197 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
4198 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
4199 						arg15, arg16, arg17, arg18);                       \
4200 			}                                                                          \
4201 		}                                                                                  \
4202 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
4203 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
4204 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
4205 				arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18);           \
4206 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
4207 			return ret;                                                                \
4208 			return FUNCNAME##_fake.custom_fake(                                        \
4209 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
4210 				arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18);           \
4211 		}                                                                                  \
4212 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
4213 	}                                                                                          \
4214 	DEFINE_RESET_FUNCTION(FUNCNAME)
4215 
4216 #define FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4217 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
4218 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,  \
4219 			  ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)                                      \
4220 	DECLARE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
4221 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
4222 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
4223 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,      \
4224 				  ARG18_TYPE)                                                      \
4225 	DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
4226 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
4227 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
4228 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE)
4229 
4230 #define DECLARE_FAKE_VALUE_FUNC20(                                                                 \
4231 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
4232 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,            \
4233 	ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)        \
4234 	typedef struct FUNCNAME##_Fake {                                                           \
4235 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4236 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4237 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4238 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4239 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
4240 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
4241 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
4242 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
4243 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
4244 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
4245 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
4246 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
4247 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
4248 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
4249 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
4250 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
4251 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
4252 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
4253 		DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME)                                              \
4254 		DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME)                                              \
4255 		DECLARE_ALL_FUNC_COMMON                                                            \
4256 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
4257 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
4258 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4259 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
4260 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
4261 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
4262 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
4263 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
4264 					     ARG18_TYPE, ARG19_TYPE);                              \
4265 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
4266 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
4267 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
4268 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
4269 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
4270 					     ARG18_TYPE, ARG19_TYPE);                              \
4271 	} FUNCNAME##_Fake;                                                                         \
4272 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4273 	void FUNCNAME##_reset(void);                                                               \
4274 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
4275 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
4276 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
4277 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
4278 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
4279 		ARG18_TYPE arg18, ARG19_TYPE arg19);
4280 
4281 #define DEFINE_FAKE_VALUE_FUNC20(                                                                  \
4282 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
4283 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,            \
4284 	ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)        \
4285 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4286 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
4287 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
4288 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
4289 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
4290 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
4291 		ARG18_TYPE arg18, ARG19_TYPE arg19)                                                \
4292 	{                                                                                          \
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 		SAVE_ARG(FUNCNAME, 16);                                                            \
4310 		SAVE_ARG(FUNCNAME, 17);                                                            \
4311 		SAVE_ARG(FUNCNAME, 18);                                                            \
4312 		SAVE_ARG(FUNCNAME, 19);                                                            \
4313 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4314 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4315 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4316 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4317 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
4318 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
4319 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
4320 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
4321 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
4322 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
4323 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
4324 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
4325 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
4326 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
4327 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
4328 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
4329 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
4330 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
4331 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
4332 			SAVE_ARG_HISTORY(FUNCNAME, 18);                                            \
4333 			SAVE_ARG_HISTORY(FUNCNAME, 19);                                            \
4334 		} else {                                                                           \
4335 			HISTORY_DROPPED(FUNCNAME);                                                 \
4336 		}                                                                                  \
4337 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4338 		REGISTER_CALL(FUNCNAME);                                                           \
4339 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4340 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4341 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4342 				RETURN_TYPE ret =                                                  \
4343 					FUNCNAME##_fake.custom_fake_seq                            \
4344 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
4345 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
4346 							arg7, arg8, arg9, arg10, arg11, arg12,     \
4347 							arg13, arg14, arg15, arg16, arg17, arg18,  \
4348 							arg19);                                    \
4349 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
4350 				return ret;                                                        \
4351 			} else {                                                                   \
4352 				RETURN_TYPE ret =                                                  \
4353 					FUNCNAME##_fake.custom_fake_seq                            \
4354 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
4355 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
4356 							arg7, arg8, arg9, arg10, arg11, arg12,     \
4357 							arg13, arg14, arg15, arg16, arg17, arg18,  \
4358 							arg19);                                    \
4359 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
4360 				return ret;                                                        \
4361 				return FUNCNAME##_fake                                             \
4362 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4363 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
4364 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
4365 						arg15, arg16, arg17, arg18, arg19);                \
4366 			}                                                                          \
4367 		}                                                                                  \
4368 		if (FUNCNAME##_fake.custom_fake != NULL) {                                         \
4369 			RETURN_TYPE ret = FUNCNAME##_fake.custom_fake(                             \
4370 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
4371 				arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19);    \
4372 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
4373 			return ret;                                                                \
4374 			return FUNCNAME##_fake.custom_fake(                                        \
4375 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
4376 				arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19);    \
4377 		}                                                                                  \
4378 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
4379 	}                                                                                          \
4380 	DEFINE_RESET_FUNCTION(FUNCNAME)
4381 
4382 #define FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4383 			  ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,        \
4384 			  ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,  \
4385 			  ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE)                          \
4386 	DECLARE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,          \
4387 				  ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,           \
4388 				  ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,        \
4389 				  ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,      \
4390 				  ARG18_TYPE, ARG19_TYPE)                                          \
4391 	DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
4392 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
4393 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
4394 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE,       \
4395 				 ARG19_TYPE)
4396 
4397 #define DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...)                                   \
4398 	typedef struct FUNCNAME##_Fake {                                                           \
4399 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4400 		DECLARE_ALL_FUNC_COMMON                                                            \
4401 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4402 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, va_list ap);            \
4403 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, va_list ap);       \
4404 	} FUNCNAME##_Fake;                                                                         \
4405 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4406 	void FUNCNAME##_reset(void);                                                               \
4407 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...);
4408 
4409 #define DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...)                                    \
4410 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4411 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...)                             \
4412 	{                                                                                          \
4413 		SAVE_ARG(FUNCNAME, 0);                                                             \
4414 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4415 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4416 		} else {                                                                           \
4417 			HISTORY_DROPPED(FUNCNAME);                                                 \
4418 		}                                                                                  \
4419 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4420 		REGISTER_CALL(FUNCNAME);                                                           \
4421 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4422 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4423 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4424 				va_list ap;                                                        \
4425 				va_start(ap, arg0);                                                \
4426 				FUNCNAME##_fake                                                    \
4427 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4428 						arg0, ap);                                         \
4429 				va_end(ap);                                                        \
4430 			} else {                                                                   \
4431 				va_list ap;                                                        \
4432 				va_start(ap, arg0);                                                \
4433 				FUNCNAME##_fake                                                    \
4434 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4435 						arg0, ap);                                         \
4436 				va_end(ap);                                                        \
4437 			}                                                                          \
4438 		}                                                                                  \
4439 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4440 			va_list ap;                                                                \
4441 			va_start(ap, arg0);                                                        \
4442 			FUNCNAME##_fake.custom_fake(arg0, ap);                                     \
4443 			va_end(ap);                                                                \
4444 		}                                                                                  \
4445 	}                                                                                          \
4446 	DEFINE_RESET_FUNCTION(FUNCNAME)
4447 
4448 #define FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...)                                           \
4449 	DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...)                                   \
4450 	DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...)
4451 
4452 #define DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)                        \
4453 	typedef struct FUNCNAME##_Fake {                                                           \
4454 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4455 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4456 		DECLARE_ALL_FUNC_COMMON                                                            \
4457 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4458 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, va_list ap); \
4459 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4460 					     va_list ap);                                          \
4461 	} FUNCNAME##_Fake;                                                                         \
4462 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4463 	void FUNCNAME##_reset(void);                                                               \
4464 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...);
4465 
4466 #define DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)                         \
4467 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4468 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...)             \
4469 	{                                                                                          \
4470 		SAVE_ARG(FUNCNAME, 0);                                                             \
4471 		SAVE_ARG(FUNCNAME, 1);                                                             \
4472 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4473 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4474 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4475 		} else {                                                                           \
4476 			HISTORY_DROPPED(FUNCNAME);                                                 \
4477 		}                                                                                  \
4478 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4479 		REGISTER_CALL(FUNCNAME);                                                           \
4480 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4481 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4482 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4483 				va_list ap;                                                        \
4484 				va_start(ap, arg1);                                                \
4485 				FUNCNAME##_fake                                                    \
4486 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4487 						arg0, arg1, ap);                                   \
4488 				va_end(ap);                                                        \
4489 			} else {                                                                   \
4490 				va_list ap;                                                        \
4491 				va_start(ap, arg1);                                                \
4492 				FUNCNAME##_fake                                                    \
4493 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4494 						arg0, arg1, ap);                                   \
4495 				va_end(ap);                                                        \
4496 			}                                                                          \
4497 		}                                                                                  \
4498 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4499 			va_list ap;                                                                \
4500 			va_start(ap, arg1);                                                        \
4501 			FUNCNAME##_fake.custom_fake(arg0, arg1, ap);                               \
4502 			va_end(ap);                                                                \
4503 		}                                                                                  \
4504 	}                                                                                          \
4505 	DEFINE_RESET_FUNCTION(FUNCNAME)
4506 
4507 #define FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)                                \
4508 	DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)                        \
4509 	DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)
4510 
4511 #define DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...)             \
4512 	typedef struct FUNCNAME##_Fake {                                                           \
4513 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4514 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4515 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4516 		DECLARE_ALL_FUNC_COMMON                                                            \
4517 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4518 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
4519 					     va_list ap);                                          \
4520 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4521 					     ARG2_TYPE, va_list ap);                               \
4522 	} FUNCNAME##_Fake;                                                                         \
4523 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4524 	void FUNCNAME##_reset(void);                                                               \
4525 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4526 						  ...);
4527 
4528 #define DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...)              \
4529 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4530 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4531 						  ...)                                             \
4532 	{                                                                                          \
4533 		SAVE_ARG(FUNCNAME, 0);                                                             \
4534 		SAVE_ARG(FUNCNAME, 1);                                                             \
4535 		SAVE_ARG(FUNCNAME, 2);                                                             \
4536 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4537 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4538 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4539 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4540 		} else {                                                                           \
4541 			HISTORY_DROPPED(FUNCNAME);                                                 \
4542 		}                                                                                  \
4543 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4544 		REGISTER_CALL(FUNCNAME);                                                           \
4545 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4546 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4547 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4548 				va_list ap;                                                        \
4549 				va_start(ap, arg2);                                                \
4550 				FUNCNAME##_fake                                                    \
4551 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4552 						arg0, arg1, arg2, ap);                             \
4553 				va_end(ap);                                                        \
4554 			} else {                                                                   \
4555 				va_list ap;                                                        \
4556 				va_start(ap, arg2);                                                \
4557 				FUNCNAME##_fake                                                    \
4558 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4559 						arg0, arg1, arg2, ap);                             \
4560 				va_end(ap);                                                        \
4561 			}                                                                          \
4562 		}                                                                                  \
4563 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4564 			va_list ap;                                                                \
4565 			va_start(ap, arg2);                                                        \
4566 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap);                         \
4567 			va_end(ap);                                                                \
4568 		}                                                                                  \
4569 	}                                                                                          \
4570 	DEFINE_RESET_FUNCTION(FUNCNAME)
4571 
4572 #define FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...)                     \
4573 	DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...)             \
4574 	DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...)
4575 
4576 #define DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...)  \
4577 	typedef struct FUNCNAME##_Fake {                                                           \
4578 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4579 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4580 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4581 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4582 		DECLARE_ALL_FUNC_COMMON                                                            \
4583 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4584 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
4585 					     ARG3_TYPE, va_list ap);                               \
4586 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4587 					     ARG2_TYPE, ARG3_TYPE, va_list ap);                    \
4588 	} FUNCNAME##_Fake;                                                                         \
4589 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4590 	void FUNCNAME##_reset(void);                                                               \
4591 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4592 						  ARG3_TYPE arg3, ...);
4593 
4594 #define DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...)   \
4595 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4596 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4597 						  ARG3_TYPE arg3, ...)                             \
4598 	{                                                                                          \
4599 		SAVE_ARG(FUNCNAME, 0);                                                             \
4600 		SAVE_ARG(FUNCNAME, 1);                                                             \
4601 		SAVE_ARG(FUNCNAME, 2);                                                             \
4602 		SAVE_ARG(FUNCNAME, 3);                                                             \
4603 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4604 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4605 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4606 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4607 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
4608 		} else {                                                                           \
4609 			HISTORY_DROPPED(FUNCNAME);                                                 \
4610 		}                                                                                  \
4611 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4612 		REGISTER_CALL(FUNCNAME);                                                           \
4613 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4614 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4615 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4616 				va_list ap;                                                        \
4617 				va_start(ap, arg3);                                                \
4618 				FUNCNAME##_fake                                                    \
4619 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4620 						arg0, arg1, arg2, arg3, ap);                       \
4621 				va_end(ap);                                                        \
4622 			} else {                                                                   \
4623 				va_list ap;                                                        \
4624 				va_start(ap, arg3);                                                \
4625 				FUNCNAME##_fake                                                    \
4626 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4627 						arg0, arg1, arg2, arg3, ap);                       \
4628 				va_end(ap);                                                        \
4629 			}                                                                          \
4630 		}                                                                                  \
4631 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4632 			va_list ap;                                                                \
4633 			va_start(ap, arg3);                                                        \
4634 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap);                   \
4635 			va_end(ap);                                                                \
4636 		}                                                                                  \
4637 	}                                                                                          \
4638 	DEFINE_RESET_FUNCTION(FUNCNAME)
4639 
4640 #define FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...)          \
4641 	DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...)  \
4642 	DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...)
4643 
4644 #define DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4645 				       ARG4_TYPE, ...)                                             \
4646 	typedef struct FUNCNAME##_Fake {                                                           \
4647 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4648 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4649 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4650 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4651 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
4652 		DECLARE_ALL_FUNC_COMMON                                                            \
4653 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4654 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
4655 					     ARG3_TYPE, ARG4_TYPE, va_list ap);                    \
4656 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4657 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, va_list ap);         \
4658 	} FUNCNAME##_Fake;                                                                         \
4659 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4660 	void FUNCNAME##_reset(void);                                                               \
4661 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4662 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ...);
4663 
4664 #define DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4665 				      ARG4_TYPE, ...)                                              \
4666 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4667 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4668 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ...)             \
4669 	{                                                                                          \
4670 		SAVE_ARG(FUNCNAME, 0);                                                             \
4671 		SAVE_ARG(FUNCNAME, 1);                                                             \
4672 		SAVE_ARG(FUNCNAME, 2);                                                             \
4673 		SAVE_ARG(FUNCNAME, 3);                                                             \
4674 		SAVE_ARG(FUNCNAME, 4);                                                             \
4675 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4676 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4677 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4678 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4679 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
4680 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
4681 		} else {                                                                           \
4682 			HISTORY_DROPPED(FUNCNAME);                                                 \
4683 		}                                                                                  \
4684 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4685 		REGISTER_CALL(FUNCNAME);                                                           \
4686 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4687 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4688 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4689 				va_list ap;                                                        \
4690 				va_start(ap, arg4);                                                \
4691 				FUNCNAME##_fake                                                    \
4692 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4693 						arg0, arg1, arg2, arg3, arg4, ap);                 \
4694 				va_end(ap);                                                        \
4695 			} else {                                                                   \
4696 				va_list ap;                                                        \
4697 				va_start(ap, arg4);                                                \
4698 				FUNCNAME##_fake                                                    \
4699 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4700 						arg0, arg1, arg2, arg3, arg4, ap);                 \
4701 				va_end(ap);                                                        \
4702 			}                                                                          \
4703 		}                                                                                  \
4704 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4705 			va_list ap;                                                                \
4706 			va_start(ap, arg4);                                                        \
4707 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap);             \
4708 			va_end(ap);                                                                \
4709 		}                                                                                  \
4710 	}                                                                                          \
4711 	DEFINE_RESET_FUNCTION(FUNCNAME)
4712 
4713 #define FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
4714 			       ...)                                                                \
4715 	DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4716 				       ARG4_TYPE, ...)                                             \
4717 	DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4718 				      ARG4_TYPE, ...)
4719 
4720 #define DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4721 				       ARG4_TYPE, ARG5_TYPE, ...)                                  \
4722 	typedef struct FUNCNAME##_Fake {                                                           \
4723 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4724 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4725 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4726 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4727 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
4728 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
4729 		DECLARE_ALL_FUNC_COMMON                                                            \
4730 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4731 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
4732 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, va_list ap);         \
4733 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4734 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
4735 					     va_list ap);                                          \
4736 	} FUNCNAME##_Fake;                                                                         \
4737 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4738 	void FUNCNAME##_reset(void);                                                               \
4739 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4740 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
4741 						  ...);
4742 
4743 #define DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4744 				      ARG4_TYPE, ARG5_TYPE, ...)                                   \
4745 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4746 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4747 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
4748 						  ...)                                             \
4749 	{                                                                                          \
4750 		SAVE_ARG(FUNCNAME, 0);                                                             \
4751 		SAVE_ARG(FUNCNAME, 1);                                                             \
4752 		SAVE_ARG(FUNCNAME, 2);                                                             \
4753 		SAVE_ARG(FUNCNAME, 3);                                                             \
4754 		SAVE_ARG(FUNCNAME, 4);                                                             \
4755 		SAVE_ARG(FUNCNAME, 5);                                                             \
4756 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4757 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4758 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4759 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4760 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
4761 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
4762 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
4763 		} else {                                                                           \
4764 			HISTORY_DROPPED(FUNCNAME);                                                 \
4765 		}                                                                                  \
4766 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4767 		REGISTER_CALL(FUNCNAME);                                                           \
4768 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4769 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4770 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4771 				va_list ap;                                                        \
4772 				va_start(ap, arg5);                                                \
4773 				FUNCNAME##_fake                                                    \
4774 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4775 						arg0, arg1, arg2, arg3, arg4, arg5, ap);           \
4776 				va_end(ap);                                                        \
4777 			} else {                                                                   \
4778 				va_list ap;                                                        \
4779 				va_start(ap, arg5);                                                \
4780 				FUNCNAME##_fake                                                    \
4781 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4782 						arg0, arg1, arg2, arg3, arg4, arg5, ap);           \
4783 				va_end(ap);                                                        \
4784 			}                                                                          \
4785 		}                                                                                  \
4786 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4787 			va_list ap;                                                                \
4788 			va_start(ap, arg5);                                                        \
4789 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap);       \
4790 			va_end(ap);                                                                \
4791 		}                                                                                  \
4792 	}                                                                                          \
4793 	DEFINE_RESET_FUNCTION(FUNCNAME)
4794 
4795 #define FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
4796 			       ARG5_TYPE, ...)                                                     \
4797 	DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4798 				       ARG4_TYPE, ARG5_TYPE, ...)                                  \
4799 	DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4800 				      ARG4_TYPE, ARG5_TYPE, ...)
4801 
4802 #define DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4803 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)                       \
4804 	typedef struct FUNCNAME##_Fake {                                                           \
4805 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4806 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4807 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4808 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4809 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
4810 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
4811 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
4812 		DECLARE_ALL_FUNC_COMMON                                                            \
4813 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4814 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
4815 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
4816 					     va_list ap);                                          \
4817 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4818 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
4819 					     ARG6_TYPE, va_list ap);                               \
4820 	} FUNCNAME##_Fake;                                                                         \
4821 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4822 	void FUNCNAME##_reset(void);                                                               \
4823 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4824 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
4825 						  ARG6_TYPE arg6, ...);
4826 
4827 #define DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4828 				      ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)                        \
4829 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4830 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4831 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
4832 						  ARG6_TYPE arg6, ...)                             \
4833 	{                                                                                          \
4834 		SAVE_ARG(FUNCNAME, 0);                                                             \
4835 		SAVE_ARG(FUNCNAME, 1);                                                             \
4836 		SAVE_ARG(FUNCNAME, 2);                                                             \
4837 		SAVE_ARG(FUNCNAME, 3);                                                             \
4838 		SAVE_ARG(FUNCNAME, 4);                                                             \
4839 		SAVE_ARG(FUNCNAME, 5);                                                             \
4840 		SAVE_ARG(FUNCNAME, 6);                                                             \
4841 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4842 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4843 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4844 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4845 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
4846 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
4847 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
4848 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
4849 		} else {                                                                           \
4850 			HISTORY_DROPPED(FUNCNAME);                                                 \
4851 		}                                                                                  \
4852 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4853 		REGISTER_CALL(FUNCNAME);                                                           \
4854 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4855 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4856 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4857 				va_list ap;                                                        \
4858 				va_start(ap, arg6);                                                \
4859 				FUNCNAME##_fake                                                    \
4860 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4861 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap);     \
4862 				va_end(ap);                                                        \
4863 			} else {                                                                   \
4864 				va_list ap;                                                        \
4865 				va_start(ap, arg6);                                                \
4866 				FUNCNAME##_fake                                                    \
4867 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4868 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap);     \
4869 				va_end(ap);                                                        \
4870 			}                                                                          \
4871 		}                                                                                  \
4872 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4873 			va_list ap;                                                                \
4874 			va_start(ap, arg6);                                                        \
4875 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
4876 			va_end(ap);                                                                \
4877 		}                                                                                  \
4878 	}                                                                                          \
4879 	DEFINE_RESET_FUNCTION(FUNCNAME)
4880 
4881 #define FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
4882 			       ARG5_TYPE, ARG6_TYPE, ...)                                          \
4883 	DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4884 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)                       \
4885 	DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4886 				      ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)
4887 
4888 #define DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4889 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...)            \
4890 	typedef struct FUNCNAME##_Fake {                                                           \
4891 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4892 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4893 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4894 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4895 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
4896 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
4897 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
4898 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
4899 		DECLARE_ALL_FUNC_COMMON                                                            \
4900 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4901 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
4902 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
4903 					     ARG7_TYPE, va_list ap);                               \
4904 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4905 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
4906 					     ARG6_TYPE, ARG7_TYPE, va_list ap);                    \
4907 	} FUNCNAME##_Fake;                                                                         \
4908 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
4909 	void FUNCNAME##_reset(void);                                                               \
4910 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4911 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
4912 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ...);
4913 
4914 #define DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4915 				      ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...)             \
4916 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
4917 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
4918 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
4919 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ...)             \
4920 	{                                                                                          \
4921 		SAVE_ARG(FUNCNAME, 0);                                                             \
4922 		SAVE_ARG(FUNCNAME, 1);                                                             \
4923 		SAVE_ARG(FUNCNAME, 2);                                                             \
4924 		SAVE_ARG(FUNCNAME, 3);                                                             \
4925 		SAVE_ARG(FUNCNAME, 4);                                                             \
4926 		SAVE_ARG(FUNCNAME, 5);                                                             \
4927 		SAVE_ARG(FUNCNAME, 6);                                                             \
4928 		SAVE_ARG(FUNCNAME, 7);                                                             \
4929 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
4930 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
4931 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
4932 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
4933 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
4934 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
4935 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
4936 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
4937 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
4938 		} else {                                                                           \
4939 			HISTORY_DROPPED(FUNCNAME);                                                 \
4940 		}                                                                                  \
4941 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
4942 		REGISTER_CALL(FUNCNAME);                                                           \
4943 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
4944 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
4945 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
4946 				va_list ap;                                                        \
4947 				va_start(ap, arg7);                                                \
4948 				FUNCNAME##_fake                                                    \
4949 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
4950 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
4951 						ap);                                               \
4952 				va_end(ap);                                                        \
4953 			} else {                                                                   \
4954 				va_list ap;                                                        \
4955 				va_start(ap, arg7);                                                \
4956 				FUNCNAME##_fake                                                    \
4957 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
4958 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
4959 						ap);                                               \
4960 				va_end(ap);                                                        \
4961 			}                                                                          \
4962 		}                                                                                  \
4963 		if (FUNCNAME##_fake.custom_fake) {                                                 \
4964 			va_list ap;                                                                \
4965 			va_start(ap, arg7);                                                        \
4966 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
4967 						    arg7, ap);                                     \
4968 			va_end(ap);                                                                \
4969 		}                                                                                  \
4970 	}                                                                                          \
4971 	DEFINE_RESET_FUNCTION(FUNCNAME)
4972 
4973 #define FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,    \
4974 			       ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...)                               \
4975 	DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
4976 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...)            \
4977 	DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,        \
4978 				      ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...)
4979 
4980 #define DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
4981 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
4982 					...)                                                       \
4983 	typedef struct FUNCNAME##_Fake {                                                           \
4984 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
4985 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
4986 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
4987 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
4988 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
4989 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
4990 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
4991 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
4992 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
4993 		DECLARE_ALL_FUNC_COMMON                                                            \
4994 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
4995 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
4996 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
4997 					     ARG7_TYPE, ARG8_TYPE, va_list ap);                    \
4998 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
4999 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5000 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, va_list ap);         \
5001 	} FUNCNAME##_Fake;                                                                         \
5002 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5003 	void FUNCNAME##_reset(void);                                                               \
5004 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5005 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5006 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...);
5007 
5008 #define DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5009 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
5010 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5011 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5012 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5013 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...)               \
5014 	{                                                                                          \
5015 		SAVE_ARG(FUNCNAME, 0);                                                             \
5016 		SAVE_ARG(FUNCNAME, 1);                                                             \
5017 		SAVE_ARG(FUNCNAME, 2);                                                             \
5018 		SAVE_ARG(FUNCNAME, 3);                                                             \
5019 		SAVE_ARG(FUNCNAME, 4);                                                             \
5020 		SAVE_ARG(FUNCNAME, 5);                                                             \
5021 		SAVE_ARG(FUNCNAME, 6);                                                             \
5022 		SAVE_ARG(FUNCNAME, 7);                                                             \
5023 		SAVE_ARG(FUNCNAME, 8);                                                             \
5024 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5025 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5026 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5027 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5028 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5029 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5030 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5031 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5032 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5033 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5034 		} else {                                                                           \
5035 			HISTORY_DROPPED(FUNCNAME);                                                 \
5036 		}                                                                                  \
5037 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5038 		REGISTER_CALL(FUNCNAME);                                                           \
5039 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5040 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5041 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5042 				va_list ap;                                                        \
5043 				va_start(ap, arg8);                                                \
5044 				FUNCNAME##_fake                                                    \
5045 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5046 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5047 						arg8, ap);                                         \
5048 				va_end(ap);                                                        \
5049 			} else {                                                                   \
5050 				va_list ap;                                                        \
5051 				va_start(ap, arg8);                                                \
5052 				FUNCNAME##_fake                                                    \
5053 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5054 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5055 						arg8, ap);                                         \
5056 				va_end(ap);                                                        \
5057 			}                                                                          \
5058 		}                                                                                  \
5059 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5060 			va_list ap;                                                                \
5061 			va_start(ap, arg8);                                                        \
5062 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5063 						    arg7, arg8, ap);                               \
5064 			va_end(ap);                                                                \
5065 		}                                                                                  \
5066 	}                                                                                          \
5067 	DEFINE_RESET_FUNCTION(FUNCNAME)
5068 
5069 #define FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5070 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...)                   \
5071 	DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5072 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5073 					...)                                                       \
5074 	DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5075 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...)
5076 
5077 #define DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5078 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5079 					ARG9_TYPE, ...)                                            \
5080 	typedef struct FUNCNAME##_Fake {                                                           \
5081 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5082 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5083 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5084 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5085 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5086 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5087 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5088 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5089 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5090 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5091 		DECLARE_ALL_FUNC_COMMON                                                            \
5092 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5093 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5094 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5095 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, va_list ap);         \
5096 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5097 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5098 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5099 					     va_list ap);                                          \
5100 	} FUNCNAME##_Fake;                                                                         \
5101 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5102 	void FUNCNAME##_reset(void);                                                               \
5103 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
5104 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
5105 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8,  \
5106 						  ARG9_TYPE arg9, ...);
5107 
5108 #define DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5109 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5110 				       ARG9_TYPE, ...)                                             \
5111 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5112 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
5113 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
5114 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8,  \
5115 						  ARG9_TYPE arg9, ...)                             \
5116 	{                                                                                          \
5117 		SAVE_ARG(FUNCNAME, 0);                                                             \
5118 		SAVE_ARG(FUNCNAME, 1);                                                             \
5119 		SAVE_ARG(FUNCNAME, 2);                                                             \
5120 		SAVE_ARG(FUNCNAME, 3);                                                             \
5121 		SAVE_ARG(FUNCNAME, 4);                                                             \
5122 		SAVE_ARG(FUNCNAME, 5);                                                             \
5123 		SAVE_ARG(FUNCNAME, 6);                                                             \
5124 		SAVE_ARG(FUNCNAME, 7);                                                             \
5125 		SAVE_ARG(FUNCNAME, 8);                                                             \
5126 		SAVE_ARG(FUNCNAME, 9);                                                             \
5127 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5128 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5129 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5130 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5131 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5132 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5133 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5134 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5135 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5136 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5137 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5138 		} else {                                                                           \
5139 			HISTORY_DROPPED(FUNCNAME);                                                 \
5140 		}                                                                                  \
5141 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5142 		REGISTER_CALL(FUNCNAME);                                                           \
5143 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5144 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5145 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5146 				va_list ap;                                                        \
5147 				va_start(ap, arg9);                                                \
5148 				FUNCNAME##_fake                                                    \
5149 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5150 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5151 						arg8, arg9, ap);                                   \
5152 				va_end(ap);                                                        \
5153 			} else {                                                                   \
5154 				va_list ap;                                                        \
5155 				va_start(ap, arg9);                                                \
5156 				FUNCNAME##_fake                                                    \
5157 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5158 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5159 						arg8, arg9, ap);                                   \
5160 				va_end(ap);                                                        \
5161 			}                                                                          \
5162 		}                                                                                  \
5163 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5164 			va_list ap;                                                                \
5165 			va_start(ap, arg9);                                                        \
5166 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5167 						    arg7, arg8, arg9, ap);                         \
5168 			va_end(ap);                                                                \
5169 		}                                                                                  \
5170 	}                                                                                          \
5171 	DEFINE_RESET_FUNCTION(FUNCNAME)
5172 
5173 #define FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5174 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...)        \
5175 	DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5176 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5177 					ARG9_TYPE, ...)                                            \
5178 	DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5179 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5180 				       ARG9_TYPE, ...)
5181 
5182 #define DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5183 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5184 					ARG9_TYPE, ARG10_TYPE, ...)                                \
5185 	typedef struct FUNCNAME##_Fake {                                                           \
5186 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5187 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5188 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5189 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5190 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5191 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5192 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5193 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5194 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5195 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5196 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
5197 		DECLARE_ALL_FUNC_COMMON                                                            \
5198 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5199 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5200 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5201 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
5202 					     va_list ap);                                          \
5203 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5204 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5205 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5206 					     ARG10_TYPE, va_list ap);                              \
5207 	} FUNCNAME##_Fake;                                                                         \
5208 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5209 	void FUNCNAME##_reset(void);                                                               \
5210 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
5211 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
5212 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8,  \
5213 						  ARG9_TYPE arg9, ARG10_TYPE arg10, ...);
5214 
5215 #define DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5216 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5217 				       ARG9_TYPE, ARG10_TYPE, ...)                                 \
5218 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5219 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2,  \
5220 						  ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5,  \
5221 						  ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8,  \
5222 						  ARG9_TYPE arg9, ARG10_TYPE arg10, ...)           \
5223 	{                                                                                          \
5224 		SAVE_ARG(FUNCNAME, 0);                                                             \
5225 		SAVE_ARG(FUNCNAME, 1);                                                             \
5226 		SAVE_ARG(FUNCNAME, 2);                                                             \
5227 		SAVE_ARG(FUNCNAME, 3);                                                             \
5228 		SAVE_ARG(FUNCNAME, 4);                                                             \
5229 		SAVE_ARG(FUNCNAME, 5);                                                             \
5230 		SAVE_ARG(FUNCNAME, 6);                                                             \
5231 		SAVE_ARG(FUNCNAME, 7);                                                             \
5232 		SAVE_ARG(FUNCNAME, 8);                                                             \
5233 		SAVE_ARG(FUNCNAME, 9);                                                             \
5234 		SAVE_ARG(FUNCNAME, 10);                                                            \
5235 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5236 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5237 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5238 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5239 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5240 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5241 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5242 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5243 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5244 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5245 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5246 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
5247 		} else {                                                                           \
5248 			HISTORY_DROPPED(FUNCNAME);                                                 \
5249 		}                                                                                  \
5250 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5251 		REGISTER_CALL(FUNCNAME);                                                           \
5252 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5253 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5254 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5255 				va_list ap;                                                        \
5256 				va_start(ap, arg10);                                               \
5257 				FUNCNAME##_fake                                                    \
5258 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5259 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5260 						arg8, arg9, arg10, ap);                            \
5261 				va_end(ap);                                                        \
5262 			} else {                                                                   \
5263 				va_list ap;                                                        \
5264 				va_start(ap, arg10);                                               \
5265 				FUNCNAME##_fake                                                    \
5266 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5267 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5268 						arg8, arg9, arg10, ap);                            \
5269 				va_end(ap);                                                        \
5270 			}                                                                          \
5271 		}                                                                                  \
5272 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5273 			va_list ap;                                                                \
5274 			va_start(ap, arg10);                                                       \
5275 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5276 						    arg7, arg8, arg9, arg10, ap);                  \
5277 			va_end(ap);                                                                \
5278 		}                                                                                  \
5279 	}                                                                                          \
5280 	DEFINE_RESET_FUNCTION(FUNCNAME)
5281 
5282 #define FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5283 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
5284 				...)                                                               \
5285 	DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5286 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5287 					ARG9_TYPE, ARG10_TYPE, ...)                                \
5288 	DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5289 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5290 				       ARG9_TYPE, ARG10_TYPE, ...)
5291 
5292 #define DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5293 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5294 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)                    \
5295 	typedef struct FUNCNAME##_Fake {                                                           \
5296 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5297 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5298 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5299 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5300 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5301 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5302 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5303 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5304 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5305 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5306 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
5307 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
5308 		DECLARE_ALL_FUNC_COMMON                                                            \
5309 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5310 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5311 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5312 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
5313 					     ARG11_TYPE, va_list ap);                              \
5314 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5315 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5316 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5317 					     ARG10_TYPE, ARG11_TYPE, va_list ap);                  \
5318 	} FUNCNAME##_Fake;                                                                         \
5319 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5320 	void FUNCNAME##_reset(void);                                                               \
5321 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5322 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5323 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5324 		ARG10_TYPE arg10, ARG11_TYPE arg11, ...);
5325 
5326 #define DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5327 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5328 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)                     \
5329 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5330 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5331 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5332 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5333 		ARG10_TYPE arg10, ARG11_TYPE arg11, ...)                                           \
5334 	{                                                                                          \
5335 		SAVE_ARG(FUNCNAME, 0);                                                             \
5336 		SAVE_ARG(FUNCNAME, 1);                                                             \
5337 		SAVE_ARG(FUNCNAME, 2);                                                             \
5338 		SAVE_ARG(FUNCNAME, 3);                                                             \
5339 		SAVE_ARG(FUNCNAME, 4);                                                             \
5340 		SAVE_ARG(FUNCNAME, 5);                                                             \
5341 		SAVE_ARG(FUNCNAME, 6);                                                             \
5342 		SAVE_ARG(FUNCNAME, 7);                                                             \
5343 		SAVE_ARG(FUNCNAME, 8);                                                             \
5344 		SAVE_ARG(FUNCNAME, 9);                                                             \
5345 		SAVE_ARG(FUNCNAME, 10);                                                            \
5346 		SAVE_ARG(FUNCNAME, 11);                                                            \
5347 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5348 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5349 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5350 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5351 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5352 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5353 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5354 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5355 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5356 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5357 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5358 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
5359 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
5360 		} else {                                                                           \
5361 			HISTORY_DROPPED(FUNCNAME);                                                 \
5362 		}                                                                                  \
5363 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5364 		REGISTER_CALL(FUNCNAME);                                                           \
5365 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5366 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5367 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5368 				va_list ap;                                                        \
5369 				va_start(ap, arg11);                                               \
5370 				FUNCNAME##_fake                                                    \
5371 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5372 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5373 						arg8, arg9, arg10, arg11, ap);                     \
5374 				va_end(ap);                                                        \
5375 			} else {                                                                   \
5376 				va_list ap;                                                        \
5377 				va_start(ap, arg11);                                               \
5378 				FUNCNAME##_fake                                                    \
5379 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5380 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5381 						arg8, arg9, arg10, arg11, ap);                     \
5382 				va_end(ap);                                                        \
5383 			}                                                                          \
5384 		}                                                                                  \
5385 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5386 			va_list ap;                                                                \
5387 			va_start(ap, arg11);                                                       \
5388 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5389 						    arg7, arg8, arg9, arg10, arg11, ap);           \
5390 			va_end(ap);                                                                \
5391 		}                                                                                  \
5392 	}                                                                                          \
5393 	DEFINE_RESET_FUNCTION(FUNCNAME)
5394 
5395 #define FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5396 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
5397 				ARG11_TYPE, ...)                                                   \
5398 	DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5399 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5400 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)                    \
5401 	DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5402 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5403 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)
5404 
5405 #define DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5406 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5407 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...)        \
5408 	typedef struct FUNCNAME##_Fake {                                                           \
5409 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5410 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5411 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5412 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5413 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5414 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5415 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5416 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5417 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5418 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5419 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
5420 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
5421 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
5422 		DECLARE_ALL_FUNC_COMMON                                                            \
5423 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5424 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5425 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5426 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
5427 					     ARG11_TYPE, ARG12_TYPE, va_list ap);                  \
5428 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5429 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5430 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5431 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, va_list ap);      \
5432 	} FUNCNAME##_Fake;                                                                         \
5433 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5434 	void FUNCNAME##_reset(void);                                                               \
5435 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5436 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5437 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5438 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...);
5439 
5440 #define DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5441 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5442 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...)         \
5443 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5444 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5445 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5446 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5447 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...)                         \
5448 	{                                                                                          \
5449 		SAVE_ARG(FUNCNAME, 0);                                                             \
5450 		SAVE_ARG(FUNCNAME, 1);                                                             \
5451 		SAVE_ARG(FUNCNAME, 2);                                                             \
5452 		SAVE_ARG(FUNCNAME, 3);                                                             \
5453 		SAVE_ARG(FUNCNAME, 4);                                                             \
5454 		SAVE_ARG(FUNCNAME, 5);                                                             \
5455 		SAVE_ARG(FUNCNAME, 6);                                                             \
5456 		SAVE_ARG(FUNCNAME, 7);                                                             \
5457 		SAVE_ARG(FUNCNAME, 8);                                                             \
5458 		SAVE_ARG(FUNCNAME, 9);                                                             \
5459 		SAVE_ARG(FUNCNAME, 10);                                                            \
5460 		SAVE_ARG(FUNCNAME, 11);                                                            \
5461 		SAVE_ARG(FUNCNAME, 12);                                                            \
5462 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5463 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5464 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5465 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5466 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5467 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5468 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5469 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5470 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5471 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5472 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5473 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
5474 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
5475 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
5476 		} else {                                                                           \
5477 			HISTORY_DROPPED(FUNCNAME);                                                 \
5478 		}                                                                                  \
5479 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5480 		REGISTER_CALL(FUNCNAME);                                                           \
5481 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5482 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5483 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5484 				va_list ap;                                                        \
5485 				va_start(ap, arg12);                                               \
5486 				FUNCNAME##_fake                                                    \
5487 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5488 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5489 						arg8, arg9, arg10, arg11, arg12, ap);              \
5490 				va_end(ap);                                                        \
5491 			} else {                                                                   \
5492 				va_list ap;                                                        \
5493 				va_start(ap, arg12);                                               \
5494 				FUNCNAME##_fake                                                    \
5495 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5496 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5497 						arg8, arg9, arg10, arg11, arg12, ap);              \
5498 				va_end(ap);                                                        \
5499 			}                                                                          \
5500 		}                                                                                  \
5501 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5502 			va_list ap;                                                                \
5503 			va_start(ap, arg12);                                                       \
5504 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5505 						    arg7, arg8, arg9, arg10, arg11, arg12, ap);    \
5506 			va_end(ap);                                                                \
5507 		}                                                                                  \
5508 	}                                                                                          \
5509 	DEFINE_RESET_FUNCTION(FUNCNAME)
5510 
5511 #define FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5512 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
5513 				ARG11_TYPE, ARG12_TYPE, ...)                                       \
5514 	DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5515 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5516 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...)        \
5517 	DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5518 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5519 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...)
5520 
5521 #define DECLARE_FAKE_VOID_FUNC15_VARARG(                                                           \
5522 	FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,     \
5523 	ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...)      \
5524 	typedef struct FUNCNAME##_Fake {                                                           \
5525 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5526 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5527 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5528 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5529 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5530 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5531 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5532 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5533 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5534 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5535 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
5536 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
5537 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
5538 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
5539 		DECLARE_ALL_FUNC_COMMON                                                            \
5540 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5541 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5542 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5543 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
5544 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, va_list ap);      \
5545 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5546 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5547 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5548 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
5549 					     va_list ap);                                          \
5550 	} FUNCNAME##_Fake;                                                                         \
5551 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5552 	void FUNCNAME##_reset(void);                                                               \
5553 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5554 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5555 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5556 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...);
5557 
5558 #define DEFINE_FAKE_VOID_FUNC15_VARARG(                                                            \
5559 	FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,     \
5560 	ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...)      \
5561 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5562 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5563 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5564 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5565 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...)       \
5566 	{                                                                                          \
5567 		SAVE_ARG(FUNCNAME, 0);                                                             \
5568 		SAVE_ARG(FUNCNAME, 1);                                                             \
5569 		SAVE_ARG(FUNCNAME, 2);                                                             \
5570 		SAVE_ARG(FUNCNAME, 3);                                                             \
5571 		SAVE_ARG(FUNCNAME, 4);                                                             \
5572 		SAVE_ARG(FUNCNAME, 5);                                                             \
5573 		SAVE_ARG(FUNCNAME, 6);                                                             \
5574 		SAVE_ARG(FUNCNAME, 7);                                                             \
5575 		SAVE_ARG(FUNCNAME, 8);                                                             \
5576 		SAVE_ARG(FUNCNAME, 9);                                                             \
5577 		SAVE_ARG(FUNCNAME, 10);                                                            \
5578 		SAVE_ARG(FUNCNAME, 11);                                                            \
5579 		SAVE_ARG(FUNCNAME, 12);                                                            \
5580 		SAVE_ARG(FUNCNAME, 13);                                                            \
5581 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5582 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5583 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5584 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5585 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5586 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5587 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5588 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5589 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5590 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5591 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5592 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
5593 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
5594 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
5595 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
5596 		} else {                                                                           \
5597 			HISTORY_DROPPED(FUNCNAME);                                                 \
5598 		}                                                                                  \
5599 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5600 		REGISTER_CALL(FUNCNAME);                                                           \
5601 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5602 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5603 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5604 				va_list ap;                                                        \
5605 				va_start(ap, arg13);                                               \
5606 				FUNCNAME##_fake                                                    \
5607 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5608 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5609 						arg8, arg9, arg10, arg11, arg12, arg13, ap);       \
5610 				va_end(ap);                                                        \
5611 			} else {                                                                   \
5612 				va_list ap;                                                        \
5613 				va_start(ap, arg13);                                               \
5614 				FUNCNAME##_fake                                                    \
5615 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5616 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5617 						arg8, arg9, arg10, arg11, arg12, arg13, ap);       \
5618 				va_end(ap);                                                        \
5619 			}                                                                          \
5620 		}                                                                                  \
5621 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5622 			va_list ap;                                                                \
5623 			va_start(ap, arg13);                                                       \
5624 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5625 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
5626 						    ap);                                           \
5627 			va_end(ap);                                                                \
5628 		}                                                                                  \
5629 	}                                                                                          \
5630 	DEFINE_RESET_FUNCTION(FUNCNAME)
5631 
5632 #define FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5633 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
5634 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...)                           \
5635 	DECLARE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5636 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5637 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
5638 					...)                                                       \
5639 	DEFINE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5640 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5641 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
5642 				       ...)
5643 
5644 #define DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5645 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5646 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
5647 					ARG14_TYPE, ...)                                           \
5648 	typedef struct FUNCNAME##_Fake {                                                           \
5649 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5650 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5651 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5652 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5653 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5654 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5655 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5656 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5657 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5658 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5659 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
5660 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
5661 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
5662 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
5663 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
5664 		DECLARE_ALL_FUNC_COMMON                                                            \
5665 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5666 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5667 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5668 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
5669 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
5670 					     va_list ap);                                          \
5671 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5672 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5673 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5674 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
5675 					     ARG14_TYPE, va_list ap);                              \
5676 	} FUNCNAME##_Fake;                                                                         \
5677 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5678 	void FUNCNAME##_reset(void);                                                               \
5679 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5680 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5681 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5682 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
5683 		ARG14_TYPE arg14, ...);
5684 
5685 #define DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5686 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5687 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
5688 				       ARG14_TYPE, ...)                                            \
5689 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5690 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5691 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5692 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5693 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
5694 		ARG14_TYPE arg14, ...)                                                             \
5695 	{                                                                                          \
5696 		SAVE_ARG(FUNCNAME, 0);                                                             \
5697 		SAVE_ARG(FUNCNAME, 1);                                                             \
5698 		SAVE_ARG(FUNCNAME, 2);                                                             \
5699 		SAVE_ARG(FUNCNAME, 3);                                                             \
5700 		SAVE_ARG(FUNCNAME, 4);                                                             \
5701 		SAVE_ARG(FUNCNAME, 5);                                                             \
5702 		SAVE_ARG(FUNCNAME, 6);                                                             \
5703 		SAVE_ARG(FUNCNAME, 7);                                                             \
5704 		SAVE_ARG(FUNCNAME, 8);                                                             \
5705 		SAVE_ARG(FUNCNAME, 9);                                                             \
5706 		SAVE_ARG(FUNCNAME, 10);                                                            \
5707 		SAVE_ARG(FUNCNAME, 11);                                                            \
5708 		SAVE_ARG(FUNCNAME, 12);                                                            \
5709 		SAVE_ARG(FUNCNAME, 13);                                                            \
5710 		SAVE_ARG(FUNCNAME, 14);                                                            \
5711 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5712 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5713 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5714 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5715 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5716 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5717 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5718 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5719 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5720 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5721 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5722 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
5723 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
5724 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
5725 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
5726 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
5727 		} else {                                                                           \
5728 			HISTORY_DROPPED(FUNCNAME);                                                 \
5729 		}                                                                                  \
5730 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5731 		REGISTER_CALL(FUNCNAME);                                                           \
5732 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5733 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5734 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5735 				va_list ap;                                                        \
5736 				va_start(ap, arg14);                                               \
5737 				FUNCNAME##_fake                                                    \
5738 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5739 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5740 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
5741 						ap);                                               \
5742 				va_end(ap);                                                        \
5743 			} else {                                                                   \
5744 				va_list ap;                                                        \
5745 				va_start(ap, arg14);                                               \
5746 				FUNCNAME##_fake                                                    \
5747 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5748 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5749 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
5750 						ap);                                               \
5751 				va_end(ap);                                                        \
5752 			}                                                                          \
5753 		}                                                                                  \
5754 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5755 			va_list ap;                                                                \
5756 			va_start(ap, arg14);                                                       \
5757 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5758 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
5759 						    arg14, ap);                                    \
5760 			va_end(ap);                                                                \
5761 		}                                                                                  \
5762 	}                                                                                          \
5763 	DEFINE_RESET_FUNCTION(FUNCNAME)
5764 
5765 #define FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5766 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
5767 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...)               \
5768 	DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5769 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5770 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
5771 					ARG14_TYPE, ...)                                           \
5772 	DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5773 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5774 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
5775 				       ARG14_TYPE, ...)
5776 
5777 #define DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5778 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5779 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
5780 					ARG14_TYPE, ARG15_TYPE, ...)                               \
5781 	typedef struct FUNCNAME##_Fake {                                                           \
5782 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5783 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5784 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5785 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5786 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5787 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5788 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5789 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5790 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5791 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5792 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
5793 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
5794 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
5795 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
5796 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
5797 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
5798 		DECLARE_ALL_FUNC_COMMON                                                            \
5799 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5800 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5801 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5802 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
5803 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
5804 					     ARG15_TYPE, va_list ap);                              \
5805 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5806 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5807 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5808 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
5809 					     ARG14_TYPE, ARG15_TYPE, va_list ap);                  \
5810 	} FUNCNAME##_Fake;                                                                         \
5811 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5812 	void FUNCNAME##_reset(void);                                                               \
5813 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5814 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5815 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5816 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
5817 		ARG14_TYPE arg14, ARG15_TYPE arg15, ...);
5818 
5819 #define DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5820 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5821 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
5822 				       ARG14_TYPE, ARG15_TYPE, ...)                                \
5823 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5824 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5825 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5826 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5827 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
5828 		ARG14_TYPE arg14, ARG15_TYPE arg15, ...)                                           \
5829 	{                                                                                          \
5830 		SAVE_ARG(FUNCNAME, 0);                                                             \
5831 		SAVE_ARG(FUNCNAME, 1);                                                             \
5832 		SAVE_ARG(FUNCNAME, 2);                                                             \
5833 		SAVE_ARG(FUNCNAME, 3);                                                             \
5834 		SAVE_ARG(FUNCNAME, 4);                                                             \
5835 		SAVE_ARG(FUNCNAME, 5);                                                             \
5836 		SAVE_ARG(FUNCNAME, 6);                                                             \
5837 		SAVE_ARG(FUNCNAME, 7);                                                             \
5838 		SAVE_ARG(FUNCNAME, 8);                                                             \
5839 		SAVE_ARG(FUNCNAME, 9);                                                             \
5840 		SAVE_ARG(FUNCNAME, 10);                                                            \
5841 		SAVE_ARG(FUNCNAME, 11);                                                            \
5842 		SAVE_ARG(FUNCNAME, 12);                                                            \
5843 		SAVE_ARG(FUNCNAME, 13);                                                            \
5844 		SAVE_ARG(FUNCNAME, 14);                                                            \
5845 		SAVE_ARG(FUNCNAME, 15);                                                            \
5846 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5847 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5848 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5849 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5850 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5851 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5852 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5853 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5854 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5855 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5856 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5857 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
5858 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
5859 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
5860 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
5861 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
5862 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
5863 		} else {                                                                           \
5864 			HISTORY_DROPPED(FUNCNAME);                                                 \
5865 		}                                                                                  \
5866 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
5867 		REGISTER_CALL(FUNCNAME);                                                           \
5868 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
5869 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
5870 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
5871 				va_list ap;                                                        \
5872 				va_start(ap, arg15);                                               \
5873 				FUNCNAME##_fake                                                    \
5874 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
5875 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5876 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
5877 						arg15, ap);                                        \
5878 				va_end(ap);                                                        \
5879 			} else {                                                                   \
5880 				va_list ap;                                                        \
5881 				va_start(ap, arg15);                                               \
5882 				FUNCNAME##_fake                                                    \
5883 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
5884 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
5885 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
5886 						arg15, ap);                                        \
5887 				va_end(ap);                                                        \
5888 			}                                                                          \
5889 		}                                                                                  \
5890 		if (FUNCNAME##_fake.custom_fake) {                                                 \
5891 			va_list ap;                                                                \
5892 			va_start(ap, arg15);                                                       \
5893 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
5894 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
5895 						    arg14, arg15, ap);                             \
5896 			va_end(ap);                                                                \
5897 		}                                                                                  \
5898 	}                                                                                          \
5899 	DEFINE_RESET_FUNCTION(FUNCNAME)
5900 
5901 #define FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
5902 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
5903 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...)   \
5904 	DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5905 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5906 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
5907 					ARG14_TYPE, ARG15_TYPE, ...)                               \
5908 	DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5909 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5910 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
5911 				       ARG14_TYPE, ARG15_TYPE, ...)
5912 
5913 #define DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
5914 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
5915 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
5916 					ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)                   \
5917 	typedef struct FUNCNAME##_Fake {                                                           \
5918 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
5919 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
5920 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
5921 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
5922 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
5923 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
5924 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
5925 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
5926 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
5927 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
5928 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
5929 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
5930 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
5931 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
5932 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
5933 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
5934 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
5935 		DECLARE_ALL_FUNC_COMMON                                                            \
5936 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
5937 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
5938 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
5939 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
5940 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
5941 					     ARG15_TYPE, ARG16_TYPE, va_list ap);                  \
5942 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
5943 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
5944 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
5945 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
5946 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, va_list ap);      \
5947 	} FUNCNAME##_Fake;                                                                         \
5948 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
5949 	void FUNCNAME##_reset(void);                                                               \
5950 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5951 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5952 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5953 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
5954 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...);
5955 
5956 #define DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
5957 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
5958 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
5959 				       ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)                    \
5960 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
5961 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
5962 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
5963 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
5964 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
5965 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...)                         \
5966 	{                                                                                          \
5967 		SAVE_ARG(FUNCNAME, 0);                                                             \
5968 		SAVE_ARG(FUNCNAME, 1);                                                             \
5969 		SAVE_ARG(FUNCNAME, 2);                                                             \
5970 		SAVE_ARG(FUNCNAME, 3);                                                             \
5971 		SAVE_ARG(FUNCNAME, 4);                                                             \
5972 		SAVE_ARG(FUNCNAME, 5);                                                             \
5973 		SAVE_ARG(FUNCNAME, 6);                                                             \
5974 		SAVE_ARG(FUNCNAME, 7);                                                             \
5975 		SAVE_ARG(FUNCNAME, 8);                                                             \
5976 		SAVE_ARG(FUNCNAME, 9);                                                             \
5977 		SAVE_ARG(FUNCNAME, 10);                                                            \
5978 		SAVE_ARG(FUNCNAME, 11);                                                            \
5979 		SAVE_ARG(FUNCNAME, 12);                                                            \
5980 		SAVE_ARG(FUNCNAME, 13);                                                            \
5981 		SAVE_ARG(FUNCNAME, 14);                                                            \
5982 		SAVE_ARG(FUNCNAME, 15);                                                            \
5983 		SAVE_ARG(FUNCNAME, 16);                                                            \
5984 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
5985 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
5986 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
5987 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
5988 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
5989 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
5990 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
5991 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
5992 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
5993 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
5994 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
5995 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
5996 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
5997 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
5998 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
5999 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
6000 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
6001 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
6002 		} else {                                                                           \
6003 			HISTORY_DROPPED(FUNCNAME);                                                 \
6004 		}                                                                                  \
6005 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6006 		REGISTER_CALL(FUNCNAME);                                                           \
6007 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6008 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6009 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6010 				va_list ap;                                                        \
6011 				va_start(ap, arg16);                                               \
6012 				FUNCNAME##_fake                                                    \
6013 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
6014 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
6015 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
6016 						arg15, arg16, ap);                                 \
6017 				va_end(ap);                                                        \
6018 			} else {                                                                   \
6019 				va_list ap;                                                        \
6020 				va_start(ap, arg16);                                               \
6021 				FUNCNAME##_fake                                                    \
6022 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6023 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
6024 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
6025 						arg15, arg16, ap);                                 \
6026 				va_end(ap);                                                        \
6027 			}                                                                          \
6028 		}                                                                                  \
6029 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6030 			va_list ap;                                                                \
6031 			va_start(ap, arg16);                                                       \
6032 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
6033 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
6034 						    arg14, arg15, arg16, ap);                      \
6035 			va_end(ap);                                                                \
6036 		}                                                                                  \
6037 	}                                                                                          \
6038 	DEFINE_RESET_FUNCTION(FUNCNAME)
6039 
6040 #define FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
6041 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
6042 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
6043 				ARG16_TYPE, ...)                                                   \
6044 	DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
6045 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
6046 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
6047 					ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)                   \
6048 	DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
6049 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
6050 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
6051 				       ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)
6052 
6053 #define DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
6054 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
6055 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
6056 					ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)       \
6057 	typedef struct FUNCNAME##_Fake {                                                           \
6058 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6059 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6060 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6061 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
6062 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
6063 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
6064 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
6065 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
6066 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
6067 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
6068 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
6069 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
6070 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
6071 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
6072 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
6073 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
6074 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
6075 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
6076 		DECLARE_ALL_FUNC_COMMON                                                            \
6077 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6078 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
6079 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
6080 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
6081 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
6082 					     ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, va_list ap);      \
6083 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
6084 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6085 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
6086 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
6087 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
6088 					     va_list ap);                                          \
6089 	} FUNCNAME##_Fake;                                                                         \
6090 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6091 	void FUNCNAME##_reset(void);                                                               \
6092 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
6093 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6094 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
6095 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
6096 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...);
6097 
6098 #define DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
6099 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
6100 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
6101 				       ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)        \
6102 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6103 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
6104 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6105 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
6106 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
6107 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...)       \
6108 	{                                                                                          \
6109 		SAVE_ARG(FUNCNAME, 0);                                                             \
6110 		SAVE_ARG(FUNCNAME, 1);                                                             \
6111 		SAVE_ARG(FUNCNAME, 2);                                                             \
6112 		SAVE_ARG(FUNCNAME, 3);                                                             \
6113 		SAVE_ARG(FUNCNAME, 4);                                                             \
6114 		SAVE_ARG(FUNCNAME, 5);                                                             \
6115 		SAVE_ARG(FUNCNAME, 6);                                                             \
6116 		SAVE_ARG(FUNCNAME, 7);                                                             \
6117 		SAVE_ARG(FUNCNAME, 8);                                                             \
6118 		SAVE_ARG(FUNCNAME, 9);                                                             \
6119 		SAVE_ARG(FUNCNAME, 10);                                                            \
6120 		SAVE_ARG(FUNCNAME, 11);                                                            \
6121 		SAVE_ARG(FUNCNAME, 12);                                                            \
6122 		SAVE_ARG(FUNCNAME, 13);                                                            \
6123 		SAVE_ARG(FUNCNAME, 14);                                                            \
6124 		SAVE_ARG(FUNCNAME, 15);                                                            \
6125 		SAVE_ARG(FUNCNAME, 16);                                                            \
6126 		SAVE_ARG(FUNCNAME, 17);                                                            \
6127 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6128 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6129 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6130 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
6131 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
6132 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
6133 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
6134 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
6135 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
6136 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
6137 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
6138 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
6139 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
6140 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
6141 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
6142 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
6143 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
6144 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
6145 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
6146 		} else {                                                                           \
6147 			HISTORY_DROPPED(FUNCNAME);                                                 \
6148 		}                                                                                  \
6149 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6150 		REGISTER_CALL(FUNCNAME);                                                           \
6151 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6152 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6153 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6154 				va_list ap;                                                        \
6155 				va_start(ap, arg17);                                               \
6156 				FUNCNAME##_fake                                                    \
6157 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
6158 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
6159 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
6160 						arg15, arg16, arg17, ap);                          \
6161 				va_end(ap);                                                        \
6162 			} else {                                                                   \
6163 				va_list ap;                                                        \
6164 				va_start(ap, arg17);                                               \
6165 				FUNCNAME##_fake                                                    \
6166 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6167 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
6168 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
6169 						arg15, arg16, arg17, ap);                          \
6170 				va_end(ap);                                                        \
6171 			}                                                                          \
6172 		}                                                                                  \
6173 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6174 			va_list ap;                                                                \
6175 			va_start(ap, arg17);                                                       \
6176 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
6177 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
6178 						    arg14, arg15, arg16, arg17, ap);               \
6179 			va_end(ap);                                                                \
6180 		}                                                                                  \
6181 	}                                                                                          \
6182 	DEFINE_RESET_FUNCTION(FUNCNAME)
6183 
6184 #define FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
6185 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
6186 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
6187 				ARG16_TYPE, ARG17_TYPE, ...)                                       \
6188 	DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,      \
6189 					ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,     \
6190 					ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, \
6191 					ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)       \
6192 	DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE,       \
6193 				       ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE,      \
6194 				       ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,  \
6195 				       ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)
6196 
6197 #define DECLARE_FAKE_VOID_FUNC20_VARARG(                                                           \
6198 	FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,     \
6199 	ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,           \
6200 	ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)                           \
6201 	typedef struct FUNCNAME##_Fake {                                                           \
6202 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6203 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6204 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6205 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
6206 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
6207 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
6208 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
6209 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
6210 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
6211 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
6212 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
6213 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
6214 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
6215 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
6216 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
6217 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
6218 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
6219 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
6220 		DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME)                                              \
6221 		DECLARE_ALL_FUNC_COMMON                                                            \
6222 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6223 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, custom_fake, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
6224 					     ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,           \
6225 					     ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE,          \
6226 					     ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE,       \
6227 					     ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE,       \
6228 					     va_list ap);                                          \
6229 		CUSTOM_FFF_FUNCTION_TEMPLATE(void, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,         \
6230 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6231 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
6232 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
6233 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
6234 					     ARG18_TYPE, va_list ap);                              \
6235 	} FUNCNAME##_Fake;                                                                         \
6236 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6237 	void FUNCNAME##_reset(void);                                                               \
6238 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
6239 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6240 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
6241 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
6242 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
6243 		ARG18_TYPE arg18, ...);
6244 
6245 #define DEFINE_FAKE_VOID_FUNC20_VARARG(                                                            \
6246 	FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE,     \
6247 	ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,           \
6248 	ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)                           \
6249 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6250 	void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                                 \
6251 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6252 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
6253 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
6254 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
6255 		ARG18_TYPE arg18, ...)                                                             \
6256 	{                                                                                          \
6257 		SAVE_ARG(FUNCNAME, 0);                                                             \
6258 		SAVE_ARG(FUNCNAME, 1);                                                             \
6259 		SAVE_ARG(FUNCNAME, 2);                                                             \
6260 		SAVE_ARG(FUNCNAME, 3);                                                             \
6261 		SAVE_ARG(FUNCNAME, 4);                                                             \
6262 		SAVE_ARG(FUNCNAME, 5);                                                             \
6263 		SAVE_ARG(FUNCNAME, 6);                                                             \
6264 		SAVE_ARG(FUNCNAME, 7);                                                             \
6265 		SAVE_ARG(FUNCNAME, 8);                                                             \
6266 		SAVE_ARG(FUNCNAME, 9);                                                             \
6267 		SAVE_ARG(FUNCNAME, 10);                                                            \
6268 		SAVE_ARG(FUNCNAME, 11);                                                            \
6269 		SAVE_ARG(FUNCNAME, 12);                                                            \
6270 		SAVE_ARG(FUNCNAME, 13);                                                            \
6271 		SAVE_ARG(FUNCNAME, 14);                                                            \
6272 		SAVE_ARG(FUNCNAME, 15);                                                            \
6273 		SAVE_ARG(FUNCNAME, 16);                                                            \
6274 		SAVE_ARG(FUNCNAME, 17);                                                            \
6275 		SAVE_ARG(FUNCNAME, 18);                                                            \
6276 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6277 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6278 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6279 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
6280 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
6281 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
6282 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
6283 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
6284 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
6285 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
6286 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
6287 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
6288 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
6289 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
6290 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
6291 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
6292 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
6293 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
6294 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
6295 			SAVE_ARG_HISTORY(FUNCNAME, 18);                                            \
6296 		} else {                                                                           \
6297 			HISTORY_DROPPED(FUNCNAME);                                                 \
6298 		}                                                                                  \
6299 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6300 		REGISTER_CALL(FUNCNAME);                                                           \
6301 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6302 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6303 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6304 				va_list ap;                                                        \
6305 				va_start(ap, arg18);                                               \
6306 				FUNCNAME##_fake                                                    \
6307 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](   \
6308 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
6309 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
6310 						arg15, arg16, arg17, arg18, ap);                   \
6311 				va_end(ap);                                                        \
6312 			} else {                                                                   \
6313 				va_list ap;                                                        \
6314 				va_start(ap, arg18);                                               \
6315 				FUNCNAME##_fake                                                    \
6316 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6317 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
6318 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
6319 						arg15, arg16, arg17, arg18, ap);                   \
6320 				va_end(ap);                                                        \
6321 			}                                                                          \
6322 		}                                                                                  \
6323 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6324 			va_list ap;                                                                \
6325 			va_start(ap, arg18);                                                       \
6326 			FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6,      \
6327 						    arg7, arg8, arg9, arg10, arg11, arg12, arg13,  \
6328 						    arg14, arg15, arg16, arg17, arg18, ap);        \
6329 			va_end(ap);                                                                \
6330 		}                                                                                  \
6331 	}                                                                                          \
6332 	DEFINE_RESET_FUNCTION(FUNCNAME)
6333 
6334 #define FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,   \
6335 				ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, \
6336 				ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE,        \
6337 				ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)                           \
6338 	DECLARE_FAKE_VOID_FUNC20_VARARG(                                                           \
6339 		FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,        \
6340 		ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,    \
6341 		ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)       \
6342 	DEFINE_FAKE_VOID_FUNC20_VARARG(                                                            \
6343 		FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,        \
6344 		ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,    \
6345 		ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)
6346 
6347 #define DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...)                     \
6348 	typedef struct FUNCNAME##_Fake {                                                           \
6349 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6350 		DECLARE_ALL_FUNC_COMMON                                                            \
6351 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6352 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6353 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6354 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, va_list ap);     \
6355 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE,             \
6356 					     va_list ap);                                          \
6357 	} FUNCNAME##_Fake;                                                                         \
6358 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6359 	void FUNCNAME##_reset(void);                                                               \
6360 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...);
6361 
6362 #define DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...)                      \
6363 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6364 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...)                      \
6365 	{                                                                                          \
6366 		SAVE_ARG(FUNCNAME, 0);                                                             \
6367 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6368 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6369 		} else {                                                                           \
6370 			HISTORY_DROPPED(FUNCNAME);                                                 \
6371 		}                                                                                  \
6372 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6373 		REGISTER_CALL(FUNCNAME);                                                           \
6374 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6375 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6376 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6377 				va_list ap;                                                        \
6378 				va_start(ap, arg0);                                                \
6379 				RETURN_TYPE ret =                                                  \
6380 					FUNCNAME##_fake.custom_fake_seq                            \
6381 						[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, ap); \
6382 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6383 				va_end(ap);                                                        \
6384 				return ret;                                                        \
6385 			} else {                                                                   \
6386 				va_list ap;                                                        \
6387 				va_start(ap, arg0);                                                \
6388 				RETURN_TYPE ret =                                                  \
6389 					FUNCNAME##_fake.custom_fake_seq                            \
6390 						[FUNCNAME##_fake.custom_fake_seq_len - 1](arg0,    \
6391 											  ap);     \
6392 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6393 				va_end(ap);                                                        \
6394 				return ret;                                                        \
6395 				return FUNCNAME##_fake                                             \
6396 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6397 						arg0, ap);                                         \
6398 			}                                                                          \
6399 		}                                                                                  \
6400 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6401 			RETURN_TYPE ret;                                                           \
6402 			va_list ap;                                                                \
6403 			va_start(ap, arg0);                                                        \
6404 			ret = FUNCNAME##_fake.custom_fake(arg0, ap);                               \
6405 			va_end(ap);                                                                \
6406 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
6407 			return ret;                                                                \
6408 		}                                                                                  \
6409 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
6410 	}                                                                                          \
6411 	DEFINE_RESET_FUNCTION(FUNCNAME)
6412 
6413 #define FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...)                             \
6414 	DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...)                     \
6415 	DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...)
6416 
6417 #define DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)          \
6418 	typedef struct FUNCNAME##_Fake {                                                           \
6419 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6420 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6421 		DECLARE_ALL_FUNC_COMMON                                                            \
6422 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6423 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6424 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6425 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
6426 					     va_list ap);                                          \
6427 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
6428 					     va_list ap);                                          \
6429 	} FUNCNAME##_Fake;                                                                         \
6430 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6431 	void FUNCNAME##_reset(void);                                                               \
6432 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...);
6433 
6434 #define DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)           \
6435 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6436 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...)      \
6437 	{                                                                                          \
6438 		SAVE_ARG(FUNCNAME, 0);                                                             \
6439 		SAVE_ARG(FUNCNAME, 1);                                                             \
6440 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6441 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6442 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6443 		} else {                                                                           \
6444 			HISTORY_DROPPED(FUNCNAME);                                                 \
6445 		}                                                                                  \
6446 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6447 		REGISTER_CALL(FUNCNAME);                                                           \
6448 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6449 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6450 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6451 				va_list ap;                                                        \
6452 				va_start(ap, arg1);                                                \
6453 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
6454 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
6455 								  arg0, arg1, ap);                 \
6456 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6457 				va_end(ap);                                                        \
6458 				return ret;                                                        \
6459 			} else {                                                                   \
6460 				va_list ap;                                                        \
6461 				va_start(ap, arg1);                                                \
6462 				RETURN_TYPE ret =                                                  \
6463 					FUNCNAME##_fake.custom_fake_seq                            \
6464 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
6465 							arg0, arg1, ap);                           \
6466 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6467 				va_end(ap);                                                        \
6468 				return ret;                                                        \
6469 				return FUNCNAME##_fake                                             \
6470 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6471 						arg0, arg1, ap);                                   \
6472 			}                                                                          \
6473 		}                                                                                  \
6474 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6475 			RETURN_TYPE ret;                                                           \
6476 			va_list ap;                                                                \
6477 			va_start(ap, arg1);                                                        \
6478 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, ap);                         \
6479 			va_end(ap);                                                                \
6480 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
6481 			return ret;                                                                \
6482 		}                                                                                  \
6483 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
6484 	}                                                                                          \
6485 	DEFINE_RESET_FUNCTION(FUNCNAME)
6486 
6487 #define FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)                  \
6488 	DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)          \
6489 	DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...)
6490 
6491 #define DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6492 					...)                                                       \
6493 	typedef struct FUNCNAME##_Fake {                                                           \
6494 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6495 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6496 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6497 		DECLARE_ALL_FUNC_COMMON                                                            \
6498 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6499 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6500 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6501 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
6502 					     ARG2_TYPE, va_list ap);                               \
6503 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
6504 					     ARG2_TYPE, va_list ap);                               \
6505 	} FUNCNAME##_Fake;                                                                         \
6506 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6507 	void FUNCNAME##_reset(void);                                                               \
6508 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6509 							 ARG2_TYPE arg2, ...);
6510 
6511 #define DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6512 				       ...)                                                        \
6513 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6514 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6515 							 ARG2_TYPE arg2, ...)                      \
6516 	{                                                                                          \
6517 		SAVE_ARG(FUNCNAME, 0);                                                             \
6518 		SAVE_ARG(FUNCNAME, 1);                                                             \
6519 		SAVE_ARG(FUNCNAME, 2);                                                             \
6520 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6521 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6522 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6523 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
6524 		} else {                                                                           \
6525 			HISTORY_DROPPED(FUNCNAME);                                                 \
6526 		}                                                                                  \
6527 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6528 		REGISTER_CALL(FUNCNAME);                                                           \
6529 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6530 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6531 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6532 				va_list ap;                                                        \
6533 				va_start(ap, arg2);                                                \
6534 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
6535 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
6536 								  arg0, arg1, arg2, ap);           \
6537 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6538 				va_end(ap);                                                        \
6539 				return ret;                                                        \
6540 			} else {                                                                   \
6541 				va_list ap;                                                        \
6542 				va_start(ap, arg2);                                                \
6543 				RETURN_TYPE ret =                                                  \
6544 					FUNCNAME##_fake.custom_fake_seq                            \
6545 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
6546 							arg0, arg1, arg2, ap);                     \
6547 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6548 				va_end(ap);                                                        \
6549 				return ret;                                                        \
6550 				return FUNCNAME##_fake                                             \
6551 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6552 						arg0, arg1, arg2, ap);                             \
6553 			}                                                                          \
6554 		}                                                                                  \
6555 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6556 			RETURN_TYPE ret;                                                           \
6557 			va_list ap;                                                                \
6558 			va_start(ap, arg2);                                                        \
6559 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap);                   \
6560 			va_end(ap);                                                                \
6561 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
6562 			return ret;                                                                \
6563 		}                                                                                  \
6564 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
6565 	}                                                                                          \
6566 	DEFINE_RESET_FUNCTION(FUNCNAME)
6567 
6568 #define FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...)       \
6569 	DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6570 					...)                                                       \
6571 	DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...)
6572 
6573 #define DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6574 					ARG3_TYPE, ...)                                            \
6575 	typedef struct FUNCNAME##_Fake {                                                           \
6576 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6577 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6578 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6579 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
6580 		DECLARE_ALL_FUNC_COMMON                                                            \
6581 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6582 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6583 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6584 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
6585 					     ARG2_TYPE, ARG3_TYPE, va_list ap);                    \
6586 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
6587 					     ARG2_TYPE, ARG3_TYPE, va_list ap);                    \
6588 	} FUNCNAME##_Fake;                                                                         \
6589 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6590 	void FUNCNAME##_reset(void);                                                               \
6591 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6592 							 ARG2_TYPE arg2, ARG3_TYPE arg3, ...);
6593 
6594 #define DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6595 				       ARG3_TYPE, ...)                                             \
6596 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6597 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6598 							 ARG2_TYPE arg2, ARG3_TYPE arg3, ...)      \
6599 	{                                                                                          \
6600 		SAVE_ARG(FUNCNAME, 0);                                                             \
6601 		SAVE_ARG(FUNCNAME, 1);                                                             \
6602 		SAVE_ARG(FUNCNAME, 2);                                                             \
6603 		SAVE_ARG(FUNCNAME, 3);                                                             \
6604 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6605 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6606 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6607 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
6608 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
6609 		} else {                                                                           \
6610 			HISTORY_DROPPED(FUNCNAME);                                                 \
6611 		}                                                                                  \
6612 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6613 		REGISTER_CALL(FUNCNAME);                                                           \
6614 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6615 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6616 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6617 				va_list ap;                                                        \
6618 				va_start(ap, arg3);                                                \
6619 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
6620 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
6621 								  arg0, arg1, arg2, arg3, ap);     \
6622 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6623 				va_end(ap);                                                        \
6624 				return ret;                                                        \
6625 			} else {                                                                   \
6626 				va_list ap;                                                        \
6627 				va_start(ap, arg3);                                                \
6628 				RETURN_TYPE ret =                                                  \
6629 					FUNCNAME##_fake.custom_fake_seq                            \
6630 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
6631 							arg0, arg1, arg2, arg3, ap);               \
6632 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6633 				va_end(ap);                                                        \
6634 				return ret;                                                        \
6635 				return FUNCNAME##_fake                                             \
6636 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6637 						arg0, arg1, arg2, arg3, ap);                       \
6638 			}                                                                          \
6639 		}                                                                                  \
6640 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6641 			RETURN_TYPE ret;                                                           \
6642 			va_list ap;                                                                \
6643 			va_start(ap, arg3);                                                        \
6644 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap);             \
6645 			va_end(ap);                                                                \
6646 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
6647 			return ret;                                                                \
6648 		}                                                                                  \
6649 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
6650 	}                                                                                          \
6651 	DEFINE_RESET_FUNCTION(FUNCNAME)
6652 
6653 #define FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
6654 				...)                                                               \
6655 	DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6656 					ARG3_TYPE, ...)                                            \
6657 	DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6658 				       ARG3_TYPE, ...)
6659 
6660 #define DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6661 					ARG3_TYPE, ARG4_TYPE, ...)                                 \
6662 	typedef struct FUNCNAME##_Fake {                                                           \
6663 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6664 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6665 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6666 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
6667 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
6668 		DECLARE_ALL_FUNC_COMMON                                                            \
6669 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6670 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6671 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6672 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
6673 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, va_list ap);         \
6674 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
6675 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, va_list ap);         \
6676 	} FUNCNAME##_Fake;                                                                         \
6677 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6678 	void FUNCNAME##_reset(void);                                                               \
6679 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6680 							 ARG2_TYPE arg2, ARG3_TYPE arg3,           \
6681 							 ARG4_TYPE arg4, ...);
6682 
6683 #define DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6684 				       ARG3_TYPE, ARG4_TYPE, ...)                                  \
6685 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6686 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6687 							 ARG2_TYPE arg2, ARG3_TYPE arg3,           \
6688 							 ARG4_TYPE arg4, ...)                      \
6689 	{                                                                                          \
6690 		SAVE_ARG(FUNCNAME, 0);                                                             \
6691 		SAVE_ARG(FUNCNAME, 1);                                                             \
6692 		SAVE_ARG(FUNCNAME, 2);                                                             \
6693 		SAVE_ARG(FUNCNAME, 3);                                                             \
6694 		SAVE_ARG(FUNCNAME, 4);                                                             \
6695 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6696 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6697 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6698 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
6699 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
6700 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
6701 		} else {                                                                           \
6702 			HISTORY_DROPPED(FUNCNAME);                                                 \
6703 		}                                                                                  \
6704 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6705 		REGISTER_CALL(FUNCNAME);                                                           \
6706 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6707 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6708 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6709 				va_list ap;                                                        \
6710 				va_start(ap, arg4);                                                \
6711 				RETURN_TYPE ret =                                                  \
6712 					FUNCNAME##_fake.custom_fake_seq                            \
6713 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
6714 							arg0, arg1, arg2, arg3, arg4, ap);         \
6715 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6716 				va_end(ap);                                                        \
6717 				return ret;                                                        \
6718 			} else {                                                                   \
6719 				va_list ap;                                                        \
6720 				va_start(ap, arg4);                                                \
6721 				RETURN_TYPE ret =                                                  \
6722 					FUNCNAME##_fake.custom_fake_seq                            \
6723 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
6724 							arg0, arg1, arg2, arg3, arg4, ap);         \
6725 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6726 				va_end(ap);                                                        \
6727 				return ret;                                                        \
6728 				return FUNCNAME##_fake                                             \
6729 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6730 						arg0, arg1, arg2, arg3, arg4, ap);                 \
6731 			}                                                                          \
6732 		}                                                                                  \
6733 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6734 			RETURN_TYPE ret;                                                           \
6735 			va_list ap;                                                                \
6736 			va_start(ap, arg4);                                                        \
6737 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap);       \
6738 			va_end(ap);                                                                \
6739 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
6740 			return ret;                                                                \
6741 		}                                                                                  \
6742 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
6743 	}                                                                                          \
6744 	DEFINE_RESET_FUNCTION(FUNCNAME)
6745 
6746 #define FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
6747 				ARG4_TYPE, ...)                                                    \
6748 	DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6749 					ARG3_TYPE, ARG4_TYPE, ...)                                 \
6750 	DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6751 				       ARG3_TYPE, ARG4_TYPE, ...)
6752 
6753 #define DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6754 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...)                      \
6755 	typedef struct FUNCNAME##_Fake {                                                           \
6756 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6757 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6758 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6759 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
6760 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
6761 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
6762 		DECLARE_ALL_FUNC_COMMON                                                            \
6763 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6764 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6765 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6766 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
6767 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6768 					     va_list ap);                                          \
6769 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
6770 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6771 					     va_list ap);                                          \
6772 	} FUNCNAME##_Fake;                                                                         \
6773 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6774 	void FUNCNAME##_reset(void);                                                               \
6775 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6776 							 ARG2_TYPE arg2, ARG3_TYPE arg3,           \
6777 							 ARG4_TYPE arg4, ARG5_TYPE arg5, ...);
6778 
6779 #define DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6780 				       ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...)                       \
6781 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6782 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1,           \
6783 							 ARG2_TYPE arg2, ARG3_TYPE arg3,           \
6784 							 ARG4_TYPE arg4, ARG5_TYPE arg5, ...)      \
6785 	{                                                                                          \
6786 		SAVE_ARG(FUNCNAME, 0);                                                             \
6787 		SAVE_ARG(FUNCNAME, 1);                                                             \
6788 		SAVE_ARG(FUNCNAME, 2);                                                             \
6789 		SAVE_ARG(FUNCNAME, 3);                                                             \
6790 		SAVE_ARG(FUNCNAME, 4);                                                             \
6791 		SAVE_ARG(FUNCNAME, 5);                                                             \
6792 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6793 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6794 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6795 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
6796 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
6797 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
6798 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
6799 		} else {                                                                           \
6800 			HISTORY_DROPPED(FUNCNAME);                                                 \
6801 		}                                                                                  \
6802 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6803 		REGISTER_CALL(FUNCNAME);                                                           \
6804 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6805 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6806 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6807 				va_list ap;                                                        \
6808 				va_start(ap, arg5);                                                \
6809 				RETURN_TYPE ret =                                                  \
6810 					FUNCNAME##_fake.custom_fake_seq                            \
6811 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
6812 							arg0, arg1, arg2, arg3, arg4, arg5, ap);   \
6813 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6814 				va_end(ap);                                                        \
6815 				return ret;                                                        \
6816 			} else {                                                                   \
6817 				va_list ap;                                                        \
6818 				va_start(ap, arg5);                                                \
6819 				RETURN_TYPE ret =                                                  \
6820 					FUNCNAME##_fake.custom_fake_seq                            \
6821 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
6822 							arg0, arg1, arg2, arg3, arg4, arg5, ap);   \
6823 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6824 				va_end(ap);                                                        \
6825 				return ret;                                                        \
6826 				return FUNCNAME##_fake                                             \
6827 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6828 						arg0, arg1, arg2, arg3, arg4, arg5, ap);           \
6829 			}                                                                          \
6830 		}                                                                                  \
6831 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6832 			RETURN_TYPE ret;                                                           \
6833 			va_list ap;                                                                \
6834 			va_start(ap, arg5);                                                        \
6835 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap); \
6836 			va_end(ap);                                                                \
6837 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
6838 			return ret;                                                                \
6839 		}                                                                                  \
6840 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
6841 	}                                                                                          \
6842 	DEFINE_RESET_FUNCTION(FUNCNAME)
6843 
6844 #define FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
6845 				ARG4_TYPE, ARG5_TYPE, ...)                                         \
6846 	DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6847 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...)                      \
6848 	DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6849 				       ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...)
6850 
6851 #define DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6852 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)           \
6853 	typedef struct FUNCNAME##_Fake {                                                           \
6854 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6855 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6856 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6857 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
6858 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
6859 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
6860 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
6861 		DECLARE_ALL_FUNC_COMMON                                                            \
6862 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6863 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6864 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6865 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
6866 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6867 					     ARG6_TYPE, va_list ap);                               \
6868 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
6869 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6870 					     ARG6_TYPE, va_list ap);                               \
6871 	} FUNCNAME##_Fake;                                                                         \
6872 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6873 	void FUNCNAME##_reset(void);                                                               \
6874 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
6875 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6876 		ARG5_TYPE arg5, ARG6_TYPE arg6, ...);
6877 
6878 #define DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6879 				       ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)            \
6880 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6881 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
6882 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6883 		ARG5_TYPE arg5, ARG6_TYPE arg6, ...)                                               \
6884 	{                                                                                          \
6885 		SAVE_ARG(FUNCNAME, 0);                                                             \
6886 		SAVE_ARG(FUNCNAME, 1);                                                             \
6887 		SAVE_ARG(FUNCNAME, 2);                                                             \
6888 		SAVE_ARG(FUNCNAME, 3);                                                             \
6889 		SAVE_ARG(FUNCNAME, 4);                                                             \
6890 		SAVE_ARG(FUNCNAME, 5);                                                             \
6891 		SAVE_ARG(FUNCNAME, 6);                                                             \
6892 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6893 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
6894 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
6895 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
6896 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
6897 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
6898 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
6899 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
6900 		} else {                                                                           \
6901 			HISTORY_DROPPED(FUNCNAME);                                                 \
6902 		}                                                                                  \
6903 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
6904 		REGISTER_CALL(FUNCNAME);                                                           \
6905 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
6906 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
6907 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
6908 				va_list ap;                                                        \
6909 				va_start(ap, arg6);                                                \
6910 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
6911 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
6912 								  arg0, arg1, arg2, arg3, arg4,    \
6913 								  arg5, arg6, ap);                 \
6914 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6915 				va_end(ap);                                                        \
6916 				return ret;                                                        \
6917 			} else {                                                                   \
6918 				va_list ap;                                                        \
6919 				va_start(ap, arg6);                                                \
6920 				RETURN_TYPE ret =                                                  \
6921 					FUNCNAME##_fake.custom_fake_seq                            \
6922 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
6923 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
6924 							ap);                                       \
6925 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
6926 				va_end(ap);                                                        \
6927 				return ret;                                                        \
6928 				return FUNCNAME##_fake                                             \
6929 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
6930 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap);     \
6931 			}                                                                          \
6932 		}                                                                                  \
6933 		if (FUNCNAME##_fake.custom_fake) {                                                 \
6934 			RETURN_TYPE ret;                                                           \
6935 			va_list ap;                                                                \
6936 			va_start(ap, arg6);                                                        \
6937 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
6938 							  arg6, ap);                               \
6939 			va_end(ap);                                                                \
6940 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
6941 			return ret;                                                                \
6942 		}                                                                                  \
6943 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
6944 	}                                                                                          \
6945 	DEFINE_RESET_FUNCTION(FUNCNAME)
6946 
6947 #define FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
6948 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)                              \
6949 	DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6950 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)           \
6951 	DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6952 				       ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...)
6953 
6954 #define DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
6955 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
6956 					...)                                                       \
6957 	typedef struct FUNCNAME##_Fake {                                                           \
6958 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
6959 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
6960 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
6961 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
6962 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
6963 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
6964 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
6965 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
6966 		DECLARE_ALL_FUNC_COMMON                                                            \
6967 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
6968 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
6969 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
6970 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
6971 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6972 					     ARG6_TYPE, ARG7_TYPE, va_list ap);                    \
6973 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
6974 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
6975 					     ARG6_TYPE, ARG7_TYPE, va_list ap);                    \
6976 	} FUNCNAME##_Fake;                                                                         \
6977 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
6978 	void FUNCNAME##_reset(void);                                                               \
6979 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
6980 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6981 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...);
6982 
6983 #define DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
6984 				       ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
6985 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
6986 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
6987 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
6988 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...)                               \
6989 	{                                                                                          \
6990 		SAVE_ARG(FUNCNAME, 0);                                                             \
6991 		SAVE_ARG(FUNCNAME, 1);                                                             \
6992 		SAVE_ARG(FUNCNAME, 2);                                                             \
6993 		SAVE_ARG(FUNCNAME, 3);                                                             \
6994 		SAVE_ARG(FUNCNAME, 4);                                                             \
6995 		SAVE_ARG(FUNCNAME, 5);                                                             \
6996 		SAVE_ARG(FUNCNAME, 6);                                                             \
6997 		SAVE_ARG(FUNCNAME, 7);                                                             \
6998 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
6999 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7000 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7001 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7002 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7003 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7004 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7005 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7006 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7007 		} else {                                                                           \
7008 			HISTORY_DROPPED(FUNCNAME);                                                 \
7009 		}                                                                                  \
7010 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7011 		REGISTER_CALL(FUNCNAME);                                                           \
7012 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7013 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7014 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7015 				va_list ap;                                                        \
7016 				va_start(ap, arg7);                                                \
7017 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
7018 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
7019 								  arg0, arg1, arg2, arg3, arg4,    \
7020 								  arg5, arg6, arg7, ap);           \
7021 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7022 				va_end(ap);                                                        \
7023 				return ret;                                                        \
7024 			} else {                                                                   \
7025 				va_list ap;                                                        \
7026 				va_start(ap, arg7);                                                \
7027 				RETURN_TYPE ret =                                                  \
7028 					FUNCNAME##_fake.custom_fake_seq                            \
7029 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7030 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7031 							arg7, ap);                                 \
7032 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7033 				va_end(ap);                                                        \
7034 				return ret;                                                        \
7035 				return FUNCNAME##_fake                                             \
7036 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7037 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7038 						ap);                                               \
7039 			}                                                                          \
7040 		}                                                                                  \
7041 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7042 			RETURN_TYPE ret;                                                           \
7043 			va_list ap;                                                                \
7044 			va_start(ap, arg7);                                                        \
7045 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7046 							  arg6, arg7, ap);                         \
7047 			va_end(ap);                                                                \
7048 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7049 			return ret;                                                                \
7050 		}                                                                                  \
7051 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7052 	}                                                                                          \
7053 	DEFINE_RESET_FUNCTION(FUNCNAME)
7054 
7055 #define FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, \
7056 				ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...)                   \
7057 	DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7058 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7059 					...)                                                       \
7060 	DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,     \
7061 				       ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...)
7062 
7063 #define DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7064 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7065 					 ARG8_TYPE, ...)                                           \
7066 	typedef struct FUNCNAME##_Fake {                                                           \
7067 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7068 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7069 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7070 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7071 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7072 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7073 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7074 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
7075 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
7076 		DECLARE_ALL_FUNC_COMMON                                                            \
7077 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
7078 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
7079 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
7080 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
7081 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7082 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, va_list ap);         \
7083 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
7084 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7085 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, va_list ap);         \
7086 	} FUNCNAME##_Fake;                                                                         \
7087 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
7088 	void FUNCNAME##_reset(void);                                                               \
7089 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7090 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7091 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...);
7092 
7093 #define DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7094 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7095 					ARG8_TYPE, ...)                                            \
7096 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
7097 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7098 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7099 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...)               \
7100 	{                                                                                          \
7101 		SAVE_ARG(FUNCNAME, 0);                                                             \
7102 		SAVE_ARG(FUNCNAME, 1);                                                             \
7103 		SAVE_ARG(FUNCNAME, 2);                                                             \
7104 		SAVE_ARG(FUNCNAME, 3);                                                             \
7105 		SAVE_ARG(FUNCNAME, 4);                                                             \
7106 		SAVE_ARG(FUNCNAME, 5);                                                             \
7107 		SAVE_ARG(FUNCNAME, 6);                                                             \
7108 		SAVE_ARG(FUNCNAME, 7);                                                             \
7109 		SAVE_ARG(FUNCNAME, 8);                                                             \
7110 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
7111 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7112 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7113 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7114 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7115 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7116 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7117 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7118 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7119 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
7120 		} else {                                                                           \
7121 			HISTORY_DROPPED(FUNCNAME);                                                 \
7122 		}                                                                                  \
7123 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7124 		REGISTER_CALL(FUNCNAME);                                                           \
7125 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7126 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7127 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7128 				va_list ap;                                                        \
7129 				va_start(ap, arg8);                                                \
7130 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
7131 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
7132 								  arg0, arg1, arg2, arg3, arg4,    \
7133 								  arg5, arg6, arg7, arg8, ap);     \
7134 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7135 				va_end(ap);                                                        \
7136 				return ret;                                                        \
7137 			} else {                                                                   \
7138 				va_list ap;                                                        \
7139 				va_start(ap, arg8);                                                \
7140 				RETURN_TYPE ret =                                                  \
7141 					FUNCNAME##_fake.custom_fake_seq                            \
7142 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7143 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7144 							arg7, arg8, ap);                           \
7145 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7146 				va_end(ap);                                                        \
7147 				return ret;                                                        \
7148 				return FUNCNAME##_fake                                             \
7149 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7150 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7151 						arg8, ap);                                         \
7152 			}                                                                          \
7153 		}                                                                                  \
7154 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7155 			RETURN_TYPE ret;                                                           \
7156 			va_list ap;                                                                \
7157 			va_start(ap, arg8);                                                        \
7158 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7159 							  arg6, arg7, arg8, ap);                   \
7160 			va_end(ap);                                                                \
7161 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7162 			return ret;                                                                \
7163 		}                                                                                  \
7164 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7165 	}                                                                                          \
7166 	DEFINE_RESET_FUNCTION(FUNCNAME)
7167 
7168 #define FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
7169 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
7170 				 ...)                                                              \
7171 	DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7172 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7173 					 ARG8_TYPE, ...)                                           \
7174 	DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7175 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7176 					ARG8_TYPE, ...)
7177 
7178 #define DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7179 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7180 					 ARG8_TYPE, ARG9_TYPE, ...)                                \
7181 	typedef struct FUNCNAME##_Fake {                                                           \
7182 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7183 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7184 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7185 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7186 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7187 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7188 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7189 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
7190 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
7191 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
7192 		DECLARE_ALL_FUNC_COMMON                                                            \
7193 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
7194 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
7195 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
7196 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
7197 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7198 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7199 					     va_list ap);                                          \
7200 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
7201 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7202 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7203 					     va_list ap);                                          \
7204 	} FUNCNAME##_Fake;                                                                         \
7205 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
7206 	void FUNCNAME##_reset(void);                                                               \
7207 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7208 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7209 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7210 		...);
7211 
7212 #define DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7213 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7214 					ARG8_TYPE, ARG9_TYPE, ...)                                 \
7215 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
7216 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7217 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7218 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7219 		...)                                                                               \
7220 	{                                                                                          \
7221 		SAVE_ARG(FUNCNAME, 0);                                                             \
7222 		SAVE_ARG(FUNCNAME, 1);                                                             \
7223 		SAVE_ARG(FUNCNAME, 2);                                                             \
7224 		SAVE_ARG(FUNCNAME, 3);                                                             \
7225 		SAVE_ARG(FUNCNAME, 4);                                                             \
7226 		SAVE_ARG(FUNCNAME, 5);                                                             \
7227 		SAVE_ARG(FUNCNAME, 6);                                                             \
7228 		SAVE_ARG(FUNCNAME, 7);                                                             \
7229 		SAVE_ARG(FUNCNAME, 8);                                                             \
7230 		SAVE_ARG(FUNCNAME, 9);                                                             \
7231 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
7232 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7233 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7234 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7235 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7236 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7237 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7238 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7239 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7240 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
7241 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
7242 		} else {                                                                           \
7243 			HISTORY_DROPPED(FUNCNAME);                                                 \
7244 		}                                                                                  \
7245 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7246 		REGISTER_CALL(FUNCNAME);                                                           \
7247 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7248 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7249 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7250 				va_list ap;                                                        \
7251 				va_start(ap, arg9);                                                \
7252 				RETURN_TYPE ret =                                                  \
7253 					FUNCNAME##_fake.custom_fake_seq                            \
7254 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
7255 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7256 							arg7, arg8, arg9, ap);                     \
7257 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7258 				va_end(ap);                                                        \
7259 				return ret;                                                        \
7260 			} else {                                                                   \
7261 				va_list ap;                                                        \
7262 				va_start(ap, arg9);                                                \
7263 				RETURN_TYPE ret =                                                  \
7264 					FUNCNAME##_fake.custom_fake_seq                            \
7265 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7266 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7267 							arg7, arg8, arg9, ap);                     \
7268 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7269 				va_end(ap);                                                        \
7270 				return ret;                                                        \
7271 				return FUNCNAME##_fake                                             \
7272 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7273 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7274 						arg8, arg9, ap);                                   \
7275 			}                                                                          \
7276 		}                                                                                  \
7277 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7278 			RETURN_TYPE ret;                                                           \
7279 			va_list ap;                                                                \
7280 			va_start(ap, arg9);                                                        \
7281 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7282 							  arg6, arg7, arg8, arg9, ap);             \
7283 			va_end(ap);                                                                \
7284 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7285 			return ret;                                                                \
7286 		}                                                                                  \
7287 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7288 	}                                                                                          \
7289 	DEFINE_RESET_FUNCTION(FUNCNAME)
7290 
7291 #define FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
7292 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
7293 				 ARG9_TYPE, ...)                                                   \
7294 	DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7295 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7296 					 ARG8_TYPE, ARG9_TYPE, ...)                                \
7297 	DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7298 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7299 					ARG8_TYPE, ARG9_TYPE, ...)
7300 
7301 #define DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7302 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7303 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...)                    \
7304 	typedef struct FUNCNAME##_Fake {                                                           \
7305 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7306 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7307 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7308 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7309 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7310 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7311 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7312 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
7313 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
7314 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
7315 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
7316 		DECLARE_ALL_FUNC_COMMON                                                            \
7317 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
7318 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
7319 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
7320 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
7321 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7322 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7323 					     ARG10_TYPE, va_list ap);                              \
7324 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
7325 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7326 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7327 					     ARG10_TYPE, va_list ap);                              \
7328 	} FUNCNAME##_Fake;                                                                         \
7329 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
7330 	void FUNCNAME##_reset(void);                                                               \
7331 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7332 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7333 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7334 		ARG10_TYPE arg10, ...);
7335 
7336 #define DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7337 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7338 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...)                     \
7339 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
7340 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7341 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7342 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7343 		ARG10_TYPE arg10, ...)                                                             \
7344 	{                                                                                          \
7345 		SAVE_ARG(FUNCNAME, 0);                                                             \
7346 		SAVE_ARG(FUNCNAME, 1);                                                             \
7347 		SAVE_ARG(FUNCNAME, 2);                                                             \
7348 		SAVE_ARG(FUNCNAME, 3);                                                             \
7349 		SAVE_ARG(FUNCNAME, 4);                                                             \
7350 		SAVE_ARG(FUNCNAME, 5);                                                             \
7351 		SAVE_ARG(FUNCNAME, 6);                                                             \
7352 		SAVE_ARG(FUNCNAME, 7);                                                             \
7353 		SAVE_ARG(FUNCNAME, 8);                                                             \
7354 		SAVE_ARG(FUNCNAME, 9);                                                             \
7355 		SAVE_ARG(FUNCNAME, 10);                                                            \
7356 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
7357 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7358 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7359 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7360 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7361 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7362 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7363 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7364 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7365 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
7366 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
7367 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
7368 		} else {                                                                           \
7369 			HISTORY_DROPPED(FUNCNAME);                                                 \
7370 		}                                                                                  \
7371 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7372 		REGISTER_CALL(FUNCNAME);                                                           \
7373 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7374 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7375 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7376 				va_list ap;                                                        \
7377 				va_start(ap, arg10);                                               \
7378 				RETURN_TYPE ret =                                                  \
7379 					FUNCNAME##_fake.custom_fake_seq                            \
7380 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
7381 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7382 							arg7, arg8, arg9, arg10, ap);              \
7383 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7384 				va_end(ap);                                                        \
7385 				return ret;                                                        \
7386 			} else {                                                                   \
7387 				va_list ap;                                                        \
7388 				va_start(ap, arg10);                                               \
7389 				RETURN_TYPE ret =                                                  \
7390 					FUNCNAME##_fake.custom_fake_seq                            \
7391 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7392 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7393 							arg7, arg8, arg9, arg10, ap);              \
7394 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7395 				va_end(ap);                                                        \
7396 				return ret;                                                        \
7397 				return FUNCNAME##_fake                                             \
7398 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7399 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7400 						arg8, arg9, arg10, ap);                            \
7401 			}                                                                          \
7402 		}                                                                                  \
7403 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7404 			RETURN_TYPE ret;                                                           \
7405 			va_list ap;                                                                \
7406 			va_start(ap, arg10);                                                       \
7407 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7408 							  arg6, arg7, arg8, arg9, arg10, ap);      \
7409 			va_end(ap);                                                                \
7410 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7411 			return ret;                                                                \
7412 		}                                                                                  \
7413 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7414 	}                                                                                          \
7415 	DEFINE_RESET_FUNCTION(FUNCNAME)
7416 
7417 #define FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
7418 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
7419 				 ARG9_TYPE, ARG10_TYPE, ...)                                       \
7420 	DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7421 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7422 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...)                    \
7423 	DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7424 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7425 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...)
7426 
7427 #define DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7428 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7429 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)        \
7430 	typedef struct FUNCNAME##_Fake {                                                           \
7431 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7432 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7433 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7434 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7435 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7436 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7437 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7438 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
7439 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
7440 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
7441 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
7442 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
7443 		DECLARE_ALL_FUNC_COMMON                                                            \
7444 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
7445 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
7446 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
7447 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
7448 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7449 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7450 					     ARG10_TYPE, ARG11_TYPE, va_list ap);                  \
7451 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
7452 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7453 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7454 					     ARG10_TYPE, ARG11_TYPE, va_list ap);                  \
7455 	} FUNCNAME##_Fake;                                                                         \
7456 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
7457 	void FUNCNAME##_reset(void);                                                               \
7458 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7459 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7460 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7461 		ARG10_TYPE arg10, ARG11_TYPE arg11, ...);
7462 
7463 #define DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7464 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7465 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)         \
7466 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
7467 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7468 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7469 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7470 		ARG10_TYPE arg10, ARG11_TYPE arg11, ...)                                           \
7471 	{                                                                                          \
7472 		SAVE_ARG(FUNCNAME, 0);                                                             \
7473 		SAVE_ARG(FUNCNAME, 1);                                                             \
7474 		SAVE_ARG(FUNCNAME, 2);                                                             \
7475 		SAVE_ARG(FUNCNAME, 3);                                                             \
7476 		SAVE_ARG(FUNCNAME, 4);                                                             \
7477 		SAVE_ARG(FUNCNAME, 5);                                                             \
7478 		SAVE_ARG(FUNCNAME, 6);                                                             \
7479 		SAVE_ARG(FUNCNAME, 7);                                                             \
7480 		SAVE_ARG(FUNCNAME, 8);                                                             \
7481 		SAVE_ARG(FUNCNAME, 9);                                                             \
7482 		SAVE_ARG(FUNCNAME, 10);                                                            \
7483 		SAVE_ARG(FUNCNAME, 11);                                                            \
7484 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
7485 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7486 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7487 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7488 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7489 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7490 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7491 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7492 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7493 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
7494 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
7495 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
7496 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
7497 		} else {                                                                           \
7498 			HISTORY_DROPPED(FUNCNAME);                                                 \
7499 		}                                                                                  \
7500 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7501 		REGISTER_CALL(FUNCNAME);                                                           \
7502 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7503 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7504 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7505 				va_list ap;                                                        \
7506 				va_start(ap, arg11);                                               \
7507 				RETURN_TYPE ret =                                                  \
7508 					FUNCNAME##_fake.custom_fake_seq                            \
7509 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
7510 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7511 							arg7, arg8, arg9, arg10, arg11, ap);       \
7512 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7513 				va_end(ap);                                                        \
7514 				return ret;                                                        \
7515 			} else {                                                                   \
7516 				va_list ap;                                                        \
7517 				va_start(ap, arg11);                                               \
7518 				RETURN_TYPE ret =                                                  \
7519 					FUNCNAME##_fake.custom_fake_seq                            \
7520 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7521 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7522 							arg7, arg8, arg9, arg10, arg11, ap);       \
7523 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7524 				va_end(ap);                                                        \
7525 				return ret;                                                        \
7526 				return FUNCNAME##_fake                                             \
7527 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7528 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7529 						arg8, arg9, arg10, arg11, ap);                     \
7530 			}                                                                          \
7531 		}                                                                                  \
7532 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7533 			RETURN_TYPE ret;                                                           \
7534 			va_list ap;                                                                \
7535 			va_start(ap, arg11);                                                       \
7536 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7537 							  arg6, arg7, arg8, arg9, arg10, arg11,    \
7538 							  ap);                                     \
7539 			va_end(ap);                                                                \
7540 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7541 			return ret;                                                                \
7542 		}                                                                                  \
7543 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7544 	}                                                                                          \
7545 	DEFINE_RESET_FUNCTION(FUNCNAME)
7546 
7547 #define FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
7548 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
7549 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)                           \
7550 	DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7551 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7552 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)        \
7553 	DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7554 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7555 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...)
7556 
7557 #define DECLARE_FAKE_VALUE_FUNC14_VARARG(                                                          \
7558 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
7559 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...)       \
7560 	typedef struct FUNCNAME##_Fake {                                                           \
7561 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7562 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7563 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7564 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7565 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7566 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7567 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7568 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
7569 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
7570 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
7571 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
7572 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
7573 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
7574 		DECLARE_ALL_FUNC_COMMON                                                            \
7575 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
7576 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
7577 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
7578 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
7579 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7580 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7581 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, va_list ap);      \
7582 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
7583 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7584 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7585 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, va_list ap);      \
7586 	} FUNCNAME##_Fake;                                                                         \
7587 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
7588 	void FUNCNAME##_reset(void);                                                               \
7589 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7590 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7591 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7592 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...);
7593 
7594 #define DEFINE_FAKE_VALUE_FUNC14_VARARG(                                                           \
7595 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
7596 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...)       \
7597 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
7598 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7599 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7600 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7601 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...)                         \
7602 	{                                                                                          \
7603 		SAVE_ARG(FUNCNAME, 0);                                                             \
7604 		SAVE_ARG(FUNCNAME, 1);                                                             \
7605 		SAVE_ARG(FUNCNAME, 2);                                                             \
7606 		SAVE_ARG(FUNCNAME, 3);                                                             \
7607 		SAVE_ARG(FUNCNAME, 4);                                                             \
7608 		SAVE_ARG(FUNCNAME, 5);                                                             \
7609 		SAVE_ARG(FUNCNAME, 6);                                                             \
7610 		SAVE_ARG(FUNCNAME, 7);                                                             \
7611 		SAVE_ARG(FUNCNAME, 8);                                                             \
7612 		SAVE_ARG(FUNCNAME, 9);                                                             \
7613 		SAVE_ARG(FUNCNAME, 10);                                                            \
7614 		SAVE_ARG(FUNCNAME, 11);                                                            \
7615 		SAVE_ARG(FUNCNAME, 12);                                                            \
7616 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
7617 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7618 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7619 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7620 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7621 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7622 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7623 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7624 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7625 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
7626 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
7627 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
7628 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
7629 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
7630 		} else {                                                                           \
7631 			HISTORY_DROPPED(FUNCNAME);                                                 \
7632 		}                                                                                  \
7633 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7634 		REGISTER_CALL(FUNCNAME);                                                           \
7635 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7636 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7637 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7638 				va_list ap;                                                        \
7639 				va_start(ap, arg12);                                               \
7640 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
7641 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
7642 								  arg0, arg1, arg2, arg3, arg4,    \
7643 								  arg5, arg6, arg7, arg8, arg9,    \
7644 								  arg10, arg11, arg12, ap);        \
7645 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7646 				va_end(ap);                                                        \
7647 				return ret;                                                        \
7648 			} else {                                                                   \
7649 				va_list ap;                                                        \
7650 				va_start(ap, arg12);                                               \
7651 				RETURN_TYPE ret =                                                  \
7652 					FUNCNAME##_fake.custom_fake_seq                            \
7653 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7654 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7655 							arg7, arg8, arg9, arg10, arg11, arg12,     \
7656 							ap);                                       \
7657 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7658 				va_end(ap);                                                        \
7659 				return ret;                                                        \
7660 				return FUNCNAME##_fake                                             \
7661 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7662 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7663 						arg8, arg9, arg10, arg11, arg12, ap);              \
7664 			}                                                                          \
7665 		}                                                                                  \
7666 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7667 			RETURN_TYPE ret;                                                           \
7668 			va_list ap;                                                                \
7669 			va_start(ap, arg12);                                                       \
7670 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7671 							  arg6, arg7, arg8, arg9, arg10, arg11,    \
7672 							  arg12, ap);                              \
7673 			va_end(ap);                                                                \
7674 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7675 			return ret;                                                                \
7676 		}                                                                                  \
7677 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7678 	}                                                                                          \
7679 	DEFINE_RESET_FUNCTION(FUNCNAME)
7680 
7681 #define FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
7682 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
7683 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...)               \
7684 	DECLARE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7685 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7686 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
7687 					 ...)                                                      \
7688 	DEFINE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7689 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7690 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
7691 					...)
7692 
7693 #define DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7694 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7695 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
7696 					 ARG13_TYPE, ...)                                          \
7697 	typedef struct FUNCNAME##_Fake {                                                           \
7698 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7699 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7700 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7701 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7702 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7703 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7704 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7705 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
7706 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
7707 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
7708 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
7709 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
7710 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
7711 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
7712 		DECLARE_ALL_FUNC_COMMON                                                            \
7713 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
7714 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
7715 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
7716 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
7717 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7718 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7719 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
7720 					     va_list ap);                                          \
7721 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
7722 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7723 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7724 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
7725 					     va_list ap);                                          \
7726 	} FUNCNAME##_Fake;                                                                         \
7727 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
7728 	void FUNCNAME##_reset(void);                                                               \
7729 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7730 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7731 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7732 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...);
7733 
7734 #define DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7735 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7736 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
7737 					ARG13_TYPE, ...)                                           \
7738 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
7739 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7740 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7741 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7742 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...)       \
7743 	{                                                                                          \
7744 		SAVE_ARG(FUNCNAME, 0);                                                             \
7745 		SAVE_ARG(FUNCNAME, 1);                                                             \
7746 		SAVE_ARG(FUNCNAME, 2);                                                             \
7747 		SAVE_ARG(FUNCNAME, 3);                                                             \
7748 		SAVE_ARG(FUNCNAME, 4);                                                             \
7749 		SAVE_ARG(FUNCNAME, 5);                                                             \
7750 		SAVE_ARG(FUNCNAME, 6);                                                             \
7751 		SAVE_ARG(FUNCNAME, 7);                                                             \
7752 		SAVE_ARG(FUNCNAME, 8);                                                             \
7753 		SAVE_ARG(FUNCNAME, 9);                                                             \
7754 		SAVE_ARG(FUNCNAME, 10);                                                            \
7755 		SAVE_ARG(FUNCNAME, 11);                                                            \
7756 		SAVE_ARG(FUNCNAME, 12);                                                            \
7757 		SAVE_ARG(FUNCNAME, 13);                                                            \
7758 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
7759 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7760 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7761 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7762 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7763 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7764 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7765 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7766 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7767 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
7768 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
7769 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
7770 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
7771 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
7772 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
7773 		} else {                                                                           \
7774 			HISTORY_DROPPED(FUNCNAME);                                                 \
7775 		}                                                                                  \
7776 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7777 		REGISTER_CALL(FUNCNAME);                                                           \
7778 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7779 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7780 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7781 				va_list ap;                                                        \
7782 				va_start(ap, arg13);                                               \
7783 				RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq                  \
7784 							  [FUNCNAME##_fake.custom_fake_seq_idx++]( \
7785 								  arg0, arg1, arg2, arg3, arg4,    \
7786 								  arg5, arg6, arg7, arg8, arg9,    \
7787 								  arg10, arg11, arg12, arg13, ap); \
7788 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7789 				va_end(ap);                                                        \
7790 				return ret;                                                        \
7791 			} else {                                                                   \
7792 				va_list ap;                                                        \
7793 				va_start(ap, arg13);                                               \
7794 				RETURN_TYPE ret =                                                  \
7795 					FUNCNAME##_fake.custom_fake_seq                            \
7796 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7797 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7798 							arg7, arg8, arg9, arg10, arg11, arg12,     \
7799 							arg13, ap);                                \
7800 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7801 				va_end(ap);                                                        \
7802 				return ret;                                                        \
7803 				return FUNCNAME##_fake                                             \
7804 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7805 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7806 						arg8, arg9, arg10, arg11, arg12, arg13, ap);       \
7807 			}                                                                          \
7808 		}                                                                                  \
7809 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7810 			RETURN_TYPE ret;                                                           \
7811 			va_list ap;                                                                \
7812 			va_start(ap, arg13);                                                       \
7813 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7814 							  arg6, arg7, arg8, arg9, arg10, arg11,    \
7815 							  arg12, arg13, ap);                       \
7816 			va_end(ap);                                                                \
7817 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7818 			return ret;                                                                \
7819 		}                                                                                  \
7820 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7821 	}                                                                                          \
7822 	DEFINE_RESET_FUNCTION(FUNCNAME)
7823 
7824 #define FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
7825 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
7826 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...)   \
7827 	DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7828 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7829 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
7830 					 ARG13_TYPE, ...)                                          \
7831 	DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7832 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7833 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
7834 					ARG13_TYPE, ...)
7835 
7836 #define DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7837 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7838 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
7839 					 ARG13_TYPE, ARG14_TYPE, ...)                              \
7840 	typedef struct FUNCNAME##_Fake {                                                           \
7841 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7842 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7843 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7844 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7845 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7846 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7847 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7848 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
7849 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
7850 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
7851 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
7852 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
7853 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
7854 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
7855 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
7856 		DECLARE_ALL_FUNC_COMMON                                                            \
7857 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
7858 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
7859 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
7860 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
7861 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7862 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7863 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
7864 					     ARG14_TYPE, va_list ap);                              \
7865 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
7866 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
7867 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
7868 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
7869 					     ARG14_TYPE, va_list ap);                              \
7870 	} FUNCNAME##_Fake;                                                                         \
7871 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
7872 	void FUNCNAME##_reset(void);                                                               \
7873 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7874 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7875 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7876 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
7877 		ARG14_TYPE arg14, ...);
7878 
7879 #define DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7880 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7881 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
7882 					ARG13_TYPE, ARG14_TYPE, ...)                               \
7883 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
7884 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
7885 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
7886 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
7887 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
7888 		ARG14_TYPE arg14, ...)                                                             \
7889 	{                                                                                          \
7890 		SAVE_ARG(FUNCNAME, 0);                                                             \
7891 		SAVE_ARG(FUNCNAME, 1);                                                             \
7892 		SAVE_ARG(FUNCNAME, 2);                                                             \
7893 		SAVE_ARG(FUNCNAME, 3);                                                             \
7894 		SAVE_ARG(FUNCNAME, 4);                                                             \
7895 		SAVE_ARG(FUNCNAME, 5);                                                             \
7896 		SAVE_ARG(FUNCNAME, 6);                                                             \
7897 		SAVE_ARG(FUNCNAME, 7);                                                             \
7898 		SAVE_ARG(FUNCNAME, 8);                                                             \
7899 		SAVE_ARG(FUNCNAME, 9);                                                             \
7900 		SAVE_ARG(FUNCNAME, 10);                                                            \
7901 		SAVE_ARG(FUNCNAME, 11);                                                            \
7902 		SAVE_ARG(FUNCNAME, 12);                                                            \
7903 		SAVE_ARG(FUNCNAME, 13);                                                            \
7904 		SAVE_ARG(FUNCNAME, 14);                                                            \
7905 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
7906 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
7907 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
7908 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
7909 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
7910 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
7911 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
7912 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
7913 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
7914 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
7915 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
7916 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
7917 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
7918 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
7919 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
7920 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
7921 		} else {                                                                           \
7922 			HISTORY_DROPPED(FUNCNAME);                                                 \
7923 		}                                                                                  \
7924 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
7925 		REGISTER_CALL(FUNCNAME);                                                           \
7926 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
7927 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
7928 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
7929 				va_list ap;                                                        \
7930 				va_start(ap, arg14);                                               \
7931 				RETURN_TYPE ret =                                                  \
7932 					FUNCNAME##_fake.custom_fake_seq                            \
7933 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
7934 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7935 							arg7, arg8, arg9, arg10, arg11, arg12,     \
7936 							arg13, arg14, ap);                         \
7937 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7938 				va_end(ap);                                                        \
7939 				return ret;                                                        \
7940 			} else {                                                                   \
7941 				va_list ap;                                                        \
7942 				va_start(ap, arg14);                                               \
7943 				RETURN_TYPE ret =                                                  \
7944 					FUNCNAME##_fake.custom_fake_seq                            \
7945 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
7946 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
7947 							arg7, arg8, arg9, arg10, arg11, arg12,     \
7948 							arg13, arg14, ap);                         \
7949 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
7950 				va_end(ap);                                                        \
7951 				return ret;                                                        \
7952 				return FUNCNAME##_fake                                             \
7953 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
7954 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
7955 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
7956 						ap);                                               \
7957 			}                                                                          \
7958 		}                                                                                  \
7959 		if (FUNCNAME##_fake.custom_fake) {                                                 \
7960 			RETURN_TYPE ret;                                                           \
7961 			va_list ap;                                                                \
7962 			va_start(ap, arg14);                                                       \
7963 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
7964 							  arg6, arg7, arg8, arg9, arg10, arg11,    \
7965 							  arg12, arg13, arg14, ap);                \
7966 			va_end(ap);                                                                \
7967 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
7968 			return ret;                                                                \
7969 		}                                                                                  \
7970 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
7971 	}                                                                                          \
7972 	DEFINE_RESET_FUNCTION(FUNCNAME)
7973 
7974 #define FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
7975 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
7976 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
7977 				 ARG14_TYPE, ...)                                                  \
7978 	DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7979 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7980 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
7981 					 ARG13_TYPE, ARG14_TYPE, ...)                              \
7982 	DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
7983 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
7984 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
7985 					ARG13_TYPE, ARG14_TYPE, ...)
7986 
7987 #define DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
7988 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
7989 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
7990 					 ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...)                  \
7991 	typedef struct FUNCNAME##_Fake {                                                           \
7992 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
7993 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
7994 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
7995 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
7996 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
7997 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
7998 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
7999 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
8000 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
8001 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
8002 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
8003 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
8004 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
8005 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
8006 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
8007 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
8008 		DECLARE_ALL_FUNC_COMMON                                                            \
8009 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
8010 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
8011 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
8012 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
8013 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8014 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8015 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8016 					     ARG14_TYPE, ARG15_TYPE, va_list ap);                  \
8017 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
8018 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8019 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8020 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8021 					     ARG14_TYPE, ARG15_TYPE, va_list ap);                  \
8022 	} FUNCNAME##_Fake;                                                                         \
8023 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
8024 	void FUNCNAME##_reset(void);                                                               \
8025 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8026 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8027 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8028 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8029 		ARG14_TYPE arg14, ARG15_TYPE arg15, ...);
8030 
8031 #define DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
8032 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
8033 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
8034 					ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...)                   \
8035 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
8036 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8037 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8038 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8039 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8040 		ARG14_TYPE arg14, ARG15_TYPE arg15, ...)                                           \
8041 	{                                                                                          \
8042 		SAVE_ARG(FUNCNAME, 0);                                                             \
8043 		SAVE_ARG(FUNCNAME, 1);                                                             \
8044 		SAVE_ARG(FUNCNAME, 2);                                                             \
8045 		SAVE_ARG(FUNCNAME, 3);                                                             \
8046 		SAVE_ARG(FUNCNAME, 4);                                                             \
8047 		SAVE_ARG(FUNCNAME, 5);                                                             \
8048 		SAVE_ARG(FUNCNAME, 6);                                                             \
8049 		SAVE_ARG(FUNCNAME, 7);                                                             \
8050 		SAVE_ARG(FUNCNAME, 8);                                                             \
8051 		SAVE_ARG(FUNCNAME, 9);                                                             \
8052 		SAVE_ARG(FUNCNAME, 10);                                                            \
8053 		SAVE_ARG(FUNCNAME, 11);                                                            \
8054 		SAVE_ARG(FUNCNAME, 12);                                                            \
8055 		SAVE_ARG(FUNCNAME, 13);                                                            \
8056 		SAVE_ARG(FUNCNAME, 14);                                                            \
8057 		SAVE_ARG(FUNCNAME, 15);                                                            \
8058 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
8059 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
8060 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
8061 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
8062 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
8063 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
8064 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
8065 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
8066 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
8067 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
8068 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
8069 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
8070 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
8071 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
8072 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
8073 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
8074 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
8075 		} else {                                                                           \
8076 			HISTORY_DROPPED(FUNCNAME);                                                 \
8077 		}                                                                                  \
8078 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
8079 		REGISTER_CALL(FUNCNAME);                                                           \
8080 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
8081 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
8082 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
8083 				va_list ap;                                                        \
8084 				va_start(ap, arg15);                                               \
8085 				RETURN_TYPE ret =                                                  \
8086 					FUNCNAME##_fake.custom_fake_seq                            \
8087 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
8088 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8089 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8090 							arg13, arg14, arg15, ap);                  \
8091 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8092 				va_end(ap);                                                        \
8093 				return ret;                                                        \
8094 			} else {                                                                   \
8095 				va_list ap;                                                        \
8096 				va_start(ap, arg15);                                               \
8097 				RETURN_TYPE ret =                                                  \
8098 					FUNCNAME##_fake.custom_fake_seq                            \
8099 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
8100 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8101 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8102 							arg13, arg14, arg15, ap);                  \
8103 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8104 				va_end(ap);                                                        \
8105 				return ret;                                                        \
8106 				return FUNCNAME##_fake                                             \
8107 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
8108 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
8109 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
8110 						arg15, ap);                                        \
8111 			}                                                                          \
8112 		}                                                                                  \
8113 		if (FUNCNAME##_fake.custom_fake) {                                                 \
8114 			RETURN_TYPE ret;                                                           \
8115 			va_list ap;                                                                \
8116 			va_start(ap, arg15);                                                       \
8117 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
8118 							  arg6, arg7, arg8, arg9, arg10, arg11,    \
8119 							  arg12, arg13, arg14, arg15, ap);         \
8120 			va_end(ap);                                                                \
8121 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
8122 			return ret;                                                                \
8123 		}                                                                                  \
8124 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
8125 	}                                                                                          \
8126 	DEFINE_RESET_FUNCTION(FUNCNAME)
8127 
8128 #define FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
8129 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
8130 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
8131 				 ARG14_TYPE, ARG15_TYPE, ...)                                      \
8132 	DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
8133 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
8134 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
8135 					 ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...)                  \
8136 	DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
8137 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
8138 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
8139 					ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...)
8140 
8141 #define DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
8142 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
8143 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
8144 					 ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)      \
8145 	typedef struct FUNCNAME##_Fake {                                                           \
8146 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
8147 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
8148 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
8149 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
8150 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
8151 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
8152 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
8153 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
8154 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
8155 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
8156 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
8157 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
8158 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
8159 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
8160 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
8161 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
8162 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
8163 		DECLARE_ALL_FUNC_COMMON                                                            \
8164 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
8165 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
8166 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
8167 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
8168 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8169 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8170 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8171 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, va_list ap);      \
8172 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
8173 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8174 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8175 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8176 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, va_list ap);      \
8177 	} FUNCNAME##_Fake;                                                                         \
8178 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
8179 	void FUNCNAME##_reset(void);                                                               \
8180 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8181 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8182 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8183 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8184 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...);
8185 
8186 #define DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
8187 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
8188 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
8189 					ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)       \
8190 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
8191 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8192 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8193 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8194 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8195 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...)                         \
8196 	{                                                                                          \
8197 		SAVE_ARG(FUNCNAME, 0);                                                             \
8198 		SAVE_ARG(FUNCNAME, 1);                                                             \
8199 		SAVE_ARG(FUNCNAME, 2);                                                             \
8200 		SAVE_ARG(FUNCNAME, 3);                                                             \
8201 		SAVE_ARG(FUNCNAME, 4);                                                             \
8202 		SAVE_ARG(FUNCNAME, 5);                                                             \
8203 		SAVE_ARG(FUNCNAME, 6);                                                             \
8204 		SAVE_ARG(FUNCNAME, 7);                                                             \
8205 		SAVE_ARG(FUNCNAME, 8);                                                             \
8206 		SAVE_ARG(FUNCNAME, 9);                                                             \
8207 		SAVE_ARG(FUNCNAME, 10);                                                            \
8208 		SAVE_ARG(FUNCNAME, 11);                                                            \
8209 		SAVE_ARG(FUNCNAME, 12);                                                            \
8210 		SAVE_ARG(FUNCNAME, 13);                                                            \
8211 		SAVE_ARG(FUNCNAME, 14);                                                            \
8212 		SAVE_ARG(FUNCNAME, 15);                                                            \
8213 		SAVE_ARG(FUNCNAME, 16);                                                            \
8214 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
8215 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
8216 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
8217 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
8218 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
8219 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
8220 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
8221 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
8222 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
8223 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
8224 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
8225 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
8226 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
8227 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
8228 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
8229 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
8230 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
8231 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
8232 		} else {                                                                           \
8233 			HISTORY_DROPPED(FUNCNAME);                                                 \
8234 		}                                                                                  \
8235 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
8236 		REGISTER_CALL(FUNCNAME);                                                           \
8237 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
8238 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
8239 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
8240 				va_list ap;                                                        \
8241 				va_start(ap, arg16);                                               \
8242 				RETURN_TYPE ret =                                                  \
8243 					FUNCNAME##_fake.custom_fake_seq                            \
8244 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
8245 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8246 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8247 							arg13, arg14, arg15, arg16, ap);           \
8248 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8249 				va_end(ap);                                                        \
8250 				return ret;                                                        \
8251 			} else {                                                                   \
8252 				va_list ap;                                                        \
8253 				va_start(ap, arg16);                                               \
8254 				RETURN_TYPE ret =                                                  \
8255 					FUNCNAME##_fake.custom_fake_seq                            \
8256 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
8257 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8258 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8259 							arg13, arg14, arg15, arg16, ap);           \
8260 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8261 				va_end(ap);                                                        \
8262 				return ret;                                                        \
8263 				return FUNCNAME##_fake                                             \
8264 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
8265 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
8266 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
8267 						arg15, arg16, ap);                                 \
8268 			}                                                                          \
8269 		}                                                                                  \
8270 		if (FUNCNAME##_fake.custom_fake) {                                                 \
8271 			RETURN_TYPE ret;                                                           \
8272 			va_list ap;                                                                \
8273 			va_start(ap, arg16);                                                       \
8274 			ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5,      \
8275 							  arg6, arg7, arg8, arg9, arg10, arg11,    \
8276 							  arg12, arg13, arg14, arg15, arg16, ap);  \
8277 			va_end(ap);                                                                \
8278 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
8279 			return ret;                                                                \
8280 		}                                                                                  \
8281 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
8282 	}                                                                                          \
8283 	DEFINE_RESET_FUNCTION(FUNCNAME)
8284 
8285 #define FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
8286 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
8287 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
8288 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)                          \
8289 	DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
8290 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
8291 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
8292 					 ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)      \
8293 	DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
8294 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
8295 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
8296 					ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...)
8297 
8298 #define DECLARE_FAKE_VALUE_FUNC19_VARARG(                                                          \
8299 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
8300 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,            \
8301 	ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)                           \
8302 	typedef struct FUNCNAME##_Fake {                                                           \
8303 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
8304 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
8305 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
8306 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
8307 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
8308 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
8309 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
8310 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
8311 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
8312 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
8313 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
8314 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
8315 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
8316 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
8317 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
8318 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
8319 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
8320 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
8321 		DECLARE_ALL_FUNC_COMMON                                                            \
8322 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
8323 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
8324 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
8325 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
8326 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8327 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8328 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8329 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
8330 					     va_list ap);                                          \
8331 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
8332 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8333 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8334 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8335 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
8336 					     va_list ap);                                          \
8337 	} FUNCNAME##_Fake;                                                                         \
8338 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
8339 	void FUNCNAME##_reset(void);                                                               \
8340 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8341 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8342 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8343 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8344 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...);
8345 
8346 #define DEFINE_FAKE_VALUE_FUNC19_VARARG(                                                           \
8347 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
8348 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,            \
8349 	ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)                           \
8350 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
8351 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8352 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8353 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8354 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8355 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...)       \
8356 	{                                                                                          \
8357 		SAVE_ARG(FUNCNAME, 0);                                                             \
8358 		SAVE_ARG(FUNCNAME, 1);                                                             \
8359 		SAVE_ARG(FUNCNAME, 2);                                                             \
8360 		SAVE_ARG(FUNCNAME, 3);                                                             \
8361 		SAVE_ARG(FUNCNAME, 4);                                                             \
8362 		SAVE_ARG(FUNCNAME, 5);                                                             \
8363 		SAVE_ARG(FUNCNAME, 6);                                                             \
8364 		SAVE_ARG(FUNCNAME, 7);                                                             \
8365 		SAVE_ARG(FUNCNAME, 8);                                                             \
8366 		SAVE_ARG(FUNCNAME, 9);                                                             \
8367 		SAVE_ARG(FUNCNAME, 10);                                                            \
8368 		SAVE_ARG(FUNCNAME, 11);                                                            \
8369 		SAVE_ARG(FUNCNAME, 12);                                                            \
8370 		SAVE_ARG(FUNCNAME, 13);                                                            \
8371 		SAVE_ARG(FUNCNAME, 14);                                                            \
8372 		SAVE_ARG(FUNCNAME, 15);                                                            \
8373 		SAVE_ARG(FUNCNAME, 16);                                                            \
8374 		SAVE_ARG(FUNCNAME, 17);                                                            \
8375 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
8376 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
8377 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
8378 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
8379 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
8380 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
8381 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
8382 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
8383 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
8384 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
8385 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
8386 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
8387 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
8388 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
8389 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
8390 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
8391 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
8392 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
8393 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
8394 		} else {                                                                           \
8395 			HISTORY_DROPPED(FUNCNAME);                                                 \
8396 		}                                                                                  \
8397 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
8398 		REGISTER_CALL(FUNCNAME);                                                           \
8399 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
8400 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
8401 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
8402 				va_list ap;                                                        \
8403 				va_start(ap, arg17);                                               \
8404 				RETURN_TYPE ret =                                                  \
8405 					FUNCNAME##_fake.custom_fake_seq                            \
8406 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
8407 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8408 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8409 							arg13, arg14, arg15, arg16, arg17, ap);    \
8410 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8411 				va_end(ap);                                                        \
8412 				return ret;                                                        \
8413 			} else {                                                                   \
8414 				va_list ap;                                                        \
8415 				va_start(ap, arg17);                                               \
8416 				RETURN_TYPE ret =                                                  \
8417 					FUNCNAME##_fake.custom_fake_seq                            \
8418 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
8419 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8420 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8421 							arg13, arg14, arg15, arg16, arg17, ap);    \
8422 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8423 				va_end(ap);                                                        \
8424 				return ret;                                                        \
8425 				return FUNCNAME##_fake                                             \
8426 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
8427 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
8428 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
8429 						arg15, arg16, arg17, ap);                          \
8430 			}                                                                          \
8431 		}                                                                                  \
8432 		if (FUNCNAME##_fake.custom_fake) {                                                 \
8433 			RETURN_TYPE ret;                                                           \
8434 			va_list ap;                                                                \
8435 			va_start(ap, arg17);                                                       \
8436 			ret = FUNCNAME##_fake.custom_fake(                                         \
8437 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
8438 				arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap);              \
8439 			va_end(ap);                                                                \
8440 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
8441 			return ret;                                                                \
8442 		}                                                                                  \
8443 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
8444 	}                                                                                          \
8445 	DEFINE_RESET_FUNCTION(FUNCNAME)
8446 
8447 #define FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
8448 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
8449 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
8450 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)              \
8451 	DECLARE_FAKE_VALUE_FUNC19_VARARG(                                                          \
8452 		RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,      \
8453 		ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE,     \
8454 		ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)       \
8455 	DEFINE_FAKE_VALUE_FUNC19_VARARG(                                                           \
8456 		RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE,      \
8457 		ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE,     \
8458 		ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...)
8459 
8460 #define DECLARE_FAKE_VALUE_FUNC20_VARARG(                                                          \
8461 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
8462 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,            \
8463 	ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)               \
8464 	typedef struct FUNCNAME##_Fake {                                                           \
8465 		DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME)                                                \
8466 		DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME)                                                \
8467 		DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME)                                                \
8468 		DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME)                                                \
8469 		DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME)                                                \
8470 		DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME)                                                \
8471 		DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME)                                                \
8472 		DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME)                                                \
8473 		DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME)                                                \
8474 		DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME)                                                \
8475 		DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME)                                              \
8476 		DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME)                                              \
8477 		DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME)                                              \
8478 		DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME)                                              \
8479 		DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME)                                              \
8480 		DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME)                                              \
8481 		DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME)                                              \
8482 		DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME)                                              \
8483 		DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME)                                              \
8484 		DECLARE_ALL_FUNC_COMMON                                                            \
8485 		DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)                                      \
8486 		DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE)                                          \
8487 		DECLARE_CUSTOM_FAKE_SEQ_VARIABLES                                                  \
8488 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, custom_fake, ARG0_TYPE, ARG1_TYPE,       \
8489 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8490 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8491 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8492 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
8493 					     ARG18_TYPE, va_list ap);                              \
8494 		CUSTOM_FFF_FUNCTION_TEMPLATE(RETURN_TYPE, *custom_fake_seq, ARG0_TYPE, ARG1_TYPE,  \
8495 					     ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,           \
8496 					     ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE,           \
8497 					     ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,       \
8498 					     ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE,       \
8499 					     ARG18_TYPE, va_list ap);                              \
8500 	} FUNCNAME##_Fake;                                                                         \
8501 	extern FUNCNAME##_Fake FUNCNAME##_fake;                                                    \
8502 	void FUNCNAME##_reset(void);                                                               \
8503 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8504 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8505 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8506 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8507 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
8508 		ARG18_TYPE arg18, ...);
8509 
8510 #define DEFINE_FAKE_VALUE_FUNC20_VARARG(                                                           \
8511 	RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE,   \
8512 	ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,            \
8513 	ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)               \
8514 	FUNCNAME##_Fake FUNCNAME##_fake;                                                           \
8515 	RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(                                          \
8516 		ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4,    \
8517 		ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9,    \
8518 		ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13,            \
8519 		ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17,            \
8520 		ARG18_TYPE arg18, ...)                                                             \
8521 	{                                                                                          \
8522 		SAVE_ARG(FUNCNAME, 0);                                                             \
8523 		SAVE_ARG(FUNCNAME, 1);                                                             \
8524 		SAVE_ARG(FUNCNAME, 2);                                                             \
8525 		SAVE_ARG(FUNCNAME, 3);                                                             \
8526 		SAVE_ARG(FUNCNAME, 4);                                                             \
8527 		SAVE_ARG(FUNCNAME, 5);                                                             \
8528 		SAVE_ARG(FUNCNAME, 6);                                                             \
8529 		SAVE_ARG(FUNCNAME, 7);                                                             \
8530 		SAVE_ARG(FUNCNAME, 8);                                                             \
8531 		SAVE_ARG(FUNCNAME, 9);                                                             \
8532 		SAVE_ARG(FUNCNAME, 10);                                                            \
8533 		SAVE_ARG(FUNCNAME, 11);                                                            \
8534 		SAVE_ARG(FUNCNAME, 12);                                                            \
8535 		SAVE_ARG(FUNCNAME, 13);                                                            \
8536 		SAVE_ARG(FUNCNAME, 14);                                                            \
8537 		SAVE_ARG(FUNCNAME, 15);                                                            \
8538 		SAVE_ARG(FUNCNAME, 16);                                                            \
8539 		SAVE_ARG(FUNCNAME, 17);                                                            \
8540 		SAVE_ARG(FUNCNAME, 18);                                                            \
8541 		if (ROOM_FOR_MORE_HISTORY(FUNCNAME)) {                                             \
8542 			SAVE_ARG_HISTORY(FUNCNAME, 0);                                             \
8543 			SAVE_ARG_HISTORY(FUNCNAME, 1);                                             \
8544 			SAVE_ARG_HISTORY(FUNCNAME, 2);                                             \
8545 			SAVE_ARG_HISTORY(FUNCNAME, 3);                                             \
8546 			SAVE_ARG_HISTORY(FUNCNAME, 4);                                             \
8547 			SAVE_ARG_HISTORY(FUNCNAME, 5);                                             \
8548 			SAVE_ARG_HISTORY(FUNCNAME, 6);                                             \
8549 			SAVE_ARG_HISTORY(FUNCNAME, 7);                                             \
8550 			SAVE_ARG_HISTORY(FUNCNAME, 8);                                             \
8551 			SAVE_ARG_HISTORY(FUNCNAME, 9);                                             \
8552 			SAVE_ARG_HISTORY(FUNCNAME, 10);                                            \
8553 			SAVE_ARG_HISTORY(FUNCNAME, 11);                                            \
8554 			SAVE_ARG_HISTORY(FUNCNAME, 12);                                            \
8555 			SAVE_ARG_HISTORY(FUNCNAME, 13);                                            \
8556 			SAVE_ARG_HISTORY(FUNCNAME, 14);                                            \
8557 			SAVE_ARG_HISTORY(FUNCNAME, 15);                                            \
8558 			SAVE_ARG_HISTORY(FUNCNAME, 16);                                            \
8559 			SAVE_ARG_HISTORY(FUNCNAME, 17);                                            \
8560 			SAVE_ARG_HISTORY(FUNCNAME, 18);                                            \
8561 		} else {                                                                           \
8562 			HISTORY_DROPPED(FUNCNAME);                                                 \
8563 		}                                                                                  \
8564 		INCREMENT_CALL_COUNT(FUNCNAME);                                                    \
8565 		REGISTER_CALL(FUNCNAME);                                                           \
8566 		if (FUNCNAME##_fake.custom_fake_seq_len) { /* a sequence of custom fakes */        \
8567 			if (FUNCNAME##_fake.custom_fake_seq_idx <                                  \
8568 			    FUNCNAME##_fake.custom_fake_seq_len) {                                 \
8569 				va_list ap;                                                        \
8570 				va_start(ap, arg18);                                               \
8571 				RETURN_TYPE ret =                                                  \
8572 					FUNCNAME##_fake.custom_fake_seq                            \
8573 						[FUNCNAME##_fake.custom_fake_seq_idx++](           \
8574 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8575 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8576 							arg13, arg14, arg15, arg16, arg17, arg18,  \
8577 							ap);                                       \
8578 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8579 				va_end(ap);                                                        \
8580 				return ret;                                                        \
8581 			} else {                                                                   \
8582 				va_list ap;                                                        \
8583 				va_start(ap, arg18);                                               \
8584 				RETURN_TYPE ret =                                                  \
8585 					FUNCNAME##_fake.custom_fake_seq                            \
8586 						[FUNCNAME##_fake.custom_fake_seq_len - 1](         \
8587 							arg0, arg1, arg2, arg3, arg4, arg5, arg6,  \
8588 							arg7, arg8, arg9, arg10, arg11, arg12,     \
8589 							arg13, arg14, arg15, arg16, arg17, arg18,  \
8590 							ap);                                       \
8591 				SAVE_RET_HISTORY(FUNCNAME, ret);                                   \
8592 				va_end(ap);                                                        \
8593 				return ret;                                                        \
8594 				return FUNCNAME##_fake                                             \
8595 					.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len - 1]( \
8596 						arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7,    \
8597 						arg8, arg9, arg10, arg11, arg12, arg13, arg14,     \
8598 						arg15, arg16, arg17, arg18, ap);                   \
8599 			}                                                                          \
8600 		}                                                                                  \
8601 		if (FUNCNAME##_fake.custom_fake) {                                                 \
8602 			RETURN_TYPE ret;                                                           \
8603 			va_list ap;                                                                \
8604 			va_start(ap, arg18);                                                       \
8605 			ret = FUNCNAME##_fake.custom_fake(                                         \
8606 				arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, \
8607 				arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap);       \
8608 			va_end(ap);                                                                \
8609 			SAVE_RET_HISTORY(FUNCNAME, ret);                                           \
8610 			return ret;                                                                \
8611 		}                                                                                  \
8612 		RETURN_FAKE_RESULT(FUNCNAME)                                                       \
8613 	}                                                                                          \
8614 	DEFINE_RESET_FUNCTION(FUNCNAME)
8615 
8616 #define FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,           \
8617 				 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, \
8618 				 ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE,        \
8619 				 ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...)  \
8620 	DECLARE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,   \
8621 					 ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,    \
8622 					 ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, \
8623 					 ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE,           \
8624 					 ARG17_TYPE, ARG18_TYPE, ...)                              \
8625 	DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE,    \
8626 					ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE,     \
8627 					ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE,  \
8628 					ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE,            \
8629 					ARG17_TYPE, ARG18_TYPE, ...)
8630 
8631 /* MSVC expand macro fix */
8632 #define EXPAND(x) x
8633 
8634 #define PP_NARG_MINUS2(...) EXPAND(PP_NARG_MINUS2_(__VA_ARGS__, PP_RSEQ_N_MINUS2()))
8635 
8636 #define PP_NARG_MINUS2_(...) EXPAND(PP_ARG_MINUS2_N(__VA_ARGS__))
8637 
8638 #define PP_ARG_MINUS2_N(returnVal, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13,     \
8639 			_14, _15, _16, _17, _18, _19, _20, N, ...)                                 \
8640 	N
8641 
8642 #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
8643 
8644 #define PP_NARG_MINUS1(...) EXPAND(PP_NARG_MINUS1_(__VA_ARGS__, PP_RSEQ_N_MINUS1()))
8645 
8646 #define PP_NARG_MINUS1_(...) EXPAND(PP_ARG_MINUS1_N(__VA_ARGS__))
8647 
8648 #define PP_ARG_MINUS1_N(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
8649 			_17, _18, _19, _20, N, ...)                                                \
8650 	N
8651 
8652 #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
8653 
8654 /* DECLARE AND DEFINE FAKE FUNCTIONS - PLACE IN TEST FILES */
8655 
8656 #define FAKE_VALUE_FUNC(...) EXPAND(FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
8657 
8658 #define FUNC_VALUE_(N, ...) EXPAND(FUNC_VALUE_N(N, __VA_ARGS__))
8659 
8660 #define FUNC_VALUE_N(N, ...) EXPAND(FAKE_VALUE_FUNC##N(__VA_ARGS__))
8661 
8662 #define FAKE_VOID_FUNC(...) EXPAND(FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
8663 
8664 #define FUNC_VOID_(N, ...) EXPAND(FUNC_VOID_N(N, __VA_ARGS__))
8665 
8666 #define FUNC_VOID_N(N, ...) EXPAND(FAKE_VOID_FUNC##N(__VA_ARGS__))
8667 
8668 #define FAKE_VALUE_FUNC_VARARG(...)                                                                \
8669 	EXPAND(FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
8670 
8671 #define FUNC_VALUE_VARARG_(N, ...) EXPAND(FUNC_VALUE_VARARG_N(N, __VA_ARGS__))
8672 
8673 #define FUNC_VALUE_VARARG_N(N, ...) EXPAND(FAKE_VALUE_FUNC##N##_VARARG(__VA_ARGS__))
8674 
8675 #define FAKE_VOID_FUNC_VARARG(...)                                                                 \
8676 	EXPAND(FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
8677 
8678 #define FUNC_VOID_VARARG_(N, ...) EXPAND(FUNC_VOID_VARARG_N(N, __VA_ARGS__))
8679 
8680 #define FUNC_VOID_VARARG_N(N, ...) EXPAND(FAKE_VOID_FUNC##N##_VARARG(__VA_ARGS__))
8681 
8682 /* DECLARE FAKE FUNCTIONS - PLACE IN HEADER FILES */
8683 
8684 #define DECLARE_FAKE_VALUE_FUNC(...)                                                               \
8685 	EXPAND(DECLARE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
8686 
8687 #define DECLARE_FUNC_VALUE_(N, ...) EXPAND(DECLARE_FUNC_VALUE_N(N, __VA_ARGS__))
8688 
8689 #define DECLARE_FUNC_VALUE_N(N, ...) EXPAND(DECLARE_FAKE_VALUE_FUNC##N(__VA_ARGS__))
8690 
8691 #define DECLARE_FAKE_VOID_FUNC(...)                                                                \
8692 	EXPAND(DECLARE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
8693 
8694 #define DECLARE_FUNC_VOID_(N, ...) EXPAND(DECLARE_FUNC_VOID_N(N, __VA_ARGS__))
8695 
8696 #define DECLARE_FUNC_VOID_N(N, ...) EXPAND(DECLARE_FAKE_VOID_FUNC##N(__VA_ARGS__))
8697 
8698 #define DECLARE_FAKE_VALUE_FUNC_VARARG(...)                                                        \
8699 	EXPAND(DECLARE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
8700 
8701 #define DECLARE_FUNC_VALUE_VARARG_(N, ...) EXPAND(DECLARE_FUNC_VALUE_VARARG_N(N, __VA_ARGS__))
8702 
8703 #define DECLARE_FUNC_VALUE_VARARG_N(N, ...) EXPAND(DECLARE_FAKE_VALUE_FUNC##N##_VARARG(__VA_ARGS__))
8704 
8705 #define DECLARE_FAKE_VOID_FUNC_VARARG(...)                                                         \
8706 	EXPAND(DECLARE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
8707 
8708 #define DECLARE_FUNC_VOID_VARARG_(N, ...) EXPAND(DECLARE_FUNC_VOID_VARARG_N(N, __VA_ARGS__))
8709 
8710 #define DECLARE_FUNC_VOID_VARARG_N(N, ...) EXPAND(DECLARE_FAKE_VOID_FUNC##N##_VARARG(__VA_ARGS__))
8711 
8712 /* DEFINE FAKE FUNCTIONS - PLACE IN SOURCE FILES */
8713 
8714 #define DEFINE_FAKE_VALUE_FUNC(...)                                                                \
8715 	EXPAND(DEFINE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
8716 
8717 #define DEFINE_FUNC_VALUE_(N, ...) EXPAND(DEFINE_FUNC_VALUE_N(N, __VA_ARGS__))
8718 
8719 #define DEFINE_FUNC_VALUE_N(N, ...) EXPAND(DEFINE_FAKE_VALUE_FUNC##N(__VA_ARGS__))
8720 
8721 #define DEFINE_FAKE_VOID_FUNC(...)                                                                 \
8722 	EXPAND(DEFINE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
8723 
8724 #define DEFINE_FUNC_VOID_(N, ...) EXPAND(DEFINE_FUNC_VOID_N(N, __VA_ARGS__))
8725 
8726 #define DEFINE_FUNC_VOID_N(N, ...) EXPAND(DEFINE_FAKE_VOID_FUNC##N(__VA_ARGS__))
8727 
8728 #define DEFINE_FAKE_VALUE_FUNC_VARARG(...)                                                         \
8729 	EXPAND(DEFINE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
8730 
8731 #define DEFINE_FUNC_VALUE_VARARG_(N, ...) EXPAND(DEFINE_FUNC_VALUE_VARARG_N(N, __VA_ARGS__))
8732 
8733 #define DEFINE_FUNC_VALUE_VARARG_N(N, ...) EXPAND(DEFINE_FAKE_VALUE_FUNC##N##_VARARG(__VA_ARGS__))
8734 
8735 #define DEFINE_FAKE_VOID_FUNC_VARARG(...)                                                          \
8736 	EXPAND(DEFINE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
8737 
8738 #define DEFINE_FUNC_VOID_VARARG_(N, ...) EXPAND(DEFINE_FUNC_VOID_VARARG_N(N, __VA_ARGS__))
8739 
8740 #define DEFINE_FUNC_VOID_VARARG_N(N, ...) EXPAND(DEFINE_FAKE_VOID_FUNC##N##_VARARG(__VA_ARGS__))
8741 
8742 #endif /* FAKE_FUNCTIONS */
8743