static int multiComparePercent(const char * * haystack_p, const char * needle, bool emptyStringFound) { const char *haystack = *haystack_p; if (haystack[0] == '%' && haystack[1] != '|') { if (haystack[1] == 'o' && // "%op%" haystack[2] == 'p' && haystack[3] == '%') { if (strisop(needle)) return 1; *haystack_p = haystack = haystack + 4; } else if (haystack[1] == 'o' && // "%or%" haystack[2] == 'r' && haystack[3] == '%') { if (*needle == '|' && needle[1] != '|' && needle[1] != '=') return 1; *haystack_p = haystack = haystack + 4; } else if (haystack[1] == 'o' && // "%oror%" haystack[2] == 'r' && haystack[3] == 'o' && haystack[4] == 'r' && haystack[5] == '%') { if (needle[0] == '|' && needle[1] == '|') return 1; *haystack_p = haystack = haystack + 6; } if (*haystack == '|') *haystack_p = haystack = haystack + 1; else if (*haystack == ' ' || *haystack == '\0') return emptyStringFound ? 0 : -1; else return -1; } return 0xFFFF; }
int Token::multiCompare(const char *haystack, const char *needle) { if (haystack[0] == '%' && haystack[1] == 'o') { if (haystack[2] == 'p' && // "%op%|" haystack[3] == '%' && haystack[4] == '|') { haystack = haystack + 5; if (strisop(needle)) return 1; } else if (haystack[2] == 'r' && // "%or%|" haystack[3] == '%' && haystack[4] == '|') { haystack = haystack + 5; if (*needle == '|') return 1; } else if (haystack[2] == 'r' && // "%oror%|" haystack[3] == 'o' && haystack[4] == 'r' && haystack[5] == '%' && haystack[6] == '|') { haystack = haystack + 7; if (needle[0] == '|' && needle[1] == '|') return 1; } } bool emptyStringFound = false; const char *needlePointer = needle; while (true) { if (*needlePointer == *haystack) { if (*needlePointer == '\0') return 1; ++needlePointer; ++haystack; } else if (*haystack == '|') { if (*needlePointer == 0) { // If needle is at the end, we have a match. return 1; } else if (needlePointer == needle) { // If needlePointer was not increased at all, we had a empty // string in the haystack emptyStringFound = true; } needlePointer = needle; ++haystack; } else if (*haystack == ' ' || *haystack == '\0') { if (needlePointer == needle) return 0; break; } // If haystack and needle don't share the same character, // find next '|' character. else { needlePointer = needle; do { ++haystack; } while (*haystack != ' ' && *haystack != '|' && *haystack); if (*haystack == ' ' || *haystack == '\0') { return emptyStringFound ? 0 : -1; } ++haystack; if (haystack[0] == '%' && haystack[1] != '|') { if (haystack[1] == 'o' && // "%op%" haystack[2] == 'p' && haystack[3] == '%') { if (strisop(needle)) return 1; haystack = haystack + 4; } else if (haystack[1] == 'o' && // "%or%" haystack[2] == 'r' && haystack[3] == '%') { if (*needle == '|') return 1; haystack = haystack + 4; } else if (haystack[1] == 'o' && // "%oror%" haystack[2] == 'r' && haystack[3] == 'o' && haystack[4] == 'r' && haystack[5] == '%') { if (needle[0] == '|' && needle[1] == '|') return 1; haystack = haystack + 6; } if (*haystack == '|') haystack++; else if (*haystack == ' ' || *haystack == '\0') return emptyStringFound ? 0 : -1; else return -1; } } } if (*needlePointer == '\0') return 1; // If empty string was found earlier from the haystack if (emptyStringFound) return 0; return -1; }