mirror of
https://github.com/meekrosoft/fff
synced 2026-01-23 00:15:59 +01:00
indent funct with block instead of pushd and popd
This commit is contained in:
102
fakegen.rb
102
fakegen.rb
@@ -17,10 +17,14 @@ end
|
||||
def output_constants
|
||||
putd "#define FFF_MAX_ARGS (#{$MAX_ARGS}u)"
|
||||
putd "#ifndef FFF_ARG_HISTORY_LEN"
|
||||
indent {
|
||||
putd "#define FFF_ARG_HISTORY_LEN (#{$DEFAULT_ARG_HISTORY}u)"
|
||||
}
|
||||
putd "#endif"
|
||||
putd "#ifndef FFF_CALL_HISTORY_LEN"
|
||||
indent {
|
||||
putd "#define FFF_CALL_HISTORY_LEN (#{$MAX_CALL_HISTORY}u)"
|
||||
}
|
||||
putd "#endif"
|
||||
end
|
||||
|
||||
@@ -54,21 +58,27 @@ end
|
||||
|
||||
def define_return_sequence_helper
|
||||
putd "#define SET_RETURN_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \\"
|
||||
indent {
|
||||
putd "FUNCNAME##_fake.return_val_seq = ARRAY_POINTER; \\"
|
||||
putd "FUNCNAME##_fake.return_val_seq_len = ARRAY_LEN;"
|
||||
}
|
||||
end
|
||||
|
||||
def define_custom_fake_sequence_helper
|
||||
putd "#define SET_CUSTOM_FAKE_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \\"
|
||||
indent {
|
||||
putd "FUNCNAME##_fake.custom_fake_seq = ARRAY_POINTER; \\"
|
||||
putd "FUNCNAME##_fake.custom_fake_seq_len = ARRAY_LEN;"
|
||||
}
|
||||
end
|
||||
|
||||
def define_reset_fake_macro
|
||||
putd ""
|
||||
putd "/* Defining a function to reset a fake function */"
|
||||
putd "#define RESET_FAKE(FUNCNAME) { \\"
|
||||
indent {
|
||||
putd "FUNCNAME##_reset(); \\"
|
||||
}
|
||||
putd "} \\"
|
||||
putd ""
|
||||
end
|
||||
@@ -76,94 +86,126 @@ end
|
||||
def define_declare_arg_helper
|
||||
putd ""
|
||||
putd "#define DECLARE_ARG(type, n, FUNCNAME) \\"
|
||||
indent {
|
||||
putd "type arg##n##_val; \\"
|
||||
putd "type arg##n##_history[FFF_ARG_HISTORY_LEN];"
|
||||
}
|
||||
end
|
||||
|
||||
def define_declare_all_func_common_helper
|
||||
putd ""
|
||||
putd "#define DECLARE_ALL_FUNC_COMMON \\"
|
||||
indent {
|
||||
putd "unsigned int call_count; \\"
|
||||
putd "unsigned int arg_history_len;\\"
|
||||
putd "unsigned int arg_histories_dropped; \\"
|
||||
}
|
||||
end
|
||||
|
||||
def define_save_arg_helper
|
||||
putd ""
|
||||
putd "#define SAVE_ARG(FUNCNAME, n) \\"
|
||||
indent {
|
||||
putd "memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));"
|
||||
}
|
||||
end
|
||||
|
||||
def define_room_for_more_history
|
||||
putd ""
|
||||
putd "#define ROOM_FOR_MORE_HISTORY(FUNCNAME) \\"
|
||||
indent {
|
||||
putd "FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN"
|
||||
}
|
||||
end
|
||||
|
||||
def define_save_arg_history_helper
|
||||
putd ""
|
||||
putd "#define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \\"
|
||||
indent {
|
||||
putd "memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));"
|
||||
}
|
||||
end
|
||||
|
||||
def define_history_dropped_helper
|
||||
putd ""
|
||||
putd "#define HISTORY_DROPPED(FUNCNAME) \\"
|
||||
indent {
|
||||
putd "FUNCNAME##_fake.arg_histories_dropped++"
|
||||
}
|
||||
end
|
||||
|
||||
def define_value_function_variables_helper
|
||||
putd ""
|
||||
putd "#define DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \\"
|
||||
indent {
|
||||
putd "RETURN_TYPE return_val; \\"
|
||||
putd "int return_val_seq_len; \\"
|
||||
putd "int return_val_seq_idx; \\"
|
||||
putd "RETURN_TYPE * return_val_seq; \\"
|
||||
}
|
||||
end
|
||||
|
||||
def define_custom_fake_seq_variables_helper
|
||||
putd ""
|
||||
putd "#define DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \\"
|
||||
indent {
|
||||
putd "int custom_fake_seq_len; \\"
|
||||
putd "int custom_fake_seq_idx; \\"
|
||||
}
|
||||
end
|
||||
|
||||
def define_increment_call_count_helper
|
||||
putd ""
|
||||
putd "#define INCREMENT_CALL_COUNT(FUNCNAME) \\"
|
||||
indent {
|
||||
putd "FUNCNAME##_fake.call_count++"
|
||||
}
|
||||
end
|
||||
|
||||
def define_return_fake_result_helper
|
||||
putd ""
|
||||
putd "#define RETURN_FAKE_RESULT(FUNCNAME) \\"
|
||||
indent {
|
||||
putd "if (FUNCNAME##_fake.return_val_seq_len){ /* then its a sequence */ \\"
|
||||
indent {
|
||||
putd "if(FUNCNAME##_fake.return_val_seq_idx < FUNCNAME##_fake.return_val_seq_len) { \\"
|
||||
indent {
|
||||
putd "return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx++]; \\"
|
||||
}
|
||||
putd "} \\"
|
||||
putd "return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]; /* return last element */ \\"
|
||||
}
|
||||
putd "} \\"
|
||||
putd "return FUNCNAME##_fake.return_val; \\"
|
||||
}
|
||||
end
|
||||
|
||||
def define_extern_c_helper
|
||||
putd ""
|
||||
putd "#ifdef __cplusplus"
|
||||
indent {
|
||||
putd "#define FFF_EXTERN_C extern \"C\"{"
|
||||
putd "#define FFF_END_EXTERN_C } "
|
||||
}
|
||||
putd "#else /* ansi c */"
|
||||
indent {
|
||||
putd "#define FFF_EXTERN_C "
|
||||
putd "#define FFF_END_EXTERN_C "
|
||||
}
|
||||
putd "#endif /* cpp/ansi c */"
|
||||
end
|
||||
|
||||
def define_reset_fake_helper
|
||||
putd ""
|
||||
putd "#define DEFINE_RESET_FUNCTION(FUNCNAME) \\"
|
||||
indent {
|
||||
putd "void FUNCNAME##_reset(){ \\"
|
||||
indent {
|
||||
putd "memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake)); \\"
|
||||
putd "FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN;\\"
|
||||
}
|
||||
putd "}"
|
||||
}
|
||||
end
|
||||
# ------ End Helper macros ------ #
|
||||
|
||||
@@ -182,6 +224,12 @@ def popd
|
||||
$current_depth = $current_depth - 4
|
||||
end
|
||||
|
||||
def indent
|
||||
pushd
|
||||
yield
|
||||
popd
|
||||
end
|
||||
|
||||
def output_macro(arg_count, has_varargs, is_value_function)
|
||||
|
||||
vararg_name = has_varargs ? "_VARARG" : ""
|
||||
@@ -193,34 +241,34 @@ def output_macro(arg_count, has_varargs, is_value_function)
|
||||
|
||||
putd ""
|
||||
output_macro_header(declare_macro_name, saved_arg_count, has_varargs, return_type)
|
||||
pushd
|
||||
indent {
|
||||
extern_c { # define argument capture variables
|
||||
output_variables(saved_arg_count, has_varargs, is_value_function)
|
||||
}
|
||||
popd
|
||||
}
|
||||
|
||||
putd ""
|
||||
output_macro_header(define_macro_name, saved_arg_count, has_varargs, return_type)
|
||||
pushd
|
||||
indent {
|
||||
extern_c {
|
||||
putd "FUNCNAME##_Fake FUNCNAME##_fake;\\"
|
||||
putd function_signature(saved_arg_count, has_varargs, is_value_function) + "{ \\"
|
||||
pushd
|
||||
indent {
|
||||
output_function_body(saved_arg_count, has_varargs, is_value_function)
|
||||
popd
|
||||
}
|
||||
putd "} \\"
|
||||
putd "DEFINE_RESET_FUNCTION(FUNCNAME) \\"
|
||||
}
|
||||
popd
|
||||
}
|
||||
|
||||
putd ""
|
||||
|
||||
output_macro_header(fake_macro_name, saved_arg_count, has_varargs, return_type)
|
||||
pushd
|
||||
indent {
|
||||
putd macro_signature_for(declare_macro_name, saved_arg_count, has_varargs, return_type)
|
||||
putd macro_signature_for(define_macro_name, saved_arg_count, has_varargs, return_type)
|
||||
putd ""
|
||||
popd
|
||||
}
|
||||
end
|
||||
|
||||
def output_macro_header(macro_name, arg_count, has_varargs, return_type)
|
||||
@@ -250,10 +298,6 @@ def macro_signature_for(macro_name, arg_count, has_varargs, return_type)
|
||||
parameter_list
|
||||
end
|
||||
|
||||
def output_argument_capture_variables(argN)
|
||||
putd " DECLARE_ARG(ARG#{argN}_TYPE, #{argN}, FUNCNAME) \\"
|
||||
end
|
||||
|
||||
def output_variables(arg_count, has_varargs, is_value_function)
|
||||
in_struct{
|
||||
arg_count.times { |argN|
|
||||
@@ -309,20 +353,27 @@ end
|
||||
def output_function_body(arg_count, has_varargs, is_value_function)
|
||||
arg_count.times { |i| putd "SAVE_ARG(FUNCNAME, #{i}); \\" }
|
||||
putd "if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\\"
|
||||
indent {
|
||||
arg_count.times { |i| putd "SAVE_ARG_HISTORY(FUNCNAME, #{i}); \\" }
|
||||
}
|
||||
putd "}\\"
|
||||
putd "else{\\"
|
||||
indent {
|
||||
putd "HISTORY_DROPPED(FUNCNAME);\\"
|
||||
}
|
||||
putd "}\\"
|
||||
putd "INCREMENT_CALL_COUNT(FUNCNAME); \\"
|
||||
putd "REGISTER_CALL(FUNCNAME); \\"
|
||||
|
||||
if has_varargs
|
||||
putd "if(FUNCNAME##_fake.custom_fake){\\"
|
||||
indent {
|
||||
putd "RETURN_TYPE ret;\\" if is_value_function
|
||||
putd "va_list ap;\\"
|
||||
putd "va_start(ap, arg#{arg_count-1});\\"
|
||||
}
|
||||
custom_fake_call = "FUNCNAME##_fake.custom_fake(#{arg_list(arg_count)}, ap);"
|
||||
indent {
|
||||
if is_value_function
|
||||
putd "ret = #{custom_fake_call}\\"
|
||||
else
|
||||
@@ -330,16 +381,23 @@ def output_function_body(arg_count, has_varargs, is_value_function)
|
||||
end
|
||||
putd "va_end(ap);\\"
|
||||
putd "return ret;\\" if is_value_function
|
||||
}
|
||||
putd "}\\"
|
||||
else
|
||||
return_type = is_value_function ? "return " : ""
|
||||
putd "if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \\"
|
||||
indent {
|
||||
putd "if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \\"
|
||||
indent {
|
||||
putd "#{return_type}FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](#{arg_list(arg_count)}); \\"
|
||||
}
|
||||
putd "} \\"
|
||||
putd "else{ \\"
|
||||
indent {
|
||||
putd "#{return_type}FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](#{arg_list(arg_count)}); \\"
|
||||
}
|
||||
putd "} \\"
|
||||
}
|
||||
putd "} \\"
|
||||
putd "if (FUNCNAME##_fake.custom_fake) #{return_type}FUNCNAME##_fake.custom_fake(#{arg_list(arg_count)}); \\"
|
||||
end
|
||||
@@ -349,15 +407,19 @@ end
|
||||
|
||||
def output_reset_function(arg_count, is_value_function)
|
||||
putd "void FUNCNAME##_reset(){ \\"
|
||||
indent {
|
||||
putd "memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake)); \\"
|
||||
putd "FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN;\\"
|
||||
}
|
||||
putd "} \\"
|
||||
end
|
||||
|
||||
def define_fff_globals
|
||||
putd "typedef struct { "
|
||||
indent {
|
||||
putd "void * call_history[FFF_CALL_HISTORY_LEN];"
|
||||
putd "unsigned int call_history_idx;"
|
||||
}
|
||||
putd "} fff_globals_t;"
|
||||
putd ""
|
||||
putd "FFF_EXTERN_C \\"
|
||||
@@ -365,30 +427,38 @@ def define_fff_globals
|
||||
putd "FFF_END_EXTERN_C \\"
|
||||
putd ""
|
||||
putd "#define DEFINE_FFF_GLOBALS \\"
|
||||
indent {
|
||||
putd "FFF_EXTERN_C \\"
|
||||
indent {
|
||||
putd "fff_globals_t fff; \\"
|
||||
}
|
||||
putd "FFF_END_EXTERN_C"
|
||||
}
|
||||
putd ""
|
||||
putd "#define FFF_RESET_HISTORY() fff.call_history_idx = 0;"
|
||||
putd ""
|
||||
putd "#define REGISTER_CALL(function) \\"
|
||||
indent {
|
||||
putd "if(fff.call_history_idx < FFF_CALL_HISTORY_LEN) \\"
|
||||
indent {
|
||||
putd "fff.call_history[fff.call_history_idx++] = (void *)function;"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def extern_c
|
||||
putd "FFF_EXTERN_C \\"
|
||||
pushd
|
||||
indent {
|
||||
yield
|
||||
popd
|
||||
}
|
||||
putd "FFF_END_EXTERN_C \\"
|
||||
end
|
||||
|
||||
def in_struct
|
||||
putd "typedef struct FUNCNAME##_Fake { \\"
|
||||
pushd
|
||||
indent {
|
||||
yield
|
||||
popd
|
||||
}
|
||||
putd "} FUNCNAME##_Fake;\\"
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user