unsafe static private bool CheckKnownSchemes(long* lptr, ushort nChars, ref UriParser syntax)
{
//NOTE beware of too short input buffers!
const long _HTTP_Mask0 = 'h' | ('t' << 16) | ((long)'t' << 32) | ((long)'p' << 48);
const char _HTTPS_Mask1 = 's';
const int _WS_Mask = 'w' | ('s' << 16);
const long _WSS_Mask = 'w' | ('s' << 16) | ((long)'s' << 32) | ((long)':' << 48);
const long _FTP_Mask = 'f' | ('t' << 16) | ((long)'p' << 32) | ((long)':' << 48);
const long _FILE_Mask0 = 'f' | ('i' << 16) | ((long)'l' << 32) | ((long)'e' << 48);
const long _GOPHER_Mask0 = 'g' | ('o' << 16) | ((long)'p' << 32) | ((long)'h' << 48);
const int _GOPHER_Mask1 = 'e' | ('r' << 16);
const long _MAILTO_Mask0 = 'm' | ('a' << 16) | ((long)'i' << 32) | ((long)'l' << 48);
const int _MAILTO_Mask1 = 't' | ('o' << 16);
const long _NEWS_Mask0 = 'n' | ('e' << 16) | ((long)'w' << 32) | ((long)'s' << 48);
const long _NNTP_Mask0 = 'n' | ('n' << 16) | ((long)'t' << 32) | ((long)'p' << 48);
const long _UUID_Mask0 = 'u' | ('u' << 16) | ((long)'i' << 32) | ((long)'d' << 48);
const long _TELNET_Mask0 = 't' | ('e' << 16) | ((long)'l' << 32) | ((long)'n' << 48);
const int _TELNET_Mask1 = 'e' | ('t' << 16);
const long _NETXXX_Mask0 = 'n' | ('e' << 16) | ((long)'t' << 32) | ((long)'.' << 48);
const long _NETTCP_Mask1 = 't' | ('c' << 16) | ((long)'p' << 32) | ((long)':' << 48);
const long _NETPIPE_Mask1 = 'p' | ('i' << 16) | ((long)'p' << 32) | ((long)'e' << 48);
const long _LDAP_Mask0 = 'l' | ('d' << 16) | ((long)'a' << 32) | ((long)'p' << 48);
const long _LOWERCASE_Mask = 0x0020002000200020L;
const int _INT_LOWERCASE_Mask = 0x00200020;
if (nChars == 2)
{
// This is the only known scheme of length 2
if ((((int)*lptr) | _INT_LOWERCASE_Mask) == _WS_Mask)
{
syntax = UriParser.WsUri;
return true;
}
return false;
}
//Map to a known scheme if possible
//upgrade 4 letters to ASCII lower case, keep a false case to stay false
switch (*lptr | _LOWERCASE_Mask)
{
case _HTTP_Mask0:
if (nChars == 4)
{
syntax = UriParser.HttpUri;
return true;
}
if (nChars == 5 && ((*(char*)(lptr + 1)) | 0x20) == _HTTPS_Mask1)
{
syntax = UriParser.HttpsUri;
return true;
}
break;
case _WSS_Mask:
if (nChars == 3)
{
syntax = UriParser.WssUri;
return true;
}
break;
case _FILE_Mask0:
if (nChars == 4)
{
syntax = UriParser.FileUri;
return true;
}
break;
case _FTP_Mask:
if (nChars == 3)
{
syntax = UriParser.FtpUri;
return true;
}
break;
case _NEWS_Mask0:
if (nChars == 4)
{
syntax = UriParser.NewsUri;
return true;
}
break;
case _NNTP_Mask0:
if (nChars == 4)
{
syntax = UriParser.NntpUri;
return true;
}
break;
case _UUID_Mask0:
if (nChars == 4)
{
syntax = UriParser.UuidUri;
return true;
}
break;
case _GOPHER_Mask0:
if (nChars == 6 && (*(int*)(lptr + 1) | _INT_LOWERCASE_Mask) == _GOPHER_Mask1)
{
syntax = UriParser.GopherUri;
return true;
}
break;
case _MAILTO_Mask0:
if (nChars == 6 && (*(int*)(lptr + 1) | _INT_LOWERCASE_Mask) == _MAILTO_Mask1)
{
syntax = UriParser.MailToUri;
return true;
}
break;
case _TELNET_Mask0:
if (nChars == 6 && (*(int*)(lptr + 1) | _INT_LOWERCASE_Mask) == _TELNET_Mask1)
{
syntax = UriParser.TelnetUri;
return true;
}
break;
case _NETXXX_Mask0:
if (nChars == 8 && (*(lptr + 1) | _LOWERCASE_Mask) == _NETPIPE_Mask1)
{
syntax = UriParser.NetPipeUri;
return true;
}
else if (nChars == 7 && (*(lptr + 1) | _LOWERCASE_Mask) == _NETTCP_Mask1)
{
syntax = UriParser.NetTcpUri;
return true;
}
break;
case _LDAP_Mask0:
if (nChars == 4)
{
syntax = UriParser.LdapUri;
return true;
}
break;
default: break;
}
return false;
}