Example #1
0
 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);
 }
Example #2
0
        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));
            }
        }