Maps different C types to the C type representations we use
# File lib/ffi/tools/types_generator.rb, line 44 44: def self.generate(options = {}) 45: typedefs = nil 46: Tempfile.open 'ffi_types_generator' do |io| 47: io.puts #include <sys/types.h>#include <sys/socket.h>#include <sys/resource.h> 48: 49: io.close 50: typedefs = `gcc -E -x c #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -c #{io.path}` 51: end 52: 53: code = "" 54: 55: typedefs.each_line do |type| 56: # We only care about single line typedef 57: next unless type =~ /typedef/ 58: # Ignore unions or structs 59: next if type =~ /union|struct/ 60: 61: # strip off the starting typedef and ending ; 62: type.gsub!(/^(.*typedef\s*)/, "") 63: type.gsub!(/\s*;\s*$/, "") 64: 65: parts = type.split(/\s+/) 66: def_type = parts.join(" ") 67: 68: # GCC does mapping with __attribute__ stuf, also see 69: # http://hal.cs.berkeley.edu/cil/cil016.html section 16.2.7. Problem 70: # with this is that the __attribute__ stuff can either occur before or 71: # after the new type that is defined... 72: if type =~ /__attribute__/ 73: if parts.last =~ /__QI__|__HI__|__SI__|__DI__|__word__/ 74: 75: # In this case, the new type is BEFORE __attribute__ we need to 76: # find the final_type as the type before the part that starts with 77: # __attribute__ 78: final_type = "" 79: parts.each do |p| 80: break if p =~ /__attribute__/ 81: final_type = p 82: end 83: else 84: final_type = parts.pop 85: end 86: 87: def_type = case type 88: when /__QI__/ then "char" 89: when /__HI__/ then "short" 90: when /__SI__/ then "int" 91: when /__DI__/ then "long long" 92: when /__word__/ then "long" 93: else "int" 94: end 95: 96: def_type = "unsigned #{def_type}" if type =~ /unsigned/ 97: else 98: final_type = parts.pop 99: def_type = parts.join(" ") 100: end 101: 102: if type = TYPE_MAP[def_type] 103: code << "rbx.platform.typedef.#{final_type} = #{type}\n" 104: TYPE_MAP[final_type] = TYPE_MAP[def_type] 105: else 106: # Fallback to an ordinary pointer if we don't know the type 107: if def_type =~ /\*/ 108: code << "rbx.platform.typedef.#{final_type} = pointer\n" 109: TYPE_MAP[final_type] = :pointer 110: end 111: end 112: end 113: 114: code 115: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.