66 lines
1.4 KiB
C#
66 lines
1.4 KiB
C#
|
using System;
|
||
|
using System.Runtime.InteropServices;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
|
||
|
namespace Mono {
|
||
|
internal static class RuntimeMarshal {
|
||
|
internal static string PtrToUtf8String (IntPtr ptr)
|
||
|
{
|
||
|
unsafe {
|
||
|
return new String ((sbyte*)ptr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal static SafeStringMarshal MarshalString (string str)
|
||
|
{
|
||
|
return new SafeStringMarshal (str);
|
||
|
}
|
||
|
|
||
|
static int DecodeBlobSize (IntPtr in_ptr, out IntPtr out_ptr)
|
||
|
{
|
||
|
uint size;
|
||
|
unsafe {
|
||
|
byte *ptr = (byte*)in_ptr;
|
||
|
|
||
|
if ((*ptr & 0x80) == 0) {
|
||
|
size = (uint)(ptr [0] & 0x7f);
|
||
|
ptr++;
|
||
|
} else if ((*ptr & 0x40) == 0){
|
||
|
size = (uint)(((ptr [0] & 0x3f) << 8) + ptr [1]);
|
||
|
ptr += 2;
|
||
|
} else {
|
||
|
size = (uint)(((ptr [0] & 0x1f) << 24) +
|
||
|
(ptr [1] << 16) +
|
||
|
(ptr [2] << 8) +
|
||
|
ptr [3]);
|
||
|
ptr += 4;
|
||
|
}
|
||
|
out_ptr = (IntPtr)ptr;
|
||
|
}
|
||
|
|
||
|
return (int)size;
|
||
|
}
|
||
|
|
||
|
internal static byte[] DecodeBlobArray (IntPtr ptr)
|
||
|
{
|
||
|
IntPtr out_ptr;
|
||
|
int size = DecodeBlobSize (ptr, out out_ptr);
|
||
|
byte[] res = new byte [size];
|
||
|
Marshal.Copy (out_ptr, res, 0, size);
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
internal static int AsciHexDigitValue (int c)
|
||
|
{
|
||
|
if (c >= '0' && c <= '9')
|
||
|
return c - '0';
|
||
|
if (c >= 'a' && c <= 'f')
|
||
|
return c - 'a' + 10;
|
||
|
return c - 'A' + 10;
|
||
|
}
|
||
|
|
||
|
[MethodImpl (MethodImplOptions.InternalCall)]
|
||
|
internal static extern void FreeAssemblyName (ref MonoAssemblyName name);
|
||
|
}
|
||
|
}
|