Skip to content

Commit 77476c1

Browse files
committed
Fix HDF5 version handling and update memory pointer types to uint
1 parent a95c99d commit 77476c1

3 files changed

Lines changed: 25 additions & 18 deletions

File tree

lib/hdf5.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,23 @@ class << self
1111

1212
def search_hdf5lib
1313
name = "libhdf5.#{FFI::Platform::LIBSUFFIX}"
14-
return File.expand_path(name, ENV['HDF5_LIB_PATH']) if ENV['HDF5_LIB_PATH']
14+
env_path = ENV['HDF5_LIB_PATH']
15+
return env_path if env_path && File.file?(env_path)
16+
return File.expand_path(name, env_path) if env_path && File.directory?(env_path)
1517

1618
begin
1719
require 'pkg-config'
1820
libs = PKGConfig.libs('hdf5')
1921
pattern = %r{(?<=-L)/[^ ]+}
20-
lib_dir = libs.scan(pattern).first
21-
lib_path = File.expand_path(name, lib_dir)
22+
libs.scan(pattern).each do |lib_dir|
23+
lib_path = File.expand_path(name, lib_dir)
24+
return lib_path if File.exist?(lib_path)
25+
end
2226
rescue PackageConfig::NotFoundError
2327
warn 'hdf5.pc not found.'
2428
end
25-
return lib_path if File.exist?(lib_path)
2629

27-
warn "hdf5 shared library '#{name}' not found."
30+
name
2831
end
2932
end
3033

lib/hdf5/ffi.rb

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,22 @@ def self.attach_variable(*)
3030
pointer
3131
], :int
3232

33-
major_ptr = ::FFI::MemoryPointer.new(:int)
34-
minor_ptr = ::FFI::MemoryPointer.new(:int)
35-
release_ptr = ::FFI::MemoryPointer.new(:int)
33+
major_ptr = ::FFI::MemoryPointer.new(:uint)
34+
minor_ptr = ::FFI::MemoryPointer.new(:uint)
35+
release_ptr = ::FFI::MemoryPointer.new(:uint)
3636
HDF5::FFI.H5get_libversion(major_ptr, minor_ptr, release_ptr)
3737

38-
raise 'HDF5 major version mismatch' if major_ptr.read_int != 1
38+
major = major_ptr.read_uint
39+
minor = minor_ptr.read_uint
40+
release = release_ptr.read_uint
3941

40-
case minor_ptr.read_int
41-
when 10
42+
case [major, minor]
43+
in [1, 10]
4244
require_relative 'ffi_10'
43-
when 14..Float::INFINITY
45+
in [1, 14..] | [2.., _]
4446
require_relative 'ffi_14'
47+
else
48+
raise "Unsupported HDF5 version #{major}.#{minor}.#{release}"
4549
end
4650
end
4751
end

test/hdf5_test.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ class HDF5Test < Test::Unit::TestCase
1010
end
1111

1212
test 'libversion' do
13-
major = FFI::MemoryPointer.new(:int)
14-
minor = FFI::MemoryPointer.new(:int)
15-
release = FFI::MemoryPointer.new(:int)
13+
major = FFI::MemoryPointer.new(:uint)
14+
minor = FFI::MemoryPointer.new(:uint)
15+
release = FFI::MemoryPointer.new(:uint)
1616
HDF5::FFI.H5get_libversion(major, minor, release)
17-
assert_equal(1, major.read_int)
18-
assert_kind_of(Integer, minor.read_int)
19-
assert_kind_of(Integer, release.read_int)
17+
assert_include([1, 2], major.read_uint)
18+
assert_kind_of(Integer, minor.read_uint)
19+
assert_kind_of(Integer, release.read_uint)
2020
end
2121

2222
test 'example' do

0 commit comments

Comments
 (0)