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; |
} |