Example #1
0
        public void parse(Stream s)
        {
            BinaryReader r = new BinaryReader(s);

            id = s.readuint(isBE);

            uint count = s.readuint(isBE);
            count -= 1;

            for (uint i = 0; i < count; i++)
            {
                LocalsEntry e = new LocalsEntry();

                s.Position = (i + 3)*4;

                e.index = i;
                e.offset = s.readuint(isBE);

                if (e.offset == 0)
                {
                    e.text = "";
                    continue;
                }

                s.Position = e.offset;

                byte b;
                int len = 0;

                do
                {
                    b = r.ReadByte();
                    len++;
                }
                while (b != 0);

                s.Position = e.offset;

                e.text = Encoding.UTF8.GetString(r.ReadBytes(len - 1));

                entries.Add(e);
            }
        }
Example #2
0
        public void parse(Stream s)
        {
            BinaryReader r = new BinaryReader(s);

            id = s.readuint(isBE);

            uint count = s.readuint(isBE);

            count -= 1;

            for (uint i = 0; i < count; i++)
            {
                LocalsEntry e = new LocalsEntry();

                s.Position = (i + 3) * 4;

                e.index  = i;
                e.offset = s.readuint(isBE);

                if (e.offset == 0)
                {
                    e.text = "";
                    continue;
                }

                s.Position = e.offset;

                byte b;
                int  len = 0;

                do
                {
                    b = r.ReadByte();
                    len++;
                }while (b != 0);

                s.Position = e.offset;

                e.text = Encoding.UTF8.GetString(r.ReadBytes(len - 1));

                entries.Add(e);
            }
        }
Example #3
0
        private static void addLocalsFileNode(XPathNavigator current, out LocalsFile lf, bool isBigEndian)
        {
            string basepath = current.GetAttribute("base", "");
            string name = current.GetAttribute("name", "");
            lf = new LocalsFile(basepath, name, isBigEndian);
            lf.id = uint.Parse(current.GetAttribute("id", ""));

            uint index, offset;
            String entryText = "";
            uint prevIndex = 0;
            uint lastOffset = 0;

            var entryNodes = current.Select("entry");
            entryNodes.MoveNext();
            prevIndex = uint.Parse(entryNodes.Current.GetAttribute("index", ""));
            lastOffset = uint.Parse(entryNodes.Current.GetAttribute("offset", ""));
            entryText = entryText + entryNodes.Current.Value;

            while (entryNodes.MoveNext() == true)
            {
                // Get index of entry
                index = uint.Parse(entryNodes.Current.GetAttribute("index", ""));
                offset = uint.Parse(entryNodes.Current.GetAttribute("offset", ""));

                if (prevIndex == index)
                {
                    // this entry is the same as the last one, save the text with LF
                    entryText = entryText + "\n" + entryNodes.Current.Value;
                    continue;
                }

                // This entry is a new one, save last entry
                LocalsEntry e = new LocalsEntry();
                e.index = prevIndex;
                e.offset = lastOffset;
                lastOffset += (uint)Encoding.UTF8.GetByteCount(entryText) + 1;
                /*if (lastOffset != offset)
                    throw new Exception("Error loading locals.bin");*/
                e.text = entryText;

                lf.entries.Add(e);

                // Save text of current entry
                entryText = entryNodes.Current.Value;
                prevIndex++;

                // If next entry is not sequential, we need to add empty entries
                while (index > prevIndex)
                {
                    LocalsEntry fake = new LocalsEntry();
                    fake.index = prevIndex;
                    fake.offset = 0;
                    fake.text = "";
                    lf.entries.Add(fake);
                    prevIndex++;
                }
            }

            // Write last entry
            LocalsEntry last = new LocalsEntry();
            last.index = prevIndex;
            last.offset = lastOffset;
            last.text = entryText;
            lf.entries.Add(last);
        }
Example #4
0
        private static void addLocalsFileNode(XPathNavigator current, out LocalsFile lf, bool isBigEndian)
        {
            string basepath = current.GetAttribute("base", "");
            string name     = current.GetAttribute("name", "");

            lf    = new LocalsFile(basepath, name, isBigEndian);
            lf.id = uint.Parse(current.GetAttribute("id", ""));

            uint   index, offset;
            String entryText  = "";
            uint   prevIndex  = 0;
            uint   lastOffset = 0;

            var entryNodes = current.Select("entry");

            entryNodes.MoveNext();
            prevIndex  = uint.Parse(entryNodes.Current.GetAttribute("index", ""));
            lastOffset = uint.Parse(entryNodes.Current.GetAttribute("offset", ""));
            entryText  = entryText + entryNodes.Current.Value;

            while (entryNodes.MoveNext() == true)
            {
                // Get index of entry
                index  = uint.Parse(entryNodes.Current.GetAttribute("index", ""));
                offset = uint.Parse(entryNodes.Current.GetAttribute("offset", ""));

                if (prevIndex == index)
                {
                    // this entry is the same as the last one, save the text with LF
                    entryText = entryText + "\n" + entryNodes.Current.Value;
                    continue;
                }

                // This entry is a new one, save last entry
                LocalsEntry e = new LocalsEntry();
                e.index     = prevIndex;
                e.offset    = lastOffset;
                lastOffset += (uint)Encoding.UTF8.GetByteCount(entryText) + 1;

                /*if (lastOffset != offset)
                 *  throw new Exception("Error loading locals.bin");*/
                e.text = entryText;

                lf.entries.Add(e);

                // Save text of current entry
                entryText = entryNodes.Current.Value;
                prevIndex++;

                // If next entry is not sequential, we need to add empty entries
                while (index > prevIndex)
                {
                    LocalsEntry fake = new LocalsEntry();
                    fake.index  = prevIndex;
                    fake.offset = 0;
                    fake.text   = "";
                    lf.entries.Add(fake);
                    prevIndex++;
                }
            }

            // Write last entry
            LocalsEntry last = new LocalsEntry();

            last.index  = prevIndex;
            last.offset = lastOffset;
            last.text   = entryText;
            lf.entries.Add(last);
        }