Zephyr API
4.4.99
A Scalable Open Source RTOS
Toggle main menu visibility
Loading...
Searching...
No Matches
fff.h
Go to the documentation of this file.
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 */
FFF_END_EXTERN_C
#define FFF_END_EXTERN_C
Definition
fff.h:124
fff
fff_globals_t fff
fff_function_t
void(* fff_function_t)(void)
Definition
fff.h:139
FFF_CALL_HISTORY_LEN
#define FFF_CALL_HISTORY_LEN
Definition
fff.h:37
FFF_EXTERN_C
#define FFF_EXTERN_C
Definition
fff.h:123
string.h
fff_globals_t
Definition
fff.h:140
fff_globals_t::call_history
fff_function_t call_history[(50u)]
Definition
fff.h:141
fff_globals_t::call_history_idx
unsigned int call_history_idx
Definition
fff.h:142
subsys
testsuite
include
zephyr
fff.h
Generated on
for Zephyr API by
1.17.0