// // Author: // Jb Evain (jbevain@gmail.com) // // Copyright (c) 2008 - 2015 Jb Evain // Copyright (c) 2008 - 2011 Novell, Inc. // // Licensed under the MIT/X11 license. // using System.Collections.Generic; using System.Text; namespace MonoFN.Cecil.Metadata { internal class StringHeap : Heap { private readonly Dictionary strings = new(); public StringHeap(byte[] data) : base(data) { } public string Read(uint index) { if (index == 0) return string.Empty; string @string; if (strings.TryGetValue(index, out @string)) return @string; if (index > data.Length - 1) return string.Empty; @string = ReadStringAt(index); if (@string.Length != 0) strings.Add(index, @string); return @string; } protected virtual string ReadStringAt(uint index) { int length = 0; int start = (int)index; for (int i = start;; i++) { if (data[i] == 0) break; length++; } return Encoding.UTF8.GetString(data, start, length); } } }