1*ccdc9c3eSSadaf Ebrahimi // Copyright 2010 The RE2 Authors. All Rights Reserved. 2*ccdc9c3eSSadaf Ebrahimi // Use of this source code is governed by a BSD-style 3*ccdc9c3eSSadaf Ebrahimi // license that can be found in the LICENSE file. 4*ccdc9c3eSSadaf Ebrahimi 5*ccdc9c3eSSadaf Ebrahimi #ifndef RE2_SET_H_ 6*ccdc9c3eSSadaf Ebrahimi #define RE2_SET_H_ 7*ccdc9c3eSSadaf Ebrahimi 8*ccdc9c3eSSadaf Ebrahimi #include <string> 9*ccdc9c3eSSadaf Ebrahimi #include <utility> 10*ccdc9c3eSSadaf Ebrahimi #include <vector> 11*ccdc9c3eSSadaf Ebrahimi 12*ccdc9c3eSSadaf Ebrahimi #include "re2/re2.h" 13*ccdc9c3eSSadaf Ebrahimi 14*ccdc9c3eSSadaf Ebrahimi namespace re2 { 15*ccdc9c3eSSadaf Ebrahimi class Prog; 16*ccdc9c3eSSadaf Ebrahimi class Regexp; 17*ccdc9c3eSSadaf Ebrahimi } // namespace re2 18*ccdc9c3eSSadaf Ebrahimi 19*ccdc9c3eSSadaf Ebrahimi namespace re2 { 20*ccdc9c3eSSadaf Ebrahimi 21*ccdc9c3eSSadaf Ebrahimi // An RE2::Set represents a collection of regexps that can 22*ccdc9c3eSSadaf Ebrahimi // be searched for simultaneously. 23*ccdc9c3eSSadaf Ebrahimi class RE2::Set { 24*ccdc9c3eSSadaf Ebrahimi public: 25*ccdc9c3eSSadaf Ebrahimi enum ErrorKind { 26*ccdc9c3eSSadaf Ebrahimi kNoError = 0, 27*ccdc9c3eSSadaf Ebrahimi kNotCompiled, // The set is not compiled. 28*ccdc9c3eSSadaf Ebrahimi kOutOfMemory, // The DFA ran out of memory. 29*ccdc9c3eSSadaf Ebrahimi kInconsistent, // The result is inconsistent. This should never happen. 30*ccdc9c3eSSadaf Ebrahimi }; 31*ccdc9c3eSSadaf Ebrahimi 32*ccdc9c3eSSadaf Ebrahimi struct ErrorInfo { 33*ccdc9c3eSSadaf Ebrahimi ErrorKind kind; 34*ccdc9c3eSSadaf Ebrahimi }; 35*ccdc9c3eSSadaf Ebrahimi 36*ccdc9c3eSSadaf Ebrahimi Set(const RE2::Options& options, RE2::Anchor anchor); 37*ccdc9c3eSSadaf Ebrahimi ~Set(); 38*ccdc9c3eSSadaf Ebrahimi 39*ccdc9c3eSSadaf Ebrahimi // Adds pattern to the set using the options passed to the constructor. 40*ccdc9c3eSSadaf Ebrahimi // Returns the index that will identify the regexp in the output of Match(), 41*ccdc9c3eSSadaf Ebrahimi // or -1 if the regexp cannot be parsed. 42*ccdc9c3eSSadaf Ebrahimi // Indices are assigned in sequential order starting from 0. 43*ccdc9c3eSSadaf Ebrahimi // Errors do not increment the index; if error is not NULL, *error will hold 44*ccdc9c3eSSadaf Ebrahimi // the error message from the parser. 45*ccdc9c3eSSadaf Ebrahimi int Add(const StringPiece& pattern, string* error); 46*ccdc9c3eSSadaf Ebrahimi 47*ccdc9c3eSSadaf Ebrahimi // Compiles the set in preparation for matching. 48*ccdc9c3eSSadaf Ebrahimi // Returns false if the compiler runs out of memory. 49*ccdc9c3eSSadaf Ebrahimi // Add() must not be called again after Compile(). 50*ccdc9c3eSSadaf Ebrahimi // Compile() must be called before Match(). 51*ccdc9c3eSSadaf Ebrahimi bool Compile(); 52*ccdc9c3eSSadaf Ebrahimi 53*ccdc9c3eSSadaf Ebrahimi // Returns true if text matches at least one of the regexps in the set. 54*ccdc9c3eSSadaf Ebrahimi // Fills v (if not NULL) with the indices of the matching regexps. 55*ccdc9c3eSSadaf Ebrahimi // Callers must not expect v to be sorted. 56*ccdc9c3eSSadaf Ebrahimi bool Match(const StringPiece& text, std::vector<int>* v) const; 57*ccdc9c3eSSadaf Ebrahimi 58*ccdc9c3eSSadaf Ebrahimi // As above, but populates error_info (if not NULL) when none of the regexps 59*ccdc9c3eSSadaf Ebrahimi // in the set matched. This can inform callers when DFA execution fails, for 60*ccdc9c3eSSadaf Ebrahimi // example, because they might wish to handle that case differently. 61*ccdc9c3eSSadaf Ebrahimi bool Match(const StringPiece& text, std::vector<int>* v, 62*ccdc9c3eSSadaf Ebrahimi ErrorInfo* error_info) const; 63*ccdc9c3eSSadaf Ebrahimi 64*ccdc9c3eSSadaf Ebrahimi private: 65*ccdc9c3eSSadaf Ebrahimi typedef std::pair<string, re2::Regexp*> Elem; 66*ccdc9c3eSSadaf Ebrahimi 67*ccdc9c3eSSadaf Ebrahimi RE2::Options options_; 68*ccdc9c3eSSadaf Ebrahimi RE2::Anchor anchor_; 69*ccdc9c3eSSadaf Ebrahimi std::vector<Elem> elem_; 70*ccdc9c3eSSadaf Ebrahimi re2::Prog* prog_; 71*ccdc9c3eSSadaf Ebrahimi bool compiled_; 72*ccdc9c3eSSadaf Ebrahimi int size_; 73*ccdc9c3eSSadaf Ebrahimi 74*ccdc9c3eSSadaf Ebrahimi Set(const Set&) = delete; 75*ccdc9c3eSSadaf Ebrahimi Set& operator=(const Set&) = delete; 76*ccdc9c3eSSadaf Ebrahimi }; 77*ccdc9c3eSSadaf Ebrahimi 78*ccdc9c3eSSadaf Ebrahimi } // namespace re2 79*ccdc9c3eSSadaf Ebrahimi 80*ccdc9c3eSSadaf Ebrahimi #endif // RE2_SET_H_ 81