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); }
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); } }
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); } } }
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); }