summaryrefslogtreecommitdiff
path: root/ext/dl/sample/libc.rb
diff options
context:
space:
mode:
authorttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-04-02 10:56:13 +0000
committerttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-04-02 10:56:13 +0000
commit7d711b817e62eb6c8dee01ea2283fcb1ad90f8ac (patch)
treeb1b54ab76217775071de4e3669674aa7887aa6b9 /ext/dl/sample/libc.rb
parent64b6406445e53f187d2982f87becff8065edd0cc (diff)
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/sample/libc.rb')
-rw-r--r--ext/dl/sample/libc.rb84
1 files changed, 84 insertions, 0 deletions
diff --git a/ext/dl/sample/libc.rb b/ext/dl/sample/libc.rb
new file mode 100644
index 0000000000..c88fc687f2
--- /dev/null
+++ b/ext/dl/sample/libc.rb
@@ -0,0 +1,84 @@
+require 'dl'
+
+module LIBC
+ begin
+ LIB = DL.dlopen('libc.so.6')
+ rescue RuntimeError
+ LIB = DL.dlopen('libc.so.5')
+ end
+
+ SYM = {
+ :atoi => LIB['atoi', 'IS'],
+ :isdigit => LIB['isdigit', 'II'],
+ }
+
+ def atoi(str)
+ r,rs = SYM[:atoi].call(str)
+ return r
+ end
+
+ def isdigit(c)
+ r,rs = SYM[:isdigit].call(c)
+ return (r != 0)
+ end
+end
+
+module LIBC
+ SYM[:strcat] = LIB['strcat', 'SsS']
+ def strcat(str1,str2)
+ r,rs = SYM[:strcat].call(str1 + "\0#{str2}",str2)
+ return rs[0]
+ end
+end
+
+module LIBC
+ SYM[:fopen] = LIB['fopen', 'PSS']
+ SYM[:fclose] = LIB['fclose', '0P']
+ SYM[:fgetc] = LIB['fgetc', 'IP']
+
+ def fopen(filename, mode)
+ r,rs = SYM[:fopen].call(filename, mode)
+ return r
+ end
+
+ def fclose(ptr)
+ SYM[:fclose].call(ptr)
+ return nil
+ end
+
+ def fgetc(ptr)
+ r,rs = SYM[:fgetc].call(ptr)
+ return r
+ end
+end
+
+module LIBC
+ SYM[:strlen] = LIB['strlen', 'IP']
+ def strlen(str)
+ r,rs = SYM[:strlen].call(str)
+ return r
+ end
+end
+
+$cb1 = DL.set_callback('IPP', 0){|ptr1, ptr2|
+ str1 = ptr1.ptr.to_s
+ str2 = ptr2.ptr.to_s
+ str1 <=> str2
+}
+
+module LIBC
+ SYM[:qsort] = LIB['qsort', '0aIIP']
+ def qsort(ary, comp)
+ len = ary.length
+ r,rs = SYM[:qsort].call(ary, len, DL.sizeof('P'), comp)
+ return rs[0].to_a('S', len)
+ end
+end
+
+include LIBC
+
+p atoi("10")
+p isdigit(?1)
+p isdigit(?a)
+p strcat("a", "b")
+p qsort(["a","c","b"],$cb1)