Files
2026-03-30 20:11:57 +07:00

56 lines
1.2 KiB
C#

//
// 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<uint, string> 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);
}
}
}