diff --git a/MatFileHandler.Tests/MatFileReaderHdfTests.cs b/MatFileHandler.Tests/MatFileReaderHdfTests.cs index d182732..6e0a81a 100644 --- a/MatFileHandler.Tests/MatFileReaderHdfTests.cs +++ b/MatFileHandler.Tests/MatFileReaderHdfTests.cs @@ -277,6 +277,17 @@ namespace MatFileHandler.Tests Assert.That(sparseArray[1, 2], Is.True); } + /// + /// Test reading a global variable. + /// + [Test] + public void TestGlobal() + { + var matFile = ReadHdfTestFile("global"); + var variable = matFile.Variables.First(); + Assert.That(variable.IsGlobal, Is.True); + } + private static void CheckComplexLimits(IArrayOf> array, T[] limits) where T : struct { diff --git a/MatFileHandler.Tests/test-data/hdf/global.mat b/MatFileHandler.Tests/test-data/hdf/global.mat new file mode 100644 index 0000000..1bb2e45 Binary files /dev/null and b/MatFileHandler.Tests/test-data/hdf/global.mat differ diff --git a/MatFileHandler/HdfFileReader.cs b/MatFileHandler/HdfFileReader.cs index f2fb596..50565fd 100644 --- a/MatFileHandler/HdfFileReader.cs +++ b/MatFileHandler/HdfFileReader.cs @@ -43,6 +43,24 @@ namespace MatFileHandler return new MatFile(variables); } + private bool ReadGlobalFlag(long datasetId) + { + if (H5A.exists_by_name(datasetId, ".", "MATLAB_global") != 0) + { + using (var globalAttribute = new Attribute(datasetId, "MATLAB_global")) + { + using (var h = new MemoryHandle(sizeof(int))) + { + H5A.read(globalAttribute.Id, H5T.NATIVE_INT, h.Handle); + var result = Marshal.ReadInt32(h.Handle); + return result != 0; + } + } + } + + return false; + } + private int VariableIterator(long group, IntPtr name, ref H5L.info_t info, IntPtr op_data) { var variableName = Marshal.PtrToStringAnsi(name); @@ -53,8 +71,9 @@ namespace MatFileHandler case H5O.type_t.DATASET: using (var dataset = new Dataset(group, variableName)) { + var isGlobal = ReadGlobalFlag(dataset.Id); var value = ReadDataset(dataset.Id); - variables.Add(new MatVariable(value, variableName, false)); + variables.Add(new MatVariable(value, variableName, isGlobal)); } break; case H5O.type_t.GROUP: @@ -64,8 +83,9 @@ namespace MatFileHandler } using (var subGroup = new Group(group, variableName)) { + var isGlobal = ReadGlobalFlag(subGroup.Id); var groupValue = ReadGroup(subGroup.Id); - variables.Add(new MatVariable(groupValue, variableName, false)); + variables.Add(new MatVariable(groupValue, variableName, isGlobal)); } break; default: