Index: tools/gn/pattern.h |
diff --git a/tools/gn/pattern.h b/tools/gn/pattern.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..582cfeab8aafab480ee4962c7b9d3d935688197f |
--- /dev/null |
+++ b/tools/gn/pattern.h |
@@ -0,0 +1,86 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef TOOLS_GN_PATTERN_H_ |
+#define TOOLS_GN_PATTERN_H_ |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "tools/gn/value.h" |
+ |
+class Pattern { |
+ public: |
+ struct Subrange { |
+ enum Type { |
+ LITERAL, // Matches exactly the contents of the string. |
+ ANYTHING, // * (zero or more chars). |
+ PATH_BOUNDARY // '/' or beginning of string. |
+ }; |
+ |
+ Subrange(Type t, const std::string& l = std::string()) |
+ : type(t), |
+ literal(l) { |
+ } |
+ |
+ // Returns the minimum number of chars that this subrange requires. |
+ size_t MinSize() const { |
+ switch (type) { |
+ case LITERAL: |
+ return literal.size(); |
+ case ANYTHING: |
+ return 0; |
+ case PATH_BOUNDARY: |
+ return 0; // Can match beginning or end of string, which is 0 len. |
+ default: |
+ return 0; |
+ } |
+ } |
+ |
+ Type type; |
+ |
+ // When type == LITERAL this is the text to match. |
+ std::string literal; |
+ }; |
+ |
+ Pattern(const std::string& s); |
+ ~Pattern(); |
+ |
+ // Returns true if the current pattern matches the given string. |
+ bool MatchesString(const std::string& s) const; |
+ |
+ private: |
+ // allow_implicit_path_boundary determines if a path boundary should accept |
+ // matches at the beginning or end of the string. |
+ bool RecursiveMatch(const std::string& s, |
+ size_t begin_char, |
+ size_t subrange_index, |
+ bool allow_implicit_path_boundary) const; |
+ |
+ std::vector<Subrange> subranges_; |
+ |
+ // Set to true when the subranges are "*foo" ("ANYTHING" followed by a |
+ // literal). This covers most patterns so we optimize for this. |
+ bool is_suffix_; |
+}; |
+ |
+class PatternList { |
+ public: |
+ PatternList(); |
+ ~PatternList(); |
+ |
+ bool is_empty() const { return patterns_.empty(); } |
+ |
+ // Initializes the pattern list from a give list of pattern strings. Sets |
+ // |*err| on failure. |
+ void SetFromValue(const Value& v, Err* err); |
+ |
+ bool MatchesString(const std::string& s) const; |
+ bool MatchesValue(const Value& v) const; |
+ |
+ private: |
+ std::vector<Pattern> patterns_; |
+}; |
+ |
+#endif // TOOLS_GN_PATTERN_H_ |