Add putdml

putdml is a multiline putd which adds a \ at the end of the generated macro
This commit is contained in:
usr42
2017-01-26 16:15:20 +01:00
parent f6fd3cf5dc
commit 49c814ff34
2 changed files with 1049 additions and 1044 deletions

View File

@@ -57,17 +57,17 @@ def output_internal_helper_macros
end end
def define_return_sequence_helper def define_return_sequence_helper
putd "#define SET_RETURN_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \\" putdml("#define SET_RETURN_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN)")
indent { indent {
putd "FUNCNAME##_fake.return_val_seq = ARRAY_POINTER; \\" putdml("FUNCNAME##_fake.return_val_seq = ARRAY_POINTER;")
putd "FUNCNAME##_fake.return_val_seq_len = ARRAY_LEN;" putd "FUNCNAME##_fake.return_val_seq_len = ARRAY_LEN;"
} }
end end
def define_custom_fake_sequence_helper def define_custom_fake_sequence_helper
putd "#define SET_CUSTOM_FAKE_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \\" putdml("#define SET_CUSTOM_FAKE_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN)")
indent { indent {
putd "FUNCNAME##_fake.custom_fake_seq = ARRAY_POINTER; \\" putdml("FUNCNAME##_fake.custom_fake_seq = ARRAY_POINTER;")
putd "FUNCNAME##_fake.custom_fake_seq_len = ARRAY_LEN;" putd "FUNCNAME##_fake.custom_fake_seq_len = ARRAY_LEN;"
} }
end end
@@ -75,36 +75,36 @@ end
def define_reset_fake_macro def define_reset_fake_macro
putd "" putd ""
putd "/* Defining a function to reset a fake function */" putd "/* Defining a function to reset a fake function */"
putd "#define RESET_FAKE(FUNCNAME) { \\" putdml("#define RESET_FAKE(FUNCNAME) {")
indent { indent {
putd "FUNCNAME##_reset(); \\" putdml("FUNCNAME##_reset();")
} }
putd "} \\" putdml("}")
putd "" putd ""
end end
def define_declare_arg_helper def define_declare_arg_helper
putd "" putd ""
putd "#define DECLARE_ARG(type, n, FUNCNAME) \\" putdml("#define DECLARE_ARG(type, n, FUNCNAME)")
indent { indent {
putd "type arg##n##_val; \\" putdml("type arg##n##_val;")
putd "type arg##n##_history[FFF_ARG_HISTORY_LEN];" putd "type arg##n##_history[FFF_ARG_HISTORY_LEN];"
} }
end end
def define_declare_all_func_common_helper def define_declare_all_func_common_helper
putd "" putd ""
putd "#define DECLARE_ALL_FUNC_COMMON \\" putdml("#define DECLARE_ALL_FUNC_COMMON")
indent { indent {
putd "unsigned int call_count; \\" putdml("unsigned int call_count;")
putd "unsigned int arg_history_len;\\" putdml("unsigned int arg_history_len;")
putd "unsigned int arg_histories_dropped; \\" putdml("unsigned int arg_histories_dropped;")
} }
end end
def define_save_arg_helper def define_save_arg_helper
putd "" putd ""
putd "#define SAVE_ARG(FUNCNAME, n) \\" putdml("#define SAVE_ARG(FUNCNAME, n)")
indent { indent {
putd "memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));" putd "memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));"
} }
@@ -112,7 +112,7 @@ end
def define_room_for_more_history def define_room_for_more_history
putd "" putd ""
putd "#define ROOM_FOR_MORE_HISTORY(FUNCNAME) \\" putdml("#define ROOM_FOR_MORE_HISTORY(FUNCNAME)")
indent { indent {
putd "FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN" putd "FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN"
} }
@@ -120,7 +120,7 @@ end
def define_save_arg_history_helper def define_save_arg_history_helper
putd "" putd ""
putd "#define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \\" putdml("#define SAVE_ARG_HISTORY(FUNCNAME, ARGN)")
indent { indent {
putd "memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));" putd "memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));"
} }
@@ -128,7 +128,7 @@ end
def define_history_dropped_helper def define_history_dropped_helper
putd "" putd ""
putd "#define HISTORY_DROPPED(FUNCNAME) \\" putdml("#define HISTORY_DROPPED(FUNCNAME)")
indent { indent {
putd "FUNCNAME##_fake.arg_histories_dropped++" putd "FUNCNAME##_fake.arg_histories_dropped++"
} }
@@ -136,27 +136,27 @@ end
def define_value_function_variables_helper def define_value_function_variables_helper
putd "" putd ""
putd "#define DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \\" putdml("#define DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)")
indent { indent {
putd "RETURN_TYPE return_val; \\" putdml("RETURN_TYPE return_val;")
putd "int return_val_seq_len; \\" putdml("int return_val_seq_len;")
putd "int return_val_seq_idx; \\" putdml("int return_val_seq_idx;")
putd "RETURN_TYPE * return_val_seq; \\" putdml("RETURN_TYPE * return_val_seq;")
} }
end end
def define_custom_fake_seq_variables_helper def define_custom_fake_seq_variables_helper
putd "" putd ""
putd "#define DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \\" putdml("#define DECLARE_CUSTOM_FAKE_SEQ_VARIABLES")
indent { indent {
putd "int custom_fake_seq_len; \\" putdml("int custom_fake_seq_len;")
putd "int custom_fake_seq_idx; \\" putdml("int custom_fake_seq_idx;")
} }
end end
def define_increment_call_count_helper def define_increment_call_count_helper
putd "" putd ""
putd "#define INCREMENT_CALL_COUNT(FUNCNAME) \\" putdml("#define INCREMENT_CALL_COUNT(FUNCNAME)")
indent { indent {
putd "FUNCNAME##_fake.call_count++" putd "FUNCNAME##_fake.call_count++"
} }
@@ -164,19 +164,19 @@ end
def define_return_fake_result_helper def define_return_fake_result_helper
putd "" putd ""
putd "#define RETURN_FAKE_RESULT(FUNCNAME) \\" putdml("#define RETURN_FAKE_RESULT(FUNCNAME)")
indent { indent {
putd "if (FUNCNAME##_fake.return_val_seq_len){ /* then its a sequence */ \\" putdml("if (FUNCNAME##_fake.return_val_seq_len){ /* then its a sequence */")
indent { indent {
putd "if(FUNCNAME##_fake.return_val_seq_idx < FUNCNAME##_fake.return_val_seq_len) { \\" putdml("if(FUNCNAME##_fake.return_val_seq_idx < FUNCNAME##_fake.return_val_seq_len) {")
indent { indent {
putd "return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx++]; \\" putdml("return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx++];")
} }
putd "} \\" putdml("}")
putd "return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]; /* return last element */ \\" putdml("return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]; /* return last element */")
} }
putd "} \\" putdml("}")
putd "return FUNCNAME##_fake.return_val; \\" putdml("return FUNCNAME##_fake.return_val;")
} }
end end
@@ -197,12 +197,12 @@ end
def define_reset_fake_helper def define_reset_fake_helper
putd "" putd ""
putd "#define DEFINE_RESET_FUNCTION(FUNCNAME) \\" putdml("#define DEFINE_RESET_FUNCTION(FUNCNAME)")
indent { indent {
putd "void FUNCNAME##_reset(){ \\" putdml("void FUNCNAME##_reset(){")
indent { indent {
putd "memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake)); \\" putdml("memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake));")
putd "FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN;\\" putdml("FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN;")
} }
putd "}" putd "}"
} }
@@ -216,6 +216,11 @@ def putd(str)
puts str puts str
end end
#multiline putd which adds a \ at the end of the generated macro
def putdml(str)
putd(str + " \\")
end
def pushd def pushd
$current_depth = $current_depth + 4 $current_depth = $current_depth + 4
end end
@@ -251,13 +256,13 @@ def output_macro(arg_count, has_varargs, is_value_function)
output_macro_header(define_macro_name, saved_arg_count, has_varargs, return_type) output_macro_header(define_macro_name, saved_arg_count, has_varargs, return_type)
indent { indent {
extern_c { extern_c {
putd "FUNCNAME##_Fake FUNCNAME##_fake;\\" putdml("FUNCNAME##_Fake FUNCNAME##_fake;")
putd function_signature(saved_arg_count, has_varargs, is_value_function) + "{ \\" putdml function_signature(saved_arg_count, has_varargs, is_value_function) + "{"
indent { indent {
output_function_body(saved_arg_count, has_varargs, is_value_function) output_function_body(saved_arg_count, has_varargs, is_value_function)
} }
putd "} \\" putdml("}")
putd "DEFINE_RESET_FUNCTION(FUNCNAME) \\" putdml("DEFINE_RESET_FUNCTION(FUNCNAME)")
} }
} }
@@ -280,7 +285,7 @@ def output_macro_name(macro_name, arg_count, has_varargs, return_type)
putd "#define " + macro_signature_for(macro_name, arg_count, has_varargs, return_type) putd "#define " + macro_signature_for(macro_name, arg_count, has_varargs, return_type)
end end
# #macro_name(RETURN_TYPE, FUNCNAME, ARG0,...) # #macro_name(RETURN_TYPE, FUNCNAME, ARG0,...) \
def macro_signature_for(macro_name, arg_count, has_varargs, return_type) def macro_signature_for(macro_name, arg_count, has_varargs, return_type)
parameter_list = "#{macro_name}(" parameter_list = "#{macro_name}("
if return_type != "" if return_type != ""
@@ -301,16 +306,16 @@ end
def output_variables(arg_count, has_varargs, is_value_function) def output_variables(arg_count, has_varargs, is_value_function)
in_struct{ in_struct{
arg_count.times { |argN| arg_count.times { |argN|
putd "DECLARE_ARG(ARG#{argN}_TYPE, #{argN}, FUNCNAME) \\" putdml("DECLARE_ARG(ARG#{argN}_TYPE, #{argN}, FUNCNAME)")
} }
putd "DECLARE_ALL_FUNC_COMMON \\" putdml("DECLARE_ALL_FUNC_COMMON")
putd "DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \\" unless not is_value_function putdml("DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE)") unless not is_value_function
putd "DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \\" putdml("DECLARE_CUSTOM_FAKE_SEQ_VARIABLES")
output_custom_function_signature(arg_count, has_varargs, is_value_function) output_custom_function_signature(arg_count, has_varargs, is_value_function)
output_custom_function_array(arg_count, has_varargs, is_value_function) output_custom_function_array(arg_count, has_varargs, is_value_function)
} }
putd "extern FUNCNAME##_Fake FUNCNAME##_fake;\\" putdml("extern FUNCNAME##_Fake FUNCNAME##_fake;")
putd "void FUNCNAME##_reset(); \\" putdml("void FUNCNAME##_reset();")
end end
#example: ARG0_TYPE arg0, ARG1_TYPE arg1 #example: ARG0_TYPE arg0, ARG1_TYPE arg1
@@ -332,15 +337,15 @@ end
def output_custom_function_signature(arg_count, has_varargs, is_value_function) def output_custom_function_signature(arg_count, has_varargs, is_value_function)
return_type = is_value_function ? "RETURN_TYPE" : "void" return_type = is_value_function ? "RETURN_TYPE" : "void"
ap_list = has_varargs ? ", va_list ap" : "" ap_list = has_varargs ? ", va_list ap" : ""
signature = "(*custom_fake)(#{arg_val_list(arg_count)}#{ap_list}); \\" signature = "(*custom_fake)(#{arg_val_list(arg_count)}#{ap_list});"
putd return_type + signature putdml return_type + signature
end end
def output_custom_function_array(arg_count, has_varargs, is_value_function) def output_custom_function_array(arg_count, has_varargs, is_value_function)
return_type = is_value_function ? "RETURN_TYPE" : "void" return_type = is_value_function ? "RETURN_TYPE" : "void"
ap_list = has_varargs ? ", va_list ap" : "" ap_list = has_varargs ? ", va_list ap" : ""
custom_array = "(**custom_fake_seq)(#{arg_val_list(arg_count)}#{ap_list}); \\" custom_array = "(**custom_fake_seq)(#{arg_val_list(arg_count)}#{ap_list});"
putd return_type + custom_array putdml return_type + custom_array
end end
# example: RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1) # example: RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1)
@@ -351,67 +356,67 @@ def function_signature(arg_count, has_varargs, is_value_function)
end end
def output_function_body(arg_count, has_varargs, is_value_function) def output_function_body(arg_count, has_varargs, is_value_function)
arg_count.times { |i| putd "SAVE_ARG(FUNCNAME, #{i}); \\" } arg_count.times { |i| putdml("SAVE_ARG(FUNCNAME, #{i});") }
putd "if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){\\" putdml("if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){")
indent { indent {
arg_count.times { |i| putd "SAVE_ARG_HISTORY(FUNCNAME, #{i}); \\" } arg_count.times { |i| putdml("SAVE_ARG_HISTORY(FUNCNAME, #{i});") }
} }
putd "}\\" putdml("}")
putd "else{\\" putdml("else{")
indent { indent {
putd "HISTORY_DROPPED(FUNCNAME);\\" putdml("HISTORY_DROPPED(FUNCNAME);")
} }
putd "}\\" putdml("}")
putd "INCREMENT_CALL_COUNT(FUNCNAME); \\" putdml("INCREMENT_CALL_COUNT(FUNCNAME);")
putd "REGISTER_CALL(FUNCNAME); \\" putdml("REGISTER_CALL(FUNCNAME);")
if has_varargs if has_varargs
putd "if(FUNCNAME##_fake.custom_fake){\\" putdml("if(FUNCNAME##_fake.custom_fake){")
indent { indent {
putd "RETURN_TYPE ret;\\" if is_value_function putdml("RETURN_TYPE ret;") if is_value_function
putd "va_list ap;\\" putdml("va_list ap;")
putd "va_start(ap, arg#{arg_count-1});\\" putdml("va_start(ap, arg#{arg_count-1});")
} }
custom_fake_call = "FUNCNAME##_fake.custom_fake(#{arg_list(arg_count)}, ap);" custom_fake_call = "FUNCNAME##_fake.custom_fake(#{arg_list(arg_count)}, ap);"
indent { indent {
if is_value_function if is_value_function
putd "ret = #{custom_fake_call}\\" putdml("ret = #{custom_fake_call}")
else else
putd "#{custom_fake_call}\\" putdml("#{custom_fake_call}")
end end
putd "va_end(ap);\\" putdml("va_end(ap);")
putd "return ret;\\" if is_value_function putdml("return ret;") if is_value_function
} }
putd "}\\" putdml("}")
else else
return_type = is_value_function ? "return " : "" return_type = is_value_function ? "return " : ""
putd "if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \\" putdml("if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */")
indent { indent {
putd "if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \\" putdml("if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){")
indent { indent {
putd "#{return_type}FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](#{arg_list(arg_count)}); \\" putdml("#{return_type}FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](#{arg_list(arg_count)});")
} }
putd "} \\" putdml("}")
putd "else{ \\" putdml("else{")
indent { indent {
putd "#{return_type}FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](#{arg_list(arg_count)}); \\" putdml("#{return_type}FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](#{arg_list(arg_count)});")
} }
putd "} \\" putdml("}")
} }
putd "} \\" putdml("}")
putd "if (FUNCNAME##_fake.custom_fake) #{return_type}FUNCNAME##_fake.custom_fake(#{arg_list(arg_count)}); \\" putdml("if (FUNCNAME##_fake.custom_fake) #{return_type}FUNCNAME##_fake.custom_fake(#{arg_list(arg_count)});")
end end
putd "RETURN_FAKE_RESULT(FUNCNAME) \\" if is_value_function putdml("RETURN_FAKE_RESULT(FUNCNAME)") if is_value_function
end end
def output_reset_function(arg_count, is_value_function) def output_reset_function(arg_count, is_value_function)
putd "void FUNCNAME##_reset(){ \\" putdml("void FUNCNAME##_reset(){")
indent { indent {
putd "memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake)); \\" putdml("memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake));")
putd "FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN;\\" putdml("FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN;")
} }
putd "} \\" putdml("}")
end end
def define_fff_globals def define_fff_globals
@@ -422,24 +427,24 @@ def define_fff_globals
} }
putd "} fff_globals_t;" putd "} fff_globals_t;"
putd "" putd ""
putd "FFF_EXTERN_C \\" putdml("FFF_EXTERN_C")
putd "extern fff_globals_t fff;" putd "extern fff_globals_t fff;"
putd "FFF_END_EXTERN_C \\" putdml("FFF_END_EXTERN_C")
putd "" putd ""
putd "#define DEFINE_FFF_GLOBALS \\" putdml("#define DEFINE_FFF_GLOBALS")
indent { indent {
putd "FFF_EXTERN_C \\" putdml("FFF_EXTERN_C")
indent { indent {
putd "fff_globals_t fff; \\" putdml("fff_globals_t fff;")
} }
putd "FFF_END_EXTERN_C" putd "FFF_END_EXTERN_C"
} }
putd "" putd ""
putd "#define FFF_RESET_HISTORY() fff.call_history_idx = 0;" putd "#define FFF_RESET_HISTORY() fff.call_history_idx = 0;"
putd "" putd ""
putd "#define REGISTER_CALL(function) \\" putdml("#define REGISTER_CALL(function)")
indent { indent {
putd "if(fff.call_history_idx < FFF_CALL_HISTORY_LEN) \\" putdml("if(fff.call_history_idx < FFF_CALL_HISTORY_LEN)")
indent { indent {
putd "fff.call_history[fff.call_history_idx++] = (void *)function;" putd "fff.call_history[fff.call_history_idx++] = (void *)function;"
} }
@@ -447,19 +452,19 @@ def define_fff_globals
end end
def extern_c def extern_c
putd "FFF_EXTERN_C \\" putdml("FFF_EXTERN_C")
indent { indent {
yield yield
} }
putd "FFF_END_EXTERN_C \\" putdml("FFF_END_EXTERN_C")
end end
def in_struct def in_struct
putd "typedef struct FUNCNAME##_Fake { \\" putdml("typedef struct FUNCNAME##_Fake {")
indent { indent {
yield yield
} }
putd "} FUNCNAME##_Fake;\\" putdml("} FUNCNAME##_Fake;")
end end
def include_guard def include_guard

1896
fff.h

File diff suppressed because it is too large Load Diff