public void Check( BinaryFileSchema schema )
{
this.schema = schema;
foreach (IBfsDataBlock block in schema.DatablockList)
{
//Generate map over unresolved expression variables;
foreach (BfsLocalField field in block.LocalFields.Values)
if (field.AssignmentExpression != null)
CheckExpression(field.AssignmentExpression, block);
if (block is IBfsStructType)
{
IBfsStructType structType = (IBfsStructType)block;
foreach (BfsStructField field in structType.StructFields.Values)
{
//Check conditional expressions
if (field.Conditional != null)
CheckExpression(field.Conditional, block);
if (field.FieldType.ArrayExtension != null)
if(field.FieldType.ArrayExtension is BfsKnownArray)
CheckExpression((field.FieldType.ArrayExtension as BfsKnownArray).Expression, block);
//Check that no unknown sized arrays are located within any structure that is compressed (seeking not allowed)
else if(field.FieldType.ArrayExtension is BfsUnknownArray && structType.CompressionMethod != null)
BfsCompiler.ReportError(field.FieldType.ArrayExtension.SourceRange,
"Cannot have unknown sized arrays within compressed blocks: '" + field.Name + "'");
}
}
else if (block is BfsEnum)
{
foreach( BfsEnumField field in (block as BfsEnum).EnumFields)
if(field.Actions != null)
foreach( IBfsAction action in field.Actions )
if( action is BfsActionAssignment )
CheckExpression((action as BfsActionAssignment).Expression, block);
}
else if (block is BfsBitfield)
{
foreach (BfsBitfieldField field in (block as BfsBitfield).BitFieldFields)
if (field.Actions != null)
foreach (IBfsAction action in field.Actions)
if (action is BfsActionAssignment)
CheckExpression((action as BfsActionAssignment).Expression, block);
}
}
}