Beispiel #1
0
 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);
 }
Beispiel #2
0
 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);
 }
Beispiel #3
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;
                }
            }
        }
Beispiel #4
0
 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);
 }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 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;
 }