Method: FFI::Generator#initialize

Defined in:
lib/ffi/tools/generator.rb

#initialize(ffi_name, rb_name, options = {}) ⇒ Generator

Returns a new instance of Generator.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/ffi/tools/generator.rb', line 51

def initialize(ffi_name, rb_name, options = {})
  @ffi_name = ffi_name
  @rb_name = rb_name
  @options = options
  @name = File.basename rb_name, '.rb'

  file = File.read @ffi_name

  new_file = file.gsub(/^( *)@@@(.*?)@@@/m) do
    @constants = []
    @structs = []

    indent = $1
    original_lines = $2.count "\n"

    instance_eval $2, @ffi_name, $`.count("\n")

    new_lines = []
    @constants.each { |c| new_lines << c.to_ruby }
    @structs.each { |s| new_lines << s.generate_layout }

    new_lines = new_lines.join("\n").split "\n" # expand multiline blocks
    new_lines = new_lines.map { |line| indent + line }

    padding = original_lines - new_lines.length
    new_lines += [nil] * padding if padding >= 0

    new_lines.join "\n"
  end

  open @rb_name, 'w' do |f|
    f.puts "# This file is generated from `#{@ffi_name}'. Do not edit."
    f.puts
    f.puts new_file
  end
end