private void CalculateStructSize(BfsSourceRange range, IBfsStructType structtype) { int totalstructsize = 0; foreach (BfsStructField field in structtype.StructFieldList) { if (field.PrimitiveType.ArrayExtension == null) totalstructsize += Environments.GetSizeOfPrimitiveType(field.PrimitiveType); else if (field.PrimitiveType.ArrayExtension is BfsKnownArray) { BfsKnownArray known = field.PrimitiveType.ArrayExtension as BfsKnownArray; BfsExpGroup expgroup = known.Expression.ExpressionGroup; if (expgroup.Members.Count == 1 && expgroup.Members[0] is BfsNumberExp) { totalstructsize += Environments.GetSizeOfPrimitiveType(field.PrimitiveType) * (int)(expgroup.Members[0] as BfsNumberExp).Value; //BfsCompiler.ReportMessage("Known array of size: " + (expgroup.Members[0] as BfsNumberExp).Value); } else BfsCompiler.ReportError(range, "Could not get size of block '"+structtype.Name+"' as it has a field with non-simple array-extension."); } else { totalstructsize = 0; BfsCompiler.ReportError(range, "Cannot get size of a block with unknown size (because of array extension in: '" + structtype.Name + "." + field.Name + "')"); break; } } structtype.SizeInBytes = totalstructsize; //BfsCompiler.ReportWarning(structtype.SourceRange, "Total size of struct: "+ totalstructsize); }
public void ConvertStructType(PegNode blocknamenode, IBfsStructType block) { if (block == null) throw new AstConvertException("Type wasn't struct-like"); block.SourceRange = GetSourceRange(blocknamenode); block.Name = GetNodeText(blocknamenode); PegNode nextNode = blocknamenode.next_; //If the structure has a Compression Method defined if ( nextNode != null && GetNodeId(nextNode) == EBinaryFileSchemaParser.compressionmethod) { block.CompressionMethod = GetNodeText(nextNode); block.CompressionRange = GetSourceRange(nextNode); nextNode = nextNode.next_; } //If a primitive type is present, then it is a comsumeable struct type if (nextNode != null && GetNodeId(nextNode) == EBinaryFileSchemaParser.primitivetype) { IBfsConsumptionType special = block as IBfsConsumptionType; special.PrimitiveType = ConvertPrimitiveType(nextNode); nextNode = nextNode.next_; } //For each of the fields the struct-type contains for(PegNode field = nextNode; field != null; field = field.next_) { if (GetNodeId(field) == EBinaryFileSchemaParser.field) { BfsStructField fielditem = new BfsStructField(); fielditem.SourceRange = GetSourceRange(field); ConvertStructField(field, fielditem); block.StructFieldList.Add(fielditem); } else if (GetNodeId(field) == EBinaryFileSchemaParser.localfield) ConvertLocalField(field, block); else throw new AstConvertException("Node wasn't a field: " + GetNodeId(field)); } }