Ejemplo n.º 1
0
        /// <summary>
        /// Load a struct block
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        protected static StructNode LoadStruct(XmlTextReader reader)
        {
            StructNode st        = new StructNode();
            string     varname   = reader.GetAttribute("varName");
            string     blocksize = reader.GetAttribute("blockSize");

            if (varname != null)
            {
                st.setVarName(varname);
            }
            if (blocksize != null)
            {
                st.setBlockSize(Convert.ToInt32(blocksize));
            }
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    st.addChild(ParseNode(reader));
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    if (reader.LocalName.Equals("struct"))
                    {
                        break;
                    }
                }
            }
            return(st);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Add a struct data element.
        /// </summary>
        /// <param name="parentNode">parent node that contains this struct element node</param>
        /// <param name="at">position where the new struct is inserted before</param>
        public void addStructTypeNode(DataNode parentNode, int at, bool defineType)
        {
            FormStruct formStruct = new FormStruct();

            if (defineType)
            {
                formStruct.TypeName = "MyStructType-" + Convert.ToString(++typeStructCounter_);
            }
            else
            {
                formStruct.Text = "Build a struct element";
                formStruct.ChangeLabel("Var Name:");
                formStruct.TypeName = "myStruct-" + Convert.ToString(parentNode.Nodes.Count);                   //TODO: check for duplicate name
            }
            formStruct.setDataTypeSource(document_.getTypeNames());
            DialogResult r = formStruct.ShowDialog(view_);

            if (r == DialogResult.OK)
            {
                string varName    = formStruct.TypeName;
                string blockSize  = formStruct.BlockSize;
                int    nBlockSize = 0;
                try
                {
                    nBlockSize = Convert.ToInt32(blockSize);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                StructNode   sn    = new StructNode((defineType)?"":varName, nBlockSize);
                AbstractNode aNode = sn;
                if (defineType)
                {
                    aNode = new DefineTypeNode(formStruct.TypeName, sn);
                }
                DataNode dn = new DataNode(aNode);
                //collect struct members
                foreach (ListViewItem itm in formStruct.getMemberItems())
                {
                    string stype  = itm.Text;
                    string svname = itm.SubItems[1].Text;
                    if (!stype.Equals(""))
                    {
                        addChildNode(dn, stype, svname);
                    }
                }
                addChildNode(parentNode, dn, at);
                document_.setModified();
                parentNode.ExpandAll();
            }
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Add struct members to a struct node in the treeview from loaded document.
 /// </summary>
 /// <param name="node"></param>
 /// <param name="t"></param>
 protected void addStructNode(TreeNode node, StructNode t)
 {
     foreach (AbstractNode it in t.getMembers())
     {
         DataNode dt = new DataNode(it);
         node.Nodes.Add(dt);
         if (it.isComplex())
         {
             if (it.GetType().Equals(typeof(StructNode)))
             {
                 addStructNode(node.LastNode, (StructNode)it);
             }
             else if (it.GetType().Equals(typeof(UnionNode)))
             {
                 addUnionNode(node.LastNode, (UnionNode)it);
             }
             else if (it.GetType().Equals(typeof(ArrayNode)))
             {
                 addArrayNode(node.LastNode, (ArrayNode)it);
             }
         }
     }
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Load a struct block
 /// </summary>
 /// <param name="reader"></param>
 /// <returns></returns>
 protected static StructNode LoadStruct(XmlTextReader reader)
 {
     StructNode st = new StructNode();
     string varname = reader.GetAttribute("varName");
     string blocksize = reader.GetAttribute("blockSize");
     if (varname != null)
     {
         st.setVarName( varname );
     }
     if (blocksize != null)
     {
         st.setBlockSize( Convert.ToInt32(blocksize) );
     }
     while (reader.Read())
     {
         if (reader.NodeType == XmlNodeType.Element)
         {
             st.addChild( ParseNode(reader) );
         }
         else if (reader.NodeType == XmlNodeType.EndElement)
         {
             if (reader.LocalName.Equals("struct"))
             {
                 break;
             }
         }
     }
     return st;
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Add struct members to a struct node in the treeview from loaded document.
 /// </summary>
 /// <param name="node"></param>
 /// <param name="t"></param>
 protected void addStructNode(TreeNode node, StructNode t)
 {
     foreach (AbstractNode it in t.getMembers())
     {
         DataNode dt = new DataNode(it);
         node.Nodes.Add(dt);
         if (it.isComplex())
         {
             if (it.GetType().Equals(typeof(StructNode)))
             {
                 addStructNode(node.LastNode, (StructNode)it);
             }
             else if (it.GetType().Equals(typeof(UnionNode)))
             {
                 addUnionNode(node.LastNode, (UnionNode)it);
             }
             else if (it.GetType().Equals(typeof(ArrayNode)))
             {
                 addArrayNode(node.LastNode, (ArrayNode)it);
             }
         }
     }
 }
Ejemplo n.º 6
0
 /// <summary>
 /// Add a struct data element.
 /// </summary>
 /// <param name="parentNode">parent node that contains this struct element node</param>
 /// <param name="at">position where the new struct is inserted before</param>
 public void addStructTypeNode(DataNode parentNode, int at, bool defineType)
 {
     FormStruct formStruct = new FormStruct();
     if (defineType)
     {
         formStruct.TypeName = "MyStructType-" + Convert.ToString(++typeStructCounter_);
     }
     else
     {
         formStruct.Text = "Build a struct element";
         formStruct.ChangeLabel("Var Name:");
         formStruct.TypeName = "myStruct-" + Convert.ToString(parentNode.Nodes.Count);	//TODO: check for duplicate name
     }
     formStruct.setDataTypeSource(document_.getTypeNames());
     DialogResult r = formStruct.ShowDialog(view_);
     if (r==DialogResult.OK)
     {
         string varName = formStruct.TypeName;
         string blockSize = formStruct.BlockSize;
         int nBlockSize = 0;
         try
         {
             nBlockSize = Convert.ToInt32(blockSize);
         }
         catch (Exception ex)
         {
             Console.WriteLine(ex.Message);
         }
         StructNode sn = new StructNode((defineType)?"":varName, nBlockSize);
         AbstractNode aNode = sn;
         if (defineType)
         {
             aNode = new DefineTypeNode(formStruct.TypeName, sn);
         }
         DataNode dn = new DataNode(aNode);
         //collect struct members
         foreach (ListViewItem itm in formStruct.getMemberItems())
         {
             string stype = itm.Text;
             string svname = itm.SubItems[1].Text;
             if (!stype.Equals(""))
             {
                 addChildNode(dn, stype, svname);
             }
         }
         addChildNode(parentNode, dn, at);
         document_.setModified();
         parentNode.ExpandAll();
     }
 }
Ejemplo n.º 7
0
 /// <summary>
 /// Check struct, union and array node for useType references, duplicate union case values.
 /// </summary>
 /// <remarks>
 /// This check should apply to the following scenarios:
 /// <list>
 /// A struct contains two or more member elements that have the same variable name
 /// A struct contains a useType as its member or member of its member which referenced a undefined type
 /// A struct contains no member element
 /// A union contains no case element
 /// A union contains two or more cases with the same discriminant value
 /// A union contains a useType element in any of the case elements that referenced a undefined type
 /// An array contains no dimension element
 /// An streamed array contains more than one dim element
 /// An variable-sized array's first dim element has a count (should be zero)
 /// A fixed array contains a dim element with a zero count (should be greater than 0)
 /// An array contains useType element that referenced a undefined type
 /// An array contains a variable-sized construct in its element or embeded descedants.
 /// </list>
 /// </remarks>
 /// <param name="dataNode"></param>
 /// <param name="defs"></param>
 /// <param name="report"></param>
 private static void checkComplexType(ComplexNode dataNode, Hashtable defs, ArrayList report)
 {
     if (dataNode.GetType().Equals(typeof(StructNode)))
     {
         StructNode sNode = (StructNode)dataNode;
         if (sNode.getMemberCount() > 0)
         {
             Hashtable varNames = new Hashtable();
             foreach (AbstractNode aNode in ((StructNode)dataNode).getMembers())
             {
                 //check duplicate variable names as warnings
                 checkVarNames(aNode, varNames, report);
                 checkUseType(aNode, defs, report);
             }
         }
         else
         {
             //empty struct
             report.Add("Warning: struct '" + sNode.toNodeText() + "' contains no member element.");
         }
     }
     else if (dataNode.GetType().Equals(typeof(UnionNode)))
     {
         UnionNode uNode = (UnionNode)dataNode;
         if (uNode.getCaseCount() > 0)
         {
             Hashtable cases = new Hashtable();
             foreach (CaseNode cNode in uNode.getCases())
             {
                 //case values must be unique
                 if (cases.Contains(cNode.getDiscriminantValue()))
                 {
                     report.Add("Error: duplicate case value '" + cNode.getDiscriminantValue() + "' at union type '" + dataNode.toNodeText() + "'.");
                 }
                 else
                 {
                     cases.Add(cNode.getDiscriminantValue(), cNode);
                 }
                 //if case body is useType, check type defs
                 checkUseType(cNode.getCaseBody(), defs, report);
             }
         }
         else
         {
             report.Add("Warning: union '" + uNode.toNodeText() + "' contains no case element.");
         }
     }
     else if (dataNode.GetType().Equals(typeof(ArrayNode)))
     {
         ArrayNode arrayNode = (ArrayNode)dataNode;
         if (arrayNode.getDimension() == null)
         {
             report.Add("Error: Array '" + arrayNode.toNodeText() + "' has no dimension element.");
         }
         else
         {
             if (arrayNode.isArrayStreamed() && arrayNode.getDimensionCount() > 1)
             {
                 report.Add("Warning: Streamed array contains more than one dimension.");
             }
             else if (arrayNode.isArrayFixed())
             {
                 for (DimNode dn = arrayNode.getDimension(); dn != null; dn = dn.getChild())
                 {
                     if (dn.count() <= 0)
                     {
                         report.Add("Error: array dimension is of invalid size at '" + arrayNode.toNodeText() + "'.");
                     }
                 }
             }
             else
             {
                 //first dim must be of 0 size
                 DimNode dn = arrayNode.getDimension();
                 if (dn.count() > 0)
                 {
                     report.Add("Warning: first dimension count of a variable-sized array ignored at '" + arrayNode.toNodeText() + "'.");
                 }
                 for (dn = dn.getChild(); dn != null; dn = dn.getChild())
                 {
                     if (dn.count() <= 0)
                     {
                         report.Add("Error: array dimension is of invalid size at '" + arrayNode.toNodeText() + "'.");
                     }
                 }
             }
         }
         checkUseType(arrayNode.getElement(), defs, report);
         //check for variable-sized construct contained in arrays
         checkVariableConstruct(arrayNode.getElement(), report);
     }
 }