diff --git a/docs/CMock Summary.odt b/docs/CMock Summary.odt index 4f054c1..510b8ba 100644 Binary files a/docs/CMock Summary.odt and b/docs/CMock Summary.odt differ diff --git a/docs/CMock Summary.pdf b/docs/CMock Summary.pdf index 8cddcf1..2b95753 100644 Binary files a/docs/CMock Summary.pdf and b/docs/CMock Summary.pdf differ diff --git a/lib/cmock_header_parser.rb b/lib/cmock_header_parser.rb index cc3143d..5ecffff 100644 --- a/lib/cmock_header_parser.rb +++ b/lib/cmock_header_parser.rb @@ -76,7 +76,7 @@ class CMockHeaderParser source.gsub!(/^(?:.*\W)?typedef\W.*/, '') # remove typedef statements #scan for functions which return function pointers, because they are a pain - source.gsub!(/([\w\s\*]+)\(*\(\s*\*([\w\s\*]+)\s*\(([\w\s\*,]+)\)\)\s*\(([\w\s\*,]+)\)\)*/) do |m| + source.gsub!(/([\w\s\*]+)\(*\(\s*\*([\w\s\*]+)\s*\(([\w\s\*,]*)\)\)\s*\(([\w\s\*,]*)\)\)*/) do |m| functype = "cmock_#{@module_name}_func_ptr#{@typedefs.size + 1}" @typedefs << "typedef #{$1.strip}(*#{functype})(#{$4});" "#{functype} #{$2.strip}(#{$3});" @@ -146,7 +146,7 @@ class CMockHeaderParser arg_list.gsub!(/\*(\w)/,'* \1') # pull asterisks away from arg to place asterisks with type (where they belong) #scan argument list for function pointers and replace them with custom types - arg_list.gsub!(/([\w\s]+)\(*\(\s*\*([\w\s\*]+)\)\s*\(([\w\s\*,]+)\)\)*/) do |m| + arg_list.gsub!(/([\w\s]+)\(*\(\s*\*([\w\s\*]+)\)\s*\(([\w\s\*,]*)\)\)*/) do |m| functype = "cmock_#{@module_name}_func_ptr#{@typedefs.size + 1}" funcret = $1.strip funcname = $2.strip diff --git a/test/unit/cmock_header_parser_test.rb b/test/unit/cmock_header_parser_test.rb index 8fdf5e4..6948229 100644 --- a/test/unit/cmock_header_parser_test.rb +++ b/test/unit/cmock_header_parser_test.rb @@ -855,6 +855,29 @@ class CMockHeaderParserTest < Test::Unit::TestCase assert_equal(typedefs, result[:typedefs]) end + should "extract functions containing a function pointer with an implied void" do + source = "void FunkyTurkey(unsigned int (*func_ptr)())" + expected = [{ :var_arg=>nil, + :return=>{ :type => "void", + :name => 'cmock_to_return', + :ptr? => false, + :const? => false, + :str => "void cmock_to_return", + :void? => true + }, + :name=>"FunkyTurkey", + :modifier=>"", + :contains_ptr? => false, + :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr", :ptr? => false, :const? => false} + ], + :args_string=>"cmock_module_func_ptr1 func_ptr", + :args_call=>"func_ptr" }] + typedefs = ["typedef unsigned int(*cmock_module_func_ptr1)();"] + result = @parser.parse("module", source) + assert_equal(expected, result[:functions]) + assert_equal(typedefs, result[:typedefs]) + end + should "extract functions containing a constant function pointer and a pointer in the nested arg list" do source = "void FunkyChicken(unsigned int (* const func_ptr)(unsigned long int * , char))" expected = [{ :var_arg=>nil, @@ -971,6 +994,28 @@ class CMockHeaderParserTest < Test::Unit::TestCase assert_equal(typedefs, result[:typedefs]) end + should "extract functions returning a function pointer with implied void" do + source = "unsigned short (*FunkyTweetie())()" + expected = [{ :var_arg=>nil, + :return=>{ :type => "cmock_module_func_ptr1", + :name => 'cmock_to_return', + :ptr? => false, + :const? => false, + :str => "cmock_module_func_ptr1 cmock_to_return", + :void? => false + }, + :name=>"FunkyTweetie", + :modifier=>"", + :contains_ptr? => false, + :args=>[], + :args_string=>"void", + :args_call=>"" }] + typedefs = ["typedef unsigned short(*cmock_module_func_ptr1)();"] + result = @parser.parse("module", source) + assert_equal(expected, result[:functions]) + assert_equal(typedefs, result[:typedefs]) + end + should "extract functions returning a function pointer where everything is a void" do source = "void (* FunkySeaGull(void))(void)" expected = [{ :var_arg=>nil,