lib/ffi-icu/lib.rb in ffi-icu-0.4.3 vs lib/ffi-icu/lib.rb in ffi-icu-0.5.0
- old
+ new
@@ -3,10 +3,13 @@
end
class BufferOverflowError < StandardError
end
+ class MissingResourceError < StandardError
+ end
+
module Lib
extend FFI::Library
def self.search_paths
@search_paths ||= begin
@@ -127,10 +130,12 @@
if error_code > 0
name = Lib.u_errorName error_code
if name == "U_BUFFER_OVERFLOW_ERROR"
raise BufferOverflowError
+ elsif name == "U_MISSING_RESOURCE_ERROR"
+ raise MissingResourceError
else
raise Error, name
end
elsif error_code < 0
$stderr.puts "ffi-icu: #{Lib.u_errorName error_code}" if $DEBUG || $VERBOSE
@@ -190,10 +195,15 @@
def self.version
@version ||= VersionInfo.new.tap { |version| u_getVersion(version) }
end
+ def self.attach_optional_function(*args)
+ attach_function *args
+ rescue FFI::NotFoundError
+ end
+
version = load_icu
suffix = figure_suffix(version)
typedef VersionInfo, :version
@@ -295,11 +305,15 @@
attach_function :ucol_getLocale, "ucol_getLocale#{suffix}", [:pointer, :int, :pointer], :string
attach_function :ucol_greater, "ucol_greater#{suffix}", [:pointer, :pointer, :int32_t, :pointer, :int32_t], :bool
attach_function :ucol_greaterOrEqual, "ucol_greaterOrEqual#{suffix}", [:pointer, :pointer, :int32_t, :pointer, :int32_t], :bool
attach_function :ucol_equal, "ucol_equal#{suffix}", [:pointer, :pointer, :int32_t, :pointer, :int32_t], :bool
attach_function :ucol_getRules, "ucol_getRules#{suffix}", [:pointer, :pointer], :pointer
+ attach_function :ucol_getSortKey, "ucol_getSortKey#{suffix}", [:pointer, :pointer, :int, :pointer, :int], :int
+ attach_function :ucol_getAttribute, "ucol_getAttribute#{suffix}", [:pointer, :int, :pointer], :int
+ attach_function :ucol_setAttribute, "ucol_setAttribute#{suffix}", [:pointer, :int, :int, :pointer], :void
+
# Transliteration
#
# http://icu-project.org/apiref/icu4c/utrans_8h.html
#
@@ -417,15 +431,48 @@
attach_function :unum_open, "unum_open#{suffix}", [:number_format_style, :pointer, :int32_t, :string, :pointer, :pointer ], :pointer
attach_function :unum_close, "unum_close#{suffix}", [:pointer], :void
attach_function :unum_format_int32, "unum_format#{suffix}", [:pointer, :int32_t, :pointer, :int32_t, :pointer, :pointer], :int32_t
attach_function :unum_format_int64, "unum_formatInt64#{suffix}", [:pointer, :int64_t, :pointer, :int32_t, :pointer, :pointer], :int32_t
attach_function :unum_format_double, "unum_formatDouble#{suffix}", [:pointer, :double, :pointer, :int32_t, :pointer, :pointer], :int32_t
- begin
- attach_function :unum_format_decimal, "unum_formatDecimal#{suffix}", [:pointer, :string, :int32_t, :pointer, :int32_t, :pointer, :pointer], :int32_t
- rescue FFI::NotFoundError
- end
+ attach_optional_function :unum_format_decimal, "unum_formatDecimal#{suffix}", [:pointer, :string, :int32_t, :pointer, :int32_t, :pointer, :pointer], :int32_t
attach_function :unum_format_currency, "unum_formatDoubleCurrency#{suffix}", [:pointer, :double, :pointer, :pointer, :int32_t, :pointer, :pointer], :int32_t
attach_function :unum_set_attribute, "unum_setAttribute#{suffix}", [:pointer, :number_format_attribute, :int32_t], :void
+
+ # UResourceBundle
+ attach_function :ures_open, "ures_open#{suffix}", [:string, :string, :pointer], :pointer
+ attach_function :ures_close, "ures_close#{suffix}", [:pointer], :void
+ # This function is marked "internal" but it's fully exported by the library ABI, so we can use it anyway.
+ attach_function :ures_getBykeyWithFallback, "ures_getByKeyWithFallback#{suffix}", [:pointer, :string, :pointer, :pointer], :pointer
+ attach_function :ures_getString, "ures_getString#{suffix}", [:pointer, :pointer, :pointer], :pointer
+
+ def self.resource_bundle_name(type)
+ stem = "icudt" + version.read_array_of_char(4)[0].to_s + "l" + "-"
+ stem + type.to_s
+ end
+
+ # UNumberFormatter
+ attach_optional_function :unumf_openForSkeletonAndLocale, "unumf_openForSkeletonAndLocale#{suffix}", [:pointer, :int32_t, :string, :pointer], :pointer
+ attach_optional_function :unumf_close, "unumf_close#{suffix}", [:pointer], :void
+ attach_optional_function :unumf_openResult, "unumf_openResult#{suffix}", [:pointer], :pointer
+ attach_optional_function :unumf_closeResult, "unumf_closeResult#{suffix}", [:pointer], :void
+ attach_optional_function :unumf_formatDecimal, "unumf_formatDecimal#{suffix}", [:pointer, :string, :int32_t, :pointer, :pointer], :void
+ attach_optional_function :unumf_resultToString, "unumf_resultToString#{suffix}", [:pointer, :pointer, :int32_t, :pointer], :int32_t
+
+ # UListFormatter
+ enum :ulistfmt_type, [
+ :and, 0,
+ :or, 1,
+ :units, 2,
+ ]
+ enum :ulistfmt_width, [
+ :wide, 0,
+ :short, 1,
+ :narrow, 2,
+ ]
+ attach_optional_function :ulistfmt_openForType, "ulistfmt_openForType#{suffix}", [:string, :ulistfmt_type, :ulistfmt_width, :pointer], :pointer
+ attach_optional_function :ulistfmt_close, "ulistfmt_close#{suffix}", [:pointer], :void
+ attach_optional_function :ulistfmt_format, "ulistfmt_format#{suffix}", [:pointer, :pointer, :pointer, :int32_t, :pointer, :int32_t, :pointer], :int32_t
+
# date
enum :date_format_style, [
:pattern, -2,
:none, -1,
:full, 0,