mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
8ef5da3be1
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4790 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
69 lines
1.3 KiB
Ruby
69 lines
1.3 KiB
Ruby
require "dl/import"
|
|
require "dl/struct"
|
|
|
|
module LIBC
|
|
extend DL::Importable
|
|
|
|
begin
|
|
dlload "libc.so.6"
|
|
rescue
|
|
dlload "libc.so.5"
|
|
end
|
|
|
|
extern "int atoi(char*)"
|
|
extern "ibool isdigit(int)"
|
|
extern "int gettimeofday(struct timeval *, struct timezone *)"
|
|
extern "char* strcat(char*, char*)"
|
|
extern "FILE* fopen(char*, char*)"
|
|
extern "int fclose(FILE*)"
|
|
extern "int fgetc(FILE*)"
|
|
extern "int strlen(char*)"
|
|
extern "void qsort(void*, int, int, void*)"
|
|
|
|
def str_qsort(ary, comp)
|
|
len = ary.length
|
|
r,rs = qsort(ary, len, DL.sizeof('P'), comp)
|
|
return rs[0].to_a('S', len)
|
|
end
|
|
|
|
Timeval = struct [
|
|
"long tv_sec",
|
|
"long tv_usec",
|
|
]
|
|
|
|
Timezone = struct [
|
|
"int tz_minuteswest",
|
|
"int tz_dsttime",
|
|
]
|
|
|
|
def my_compare(ptr1, ptr2)
|
|
ptr1.ptr.to_s <=> ptr2.ptr.to_s
|
|
end
|
|
COMPARE = callback("int my_compare(char**, char**)")
|
|
end
|
|
|
|
|
|
$cb1 = DL.callback('IPP'){|ptr1, ptr2|
|
|
str1 = ptr1.ptr.to_s
|
|
str2 = ptr2.ptr.to_s
|
|
str1 <=> str2
|
|
}
|
|
|
|
p LIBC.atoi("10")
|
|
|
|
p LIBC.isdigit(?1)
|
|
|
|
p LIBC.isdigit(?a)
|
|
|
|
p LIBC.strcat("a", "b")
|
|
|
|
ary = ["a","c","b"]
|
|
ptr = ary.to_ptr
|
|
LIBC.qsort(ptr, ary.length, DL.sizeof('P'), LIBC::COMPARE)
|
|
p ptr.to_a('S', ary.length)
|
|
|
|
tv = LIBC::Timeval.malloc
|
|
tz = LIBC::Timezone.malloc
|
|
LIBC.gettimeofday(tv, tz)
|
|
|
|
p Time.at(tv.tv_sec)
|