private static bool GlobMatching()

in cs/remote/src/FASTER.server/PubSub/SpanByteKeySerializer.cs [58:204]


        private static bool GlobMatching(byte* pattern, int patternLen, byte* key, int stringLen, bool nocase = false)
        {
            while (patternLen > 0 && stringLen > 0)
            {
                switch (pattern[0])
                {
                    case (byte)'*':
                        while (patternLen > 0 && pattern[1] == '*')
                        {
                            pattern++;
                            patternLen--;
                        }
                        if (patternLen == 1)
                            return true; /* match */
                        while (stringLen > 0)
                        {
                            if (GlobMatching(pattern + 1, patternLen - 1, key, stringLen, nocase))
                                return true; /* match */
                            key++;
                            stringLen--;
                        }
                        return false; /* no match */

                    case (byte)'?':
                        key++;
                        stringLen--;
                        break;

                    case (byte)'[':
                        {
                            bool not, match;
                            pattern++;
                            patternLen--;
                            not = (pattern[0] == '^');
                            if (not)
                            {
                                pattern++;
                                patternLen--;
                            }
                            match = false;
                            while (true)
                            {
                                if (pattern[0] == '\\' && patternLen >= 2)
                                {
                                    pattern++;
                                    patternLen--;
                                    if (pattern[0] == key[0])
                                        match = true;
                                }
                                else if (pattern[0] == ']')
                                {
                                    break;
                                }
                                else if (patternLen == 0)
                                {
                                    pattern--;
                                    patternLen++;
                                    break;
                                }
                                else if (patternLen >= 3 && pattern[1] == '-')
                                {
                                    int start = pattern[0];
                                    int end = pattern[2];
                                    int c = key[0];
                                    if (start > end)
                                    {
                                        int t = start;
                                        start = end;
                                        end = t;
                                    }
                                    if (nocase)
                                    {
                                        start = char.ToLower((char)start);
                                        end = char.ToLower((char)end);
                                        c = char.ToLower((char)c);
                                    }
                                    pattern += 2;
                                    patternLen -= 2;
                                    if (c >= start && c <= end)
                                        match = true;
                                }
                                else
                                {
                                    if (!nocase)
                                    {
                                        if (pattern[0] == key[0])
                                            match = true;
                                    }
                                    else
                                    {
                                        if (char.ToLower((char)pattern[0]) == char.ToLower((char)key[0]))
                                            match = true;
                                    }
                                }
                                pattern++;
                                patternLen--;
                            }

                            if (not)
                                match = !match;
                            if (!match)
                                return false; /* no match */
                            key++;
                            stringLen--;
                            break;
                        }

                    case (byte)'\\':
                        if (patternLen >= 2)
                        {
                            pattern++;
                            patternLen--;
                        }
                        goto default;

                    /* fall through */
                    default:
                        if (!nocase)
                        {
                            if (pattern[0] != key[0])
                                return false; /* no match */
                        }
                        else
                        {
                            if (char.ToLower((char)pattern[0]) != char.ToLower((char)key[0]))
                                return false; /* no match */
                        }
                        key++;
                        stringLen--;
                        break;
                }
                pattern++;
                patternLen--;
                if (stringLen == 0)
                {
                    while (*pattern == '*')
                    {
                        pattern++;
                        patternLen--;
                    }
                    break;
                }
            }
            if (patternLen == 0 && stringLen == 0)
                return true;
            return false;
        }