зеркало из https://github.com/github/ruby.git
116 строки
2.2 KiB
Ruby
116 строки
2.2 KiB
Ruby
# example:
|
|
# DLTYPE[INT][:rb2c]["arg0"] => "NUM2INT(arg0)"
|
|
# DLTYPE[DOUBLE][:c2rb]["r"] => "rb_float_new(r)"
|
|
|
|
DLTYPE = {
|
|
VOID = 0x00 => {
|
|
:name => 'VOID',
|
|
:rb2c => nil,
|
|
:c2rb => nil,
|
|
:ctype => "void",
|
|
:stmem => "v",
|
|
:sym => true,
|
|
:cb => true,
|
|
},
|
|
CHAR = 0x01 => {
|
|
:name => 'CHAR',
|
|
:rb2c => proc{|x| "NUM2CHR(#{x})"},
|
|
:c2rb => proc{|x| "CHR2FIX(#{x})"},
|
|
:ctype => "char",
|
|
:stmem => "c",
|
|
:sym => false,
|
|
:cb => false,
|
|
},
|
|
SHORT = 0x02 => {
|
|
:name => 'SHORT',
|
|
:rb2c => proc{|x| "FIX2INT(#{x})"},
|
|
:c2rb => proc{|x| "INT2FIX(#{x})"},
|
|
:ctype => "short",
|
|
:stmem => "h",
|
|
:sym => false,
|
|
:cb => false,
|
|
},
|
|
INT = 0x03 => {
|
|
:name => 'INT',
|
|
:rb2c => proc{|x| "NUM2INT(#{x})"},
|
|
:c2rb => proc{|x| "INT2NUM(#{x})"},
|
|
:ctype => "int",
|
|
:stmem => "i",
|
|
:sym => true,
|
|
:cb => false,
|
|
},
|
|
LONG = 0x04 => {
|
|
:name => 'LONG',
|
|
:rb2c => proc{|x| "NUM2INT(#{x})"},
|
|
:c2rb => proc{|x| "INT2NUM(#{x})"},
|
|
:ctype => "long",
|
|
:stmem => "l",
|
|
:sym => true,
|
|
:cb => true,
|
|
},
|
|
FLOAT = 0x05 => {
|
|
:name => 'FLOAT',
|
|
:rb2c => proc{|x| "(float)(RFLOAT(#{x})->value)"},
|
|
:c2rb => proc{|x| "rb_float_new((double)#{x})"},
|
|
:ctype => "float",
|
|
:stmem => "f",
|
|
:sym => false,
|
|
:cb => false,
|
|
},
|
|
DOUBLE = 0x06 => {
|
|
:name => 'DOUBLE',
|
|
:rb2c => proc{|x| "RFLOAT(#{x})->value"},
|
|
:c2rb => proc{|x| "rb_float_new(#{x})"},
|
|
:ctype => "double",
|
|
:stmem => "d",
|
|
:sym => true,
|
|
:cb => true,
|
|
},
|
|
VOIDP = 0x07 => {
|
|
:name => 'VOIDP',
|
|
:rb2c => proc{|x| "rb_dlptr2cptr(#{x})"},
|
|
:c2rb => proc{|x| "rb_dlptr_new(#{x},sizeof(void*),0)"},
|
|
:ctype => "void *",
|
|
:stmem => "p",
|
|
:sym => true,
|
|
:cb => true,
|
|
},
|
|
}
|
|
|
|
def tpush(t, x)
|
|
(t << 3)|x
|
|
end
|
|
|
|
def tget(t, i)
|
|
(t & (0x07 << (i * 3))) >> (i * 3)
|
|
end
|
|
|
|
def types2num(types)
|
|
res = 0x00
|
|
r = types.reverse
|
|
r.each{|t|
|
|
res = tpush(res,t)
|
|
}
|
|
res
|
|
end
|
|
|
|
def num2types(num)
|
|
ts = []
|
|
i = 0
|
|
t = tget(num,i)
|
|
while( (t != VOID && i > 0) || (i == 0) )
|
|
ts.push(DLTYPE[t][:ctype])
|
|
i += 1
|
|
t = tget(num,i)
|
|
end
|
|
ts
|
|
end
|
|
|
|
def types2ctypes(types)
|
|
res = []
|
|
types.each{|t|
|
|
res.push(DLTYPE[t][:ctype])
|
|
}
|
|
res
|
|
end
|