Fix up Rubinius specific library specs.
[rbx.git] / lib / ffi / generator.rb
blob0de9928bf4c909045a34ae2ebbeb12fe69780acd
1 module FFI
2   class Generator
4     def initialize(ffi_name, rb_name)
5       @ffi_name = ffi_name
6       @rb_name = rb_name
8       @name = File.basename rb_name, '.rb'
10       file = File.read @ffi_name
12       new_file = file.gsub(/^( *)@@@(.*?)@@@/m) do
13         @constants = []
14         @structs = []
16         indent = $1
17         original_lines = $2.count "\n"
19         instance_eval $2
21         new_lines = []
22         @constants.each { |c| new_lines << c.to_ruby }
23         @structs.each { |s| new_lines << s.generate_layout }
25         new_lines = new_lines.join("\n").split "\n" # expand multiline blocks
26         new_lines = new_lines.map { |line| indent + line }
28         padding = original_lines - new_lines.length
29         new_lines += [nil] * padding if padding >= 0
31         new_lines.join "\n"
32       end
34       open @rb_name, 'w' do |f|
35         f.puts "# This file is generated by rake. Do not edit."
36         f.puts
37         f.puts new_file
38       end
39     end
41     def constants(options = {}, &block)
42       @constants << FFI::ConstGenerator.new(@name, options, &block)
43     end
45     def struct(&block)
46       @structs << FFI::StructGenerator.new(@name, &block)
47     end
49     ##
50     # Utility converter for constants
52     def to_s
53       proc { |obj| obj.to_s.inspect }
54     end
56   end
57 end