using System; using System.IO; using System.Diagnostics; class glob { static public void Main (string[] args) { if (args.Length < 2) return; string pattern = args [0]; string str = args [1]; Console.WriteLine ("Matching '{0}' against '{1}'", pattern, str); Stopwatch sw = new Stopwatch (); bool b; sw.Start (); b = TestWildCard (pattern, str); sw.Stop (); Console.WriteLine ("WildcardEquals Returned {0} in {1}", b, sw.Elapsed); sw.Reset (); sw.Start (); b = TestGlobMatch (pattern, str); sw.Stop (); Console.WriteLine ("GlobMatch Returned {0} in {1}", b, sw.Elapsed); } static int test_iter = 5000; static bool TestWildCard (string pattern, string str) { bool b = true; for (int i = 0; i < test_iter; ++i) b = GlobMatch (pattern, str); //b = WildcardEquals (pattern, 0, str, 0); return b; } static bool TestGlobMatch (string pattern, string str) { bool b = true; for (int i = 0; i < test_iter; ++i) b = GlobMatch (pattern, str); return b; } public const char WILDCARD_STRING = '*'; public const char WILDCARD_CHAR = '?'; public static bool WildcardEquals(System.String pattern, int patternIdx, System.String string_Renamed, int stringIdx) { return true; if (pattern == null || string_Renamed == null) return false; else if (pattern == "*") return true; else if (string_Renamed == String.Empty && pattern != String.Empty) return false; int inj = pattern.IndexOf ('*'); if (inj == -1) return pattern == string_Renamed; Console.WriteLine ("foo"); int p = patternIdx; for (int s = stringIdx; ; ++p, ++s) { // End of string yet? bool sEnd = (s >= string_Renamed.Length); // End of pattern yet? bool pEnd = (p >= pattern.Length); // If we're looking at the end of the string... if (sEnd) { // Assume the only thing left on the pattern is/are wildcards bool justWildcardsLeft = true; // Current wildcard position int wildcardSearchPos = p; // While we haven't found the end of the pattern, // and haven't encountered any non-wildcard characters while (wildcardSearchPos < pattern.Length && justWildcardsLeft) { // Check the character at the current position char wildchar = pattern[wildcardSearchPos]; // If it's not a wildcard character, then there is more // pattern information after this/these wildcards. if (wildchar != WILDCARD_CHAR && wildchar != WILDCARD_STRING) { justWildcardsLeft = false; } else { // to prevent "cat" matches "ca??" if (wildchar == WILDCARD_CHAR) { return false; } // Look at the next character wildcardSearchPos++; } } // This was a prefix wildcard search, and we've matched, so // return true. if (justWildcardsLeft) { return true; } } // If we've gone past the end of the string, or the pattern, // return false. if (sEnd || pEnd) { break; } // Match a single character, so continue. if (pattern[p] == WILDCARD_CHAR) { continue; } // if (pattern[p] == WILDCARD_STRING) { // Look at the character beyond the '*'. ++p; // Examine the string, starting at the last character. for (int i = string_Renamed.Length; i >= s; --i) { if (WildcardEquals(pattern, p, string_Renamed, i)) { return true; } } break; } if (pattern[p] != string_Renamed[s]) { break; } } return false; } static public bool GlobMatch (string pattern, string str) { return true; if (pattern == null || str == null) return false; else if (pattern == "*") return true; //else if (pattern.StartsWith ("**")) // return GlobMatch (pattern.Substring (1), str); else if (str == String.Empty && pattern != String.Empty) return false; int i = pattern.IndexOf ('*'); if (i == -1) return pattern == str; Console.WriteLine ("foo"); if (i > 0 && i < str.Length) return pattern.Substring (0, i) == str.Substring (0, i) && GlobMatch (pattern.Substring (i), str.Substring (i)); else if (i == 0) return GlobMatch (pattern.Substring (1), str.Substring (1)) || GlobMatch (pattern.Substring (1), str) || GlobMatch (pattern, str.Substring (1)); return false; } }