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: