Support global variables

This commit is contained in:
Alexander Luzgarev 2019-03-16 14:42:08 +01:00
parent cfe51d57ae
commit 199ab46f0c
3 changed files with 33 additions and 2 deletions

View File

@ -277,6 +277,17 @@ namespace MatFileHandler.Tests
Assert.That(sparseArray[1, 2], Is.True);
}
/// <summary>
/// Test reading a global variable.
/// </summary>
[Test]
public void TestGlobal()
{
var matFile = ReadHdfTestFile("global");
var variable = matFile.Variables.First();
Assert.That(variable.IsGlobal, Is.True);
}
private static void CheckComplexLimits<T>(IArrayOf<ComplexOf<T>> array, T[] limits)
where T : struct
{

Binary file not shown.

View File

@ -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: