protected Dna.ElementDecl GetFileElement(Dna.StructDecl fileStruct, Dna.ElementDecl lookupElement, out long elementOffset) { elementOffset = 0; foreach (Dna.ElementDecl element in fileStruct.Elements) { if (element.NameInfo.Equals(lookupElement.NameInfo)) { if (element.Type.Name.Equals(lookupElement.Type.Name)) { return(element); } break; } elementOffset += _fileDna.GetElementSize(element); } return(null); }
protected long GetFileElement(Dna.StructDecl firstStruct, Dna.ElementDecl lookupElement, long data, out Dna.ElementDecl found) { foreach (Dna.ElementDecl element in firstStruct.Elements) { if (element.Name.Equals(lookupElement.Name)) { if (element.Type.Name.Equals(lookupElement.Type.Name)) { found = element; return(data); } found = null; return(0); } data += _fileDna.GetElementSize(element); } found = null; return(0); }
protected void ParseStruct(BinaryWriter strc, BinaryReader data, Dna.StructDecl fileStruct, Dna.StructDecl memoryStruct, bool fixupPointers) { if (fileStruct == null) { return; } if (memoryStruct == null) { return; } long dataPtr = data.BaseStream.Position; long strcPtr = strc.BaseStream.Position; foreach (Dna.ElementDecl element in memoryStruct.Elements) { int memorySize = _memoryDna.GetElementSize(element); if (element.Type.Struct != null && element.Name.Name[0] != '*') { Dna.ElementDecl elementOld; long elementOffset = GetFileElement(fileStruct, element, dataPtr, out elementOld); if (elementOffset != 0) { Dna.StructDecl oldStruct = _fileDna.GetStruct(_fileDna.GetReverseType(element.Type.Name)); data.BaseStream.Position = elementOffset; int arrayLen = elementOld.Name.ArraySizeNew; if (arrayLen == 1) { strc.BaseStream.Position = strcPtr; ParseStruct(strc, data, oldStruct, element.Type.Struct, fixupPointers); strcPtr += memorySize; } else { int fileSize = _fileDna.GetElementSize(elementOld) / arrayLen; memorySize /= arrayLen; for (int i = 0; i < arrayLen; i++) { strc.BaseStream.Position = strcPtr; ParseStruct(strc, data, oldStruct, element.Type.Struct, fixupPointers); data.BaseStream.Position += fileSize; strcPtr += memorySize; } } } } else { strc.BaseStream.Position = strcPtr; GetMatchingFileDna(fileStruct, element, strc, dataPtr, fixupPointers); strcPtr += memorySize; } } }
public ElementDecl FindElement(Dna dna, bool brokenDna, NameInfo name, out int offset) { offset = 0; foreach (ElementDecl element in Elements) { if (element.NameInfo.Equals(name)) { return(element); } int eleLen = dna.GetElementSize(element); if (brokenDna) { if (element.Type.Name.Equals("short") && element.NameInfo.Name.Equals("int")) { eleLen = 0; } } offset += eleLen; } return(null); }
protected int ResolvePointersStructRecursive(BinaryReader reader, int dnaNr, FileVerboseMode verboseMode, int recursion) { Dna fileDna = (_fileDna != null) ? _fileDna : _memoryDna; Dna.StructDecl oldStruct = fileDna.GetStruct(dnaNr); int totalSize = 0; foreach (Dna.ElementDecl element in oldStruct.Elements) { int size = fileDna.GetElementSize(element); int arrayLen = element.Name.ArraySizeNew; if (element.Name.Name[0] == '*') { if (arrayLen > 1) { throw new NotImplementedException(); } else { long ptr = (IntPtr.Size == 8) ? reader.ReadInt64() : reader.ReadInt32(); if ((verboseMode & FileVerboseMode.ExportXml) != 0) { for (int i = 0; i < recursion; i++) { Console.Write(" "); } Console.WriteLine("<{0} type=\"pointer\"> {1} </{0}>", element.Name.Name.Substring(1), ptr); } byte[] ptrChunk = FindLibPointer(ptr); if (ptrChunk != null) { //throw new NotImplementedException(); } else { //Console.WriteLine("Cannot fixup pointer at {0} from {1} to {2}!", ptrptr, *ptrptr, ptr); } } } else { if (element.Type.Struct != null) { if ((verboseMode & FileVerboseMode.ExportXml) != 0) { for (int i = 0; i < recursion; i++) { Console.Write(" "); } if (arrayLen > 1) { Console.WriteLine("<{0} type=\"{1}\" count={2}>", element.Name.CleanName, element.Type.Name, arrayLen); } else { Console.WriteLine("<{0} type=\"{1}\">", element.Name.CleanName, element.Type.Name); } } for (int i = 0; i < arrayLen; i++) { int revType = _fileDna.GetReverseType(element.Type.Name); ResolvePointersStructRecursive(reader, revType, verboseMode, recursion + 1); //throw new NotImplementedException(); } if ((verboseMode & FileVerboseMode.ExportXml) != 0) { for (int i = 0; i < recursion; i++) { Console.Write(" "); } Console.WriteLine("</{0}>", element.Name.CleanName); } } else { // export a simple type if ((verboseMode & FileVerboseMode.ExportXml) != 0) { if (arrayLen > MaxArrayLength) { Console.WriteLine("too long"); } else { bool isIntegerType; switch (element.Type.Name) { case "char": case "short": case "int": isIntegerType = true; break; default: isIntegerType = false; break; } if (isIntegerType) { throw new NotImplementedException(); /* * const char* newtype="int"; * int dbarray[MAX_ARRAY_LENGTH]; * int* dbPtr = 0; * char* tmp = elemPtr; * dbPtr = &dbarray[0]; * if (dbPtr) * { * char cleanName[MAX_STRLEN]; * getCleanName(memName,cleanName); * * int i; * getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr); * for (i=0;i<recursion;i++) * printf(" "); * if (arrayLen==1) * printf("<%s type=\"%s\">",cleanName,memType); * else * printf("<%s type=\"%s\" count=%d>",cleanName,memType,arrayLen); * for (i=0;i<arrayLen;i++) * printf(" %d ",dbPtr[i]); * printf("</%s>\n",cleanName); * }*/ } else { double[] dbArray = new double[arrayLen]; GetElement(reader, arrayLen, element.Type, dbArray); for (int i = 0; i < recursion; i++) { Console.Write(" "); } if (arrayLen == 1) { Console.Write("<{0} type=\"{1}\">", element.Name.Name, element.Type.Name); } else { Console.Write("<{0} type=\"{1}\" count=\"{2}\">", element.Name.CleanName, element.Type.Name, arrayLen); } for (int i = 0; i < arrayLen; i++) { Console.Write(" {0} ", dbArray[i].ToString(CultureInfo.InvariantCulture)); } Console.WriteLine("</{0}>", element.Name.CleanName); } } } reader.BaseStream.Position += size; } } totalSize += size; } return(totalSize); }
public ElementDecl FindElement(Dna dna, bool brokenDna, NameInfo name, out int offset) { offset = 0; foreach (ElementDecl element in Elements) { if (element.NameInfo.Equals(name)) { return element; } int eleLen = dna.GetElementSize(element); if (brokenDna) { if (element.Type.Name.Equals("short") && element.NameInfo.Name.Equals("int")) { eleLen = 0; } } offset += eleLen; } return null; }