diff options
author | ttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-04-02 10:56:13 +0000 |
---|---|---|
committer | ttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-04-02 10:56:13 +0000 |
commit | 7d711b817e62eb6c8dee01ea2283fcb1ad90f8ac (patch) | |
tree | b1b54ab76217775071de4e3669674aa7887aa6b9 /ext/dl/type.rb | |
parent | 64b6406445e53f187d2982f87becff8065edd0cc (diff) | |
download | ruby-7d711b817e62eb6c8dee01ea2283fcb1ad90f8ac.tar.gz |
Add ruby-dl
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2324 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/dl/type.rb')
-rw-r--r-- | ext/dl/type.rb | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/ext/dl/type.rb b/ext/dl/type.rb new file mode 100644 index 0000000000..804420c395 --- /dev/null +++ b/ext/dl/type.rb @@ -0,0 +1,115 @@ +# 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 |