|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.IO;
using System.Text;
namespace System.Xml
{
internal static class XmlComplianceUtil
{
// Replaces \r\n, \n, \r and \t with single space (0x20) and then removes spaces
// at the beginning and the end of the string and replaces sequences of spaces
// with a single space.
public static string NonCDataNormalize(string value)
{
int len = value.Length;
if (len <= 0)
{
return string.Empty;
}
int startPos = 0;
StringBuilder? norValue = null;
while (XmlCharType.IsWhiteSpace(value[startPos]))
{
startPos++;
if (startPos == len)
{
return " ";
}
}
int i = startPos;
while (i < len)
{
if (!XmlCharType.IsWhiteSpace(value[i]))
{
i++;
continue;
}
int j = i + 1;
while (j < len && XmlCharType.IsWhiteSpace(value[j]))
{
j++;
}
if (j == len)
{
if (norValue == null)
{
return value.Substring(startPos, i - startPos);
}
else
{
norValue.Append(value, startPos, i - startPos);
return norValue.ToString();
}
}
if (j > i + 1 || value[i] != 0x20)
{
norValue ??= new StringBuilder(len);
norValue.Append(value, startPos, i - startPos);
norValue.Append((char)0x20);
startPos = j;
i = j;
}
else
{
i++;
}
}
if (norValue != null)
{
if (startPos < i)
{
norValue.Append(value, startPos, i - startPos);
}
return norValue.ToString();
}
else
{
if (startPos > 0)
{
return value.Substring(startPos, len - startPos);
}
else
{
return value;
}
}
}
// Replaces \r\n, \n, \r and \t with single space (0x20)
public static string CDataNormalize(string value)
{
int len = value.Length;
if (len <= 0)
{
return string.Empty;
}
int i = 0;
int startPos = 0;
StringBuilder? norValue = null;
while (i < len)
{
char ch = value[i];
if (ch >= 0x20 || (ch != 0x9 && ch != 0xA && ch != 0xD))
{
i++;
continue;
}
norValue ??= new StringBuilder(len);
if (startPos < i)
{
norValue.Append(value, startPos, i - startPos);
}
norValue.Append((char)0x20);
if (ch == 0xD && (i + 1 < len && value[i + 1] == 0xA))
{
i += 2;
}
else
{
i++;
}
startPos = i;
}
if (norValue == null)
{
return value;
}
else
{
if (i > startPos)
{
norValue.Append(value, startPos, i - startPos);
}
return norValue.ToString();
}
}
public static bool IsValidLanguageID(string value)
{
int len = value.Length;
if (len < 2)
{
return false;
}
bool fSeenLetter = false;
int i = 0;
char ch = value[i];
if (XmlCharType.IsLetter(ch))
{
if (XmlCharType.IsLetter(value[++i]))
{
if (len == 2)
{
return true;
}
len--;
i++;
}
else if (('I' != ch && 'i' != ch) && ('X' != ch && 'x' != ch))
{ //IANA or custom Code
return false;
}
if (value[i] != '-')
{
return false;
}
len -= 2;
while (len-- > 0)
{
ch = value[++i];
if (XmlCharType.IsLetter(ch))
{
fSeenLetter = true;
}
else if (ch == '-' && fSeenLetter)
{
fSeenLetter = false;
}
else
{
return false;
}
}
if (fSeenLetter)
{
return true;
}
}
return false;
}
}
}
|