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,