added helper for generating argument sequences
diff --git a/fakegen.rb b/fakegen.rb
index b030974..6c4ac21 100644
--- a/fakegen.rb
+++ b/fakegen.rb
@@ -403,6 +403,11 @@
   putd "#endif /* FAKE_FUNCTIONS */"
 end
 
+def generate_arg_sequence(args, prefix, do_reverse, joinstr) 
+ fmap = (0..args).flat_map {|i| [prefix + i.to_s]}
+ if do_reverse then fmap.reverse.join(joinstr) else fmap.join(", ") end
+end
+
 def output_macro_counting_shortcuts
   putd <<-MACRO_COUNTING
 
@@ -412,10 +417,10 @@
 #define PP_NARG_MINUS2_(...) \
     PP_ARG_MINUS2_N(__VA_ARGS__)
 
-#define PP_ARG_MINUS2_N(returnVal, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, N, ...)   N
+#define PP_ARG_MINUS2_N(returnVal, #{generate_arg_sequence($MAX_ARGS - 1, '_', false, ", ")}, N, ...)   N
 
 #define PP_RSEQ_N_MINUS2() \
-    19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
+    #{generate_arg_sequence($MAX_ARGS - 1, '', true, ',')}
 
 
 #define FAKE_VALUE_FUNC(...) \
@@ -435,10 +440,10 @@
 #define PP_NARG_MINUS1_(...) \
     PP_ARG_MINUS1_N(__VA_ARGS__)
 
-#define PP_ARG_MINUS1_N(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...)   N
+#define PP_ARG_MINUS1_N(#{generate_arg_sequence($MAX_ARGS, '_', false, ", ")}, N, ...)   N
 
 #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
+    #{generate_arg_sequence($MAX_ARGS, '', true, ',')}
 
 
 #define FAKE_VOID_FUNC(...) \
diff --git a/fff.h b/fff.h
index d807ab4..ee664dd 100644
--- a/fff.h
+++ b/fff.h
@@ -29,7 +29,7 @@
 #include <stdarg.h>
 #include <string.h> /* For memset and memcpy */
 
-#define FFF_MAX_ARGS (20u)
+#define FFF_MAX_ARGS (25u)
 #ifndef FFF_ARG_HISTORY_LEN
     #define FFF_ARG_HISTORY_LEN (50u)
 #endif
@@ -1619,6 +1619,556 @@
     DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
     
 
+#define DECLARE_FAKE_VOID_FUNC21(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC21(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); \
+                } \
+                else{ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC21(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    DECLARE_FAKE_VOID_FUNC21(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    DEFINE_FAKE_VOID_FUNC21(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC22(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC22(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21); \
+                } \
+                else{ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21); \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC22(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    DECLARE_FAKE_VOID_FUNC22(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    DEFINE_FAKE_VOID_FUNC22(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC23(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC23(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22); \
+                } \
+                else{ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22); \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC23(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    DECLARE_FAKE_VOID_FUNC23(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    DEFINE_FAKE_VOID_FUNC23(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC24(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ARG(ARG23_TYPE, 23, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC24(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            SAVE_ARG(FUNCNAME, 23); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+                SAVE_ARG_HISTORY(FUNCNAME, 23); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23); \
+                } \
+                else{ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23); \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC24(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    DECLARE_FAKE_VOID_FUNC24(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    DEFINE_FAKE_VOID_FUNC24(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC25(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ARG(ARG23_TYPE, 23, FUNCNAME) \
+            DECLARE_ARG(ARG24_TYPE, 24, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ARG24_TYPE arg24); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ARG24_TYPE arg24); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC25(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ARG24_TYPE arg24){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            SAVE_ARG(FUNCNAME, 23); \
+            SAVE_ARG(FUNCNAME, 24); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+                SAVE_ARG_HISTORY(FUNCNAME, 23); \
+                SAVE_ARG_HISTORY(FUNCNAME, 24); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24); \
+                } \
+                else{ \
+                    FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24); \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC25(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    DECLARE_FAKE_VOID_FUNC25(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    DEFINE_FAKE_VOID_FUNC25(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    
+
 #define DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
     FFF_EXTERN_C \
         typedef struct FUNCNAME##_Fake { \
@@ -3152,6 +3702,566 @@
     DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
     
 
+#define DECLARE_FAKE_VALUE_FUNC21(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC21(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); \
+                } \
+                else{ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); \
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC21(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    DECLARE_FAKE_VALUE_FUNC21(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    DEFINE_FAKE_VALUE_FUNC21(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC22(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC22(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21); \
+                } \
+                else{ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21); \
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC22(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    DECLARE_FAKE_VALUE_FUNC22(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    DEFINE_FAKE_VALUE_FUNC22(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC23(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC23(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22); \
+                } \
+                else{ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22); \
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC23(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    DECLARE_FAKE_VALUE_FUNC23(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    DEFINE_FAKE_VALUE_FUNC23(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC24(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ARG(ARG23_TYPE, 23, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC24(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            SAVE_ARG(FUNCNAME, 23); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+                SAVE_ARG_HISTORY(FUNCNAME, 23); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23); \
+                } \
+                else{ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23); \
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC24(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    DECLARE_FAKE_VALUE_FUNC24(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    DEFINE_FAKE_VALUE_FUNC24(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC25(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ARG(ARG23_TYPE, 23, FUNCNAME) \
+            DECLARE_ARG(ARG24_TYPE, 24, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ARG24_TYPE arg24); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ARG24_TYPE arg24); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC25(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ARG24_TYPE arg24){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            SAVE_ARG(FUNCNAME, 23); \
+            SAVE_ARG(FUNCNAME, 24); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+                SAVE_ARG_HISTORY(FUNCNAME, 23); \
+                SAVE_ARG_HISTORY(FUNCNAME, 24); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
+                if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24); \
+                } \
+                else{ \
+                    return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24); \
+                } \
+            } \
+            if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24); \
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC25(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    DECLARE_FAKE_VALUE_FUNC25(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    DEFINE_FAKE_VALUE_FUNC25(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ARG24_TYPE) \
+    
+
 #define DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
     FFF_EXTERN_C \
         typedef struct FUNCNAME##_Fake { \
@@ -4444,6 +5554,526 @@
     DEFINE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
     
 
+#define DECLARE_FAKE_VOID_FUNC21_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, va_list ap); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC21_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                va_list ap;\
+                va_start(ap, arg19);\
+              FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, ap);\
+                va_end(ap);\
+            }\
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC21_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    DECLARE_FAKE_VOID_FUNC21_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    DEFINE_FAKE_VOID_FUNC21_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC22_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, va_list ap); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC22_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                va_list ap;\
+                va_start(ap, arg20);\
+              FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, ap);\
+                va_end(ap);\
+            }\
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC22_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    DECLARE_FAKE_VOID_FUNC22_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    DEFINE_FAKE_VOID_FUNC22_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC23_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, va_list ap); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC23_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                va_list ap;\
+                va_start(ap, arg21);\
+              FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, ap);\
+                va_end(ap);\
+            }\
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC23_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    DECLARE_FAKE_VOID_FUNC23_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    DEFINE_FAKE_VOID_FUNC23_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC24_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, va_list ap); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC24_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                va_list ap;\
+                va_start(ap, arg22);\
+              FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, ap);\
+                va_end(ap);\
+            }\
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC24_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    DECLARE_FAKE_VOID_FUNC24_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    DEFINE_FAKE_VOID_FUNC24_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VOID_FUNC25_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ARG(ARG23_TYPE, 23, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, va_list ap); \
+            void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VOID_FUNC25_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            SAVE_ARG(FUNCNAME, 23); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+                SAVE_ARG_HISTORY(FUNCNAME, 23); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                va_list ap;\
+                va_start(ap, arg23);\
+              FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, ap);\
+                va_end(ap);\
+            }\
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VOID_FUNC25_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    DECLARE_FAKE_VOID_FUNC25_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    DEFINE_FAKE_VOID_FUNC25_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    
+
 #define DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
     FFF_EXTERN_C \
         typedef struct FUNCNAME##_Fake { \
@@ -5812,11 +7442,551 @@
     DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
     
 
+#define DECLARE_FAKE_VALUE_FUNC21_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, va_list ap); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC21_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                RETURN_TYPE ret;\
+                va_list ap;\
+                va_start(ap, arg19);\
+                ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, ap);\
+                va_end(ap);\
+                return ret;\
+            }\
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC21_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    DECLARE_FAKE_VALUE_FUNC21_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    DEFINE_FAKE_VALUE_FUNC21_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC22_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, va_list ap); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC22_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                RETURN_TYPE ret;\
+                va_list ap;\
+                va_start(ap, arg20);\
+                ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, ap);\
+                va_end(ap);\
+                return ret;\
+            }\
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC22_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    DECLARE_FAKE_VALUE_FUNC22_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    DEFINE_FAKE_VALUE_FUNC22_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC23_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, va_list ap); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC23_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                RETURN_TYPE ret;\
+                va_list ap;\
+                va_start(ap, arg21);\
+                ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, ap);\
+                va_end(ap);\
+                return ret;\
+            }\
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC23_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    DECLARE_FAKE_VALUE_FUNC23_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    DEFINE_FAKE_VALUE_FUNC23_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC24_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, va_list ap); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC24_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                RETURN_TYPE ret;\
+                va_list ap;\
+                va_start(ap, arg22);\
+                ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, ap);\
+                va_end(ap);\
+                return ret;\
+            }\
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC24_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    DECLARE_FAKE_VALUE_FUNC24_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    DEFINE_FAKE_VALUE_FUNC24_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ...) \
+    
+
+#define DECLARE_FAKE_VALUE_FUNC25_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    FFF_EXTERN_C \
+        typedef struct FUNCNAME##_Fake { \
+            DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
+            DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
+            DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
+            DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
+            DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
+            DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
+            DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
+            DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
+            DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
+            DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
+            DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
+            DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
+            DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
+            DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
+            DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
+            DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
+            DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
+            DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
+            DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
+            DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
+            DECLARE_ARG(ARG20_TYPE, 20, FUNCNAME) \
+            DECLARE_ARG(ARG21_TYPE, 21, FUNCNAME) \
+            DECLARE_ARG(ARG22_TYPE, 22, FUNCNAME) \
+            DECLARE_ARG(ARG23_TYPE, 23, FUNCNAME) \
+            DECLARE_ALL_FUNC_COMMON \
+            DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
+            DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
+            RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, va_list ap); \
+            RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, va_list ap); \
+        } FUNCNAME##_Fake;\
+        extern FUNCNAME##_Fake FUNCNAME##_fake;\
+        void FUNCNAME##_reset(); \
+    FFF_END_EXTERN_C \
+
+#define DEFINE_FAKE_VALUE_FUNC25_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    FFF_EXTERN_C \
+        FUNCNAME##_Fake FUNCNAME##_fake;\
+        RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19, ARG20_TYPE arg20, ARG21_TYPE arg21, ARG22_TYPE arg22, ARG23_TYPE arg23, ...){ \
+            SAVE_ARG(FUNCNAME, 0); \
+            SAVE_ARG(FUNCNAME, 1); \
+            SAVE_ARG(FUNCNAME, 2); \
+            SAVE_ARG(FUNCNAME, 3); \
+            SAVE_ARG(FUNCNAME, 4); \
+            SAVE_ARG(FUNCNAME, 5); \
+            SAVE_ARG(FUNCNAME, 6); \
+            SAVE_ARG(FUNCNAME, 7); \
+            SAVE_ARG(FUNCNAME, 8); \
+            SAVE_ARG(FUNCNAME, 9); \
+            SAVE_ARG(FUNCNAME, 10); \
+            SAVE_ARG(FUNCNAME, 11); \
+            SAVE_ARG(FUNCNAME, 12); \
+            SAVE_ARG(FUNCNAME, 13); \
+            SAVE_ARG(FUNCNAME, 14); \
+            SAVE_ARG(FUNCNAME, 15); \
+            SAVE_ARG(FUNCNAME, 16); \
+            SAVE_ARG(FUNCNAME, 17); \
+            SAVE_ARG(FUNCNAME, 18); \
+            SAVE_ARG(FUNCNAME, 19); \
+            SAVE_ARG(FUNCNAME, 20); \
+            SAVE_ARG(FUNCNAME, 21); \
+            SAVE_ARG(FUNCNAME, 22); \
+            SAVE_ARG(FUNCNAME, 23); \
+            if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\
+                SAVE_ARG_HISTORY(FUNCNAME, 0); \
+                SAVE_ARG_HISTORY(FUNCNAME, 1); \
+                SAVE_ARG_HISTORY(FUNCNAME, 2); \
+                SAVE_ARG_HISTORY(FUNCNAME, 3); \
+                SAVE_ARG_HISTORY(FUNCNAME, 4); \
+                SAVE_ARG_HISTORY(FUNCNAME, 5); \
+                SAVE_ARG_HISTORY(FUNCNAME, 6); \
+                SAVE_ARG_HISTORY(FUNCNAME, 7); \
+                SAVE_ARG_HISTORY(FUNCNAME, 8); \
+                SAVE_ARG_HISTORY(FUNCNAME, 9); \
+                SAVE_ARG_HISTORY(FUNCNAME, 10); \
+                SAVE_ARG_HISTORY(FUNCNAME, 11); \
+                SAVE_ARG_HISTORY(FUNCNAME, 12); \
+                SAVE_ARG_HISTORY(FUNCNAME, 13); \
+                SAVE_ARG_HISTORY(FUNCNAME, 14); \
+                SAVE_ARG_HISTORY(FUNCNAME, 15); \
+                SAVE_ARG_HISTORY(FUNCNAME, 16); \
+                SAVE_ARG_HISTORY(FUNCNAME, 17); \
+                SAVE_ARG_HISTORY(FUNCNAME, 18); \
+                SAVE_ARG_HISTORY(FUNCNAME, 19); \
+                SAVE_ARG_HISTORY(FUNCNAME, 20); \
+                SAVE_ARG_HISTORY(FUNCNAME, 21); \
+                SAVE_ARG_HISTORY(FUNCNAME, 22); \
+                SAVE_ARG_HISTORY(FUNCNAME, 23); \
+            }\
+            else{\
+                HISTORY_DROPPED(FUNCNAME);\
+            }\
+            INCREMENT_CALL_COUNT(FUNCNAME); \
+            REGISTER_CALL(FUNCNAME); \
+            if(FUNCNAME##_fake.custom_fake){\
+                RETURN_TYPE ret;\
+                va_list ap;\
+                va_start(ap, arg23);\
+                ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, ap);\
+                va_end(ap);\
+                return ret;\
+            }\
+            RETURN_FAKE_RESULT(FUNCNAME)  \
+        } \
+        DEFINE_RESET_FUNCTION(FUNCNAME) \
+    FFF_END_EXTERN_C \
+
+#define FAKE_VALUE_FUNC25_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    DECLARE_FAKE_VALUE_FUNC25_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    DEFINE_FAKE_VALUE_FUNC25_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE, ARG20_TYPE, ARG21_TYPE, ARG22_TYPE, ARG23_TYPE, ...) \
+    
+
 #define PP_NARG_MINUS2(...)     PP_NARG_MINUS2_(__VA_ARGS__, PP_RSEQ_N_MINUS2())
 
 #define PP_NARG_MINUS2_(...)     PP_ARG_MINUS2_N(__VA_ARGS__)
 
-#define PP_ARG_MINUS2_N(returnVal, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, N, ...)   N
+#define PP_ARG_MINUS2_N(returnVal, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, N, ...)   N
 
 #define PP_RSEQ_N_MINUS2()     19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
 
@@ -5833,9 +8003,9 @@
 
 #define PP_NARG_MINUS1_(...)     PP_ARG_MINUS1_N(__VA_ARGS__)
 
-#define PP_ARG_MINUS1_N(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...)   N
+#define PP_ARG_MINUS1_N(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, N, ...)   N
 
-#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
+#define PP_RSEQ_N_MINUS1()     25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
 
 
 #define FAKE_VOID_FUNC(...)     FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__)