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