static string TranslatePattern()

in Agents/Xamarin.Interactive/ProcessControl/Glob.cs [204:258]


            static string TranslatePattern (string pattern)
            {
                var builder = new StringBuilder (pattern.Length * 2);

                var i = 0;
                var n = pattern.Length;
                var braceDepth = 0;

                while (i < n) {
                    var c = pattern [i];
                    i++;

                    if (c == '*')
                        builder.Append (".*");
                    else if (c == '?')
                        builder.Append ('.');
                    else if (c == '[') {
                        var j = i;

                        if (j < n && pattern [j] == '!')
                            j++;
                        if (j < n && pattern [j] == ']')
                            j++;
                        while (j < n && pattern [j] != ']')
                            j++;

                        if (j >= n)
                            builder.Append ("\\[");
                        else {
                            var subpattern = pattern.Substring (i, j - i).Replace ("\\", "\\\\");
                            i = j + 1;
                            if (subpattern [0] == '!')
                                subpattern = '^' + subpattern.Substring (1);
                            else if (subpattern [0] == '^')
                                subpattern = "\\" + subpattern;
                            builder.Append ('[');
                            builder.Append (subpattern);
                            builder.Append (']');
                        }
                    } else if (c == '{') {
                        braceDepth++;
                        builder.Append ('(');
                    } else if (c == '}') {
                        braceDepth--;
                        builder.Append (')');
                    } else if (c == ',' && braceDepth > 0)
                        builder.Append ('|');
                    else
                        builder.Append (Regex.Escape (c.ToString ()));
                }

                builder.Append ('$');

                return builder.ToString ();
            }