22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/kakasi/ffi.rb', line 22
def kakasi(options, string)
@mutex.synchronize {
if options != @options
kakasi_close_kanwadict() if @options
args = ['kakasi', *options.split]
argc = args.size
argv = FFI::MemoryPointer.new(:pointer, argc).
write_array_of_pointer(args.map { |arg|
FFI::MemoryPointer.from_string(arg)
})
kakasi_getopt_argv(argc, argv).zero? or
raise "failed to initialize kakasi"
@options = options.dup
end
encoding = string.encoding
result = ''.force_encoding(INTERNAL_ENCODING)
string.encode(INTERNAL_ENCODING).split(/(\0+)/).each { |str, nul|
buf = kakasi_do(str)
result << buf.read_string.force_encoding(INTERNAL_ENCODING)
kakasi_free(buf)
result << nul if nul
}
result.encode(encoding)
}
end
|