class FFI::Exporter
def dump(out_file)
def dump(out_file) File.open(out_file, 'w') do |f| guard = File.basename(out_file).upcase.gsub('.', '_').gsub('/', '_') f.puts <<-HEADER def #{guard} ine #{guard} 1 def RBFFI_EXPORT def __cplusplus efine RBFFI_EXPORT extern "C" se efine RBFFI_EXPORT dif if HEADER @callbacks.each do |name, cb| f.puts "typedef #{cb.name(name)};" end @structs.each do |s| f.puts "struct #{s[:name].gsub('::', '_')} {" s[:fields].each do |field| if field[:type].is_a?(CallbackInfo) type = field[:type].name(field[:name].to_s) else type = "#{field[:type].name} #{field[:name].to_s}" end f.puts "#{' ' * 4}#{type};" end f.puts '};' f.puts end @functions.each do |fn| param_string = fn[:params].empty? ? 'void' : fn[:params].map(&:name).join(', ') f.puts "RBFFI_EXPORT #{fn[:result_type].name} #{fn[:fname]}(#{param_string});" end f.puts <<-EPILOG if /* #{guard} */ EPILOG end end