Module: ICU::Lib
- Extended by:
- FFI::Library
- Defined in:
- lib/ffi-icu/lib.rb,
lib/ffi-icu/lib/util.rb
Defined Under Namespace
Modules: Util
Classes: UParseError, UTransPosition, VersionInfo
Class Method Summary
collapse
Class Method Details
.check_error ⇒ Object
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/ffi-icu/lib.rb', line 113
def self.check_error
ptr = FFI::MemoryPointer.new(:int)
ret = yield(ptr)
error_code = ptr.read_int
if error_code > 0
name = Lib.u_errorName error_code
if name == "U_BUFFER_OVERFLOW_ERROR"
raise BufferOverflowError
else
raise Error, name
end
elsif error_code < 0
$stderr.puts "ffi-icu: #{Lib.u_errorName error_code}" if $DEBUG || $VERBOSE
end
ret
end
|
.cldr_version ⇒ Object
175
176
177
178
179
|
# File 'lib/ffi-icu/lib.rb', line 175
def self.cldr_version
@cldr_version ||= VersionInfo.new.tap do |version|
check_error { |status| ulocdata_getCLDRVersion(version, status) }
end
end
|
.enum_ptr_to_array(enum_ptr) ⇒ Object
132
133
134
135
136
137
138
139
140
141
142
|
# File 'lib/ffi-icu/lib.rb', line 132
def self.enum_ptr_to_array(enum_ptr)
length = check_error do |status|
uenum_count(enum_ptr, status)
end
len = FFI::MemoryPointer.new(:int)
(0...length).map do |idx|
check_error { |st| uenum_next(enum_ptr, len, st) }
end
end
|
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/ffi-icu/lib.rb', line 81
def self.figure_suffix(version)
suffixes = [""]
if version
suffixes << "_#{version}" << "_#{version[0].chr}_#{version[1].chr}"
end
suffixes.find do |suffix|
function_name = "u_errorName#{suffix}"
function_names(function_name, nil).find do |fname|
ffi_libraries.find do |lib|
lib.find_function(fname)
end
end
end
end
|
.find_lib(lib) ⇒ Object
29
30
31
32
33
|
# File 'lib/ffi-icu/lib.rb', line 29
def self.find_lib(lib)
Dir.glob(search_paths.map { |path|
File.expand_path(File.join(path, lib))
}).first
end
|
.icu_version(libs) ⇒ Object
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/ffi-icu/lib.rb', line 64
def self.icu_version(libs)
version = nil
libs.find do |lib|
match = lib.name.match(/(\d\d)\.#{FFI::Platform::LIBSUFFIX}/) ||
lib.name.match(/#{FFI::Platform::LIBSUFFIX}\.(\d\d)/)
if match
version = match[1]
end
end
version
end
|
.load_icu ⇒ Object
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/ffi-icu/lib.rb', line 35
def self.load_icu
lib_names = case ICU.platform
when :osx
[find_lib("libicucore.#{FFI::Platform::LIBSUFFIX}")]
when :linux
[find_lib("libicui18n.#{FFI::Platform::LIBSUFFIX}.??"),
find_lib("libicutu.#{FFI::Platform::LIBSUFFIX}.??")]
when :windows
[find_lib("icuuc??.#{FFI::Platform::LIBSUFFIX}"),
find_lib("icuin??.#{FFI::Platform::LIBSUFFIX}")]
end
lib_names.compact! if lib_names
if not lib_names or lib_names.length == 0
raise LoadError, "Could not find ICU on #{ICU.platform.inspect}. Patches welcome, or you can add the containing directory yourself: #{self}.search_paths << '/path/to/lib'"
end
begin
libs = ffi_lib(*lib_names)
rescue LoadError => ex
raise LoadError, "no idea how to load ICU on #{ICU.platform.inspect}, patches appreciated! (#{ex.message})"
end
icu_version(libs)
end
|
.not_available(func_name) ⇒ Object
144
145
146
147
148
|
# File 'lib/ffi-icu/lib.rb', line 144
def self.not_available(func_name)
self.class.send :define_method, func_name do |*args|
raise Error, "#{func_name} not available on platform #{ICU.platform.inspect}"
end
end
|
.search_paths ⇒ Object
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/ffi-icu/lib.rb', line 11
def self.search_paths
@search_paths ||= begin
if ENV['FFI_ICU_LIB']
[ ENV['FFI_ICU_LIB'] ]
elsif FFI::Platform::IS_WINDOWS
ENV['PATH'].split(File::PATH_SEPARATOR)
else
[
'/usr/local/{lib64,lib}',
'/opt/local/{lib64,lib}',
'/usr/{lib64,lib}',
'/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu', ]
end
end
end
|
.version ⇒ Object
181
182
183
|
# File 'lib/ffi-icu/lib.rb', line 181
def self.version
@version ||= VersionInfo.new.tap { |version| u_getVersion(version) }
end
|