| Index: third_party/re2/util/pcre.cc
|
| diff --git a/third_party/re2/util/pcre.cc b/third_party/re2/util/pcre.cc
|
| index 160213335ea12f3f46e85604d8efd053afd7d3f6..9a3f32d25a370d65193e4f0a68e6de106903a9d9 100644
|
| --- a/third_party/re2/util/pcre.cc
|
| +++ b/third_party/re2/util/pcre.cc
|
| @@ -7,15 +7,11 @@
|
| // compilation as PCRE in namespace re2.
|
|
|
| #include <errno.h>
|
| +#include <limits>
|
| #include "util/util.h"
|
| #include "util/flags.h"
|
| #include "util/pcre.h"
|
|
|
| -#ifdef WIN32
|
| -#define strtoll _strtoi64
|
| -#define strtoull _strtoui64
|
| -#endif
|
| -
|
| #define PCREPORT(level) LOG(level)
|
|
|
| // Default PCRE limits.
|
| @@ -27,6 +23,42 @@ DEFINE_int32(regexp_stack_limit, 256<<10, "default PCRE stack limit (bytes)");
|
| DEFINE_int32(regexp_match_limit, 1000000,
|
| "default PCRE match limit (function calls)");
|
|
|
| +#ifndef USEPCRE
|
| +
|
| +// Fake just enough of the PCRE API to allow this file to build. :)
|
| +
|
| +struct pcre_extra {
|
| + int flags;
|
| + int match_limit;
|
| + int match_limit_recursion;
|
| +};
|
| +
|
| +#define PCRE_EXTRA_MATCH_LIMIT 0
|
| +#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0
|
| +#define PCRE_ANCHORED 0
|
| +#define PCRE_NOTEMPTY 0
|
| +#define PCRE_ERROR_NOMATCH 1
|
| +#define PCRE_ERROR_MATCHLIMIT 2
|
| +#define PCRE_ERROR_RECURSIONLIMIT 3
|
| +#define PCRE_INFO_CAPTURECOUNT 0
|
| +
|
| +void pcre_free(void*) {
|
| +}
|
| +
|
| +pcre* pcre_compile(const char*, int, const char**, int*, const unsigned char*) {
|
| + return NULL;
|
| +}
|
| +
|
| +int pcre_exec(const pcre*, const pcre_extra*, const char*, int, int, int, int*, int) {
|
| + return 0;
|
| +}
|
| +
|
| +int pcre_fullinfo(const pcre*, const pcre_extra*, int, void*) {
|
| + return 0;
|
| +}
|
| +
|
| +#endif
|
| +
|
| namespace re2 {
|
|
|
| // Maximum number of args we can set
|
| @@ -118,7 +150,7 @@ pcre* PCRE::Compile(Anchor anchor) {
|
| // ANCHOR_BOTH Tack a "\z" to the end of the original pattern
|
| // and use a pcre anchored match.
|
|
|
| - const char* error;
|
| + const char* error = "";
|
| int eoffset;
|
| pcre* re;
|
| if (anchor != ANCHOR_BOTH) {
|
| @@ -183,7 +215,7 @@ bool PCRE::FullMatchFunctor::operator ()(const StringPiece& text,
|
| done:
|
|
|
| int consumed;
|
| - int vec[kVecSize];
|
| + int vec[kVecSize] = {};
|
| return re.DoMatchImpl(text, ANCHOR_BOTH, &consumed, args, n, vec, kVecSize);
|
| }
|
|
|
| @@ -226,7 +258,7 @@ bool PCRE::PartialMatchFunctor::operator ()(const StringPiece& text,
|
| done:
|
|
|
| int consumed;
|
| - int vec[kVecSize];
|
| + int vec[kVecSize] = {};
|
| return re.DoMatchImpl(text, UNANCHORED, &consumed, args, n, vec, kVecSize);
|
| }
|
|
|
| @@ -269,7 +301,7 @@ bool PCRE::ConsumeFunctor::operator ()(StringPiece* input,
|
| done:
|
|
|
| int consumed;
|
| - int vec[kVecSize];
|
| + int vec[kVecSize] = {};
|
| if (pattern.DoMatchImpl(*input, ANCHOR_START, &consumed,
|
| args, n, vec, kVecSize)) {
|
| input->remove_prefix(consumed);
|
| @@ -318,7 +350,7 @@ bool PCRE::FindAndConsumeFunctor::operator ()(StringPiece* input,
|
| done:
|
|
|
| int consumed;
|
| - int vec[kVecSize];
|
| + int vec[kVecSize] = {};
|
| if (pattern.DoMatchImpl(*input, UNANCHORED, &consumed,
|
| args, n, vec, kVecSize)) {
|
| input->remove_prefix(consumed);
|
| @@ -331,7 +363,7 @@ done:
|
| bool PCRE::Replace(string *str,
|
| const PCRE& pattern,
|
| const StringPiece& rewrite) {
|
| - int vec[kVecSize];
|
| + int vec[kVecSize] = {};
|
| int matches = pattern.TryMatch(*str, 0, UNANCHORED, true, vec, kVecSize);
|
| if (matches == 0)
|
| return false;
|
| @@ -350,12 +382,12 @@ int PCRE::GlobalReplace(string *str,
|
| const PCRE& pattern,
|
| const StringPiece& rewrite) {
|
| int count = 0;
|
| - int vec[kVecSize];
|
| + int vec[kVecSize] = {};
|
| string out;
|
| int start = 0;
|
| bool last_match_was_empty_string = false;
|
|
|
| - for (; start <= str->length();) {
|
| + while (start <= static_cast<int>(str->size())) {
|
| // If the previous match was for the empty string, we shouldn't
|
| // just match again: we'll match in the same way and get an
|
| // infinite loop. Instead, we do the match in a special way:
|
| @@ -371,14 +403,15 @@ int PCRE::GlobalReplace(string *str,
|
| matches = pattern.TryMatch(*str, start, ANCHOR_START, false,
|
| vec, kVecSize);
|
| if (matches <= 0) {
|
| - if (start < str->length())
|
| + if (start < static_cast<int>(str->size()))
|
| out.push_back((*str)[start]);
|
| start++;
|
| last_match_was_empty_string = false;
|
| continue;
|
| }
|
| } else {
|
| - matches = pattern.TryMatch(*str, start, UNANCHORED, true, vec, kVecSize);
|
| + matches = pattern.TryMatch(*str, start, UNANCHORED, true,
|
| + vec, kVecSize);
|
| if (matches <= 0)
|
| break;
|
| }
|
| @@ -396,8 +429,8 @@ int PCRE::GlobalReplace(string *str,
|
| if (count == 0)
|
| return 0;
|
|
|
| - if (start < str->length())
|
| - out.append(*str, start, str->length() - start);
|
| + if (start < static_cast<int>(str->size()))
|
| + out.append(*str, start, static_cast<int>(str->size()) - start);
|
| swap(out, *str);
|
| return count;
|
| }
|
| @@ -406,7 +439,7 @@ bool PCRE::Extract(const StringPiece &text,
|
| const PCRE& pattern,
|
| const StringPiece &rewrite,
|
| string *out) {
|
| - int vec[kVecSize];
|
| + int vec[kVecSize] = {};
|
| int matches = pattern.TryMatch(text, 0, UNANCHORED, true, vec, kVecSize);
|
| if (matches == 0)
|
| return false;
|
| @@ -452,7 +485,7 @@ string PCRE::QuoteMeta(const StringPiece& unquoted) {
|
| /***** Actual matching and rewriting code *****/
|
|
|
| bool PCRE::HitLimit() {
|
| - return hit_limit_;
|
| + return hit_limit_ != 0;
|
| }
|
|
|
| void PCRE::ClearHitLimit() {
|
| @@ -600,9 +633,9 @@ bool PCRE::DoMatch(const StringPiece& text,
|
| const Arg* const args[],
|
| int n) const {
|
| assert(n >= 0);
|
| - size_t const vecsize = (1 + n) * 3; // results + PCRE workspace
|
| - // (as for kVecSize)
|
| - int *vec = new int[vecsize];
|
| + const int vecsize = (1 + n) * 3; // results + PCRE workspace
|
| + // (as for kVecSize)
|
| + int* vec = new int[vecsize];
|
| bool b = DoMatchImpl(text, anchor, consumed, args, n, vec, vecsize);
|
| delete[] vec;
|
| return b;
|
| @@ -808,7 +841,7 @@ bool PCRE::Arg::parse_short_radix(const char* str,
|
| if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
|
| if ((short)r != r) return false; // Out of range
|
| if (dest == NULL) return true;
|
| - *(reinterpret_cast<short*>(dest)) = r;
|
| + *(reinterpret_cast<short*>(dest)) = (short)r;
|
| return true;
|
| }
|
|
|
| @@ -820,7 +853,7 @@ bool PCRE::Arg::parse_ushort_radix(const char* str,
|
| if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
|
| if ((ushort)r != r) return false; // Out of range
|
| if (dest == NULL) return true;
|
| - *(reinterpret_cast<unsigned short*>(dest)) = r;
|
| + *(reinterpret_cast<unsigned short*>(dest)) = (ushort)r;
|
| return true;
|
| }
|
|
|
| @@ -898,7 +931,7 @@ bool PCRE::Arg::parse_double(const char* str, int n, void* dest) {
|
| char* end;
|
| double r = strtod(buf, &end);
|
| if (end != buf + n) {
|
| -#ifdef COMPILER_MSVC
|
| +#ifdef _WIN32
|
| // Microsoft's strtod() doesn't handle inf and nan, so we have to
|
| // handle it explicitly. Speed is not important here because this
|
| // code is only called in unit tests.
|
| @@ -911,11 +944,11 @@ bool PCRE::Arg::parse_double(const char* str, int n, void* dest) {
|
| ++i;
|
| }
|
| if (0 == stricmp(i, "inf") || 0 == stricmp(i, "infinity")) {
|
| - r = numeric_limits<double>::infinity();
|
| + r = std::numeric_limits<double>::infinity();
|
| if (!pos)
|
| r = -r;
|
| } else if (0 == stricmp(i, "nan")) {
|
| - r = numeric_limits<double>::quiet_NaN();
|
| + r = std::numeric_limits<double>::quiet_NaN();
|
| } else {
|
| return false;
|
| }
|
|
|