Fixed #3118 (Tokenizer: str*cmp() in hot spot code)

This commit is contained in:
Johan Samuelson 2011-09-20 19:03:19 +02:00 committed by Daniel Marjamäki
parent af5272dfb0
commit 889c407f58
1 changed files with 31 additions and 15 deletions

View File

@ -214,14 +214,14 @@ static bool strisop(const char str[])
} }
else if (str[2] == 0) else if (str[2] == 0)
{ {
if (strcmp(str, "&&")==0 || if ((str[0] == '&' && str[1] == '&') ||
strcmp(str, "||")==0 || (str[0] == '|' && str[1] == '|') ||
strcmp(str, "==")==0 || (str[0] == '=' && str[1] == '=') ||
strcmp(str, "!=")==0 || (str[0] == '!' && str[1] == '=') ||
strcmp(str, ">=")==0 || (str[0] == '>' && str[1] == '=') ||
strcmp(str, "<=")==0 || (str[0] == '<' && str[1] == '=') ||
strcmp(str, ">>")==0 || (str[0] == '>' && str[1] == '>') ||
strcmp(str, "<<")==0) (str[0] == '<' && str[1] == '<'))
return true; return true;
} }
return false; return false;
@ -229,21 +229,29 @@ static bool strisop(const char str[])
int Token::multiCompare(const char *haystack, const char *needle) int Token::multiCompare(const char *haystack, const char *needle)
{ {
if (haystack[0] == '%' && haystack[1] != '|') if (haystack[0] == '%' && haystack[1] == 'o')
{ {
if (strncmp(haystack, "%op%|", 5) == 0) if (haystack[2] == 'p' && // "%op%|"
haystack[3] == '%' &&
haystack[4] == '|')
{ {
haystack = haystack + 5; haystack = haystack + 5;
if (strisop(needle)) if (strisop(needle))
return 1; return 1;
} }
else if (strncmp(haystack, "%or%|", 5) == 0) else if (haystack[2] == 'r' && // "%or%|"
haystack[3] == '%' &&
haystack[4] == '|')
{ {
haystack = haystack + 5; haystack = haystack + 5;
if (*needle == '|') if (*needle == '|')
return 1; return 1;
} }
else if (strncmp(haystack, "%oror%|", 7) == 0) else if (haystack[2] == 'r' && // "%oror%|"
haystack[3] == 'o' &&
haystack[4] == 'r' &&
haystack[5] == '%' &&
haystack[6] == '|')
{ {
haystack = haystack + 7; haystack = haystack + 7;
if (needle[0] == '|' && needle[1] == '|') if (needle[0] == '|' && needle[1] == '|')
@ -306,19 +314,27 @@ int Token::multiCompare(const char *haystack, const char *needle)
if (haystack[0] == '%' && haystack[1] != '|') if (haystack[0] == '%' && haystack[1] != '|')
{ {
if (strncmp(haystack, "%op%", 4) == 0) if (haystack[1] == 'o' && // "%op%"
haystack[2] == 'p' &&
haystack[3] == '%')
{ {
if (strisop(needle)) if (strisop(needle))
return 1; return 1;
haystack = haystack + 4; haystack = haystack + 4;
} }
else if (strncmp(haystack, "%or%", 4) == 0) else if (haystack[1] == 'o' && // "%or%"
haystack[2] == 'r' &&
haystack[3] == '%')
{ {
if (*needle == '|') if (*needle == '|')
return 1; return 1;
haystack = haystack + 4; haystack = haystack + 4;
} }
else if (strncmp(haystack, "%oror%", 6) == 0) else if (haystack[1] == 'o' && // "%oror%"
haystack[2] == 'r' &&
haystack[3] == 'o' &&
haystack[4] == 'r' &&
haystack[5] == '%')
{ {
if (needle[0] == '|' && needle[1] == '|') if (needle[0] == '|' && needle[1] == '|')
return 1; return 1;