using System;
using System.Runtime.InteropServices;
using System.Text;
namespace PdfOxide.Internal
{
internal static class StringMarshaler
{
public static string PtrToString(IntPtr ptr)
{
if (ptr == IntPtr.Zero)
return string.Empty;
return PtrToStringUtf8(ptr) ?? string.Empty;
}
internal static string? PtrToStringUtf8(IntPtr ptr)
{
if (ptr == IntPtr.Zero)
return null;
#if NET5_0_OR_GREATER
return Marshal.PtrToStringUTF8(ptr);
#else
int length = 0;
while (Marshal.ReadByte(ptr, length) != 0)
length++;
if (length == 0)
return string.Empty;
byte[] buffer = new byte[length];
Marshal.Copy(ptr, buffer, 0, length);
return Encoding.UTF8.GetString(buffer);
#endif
}
public static string PtrToStringAndFree(IntPtr ptr)
{
try
{
return PtrToString(ptr);
}
finally
{
if (ptr != IntPtr.Zero)
{
NativeMethods.FreeString(ptr);
}
}
}
}
}