def attach_variable(mname, a1, a2 = nil)
cname, type = a2 ? [ a1, a2 ] : [ mname.to_s, a1 ]
libraries = defined?(@ffi_libs) ? @ffi_libs : [ DEFAULT ]
address = nil
libraries.each do |lib|
begin
address = lib.find_symbol(cname.to_s)
break unless address.nil?
rescue LoadError
end
end
raise FFI::NotFoundError.new(cname, libraries) if address.nil?
case ffi_type = find_type(type)
when :pointer, FFI::NativeType::POINTER
op = :pointer
when :char, FFI::NativeType::INT8
op = :int8
when :uchar, FFI::NativeType::UINT8
op = :uint8
when :short, FFI::NativeType::INT16
op = :int16
when :ushort, FFI::NativeType::UINT16
op = :uint16
when :int, FFI::NativeType::INT32
op = :int32
when :uint, FFI::NativeType::UINT32
op = :uint32
when :long, FFI::NativeType::LONG
op = :long
when :ulong, FFI::NativeType::ULONG
op = :ulong
when :long_long, FFI::NativeType::INT64
op = :int64
when :ulong_long, FFI::NativeType::UINT64
op = :uint64
else
if ffi_type.is_a?(FFI::CallbackInfo)
op = :callback
else
raise FFI::TypeError, "Cannot access library variable of type #{type}"
end
end
if op == :callback
self.module_eval "@@ffi_gvar_\#{mname} = address\n@@ffi_gvar_\#{mname}_cbinfo = ffi_type\ndef self.\#{mname}\nraise ArgError, \"Cannot get callback fields\"\nend\ndef self.\#{mname}=(value)\n@@ffi_gvar_\#{mname}.put_callback(0, value, @@ffi_gvar_\#{mname}_cbinfo)\nend\n"
else
self.module_eval "@@ffi_gvar_\#{mname} = address\ndef self.\#{mname}\n@@ffi_gvar_\#{mname}.get_\#{op.to_s}(0)\nend\ndef self.\#{mname}=(value)\n@@ffi_gvar_\#{mname}.put_\#{op.to_s}(0, value)\nend\n"
end
address
end