Exemplo n.º 1
0
        String PrintVariable(ElfVariable variable, int indent)
        {
            String str = "";

            /* Create a tab*/
            for (int i = 0; i < indent * 2; i++)
            {
                str += ' ';
            }
            if (!(variable is ElfObjectWithChildrens))
            {
                if (variable is ElfPointer)
                {
                    str += str + "*" + variable.Name + " = " + variable.GetStrValue() + Environment.NewLine;
                }
                else
                {
                    str += str + /*"[" + variable.Address+"]" + */ variable.Name + " = " + variable.GetStrValue() + Environment.NewLine;
                }
            }
            else
            {
                str += str + variable.Name + Environment.NewLine;
                ElfObjectWithChildrens elfStruct = (ElfObjectWithChildrens)variable;
                foreach (ElfVariable child in elfStruct.Childrens)
                {
                    str += PrintVariable(child, indent + 1);
                }
            }

            return(str);
        }
Exemplo n.º 2
0
 public void GetFields(ElfVariableList varList, ElfVariable variable)
 {
     if (variable is ElfObjectWithChildrens)
     {
         ElfObjectWithChildrens elfStruct = (ElfObjectWithChildrens)variable;
         foreach (ElfVariable child in elfStruct.Childrens)
         {
             GetFields(varList, child);
         }
     }
     else
     {
         varList.Add(variable);
     }
 }
Exemplo n.º 3
0
        ElfVariable getVariableByIndex(ElfVariable variable, int currentIndex, int desiredIndex, out int newIndex)
        {
            if (currentIndex == desiredIndex)
            {
                newIndex = -1;
                return(variable);
            }
            else
            {
                if (variable is ElfObjectWithChildrens)
                {
                    currentIndex++;
                    ElfVariable            gotVar;
                    ElfObjectWithChildrens elfStruct = (ElfObjectWithChildrens)variable;
                    int nextIndex = currentIndex;
                    foreach (ElfVariable child in elfStruct.Childrens)
                    {
                        gotVar = getVariableByIndex(child, currentIndex, desiredIndex, out nextIndex);

                        if (gotVar != null)
                        {
                            newIndex = -1;
                            return(gotVar);
                        }
                        else
                        {
                            currentIndex = nextIndex;
                        }
                    }
                    newIndex = nextIndex;
                    return(null);
                }
                else
                {
                    newIndex = currentIndex + 1;
                    return(null);
                }
            }
        }
Exemplo n.º 4
0
        public ElfVariable UpdateVariable(String varName, ElfObjectWithChildrens parent, String gdbName)
        {
            /* Get Variable fields*/
            String varInfo = parser.GetVariableInfo(gdbName);

            if (varInfo.IndexOf("No symbol") != -1)
            {
                /* variable not found */
                return(null);
            }

            FieldDataType datatype  = GetVariableDataType(varInfo);
            Boolean       isPointer = isItPointer(varInfo, datatype);

            if (isPointer)
            {
                string     address = parser.GetVariableAdress(gdbName);
                ElfPointer pointer = ElfVariableFabric.CreatePointer(varName, address);
                if (parent == null)
                {
                    variables.Add(pointer);
                }
                else
                {
                    parent.Childrens.Add(pointer);
                }
            }
            else
            {
                /* Is it an array? */
                int arrayLen = isItAnArray(varInfo, datatype);

                if (arrayLen == -1)
                {
                    /* Is it a structure? */
                    if (datatype == FieldDataType.dftStruct)
                    {
                        ElfStruct variableStruct = ElfVariableFabric.CreateStruct(varName);
                        variableStruct.Parent = parent;
                        int      openBraceIndex  = varInfo.IndexOf('{');
                        int      closeBraceIndex = varInfo.IndexOf('}');
                        String   fieldString     = varInfo.Substring(openBraceIndex + 1, closeBraceIndex - openBraceIndex - 2);
                        String[] fields          = fieldString.Split(';');
                        foreach (String field in fields)
                        {
                            /* extract field name */
                            string[] data = field.Trim().Split(' ');
                            if (data.Length >= 2)
                            {
                                String name = data[data.Length - 1];
                                name = name.Replace('*', ' ').Trim();
                                int indexOfBrace = name.IndexOf("[");
                                if (indexOfBrace > 0)
                                {
                                    name = name.Remove(indexOfBrace);
                                }

                                UpdateVariable(name, variableStruct, gdbName + "." + name);
                            }
                        }
                        if (parent == null)
                        {
                            variables.Add(variableStruct);
                        }
                        else
                        {
                            parent.Childrens.Add(variableStruct);
                        }
                    }
                    else if (datatype != FieldDataType.dftUnknown)
                    {
                        /* Get address of variable */
                        String address = parser.GetVariableAdress(gdbName);

                        ElfVariable variable = ElfVariableFabric.Create(datatype, varName, address);
                        if (parent != null)
                        {
                            if (variable != null)
                            {
                                parent.Childrens.Add(variable);
                                variable.Parent = parent;
                            }
                        }
                        else
                        {
                            variables.Add(variable);
                        }

                        if (datatype == FieldDataType.dftEnum)
                        {
                            if (variable is ElfEnum)
                            {
                                UpdateEnumValues(varInfo, (ElfEnum)variable);
                            }
                        }
                    }
                }
                else
                {
                    ElfArray newArray = ElfVariableFabric.CreateArray(varName);
                    newArray.Parent = parent;
                    if (parent == null)
                    {
                        variables.Add(newArray);
                    }
                    else
                    {
                        parent.Childrens.Add(newArray);
                    }

                    for (int i = 0; i < arrayLen; i++)
                    {
                        String elemName = varName + "[" + i + "]";
                        UpdateVariable(elemName, newArray, gdbName + "[" + i + "]");
                    }
                }
            }
            return(null);
        }