diff --git a/AUTHORS b/AUTHORS index 3c0f928..e17d9bf 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,5 +8,6 @@ # Please keep the list sorted. +Brian Gunlogson <unixman83@gmail.com> Google Inc. Stefano Rivera <stefano.rivera@gmail.com> diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 7b44e04..7f6a93d 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -26,6 +26,7 @@ # Please keep the list sorted. +Brian Gunlogson <unixman83@gmail.com> Dominic Battré <battre@chromium.org> John Millikin <jmillikin@gmail.com> Rob Pike <r@google.com> diff --git a/re2/compile.cc b/re2/compile.cc index 9cddb71..adb45fd 100644 --- a/re2/compile.cc +++ b/re2/compile.cc @@ -502,7 +502,7 @@ int Compiler::RuneByteSuffix(uint8 lo, uint8 hi, bool foldcase, int next) { return UncachedRuneByteSuffix(lo, hi, foldcase, next); } - uint64 key = ((uint64)next << 17) | (lo<<9) | (hi<<1) | foldcase; + uint64 key = ((uint64)next << 17) | (lo<<9) | (hi<<1) | (foldcase ? 1ULL : 0ULL); map<uint64, int>::iterator it = rune_cache_.find(key); if (it != rune_cache_.end()) return it->second; diff --git a/re2/prefilter_tree.cc b/re2/prefilter_tree.cc index d8bc37a..cdcf77e 100644 --- a/re2/prefilter_tree.cc +++ b/re2/prefilter_tree.cc @@ -8,6 +8,11 @@ #include "re2/prefilter_tree.h" #include "re2/re2.h" +#ifdef WIN32 +#include <stdio.h> +#define snprintf _snprintf +#endif + DEFINE_int32(filtered_re2_min_atom_len, 3, "Strings less than this length are not stored as atoms"); diff --git a/re2/re2.cc b/re2/re2.cc index 8d1d468..0da886d 100644 --- a/re2/re2.cc +++ b/re2/re2.cc @@ -11,7 +11,13 @@ #include <stdio.h> #include <string> +#ifdef WIN32 +#define strtoll _strtoi64 +#define strtoull _strtoui64 +#define strtof strtod +#else #include <pthread.h> +#endif #include <errno.h> #include "util/util.h" #include "util/flags.h" @@ -31,10 +37,22 @@ const VariadicFunction2<bool, const StringPiece&, const RE2&, RE2::Arg, RE2::Par const VariadicFunction2<bool, StringPiece*, const RE2&, RE2::Arg, RE2::ConsumeN> RE2::Consume; const VariadicFunction2<bool, StringPiece*, const RE2&, RE2::Arg, RE2::FindAndConsumeN> RE2::FindAndConsume; -// This will trigger LNK2005 error in MSVC. -#ifndef COMPILER_MSVC -const int RE2::Options::kDefaultMaxMem; // initialized in re2.h -#endif // COMPILER_MSVC +#define kDefaultMaxMem (8<<20) + +RE2::Options::Options() + : encoding_(EncodingUTF8), + posix_syntax_(false), + longest_match_(false), + log_errors_(true), + max_mem_(kDefaultMaxMem), + literal_(false), + never_nl_(false), + never_capture_(false), + case_sensitive_(true), + perl_classes_(false), + word_boundary_(false), + one_line_(false) { +} RE2::Options::Options(RE2::CannedOptions opt) : encoding_(opt == RE2::Latin1 ? EncodingLatin1 : EncodingUTF8), diff --git a/re2/re2.h b/re2/re2.h index 272028b..c509853 100644 --- a/re2/re2.h +++ b/re2/re2.h @@ -552,28 +552,16 @@ class RE2 { // If this happens too often, RE2 falls back on the NFA implementation. // For now, make the default budget something close to Code Search. +#ifndef WIN32 static const int kDefaultMaxMem = 8<<20; +#endif enum Encoding { EncodingUTF8 = 1, EncodingLatin1 }; - Options() : - encoding_(EncodingUTF8), - posix_syntax_(false), - longest_match_(false), - log_errors_(true), - max_mem_(kDefaultMaxMem), - literal_(false), - never_nl_(false), - never_capture_(false), - case_sensitive_(true), - perl_classes_(false), - word_boundary_(false), - one_line_(false) { - } - + Options(); /*implicit*/ Options(CannedOptions); Encoding encoding() const { return encoding_; } diff --git a/re2/stringpiece.h b/re2/stringpiece.h index ab9297c..38a5150 100644 --- a/re2/stringpiece.h +++ b/re2/stringpiece.h @@ -23,6 +23,9 @@ #include <cstddef> #include <iosfwd> #include <string> +#ifdef WIN32 +#include <algorithm> +#endif namespace re2 { diff --git a/re2/testing/re2_test.cc b/re2/testing/re2_test.cc index b99cacf..911e868 100644 --- a/re2/testing/re2_test.cc +++ b/re2/testing/re2_test.cc @@ -6,7 +6,9 @@ // TODO: Test extractions for PartialMatch/Consume #include <sys/types.h> +#ifndef WIN32 #include <sys/mman.h> +#endif #include <sys/stat.h> #include <errno.h> #include <vector> @@ -14,6 +16,11 @@ #include "re2/re2.h" #include "re2/regexp.h" +#ifdef WIN32 +#include <stdio.h> +#define snprintf _snprintf +#endif + DECLARE_bool(logtostderr); namespace re2 { @@ -657,6 +664,7 @@ TEST(RE2, FullMatchTypedNullArg) { CHECK(!RE2::FullMatch("hello", "(.*)", (float*)NULL)); } +#ifndef WIN32 // Check that numeric parsing code does not read past the end of // the number being parsed. TEST(RE2, NULTerminated) { @@ -678,6 +686,7 @@ TEST(RE2, NULTerminated) { CHECK(RE2::FullMatch(StringPiece(v + pagesize - 1, 1), "(.*)", &x)); CHECK_EQ(x, 1); } +#endif TEST(RE2, FullMatchTypeTests) { // Type tests diff --git a/util/logging.h b/util/logging.h index 4443f7c..d0a2d87 100644 --- a/util/logging.h +++ b/util/logging.h @@ -7,8 +7,13 @@ #ifndef RE2_UTIL_LOGGING_H__ #define RE2_UTIL_LOGGING_H__ +#ifndef WIN32 #include <unistd.h> /* for write */ +#endif #include <sstream> +#ifdef WIN32 +#include <io.h> +#endif // Debug-only checking. #define DCHECK(condition) assert(condition) diff --git a/util/mutex.h b/util/mutex.h index 9787bfb..e321fae 100644 --- a/util/mutex.h +++ b/util/mutex.h @@ -12,8 +12,10 @@ namespace re2 { +#ifndef WIN32 #define HAVE_PTHREAD 1 #define HAVE_RWLOCK 1 +#endif #if defined(NO_THREADS) typedef int MutexType; // to keep a lock-count @@ -32,7 +34,9 @@ namespace re2 { # include <pthread.h> typedef pthread_mutex_t MutexType; #elif defined(WIN32) -# define WIN32_LEAN_AND_MEAN // We only need minimal includes +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN // We only need minimal includes +# endif # ifdef GMUTEX_TRYLOCK // We need Windows NT or later for TryEnterCriticalSection(). If you // don't need that functionality, you can remove these _WIN32_WINNT diff --git a/util/pcre.cc b/util/pcre.cc index 5e67e1f..1602133 100644 --- a/util/pcre.cc +++ b/util/pcre.cc @@ -11,6 +11,11 @@ #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. diff --git a/util/pcre.h b/util/pcre.h index 4dda95d..771ac91 100644 --- a/util/pcre.h +++ b/util/pcre.h @@ -180,9 +180,15 @@ struct pcre_extra { int flags, match_limit, match_limit_recursion; }; #define PCRE_ERROR_MATCHLIMIT 2 #define PCRE_ERROR_RECURSIONLIMIT 3 #define PCRE_INFO_CAPTURECOUNT 0 +#ifndef WIN32 #define pcre_compile(a,b,c,d,e) ({ (void)(a); (void)(b); *(c)=""; *(d)=0; (void)(e); ((pcre*)0); }) #define pcre_exec(a, b, c, d, e, f, g, h) ({ (void)(a); (void)(b); (void)(c); (void)(d); (void)(e); (void)(f); (void)(g); (void)(h); 0; }) #define pcre_fullinfo(a, b, c, d) ({ (void)(a); (void)(b); (void)(c); *(d) = 0; 0; }) +#else +#define pcre_compile(a,b,c,d,e) NULL +#define pcre_exec(a, b, c, d, e, f, g, h) NULL +#define pcre_fullinfo(a, b, c, d) NULL +#endif } // namespace re2 #endif diff --git a/util/test.cc b/util/test.cc index 0644829..2fe1bfa 100644 --- a/util/test.cc +++ b/util/test.cc @@ -3,7 +3,9 @@ // license that can be found in the LICENSE file. #include <stdio.h> +#ifndef WIN32 #include <sys/resource.h> +#endif #include "util/test.h" DEFINE_string(test_tmpdir, "/var/tmp", "temp directory"); @@ -23,9 +25,13 @@ void RegisterTest(void (*fn)(void), const char *name) { namespace re2 { int64 VirtualProcessSize() { +#ifndef WIN32 struct rusage ru; getrusage(RUSAGE_SELF, &ru); return (int64)ru.ru_maxrss*1024; +#else + return 0; +#endif } } // namespace re2 diff --git a/util/util.h b/util/util.h index c46ab1b..17ef824 100644 --- a/util/util.h +++ b/util/util.h @@ -12,7 +12,9 @@ #include <stddef.h> // For size_t #include <assert.h> #include <stdarg.h> +#ifndef WIN32 #include <sys/time.h> +#endif #include <time.h> #include <ctype.h> // For isdigit, isalpha. @@ -51,7 +53,11 @@ using std::tr1::unordered_set; #else #include <unordered_set> +#ifdef WIN32 +using std::tr1::unordered_set; +#else using std::unordered_set; +#endif #endif diff --git a/util/valgrind.h b/util/valgrind.h index ca10b1a..d097b0c 100644 --- a/util/valgrind.h +++ b/util/valgrind.h @@ -4064,6 +4064,7 @@ typedef #endif /* PLAT_ppc64_aix5 */ +#ifndef WIN32 /* ------------------------------------------------------------------ */ /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ /* */ @@ -4170,7 +4171,7 @@ typedef VG_USERREQ__DISCARD_TRANSLATIONS, \ _qzz_addr, _qzz_len, 0, 0, 0); \ } - +#endif /* These requests are for getting Valgrind itself to print something. Possibly with a backtrace. This is a really ugly hack. The return value