private unsafe void UnsafeWriteText(char* chars, int charCount)
{
// Callers should handle zero
DiagnosticUtility.DebugAssert(charCount > 0, "");
if (charCount == 1)
{
char ch = chars[0];
if (ch == '0')
{
WriteTextNode(XmlBinaryNodeType.ZeroText);
return;
}
if (ch == '1')
{
WriteTextNode(XmlBinaryNodeType.OneText);
return;
}
}
if (charCount <= byte.MaxValue / maxBytesPerChar)
{
// Optimize if we know we can fit the converted string in the buffer
// so we don't have to make a pass to count the bytes
int offset;
byte[] buffer = GetBuffer(1 + 1 + charCount * maxBytesPerChar, out offset);
int length = UnsafeGetUTF8Chars(chars, charCount, buffer, offset + 2);
if (length / 2 <= charCount)
{
buffer[offset] = (byte)XmlBinaryNodeType.Chars8Text;
}
else
{
buffer[offset] = (byte)XmlBinaryNodeType.UnicodeChars8Text;
length = UnsafeGetUnicodeChars(chars, charCount, buffer, offset + 2);
}
_textNodeOffset = offset;
DiagnosticUtility.DebugAssert(length <= byte.MaxValue, "");
buffer[offset + 1] = (byte)length;
Advance(2 + length);
}
else
{
int byteCount = UnsafeGetUTF8Length(chars, charCount);
if (byteCount / 2 > charCount)
{
WriteTextNodeWithLength(XmlBinaryNodeType.UnicodeChars8Text, charCount * 2);
UnsafeWriteUnicodeChars(chars, charCount);
}
else
{
WriteTextNodeWithLength(XmlBinaryNodeType.Chars8Text, byteCount);
UnsafeWriteUTF8Chars(chars, charCount);
}
}
}