mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-14 12:44:16 +01:00
Make logic clearer
This commit is contained in:
parent
3d51f88a33
commit
ca321e59e4
1 changed files with 41 additions and 34 deletions
|
|
@ -171,43 +171,61 @@ internal sealed unsafe class ImGuiClipboardFunctionProvider : IServiceType, IDis
|
||||||
_ => 0xFFFD,
|
_ => 0xFFFD,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Replaces a sequence with another.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buf">The buffer.</param>
|
||||||
|
/// <param name="offset">Offset of the sequence to be replaced.</param>
|
||||||
|
/// <param name="length">Length of the sequence to be replaced.</param>
|
||||||
|
/// <param name="replacement">The replacement sequence.</param>
|
||||||
|
/// <returns>The length of <paramref name="replacement"/>.</returns>
|
||||||
|
public static int ReplaceSequence(
|
||||||
|
ref ImVectorWrapper<byte> buf,
|
||||||
|
int offset,
|
||||||
|
int length,
|
||||||
|
ReadOnlySpan<byte> replacement)
|
||||||
|
{
|
||||||
|
var i = 0;
|
||||||
|
for (; i < replacement.Length; i++)
|
||||||
|
{
|
||||||
|
if (length >= i + 1)
|
||||||
|
buf[offset++] = replacement[i];
|
||||||
|
else
|
||||||
|
buf.Insert(offset++, replacement[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i < length; i++)
|
||||||
|
buf.RemoveAt(offset);
|
||||||
|
|
||||||
|
return replacement.Length;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Normalize the given text for our use case.
|
/// Normalize the given text for our use case.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="buf">The buffer.</param>
|
/// <param name="buf">The buffer.</param>
|
||||||
public static void Normalize(ref ImVectorWrapper<byte> buf)
|
public static void Normalize(ref ImVectorWrapper<byte> buf)
|
||||||
{
|
{
|
||||||
|
// Ensure an implicit null after the end of the string.
|
||||||
|
buf.EnsureCapacity(buf.Length + 1);
|
||||||
|
buf.StorageSpan[buf.Length] = 0;
|
||||||
|
|
||||||
for (var i = 0; i < buf.Length;)
|
for (var i = 0; i < buf.Length;)
|
||||||
{
|
{
|
||||||
// Already correct?
|
|
||||||
if (buf[i] is 0x0D && buf[i + 1] is 0x0A)
|
|
||||||
{
|
|
||||||
i += 2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cb = CountBytes(buf.Data + i, buf.Length - i);
|
var cb = CountBytes(buf.Data + i, buf.Length - i);
|
||||||
var currInt = GetCodepoint(buf.Data + i, cb);
|
var currInt = GetCodepoint(buf.Data + i, cb);
|
||||||
switch (currInt)
|
switch (currInt)
|
||||||
{
|
{
|
||||||
case 0xFFFF: // Simply invalid
|
// Note that buf.Data[i + 1] is always defined. See the beginning of the function.
|
||||||
|
case '\r' when buf.Data[i + 1] == '\n': // Already CR LF?
|
||||||
|
i += 2;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 0xFFFE or 0xFFFF: // Simply invalid
|
||||||
case > char.MaxValue: // ImWchar is same size with char; does not support
|
case > char.MaxValue: // ImWchar is same size with char; does not support
|
||||||
case >= 0xD800 and <= 0xDBFF: // UTF-16 surrogate; does not support
|
case >= 0xD800 and <= 0xDBFF: // UTF-16 surrogate; does not support
|
||||||
// Replace with \uFFFD in UTF-8: EF BF BD
|
// Replace with \uFFFD in UTF-8: EF BF BD
|
||||||
buf[i++] = 0xEF;
|
i += ReplaceSequence(ref buf, i, cb, "\uFFFD"u8);
|
||||||
|
|
||||||
if (cb >= 2)
|
|
||||||
buf[i++] = 0xBF;
|
|
||||||
else
|
|
||||||
buf.Insert(i++, 0xBF);
|
|
||||||
|
|
||||||
if (cb >= 3)
|
|
||||||
buf[i++] = 0xBD;
|
|
||||||
else
|
|
||||||
buf.Insert(i++, 0xBD);
|
|
||||||
|
|
||||||
if (cb >= 4)
|
|
||||||
buf.RemoveAt(i);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// See String.Manipulation.cs: IndexOfNewlineChar.
|
// See String.Manipulation.cs: IndexOfNewlineChar.
|
||||||
|
|
@ -217,18 +235,7 @@ internal sealed unsafe class ImGuiClipboardFunctionProvider : IServiceType, IDis
|
||||||
case '\u0085': // NEL; Next Line
|
case '\u0085': // NEL; Next Line
|
||||||
case '\u2028': // LS; Line Separator
|
case '\u2028': // LS; Line Separator
|
||||||
case '\u2029': // PS; Paragraph Separator
|
case '\u2029': // PS; Paragraph Separator
|
||||||
buf[i++] = 0x0D;
|
i += ReplaceSequence(ref buf, i, cb, "\r\n"u8);
|
||||||
|
|
||||||
if (cb >= 2)
|
|
||||||
buf[i++] = 0x0A;
|
|
||||||
else
|
|
||||||
buf.Insert(i++, 0x0A);
|
|
||||||
|
|
||||||
if (cb >= 3)
|
|
||||||
buf.RemoveAt(i);
|
|
||||||
|
|
||||||
if (cb >= 4)
|
|
||||||
buf.RemoveAt(i);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue