System.Uri.CheckSchemeSyntax C# (CSharp) Method

CheckSchemeSyntax() static private method

static private CheckSchemeSyntax ( char ptr, ushort length, UriParser &syntax ) : ParsingError
ptr char
length ushort
syntax UriParser
return ParsingError
        unsafe static private ParsingError CheckSchemeSyntax(char* ptr, ushort length, ref UriParser syntax)
        {
            //First character must be an alpha
            {
                char c = *ptr;
                if (c >= 'a' && c <= 'z')
                {
                    ;
                }
                else if (c >= 'A' && c <= 'Z')
                {
                    *ptr = (char)(c | 0x20);    //make it lowercase
                }
                else
                {
                    return ParsingError.BadScheme;
                }
            }

            for (ushort i = 1; i < length; ++i)
            {
                char c = ptr[i];
                if (c >= 'a' && c <= 'z')
                {
                    ;
                }
                else if (c >= 'A' && c <= 'Z')
                {
                    ptr[i] = (char)(c | 0x20);    //make it lowercase
                }
                else if (c >= '0' && c <= '9')
                {
                    ;
                }
                else if (c == '+' || c == '-' || c == '.')
                {
                    ;
                }
                else
                {
                    return ParsingError.BadScheme;
                }
            }

            // Special-case common and known schemes to avoid allocations and dictionary lookups in these cases.
            switch (length)
            {
                case 2:
                    if (ptr[0] == 'w' && ptr[1] == 's')
                    {
                        syntax = UriParser.WsUri;
                        return ParsingError.None;
                    }
                    break;
                case 3:
                    const int ftpMask = 'f' << 16 | 't' << 8 | 'p';
                    const int wssMask = 'w' << 16 | 's' << 8 | 's';
                    switch (ptr[0] << 16 | ptr[1] << 8 | ptr[2])
                    {
                        case ftpMask:
                            syntax = UriParser.FtpUri;
                            return ParsingError.None;
                        case wssMask:
                            syntax = UriParser.WssUri;
                            return ParsingError.None;
                    }
                    break;
                case 4:
                    const int httpMask = 'h' << 24 | 't' << 16 | 't' << 8 | 'p';
                    const int fileMask = 'f' << 24 | 'i' << 16 | 'l' << 8 | 'e';
                    switch (ptr[0] << 24 | ptr[1] << 16 | ptr[2] << 8 | ptr[3])
                    {
                        case httpMask:
                            syntax = UriParser.HttpUri;
                            return ParsingError.None;
                        case fileMask:
                            syntax = UriParser.FileUri;
                            return ParsingError.None;
                    }
                    break;
                case 5:
                    if (ptr[0] == 'h' && ptr[1] == 't' && ptr[2] == 't' && ptr[3] == 'p' && ptr[4] == 's')
                    {
                        syntax = UriParser.HttpsUri;
                        return ParsingError.None;
                    }
                    break;
                case 6:
                    if (ptr[0] == 'm' && ptr[1] == 'a' && ptr[2] == 'i' && ptr[3] == 'l' && ptr[4] == 't' && ptr[5] == 'o')
                    {
                        syntax = UriParser.MailToUri;
                        return ParsingError.None;
                    }
                    break;
            }

            // Not special-cased scheme.  Look up the syntax based on the substring.
            string str = new string(ptr, 0, length);
            syntax = UriParser.FindOrFetchAsUnknownV1Syntax(str);
            return ParsingError.None;
        }