Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Unified Diff: third_party/re2/util/pcre.h

Issue 1544433002: Replace RE2 import with a dependency (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Re-Added LICENSE and OWNERS file Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/re2/util/mutex.h ('k') | third_party/re2/util/pcre.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/re2/util/pcre.h
diff --git a/third_party/re2/util/pcre.h b/third_party/re2/util/pcre.h
deleted file mode 100644
index 20b10c069fdae5a18f6be72638c6ae4dc441f88b..0000000000000000000000000000000000000000
--- a/third_party/re2/util/pcre.h
+++ /dev/null
@@ -1,666 +0,0 @@
-// Copyright 2003-2010 Google Inc. All Rights Reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This is a variant of PCRE's pcrecpp.h, originally written at Google.
-// The main changes are the addition of the HitLimit method and
-// compilation as PCRE in namespace re2.
-
-// C++ interface to the pcre regular-expression library. PCRE supports
-// Perl-style regular expressions (with extensions like \d, \w, \s,
-// ...).
-//
-// -----------------------------------------------------------------------
-// REGEXP SYNTAX:
-//
-// This module uses the pcre library and hence supports its syntax
-// for regular expressions:
-//
-// http://www.google.com/search?q=pcre
-//
-// The syntax is pretty similar to Perl's. For those not familiar
-// with Perl's regular expressions, here are some examples of the most
-// commonly used extensions:
-//
-// "hello (\\w+) world" -- \w matches a "word" character
-// "version (\\d+)" -- \d matches a digit
-// "hello\\s+world" -- \s matches any whitespace character
-// "\\b(\\w+)\\b" -- \b matches empty string at a word boundary
-// "(?i)hello" -- (?i) turns on case-insensitive matching
-// "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible
-//
-// -----------------------------------------------------------------------
-// MATCHING INTERFACE:
-//
-// The "FullMatch" operation checks that supplied text matches a
-// supplied pattern exactly.
-//
-// Example: successful match
-// CHECK(PCRE::FullMatch("hello", "h.*o"));
-//
-// Example: unsuccessful match (requires full match):
-// CHECK(!PCRE::FullMatch("hello", "e"));
-//
-// -----------------------------------------------------------------------
-// UTF-8 AND THE MATCHING INTERFACE:
-//
-// By default, pattern and text are plain text, one byte per character.
-// The UTF8 flag, passed to the constructor, causes both pattern
-// and string to be treated as UTF-8 text, still a byte stream but
-// potentially multiple bytes per character. In practice, the text
-// is likelier to be UTF-8 than the pattern, but the match returned
-// may depend on the UTF8 flag, so always use it when matching
-// UTF8 text. E.g., "." will match one byte normally but with UTF8
-// set may match up to three bytes of a multi-byte character.
-//
-// Example:
-// PCRE re(utf8_pattern, PCRE::UTF8);
-// CHECK(PCRE::FullMatch(utf8_string, re));
-//
-// -----------------------------------------------------------------------
-// MATCHING WITH SUB-STRING EXTRACTION:
-//
-// You can supply extra pointer arguments to extract matched subpieces.
-//
-// Example: extracts "ruby" into "s" and 1234 into "i"
-// int i;
-// string s;
-// CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s, &i));
-//
-// Example: fails because string cannot be stored in integer
-// CHECK(!PCRE::FullMatch("ruby", "(.*)", &i));
-//
-// Example: fails because there aren't enough sub-patterns:
-// CHECK(!PCRE::FullMatch("ruby:1234", "\\w+:\\d+", &s));
-//
-// Example: does not try to extract any extra sub-patterns
-// CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s));
-//
-// Example: does not try to extract into NULL
-// CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", NULL, &i));
-//
-// Example: integer overflow causes failure
-// CHECK(!PCRE::FullMatch("ruby:1234567891234", "\\w+:(\\d+)", &i));
-//
-// -----------------------------------------------------------------------
-// PARTIAL MATCHES
-//
-// You can use the "PartialMatch" operation when you want the pattern
-// to match any substring of the text.
-//
-// Example: simple search for a string:
-// CHECK(PCRE::PartialMatch("hello", "ell"));
-//
-// Example: find first number in a string
-// int number;
-// CHECK(PCRE::PartialMatch("x*100 + 20", "(\\d+)", &number));
-// CHECK_EQ(number, 100);
-//
-// -----------------------------------------------------------------------
-// PPCRE-COMPILED PCREGULAR EXPPCRESSIONS
-//
-// PCRE makes it easy to use any string as a regular expression, without
-// requiring a separate compilation step.
-//
-// If speed is of the essence, you can create a pre-compiled "PCRE"
-// object from the pattern and use it multiple times. If you do so,
-// you can typically parse text faster than with sscanf.
-//
-// Example: precompile pattern for faster matching:
-// PCRE pattern("h.*o");
-// while (ReadLine(&str)) {
-// if (PCRE::FullMatch(str, pattern)) ...;
-// }
-//
-// -----------------------------------------------------------------------
-// SCANNING TEXT INCPCREMENTALLY
-//
-// The "Consume" operation may be useful if you want to repeatedly
-// match regular expressions at the front of a string and skip over
-// them as they match. This requires use of the "StringPiece" type,
-// which represents a sub-range of a real string.
-//
-// Example: read lines of the form "var = value" from a string.
-// string contents = ...; // Fill string somehow
-// StringPiece input(contents); // Wrap a StringPiece around it
-//
-// string var;
-// int value;
-// while (PCRE::Consume(&input, "(\\w+) = (\\d+)\n", &var, &value)) {
-// ...;
-// }
-//
-// Each successful call to "Consume" will set "var/value", and also
-// advance "input" so it points past the matched text. Note that if the
-// regular expression matches an empty string, input will advance
-// by 0 bytes. If the regular expression being used might match
-// an empty string, the loop body must check for this case and either
-// advance the string or break out of the loop.
-//
-// The "FindAndConsume" operation is similar to "Consume" but does not
-// anchor your match at the beginning of the string. For example, you
-// could extract all words from a string by repeatedly calling
-// PCRE::FindAndConsume(&input, "(\\w+)", &word)
-//
-// -----------------------------------------------------------------------
-// PARSING HEX/OCTAL/C-RADIX NUMBERS
-//
-// By default, if you pass a pointer to a numeric value, the
-// corresponding text is interpreted as a base-10 number. You can
-// instead wrap the pointer with a call to one of the operators Hex(),
-// Octal(), or CRadix() to interpret the text in another base. The
-// CRadix operator interprets C-style "0" (base-8) and "0x" (base-16)
-// prefixes, but defaults to base-10.
-//
-// Example:
-// int a, b, c, d;
-// CHECK(PCRE::FullMatch("100 40 0100 0x40", "(.*) (.*) (.*) (.*)",
-// Octal(&a), Hex(&b), CRadix(&c), CRadix(&d));
-// will leave 64 in a, b, c, and d.
-
-#include "util/util.h"
-#include "re2/stringpiece.h"
-
-#ifdef USEPCRE
-#include <pcre.h>
-namespace re2 {
-const bool UsingPCRE = true;
-} // namespace re2
-#else
-struct pcre; // opaque
-namespace re2 {
-const bool UsingPCRE = false;
-} // namespace re2
-#endif
-
-namespace re2 {
-
-class PCRE_Options;
-
-// Interface for regular expression matching. Also corresponds to a
-// pre-compiled regular expression. An "PCRE" object is safe for
-// concurrent use by multiple threads.
-class PCRE {
- public:
- // We convert user-passed pointers into special Arg objects
- class Arg;
-
- // Marks end of arg list.
- // ONLY USE IN OPTIONAL ARG DEFAULTS.
- // DO NOT PASS EXPLICITLY.
- static Arg no_more_args;
-
- // Options are same value as those in pcre. We provide them here
- // to avoid users needing to include pcre.h and also to isolate
- // users from pcre should we change the underlying library.
- // Only those needed by Google programs are exposed here to
- // avoid collision with options employed internally by regexp.cc
- // Note that some options have equivalents that can be specified in
- // the regexp itself. For example, prefixing your regexp with
- // "(?s)" has the same effect as the PCRE_DOTALL option.
- enum Option {
- None = 0x0000,
- UTF8 = 0x0800, // == PCRE_UTF8
- EnabledCompileOptions = UTF8,
- EnabledExecOptions = 0x0000, // TODO: use to replace anchor flag
- };
-
- // We provide implicit conversions from strings so that users can
- // pass in a string or a "const char*" wherever an "PCRE" is expected.
- PCRE(const char* pattern);
- PCRE(const char* pattern, Option option);
- PCRE(const string& pattern);
- PCRE(const string& pattern, Option option);
- PCRE(const char *pattern, const PCRE_Options& re_option);
- PCRE(const string& pattern, const PCRE_Options& re_option);
-
- ~PCRE();
-
- // The string specification for this PCRE. E.g.
- // PCRE re("ab*c?d+");
- // re.pattern(); // "ab*c?d+"
- const string& pattern() const { return pattern_; }
-
- // If PCRE could not be created properly, returns an error string.
- // Else returns the empty string.
- const string& error() const { return *error_; }
-
- // Whether the PCRE has hit a match limit during execution.
- // Not thread safe. Intended only for testing.
- // If hitting match limits is a problem,
- // you should be using PCRE2 (re2/re2.h)
- // instead of checking this flag.
- bool HitLimit();
- void ClearHitLimit();
-
- /***** The useful part: the matching interface *****/
-
- // Matches "text" against "pattern". If pointer arguments are
- // supplied, copies matched sub-patterns into them.
- //
- // You can pass in a "const char*" or a "string" for "text".
- // You can pass in a "const char*" or a "string" or a "PCRE" for "pattern".
- //
- // The provided pointer arguments can be pointers to any scalar numeric
- // type, or one of:
- // string (matched piece is copied to string)
- // StringPiece (StringPiece is mutated to point to matched piece)
- // T (where "bool T::ParseFrom(const char*, int)" exists)
- // (void*)NULL (the corresponding matched sub-pattern is not copied)
- //
- // Returns true iff all of the following conditions are satisfied:
- // a. "text" matches "pattern" exactly
- // b. The number of matched sub-patterns is >= number of supplied pointers
- // c. The "i"th argument has a suitable type for holding the
- // string captured as the "i"th sub-pattern. If you pass in
- // NULL for the "i"th argument, or pass fewer arguments than
- // number of sub-patterns, "i"th captured sub-pattern is
- // ignored.
- //
- // CAVEAT: An optional sub-pattern that does not exist in the
- // matched string is assigned the empty string. Therefore, the
- // following will return false (because the empty string is not a
- // valid number):
- // int number;
- // PCRE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
- struct FullMatchFunctor {
- bool operator ()(const StringPiece& text, const PCRE& re, // 3..16 args
- const Arg& ptr1 = no_more_args,
- const Arg& ptr2 = no_more_args,
- const Arg& ptr3 = no_more_args,
- const Arg& ptr4 = no_more_args,
- const Arg& ptr5 = no_more_args,
- const Arg& ptr6 = no_more_args,
- const Arg& ptr7 = no_more_args,
- const Arg& ptr8 = no_more_args,
- const Arg& ptr9 = no_more_args,
- const Arg& ptr10 = no_more_args,
- const Arg& ptr11 = no_more_args,
- const Arg& ptr12 = no_more_args,
- const Arg& ptr13 = no_more_args,
- const Arg& ptr14 = no_more_args,
- const Arg& ptr15 = no_more_args,
- const Arg& ptr16 = no_more_args) const;
- };
-
- static const FullMatchFunctor FullMatch;
-
- // Exactly like FullMatch(), except that "pattern" is allowed to match
- // a substring of "text".
- struct PartialMatchFunctor {
- bool operator ()(const StringPiece& text, const PCRE& re, // 3..16 args
- const Arg& ptr1 = no_more_args,
- const Arg& ptr2 = no_more_args,
- const Arg& ptr3 = no_more_args,
- const Arg& ptr4 = no_more_args,
- const Arg& ptr5 = no_more_args,
- const Arg& ptr6 = no_more_args,
- const Arg& ptr7 = no_more_args,
- const Arg& ptr8 = no_more_args,
- const Arg& ptr9 = no_more_args,
- const Arg& ptr10 = no_more_args,
- const Arg& ptr11 = no_more_args,
- const Arg& ptr12 = no_more_args,
- const Arg& ptr13 = no_more_args,
- const Arg& ptr14 = no_more_args,
- const Arg& ptr15 = no_more_args,
- const Arg& ptr16 = no_more_args) const;
- };
-
- static const PartialMatchFunctor PartialMatch;
-
- // Like FullMatch() and PartialMatch(), except that pattern has to
- // match a prefix of "text", and "input" is advanced past the matched
- // text. Note: "input" is modified iff this routine returns true.
- struct ConsumeFunctor {
- bool operator ()(StringPiece* input, const PCRE& pattern, // 3..16 args
- const Arg& ptr1 = no_more_args,
- const Arg& ptr2 = no_more_args,
- const Arg& ptr3 = no_more_args,
- const Arg& ptr4 = no_more_args,
- const Arg& ptr5 = no_more_args,
- const Arg& ptr6 = no_more_args,
- const Arg& ptr7 = no_more_args,
- const Arg& ptr8 = no_more_args,
- const Arg& ptr9 = no_more_args,
- const Arg& ptr10 = no_more_args,
- const Arg& ptr11 = no_more_args,
- const Arg& ptr12 = no_more_args,
- const Arg& ptr13 = no_more_args,
- const Arg& ptr14 = no_more_args,
- const Arg& ptr15 = no_more_args,
- const Arg& ptr16 = no_more_args) const;
- };
-
- static const ConsumeFunctor Consume;
-
- // Like Consume(..), but does not anchor the match at the beginning of the
- // string. That is, "pattern" need not start its match at the beginning of
- // "input". For example, "FindAndConsume(s, "(\\w+)", &word)" finds the next
- // word in "s" and stores it in "word".
- struct FindAndConsumeFunctor {
- bool operator ()(StringPiece* input, const PCRE& pattern,
- const Arg& ptr1 = no_more_args,
- const Arg& ptr2 = no_more_args,
- const Arg& ptr3 = no_more_args,
- const Arg& ptr4 = no_more_args,
- const Arg& ptr5 = no_more_args,
- const Arg& ptr6 = no_more_args,
- const Arg& ptr7 = no_more_args,
- const Arg& ptr8 = no_more_args,
- const Arg& ptr9 = no_more_args,
- const Arg& ptr10 = no_more_args,
- const Arg& ptr11 = no_more_args,
- const Arg& ptr12 = no_more_args,
- const Arg& ptr13 = no_more_args,
- const Arg& ptr14 = no_more_args,
- const Arg& ptr15 = no_more_args,
- const Arg& ptr16 = no_more_args) const;
- };
-
- static const FindAndConsumeFunctor FindAndConsume;
-
- // Replace the first match of "pattern" in "str" with "rewrite".
- // Within "rewrite", backslash-escaped digits (\1 to \9) can be
- // used to insert text matching corresponding parenthesized group
- // from the pattern. \0 in "rewrite" refers to the entire matching
- // text. E.g.,
- //
- // string s = "yabba dabba doo";
- // CHECK(PCRE::Replace(&s, "b+", "d"));
- //
- // will leave "s" containing "yada dabba doo"
- //
- // Returns true if the pattern matches and a replacement occurs,
- // false otherwise.
- static bool Replace(string *str,
- const PCRE& pattern,
- const StringPiece& rewrite);
-
- // Like Replace(), except replaces all occurrences of the pattern in
- // the string with the rewrite. Replacements are not subject to
- // re-matching. E.g.,
- //
- // string s = "yabba dabba doo";
- // CHECK(PCRE::GlobalReplace(&s, "b+", "d"));
- //
- // will leave "s" containing "yada dada doo"
- //
- // Returns the number of replacements made.
- static int GlobalReplace(string *str,
- const PCRE& pattern,
- const StringPiece& rewrite);
-
- // Like Replace, except that if the pattern matches, "rewrite"
- // is copied into "out" with substitutions. The non-matching
- // portions of "text" are ignored.
- //
- // Returns true iff a match occurred and the extraction happened
- // successfully; if no match occurs, the string is left unaffected.
- static bool Extract(const StringPiece &text,
- const PCRE& pattern,
- const StringPiece &rewrite,
- string *out);
-
- // Check that the given @p rewrite string is suitable for use with
- // this PCRE. It checks that:
- // * The PCRE has enough parenthesized subexpressions to satisfy all
- // of the \N tokens in @p rewrite, and
- // * The @p rewrite string doesn't have any syntax errors
- // ('\' followed by anything besides [0-9] and '\').
- // Making this test will guarantee that "replace" and "extract"
- // operations won't LOG(ERROR) or fail because of a bad rewrite
- // string.
- // @param rewrite The proposed rewrite string.
- // @param error An error message is recorded here, iff we return false.
- // Otherwise, it is unchanged.
- // @return true, iff @p rewrite is suitable for use with the PCRE.
- bool CheckRewriteString(const StringPiece& rewrite, string* error) const;
-
- // Returns a copy of 'unquoted' with all potentially meaningful
- // regexp characters backslash-escaped. The returned string, used
- // as a regular expression, will exactly match the original string.
- // For example,
- // 1.5-2.0?
- // becomes:
- // 1\.5\-2\.0\?
- static string QuoteMeta(const StringPiece& unquoted);
-
- /***** Generic matching interface (not so nice to use) *****/
-
- // Type of match (TODO: Should be restructured as an Option)
- enum Anchor {
- UNANCHORED, // No anchoring
- ANCHOR_START, // Anchor at start only
- ANCHOR_BOTH, // Anchor at start and end
- };
-
- // General matching routine. Stores the length of the match in
- // "*consumed" if successful.
- bool DoMatch(const StringPiece& text,
- Anchor anchor,
- int* consumed,
- const Arg* const* args, int n) const;
-
- // Return the number of capturing subpatterns, or -1 if the
- // regexp wasn't valid on construction.
- int NumberOfCapturingGroups() const;
-
- private:
- void Init(const char* pattern, Option option, int match_limit,
- int stack_limit, bool report_errors);
-
- // Match against "text", filling in "vec" (up to "vecsize" * 2/3) with
- // pairs of integers for the beginning and end positions of matched
- // text. The first pair corresponds to the entire matched text;
- // subsequent pairs correspond, in order, to parentheses-captured
- // matches. Returns the number of pairs (one more than the number of
- // the last subpattern with a match) if matching was successful
- // and zero if the match failed.
- // I.e. for PCRE("(foo)|(bar)|(baz)") it will return 2, 3, and 4 when matching
- // against "foo", "bar", and "baz" respectively.
- // When matching PCRE("(foo)|hello") against "hello", it will return 1.
- // But the values for all subpattern are filled in into "vec".
- int TryMatch(const StringPiece& text,
- int startpos,
- Anchor anchor,
- bool empty_ok,
- int *vec,
- int vecsize) const;
-
- // Append the "rewrite" string, with backslash subsitutions from "text"
- // and "vec", to string "out".
- bool Rewrite(string *out,
- const StringPiece &rewrite,
- const StringPiece &text,
- int *vec,
- int veclen) const;
-
- // internal implementation for DoMatch
- bool DoMatchImpl(const StringPiece& text,
- Anchor anchor,
- int* consumed,
- const Arg* const args[],
- int n,
- int* vec,
- int vecsize) const;
-
- // Compile the regexp for the specified anchoring mode
- pcre* Compile(Anchor anchor);
-
- string pattern_;
- Option options_;
- pcre* re_full_; // For full matches
- pcre* re_partial_; // For partial matches
- const string* error_; // Error indicator (or empty string)
- bool report_errors_; // Silences error logging if false
- int match_limit_; // Limit on execution resources
- int stack_limit_; // Limit on stack resources (bytes)
- mutable int32_t hit_limit_; // Hit limit during execution (bool)?
- DISALLOW_COPY_AND_ASSIGN(PCRE);
-};
-
-// PCRE_Options allow you to set the PCRE::Options, plus any pcre
-// "extra" options. The only extras are match_limit, which limits
-// the CPU time of a match, and stack_limit, which limits the
-// stack usage. Setting a limit to <= 0 lets PCRE pick a sensible default
-// that should not cause too many problems in production code.
-// If PCRE hits a limit during a match, it may return a false negative,
-// but (hopefully) it won't crash.
-//
-// NOTE: If you are handling regular expressions specified by
-// (external or internal) users, rather than hard-coded ones,
-// you should be using PCRE2, which uses an alternate implementation
-// that avoids these issues. See http://go/re2quick.
-class PCRE_Options {
- public:
- // constructor
- PCRE_Options() : option_(PCRE::None), match_limit_(0), stack_limit_(0), report_errors_(true) {}
- // accessors
- PCRE::Option option() const { return option_; }
- void set_option(PCRE::Option option) {
- option_ = option;
- }
- int match_limit() const { return match_limit_; }
- void set_match_limit(int match_limit) {
- match_limit_ = match_limit;
- }
- int stack_limit() const { return stack_limit_; }
- void set_stack_limit(int stack_limit) {
- stack_limit_ = stack_limit;
- }
-
- // If the regular expression is malformed, an error message will be printed
- // iff report_errors() is true. Default: true.
- bool report_errors() const { return report_errors_; }
- void set_report_errors(bool report_errors) {
- report_errors_ = report_errors;
- }
- private:
- PCRE::Option option_;
- int match_limit_;
- int stack_limit_;
- bool report_errors_;
-};
-
-
-/***** Implementation details *****/
-
-// Hex/Octal/Binary?
-
-// Special class for parsing into objects that define a ParseFrom() method
-template <class T>
-class _PCRE_MatchObject {
- public:
- static inline bool Parse(const char* str, int n, void* dest) {
- if (dest == NULL) return true;
- T* object = reinterpret_cast<T*>(dest);
- return object->ParseFrom(str, n);
- }
-};
-
-class PCRE::Arg {
- public:
- // Empty constructor so we can declare arrays of PCRE::Arg
- Arg();
-
- // Constructor specially designed for NULL arguments
- Arg(void*);
-
- typedef bool (*Parser)(const char* str, int n, void* dest);
-
-// Type-specific parsers
-#define MAKE_PARSER(type,name) \
- Arg(type* p) : arg_(p), parser_(name) { } \
- Arg(type* p, Parser parser) : arg_(p), parser_(parser) { } \
-
-
- MAKE_PARSER(char, parse_char);
- MAKE_PARSER(unsigned char, parse_uchar);
- MAKE_PARSER(short, parse_short);
- MAKE_PARSER(unsigned short, parse_ushort);
- MAKE_PARSER(int, parse_int);
- MAKE_PARSER(unsigned int, parse_uint);
- MAKE_PARSER(long, parse_long);
- MAKE_PARSER(unsigned long, parse_ulong);
- MAKE_PARSER(long long, parse_longlong);
- MAKE_PARSER(unsigned long long, parse_ulonglong);
- MAKE_PARSER(float, parse_float);
- MAKE_PARSER(double, parse_double);
- MAKE_PARSER(string, parse_string);
- MAKE_PARSER(StringPiece, parse_stringpiece);
-
-#undef MAKE_PARSER
-
- // Generic constructor
- template <class T> Arg(T*, Parser parser);
- // Generic constructor template
- template <class T> Arg(T* p)
- : arg_(p), parser_(_PCRE_MatchObject<T>::Parse) {
- }
-
- // Parse the data
- bool Parse(const char* str, int n) const;
-
- private:
- void* arg_;
- Parser parser_;
-
- static bool parse_null (const char* str, int n, void* dest);
- static bool parse_char (const char* str, int n, void* dest);
- static bool parse_uchar (const char* str, int n, void* dest);
- static bool parse_float (const char* str, int n, void* dest);
- static bool parse_double (const char* str, int n, void* dest);
- static bool parse_string (const char* str, int n, void* dest);
- static bool parse_stringpiece (const char* str, int n, void* dest);
-
-#define DECLARE_INTEGER_PARSER(name) \
- private: \
- static bool parse_ ## name(const char* str, int n, void* dest); \
- static bool parse_ ## name ## _radix( \
- const char* str, int n, void* dest, int radix); \
- public: \
- static bool parse_ ## name ## _hex(const char* str, int n, void* dest); \
- static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \
- static bool parse_ ## name ## _cradix(const char* str, int n, void* dest)
-
- DECLARE_INTEGER_PARSER(short);
- DECLARE_INTEGER_PARSER(ushort);
- DECLARE_INTEGER_PARSER(int);
- DECLARE_INTEGER_PARSER(uint);
- DECLARE_INTEGER_PARSER(long);
- DECLARE_INTEGER_PARSER(ulong);
- DECLARE_INTEGER_PARSER(longlong);
- DECLARE_INTEGER_PARSER(ulonglong);
-
-#undef DECLARE_INTEGER_PARSER
-};
-
-inline PCRE::Arg::Arg() : arg_(NULL), parser_(parse_null) { }
-inline PCRE::Arg::Arg(void* p) : arg_(p), parser_(parse_null) { }
-
-inline bool PCRE::Arg::Parse(const char* str, int n) const {
- return (*parser_)(str, n, arg_);
-}
-
-// This part of the parser, appropriate only for ints, deals with bases
-#define MAKE_INTEGER_PARSER(type, name) \
- inline PCRE::Arg Hex(type* ptr) { \
- return PCRE::Arg(ptr, PCRE::Arg::parse_ ## name ## _hex); } \
- inline PCRE::Arg Octal(type* ptr) { \
- return PCRE::Arg(ptr, PCRE::Arg::parse_ ## name ## _octal); } \
- inline PCRE::Arg CRadix(type* ptr) { \
- return PCRE::Arg(ptr, PCRE::Arg::parse_ ## name ## _cradix); }
-
-MAKE_INTEGER_PARSER(short, short);
-MAKE_INTEGER_PARSER(unsigned short, ushort);
-MAKE_INTEGER_PARSER(int, int);
-MAKE_INTEGER_PARSER(unsigned int, uint);
-MAKE_INTEGER_PARSER(long, long);
-MAKE_INTEGER_PARSER(unsigned long, ulong);
-MAKE_INTEGER_PARSER(long long, longlong);
-MAKE_INTEGER_PARSER(unsigned long long, ulonglong);
-
-#undef MAKE_INTEGER_PARSER
-
-} // namespace re2
« no previous file with comments | « third_party/re2/util/mutex.h ('k') | third_party/re2/util/pcre.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698