File: FrameworkFork\Microsoft.Xml\Xml\XmlComplianceUtil.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using System.IO;
 
namespace Microsoft.Xml
{
    using System;
 
    using System.Text;
 
    internal static class XmlComplianceUtil
    {
        // Replaces \r\n, \n, \r and \t with single space (0x20) and then removes spaces
        // at the beggining and 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;
            XmlCharType xmlCharType = XmlCharType.Instance;
            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)
                {
                    if (norValue == null)
                    {
                        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;
                }
 
                if (norValue == null)
                {
                    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(char[] value, int startPos, int length)
        {
            int len = length;
            if (len < 2)
            {
                return false;
            }
 
            bool fSeenLetter = false;
            int i = startPos;
            XmlCharType xmlCharType = XmlCharType.Instance;
 
            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;
        }
    }
}