1 diff --git a/AUTHORS b/AUTHORS 2 index 3c0f928..e17d9bf 100644 3 --- a/AUTHORS 4 +++ b/AUTHORS 5 @@ -8,5 +8,6 @@ 6 7 # Please keep the list sorted. 8 9 +Brian Gunlogson <unixman83 (a] gmail.com> 10 Google Inc. 11 Stefano Rivera <stefano.rivera (a] gmail.com> 12 diff --git a/CONTRIBUTORS b/CONTRIBUTORS 13 index 7b44e04..7f6a93d 100644 14 --- a/CONTRIBUTORS 15 +++ b/CONTRIBUTORS 16 @@ -26,6 +26,7 @@ 17 18 # Please keep the list sorted. 19 20 +Brian Gunlogson <unixman83 (a] gmail.com> 21 Dominic Battr <battre (a] chromium.org> 22 John Millikin <jmillikin (a] gmail.com> 23 Rob Pike <r (a] google.com> 24 diff --git a/re2/compile.cc b/re2/compile.cc 25 index 9cddb71..adb45fd 100644 26 --- a/re2/compile.cc 27 +++ b/re2/compile.cc 28 @@ -502,7 +502,7 @@ int Compiler::RuneByteSuffix(uint8 lo, uint8 hi, bool foldcase, int next) { 29 return UncachedRuneByteSuffix(lo, hi, foldcase, next); 30 } 31 32 - uint64 key = ((uint64)next << 17) | (lo<<9) | (hi<<1) | foldcase; 33 + uint64 key = ((uint64)next << 17) | (lo<<9) | (hi<<1) | (foldcase ? 1ULL : 0ULL); 34 map<uint64, int>::iterator it = rune_cache_.find(key); 35 if (it != rune_cache_.end()) 36 return it->second; 37 diff --git a/re2/prefilter_tree.cc b/re2/prefilter_tree.cc 38 index d8bc37a..cdcf77e 100644 39 --- a/re2/prefilter_tree.cc 40 +++ b/re2/prefilter_tree.cc 41 @@ -8,6 +8,11 @@ 42 #include "re2/prefilter_tree.h" 43 #include "re2/re2.h" 44 45 +#ifdef WIN32 46 +#include <stdio.h> 47 +#define snprintf _snprintf 48 +#endif 49 + 50 DEFINE_int32(filtered_re2_min_atom_len, 51 3, 52 "Strings less than this length are not stored as atoms"); 53 diff --git a/re2/re2.cc b/re2/re2.cc 54 index 8d1d468..0da886d 100644 55 --- a/re2/re2.cc 56 +++ b/re2/re2.cc 57 @@ -11,7 +11,13 @@ 58 59 #include <stdio.h> 60 #include <string> 61 +#ifdef WIN32 62 +#define strtoll _strtoi64 63 +#define strtoull _strtoui64 64 +#define strtof strtod 65 +#else 66 #include <pthread.h> 67 +#endif 68 #include <errno.h> 69 #include "util/util.h" 70 #include "util/flags.h" 71 @@ -31,10 +37,22 @@ const VariadicFunction2<bool, const StringPiece&, const RE2&, RE2::Arg, RE2::Par 72 const VariadicFunction2<bool, StringPiece*, const RE2&, RE2::Arg, RE2::ConsumeN> RE2::Consume; 73 const VariadicFunction2<bool, StringPiece*, const RE2&, RE2::Arg, RE2::FindAndConsumeN> RE2::FindAndConsume; 74 75 -// This will trigger LNK2005 error in MSVC. 76 -#ifndef COMPILER_MSVC 77 -const int RE2::Options::kDefaultMaxMem; // initialized in re2.h 78 -#endif // COMPILER_MSVC 79 +#define kDefaultMaxMem (8<<20) 80 + 81 +RE2::Options::Options() 82 + : encoding_(EncodingUTF8), 83 + posix_syntax_(false), 84 + longest_match_(false), 85 + log_errors_(true), 86 + max_mem_(kDefaultMaxMem), 87 + literal_(false), 88 + never_nl_(false), 89 + never_capture_(false), 90 + case_sensitive_(true), 91 + perl_classes_(false), 92 + word_boundary_(false), 93 + one_line_(false) { 94 +} 95 96 RE2::Options::Options(RE2::CannedOptions opt) 97 : encoding_(opt == RE2::Latin1 ? EncodingLatin1 : EncodingUTF8), 98 diff --git a/re2/re2.h b/re2/re2.h 99 index 272028b..c509853 100644 100 --- a/re2/re2.h 101 +++ b/re2/re2.h 102 @@ -552,28 +552,16 @@ class RE2 { 103 // If this happens too often, RE2 falls back on the NFA implementation. 104 105 // For now, make the default budget something close to Code Search. 106 +#ifndef WIN32 107 static const int kDefaultMaxMem = 8<<20; 108 +#endif 109 110 enum Encoding { 111 EncodingUTF8 = 1, 112 EncodingLatin1 113 }; 114 115 - Options() : 116 - encoding_(EncodingUTF8), 117 - posix_syntax_(false), 118 - longest_match_(false), 119 - log_errors_(true), 120 - max_mem_(kDefaultMaxMem), 121 - literal_(false), 122 - never_nl_(false), 123 - never_capture_(false), 124 - case_sensitive_(true), 125 - perl_classes_(false), 126 - word_boundary_(false), 127 - one_line_(false) { 128 - } 129 - 130 + Options(); 131 /*implicit*/ Options(CannedOptions); 132 133 Encoding encoding() const { return encoding_; } 134 diff --git a/re2/stringpiece.h b/re2/stringpiece.h 135 index ab9297c..38a5150 100644 136 --- a/re2/stringpiece.h 137 +++ b/re2/stringpiece.h 138 @@ -23,6 +23,9 @@ 139 #include <cstddef> 140 #include <iosfwd> 141 #include <string> 142 +#ifdef WIN32 143 +#include <algorithm> 144 +#endif 145 146 namespace re2 { 147 148 diff --git a/re2/testing/re2_test.cc b/re2/testing/re2_test.cc 149 index b99cacf..911e868 100644 150 --- a/re2/testing/re2_test.cc 151 +++ b/re2/testing/re2_test.cc 152 @@ -6,7 +6,9 @@ 153 // TODO: Test extractions for PartialMatch/Consume 154 155 #include <sys/types.h> 156 +#ifndef WIN32 157 #include <sys/mman.h> 158 +#endif 159 #include <sys/stat.h> 160 #include <errno.h> 161 #include <vector> 162 @@ -14,6 +16,11 @@ 163 #include "re2/re2.h" 164 #include "re2/regexp.h" 165 166 +#ifdef WIN32 167 +#include <stdio.h> 168 +#define snprintf _snprintf 169 +#endif 170 + 171 DECLARE_bool(logtostderr); 172 173 namespace re2 { 174 @@ -657,6 +664,7 @@ TEST(RE2, FullMatchTypedNullArg) { 175 CHECK(!RE2::FullMatch("hello", "(.*)", (float*)NULL)); 176 } 177 178 +#ifndef WIN32 179 // Check that numeric parsing code does not read past the end of 180 // the number being parsed. 181 TEST(RE2, NULTerminated) { 182 @@ -678,6 +686,7 @@ TEST(RE2, NULTerminated) { 183 CHECK(RE2::FullMatch(StringPiece(v + pagesize - 1, 1), "(.*)", &x)); 184 CHECK_EQ(x, 1); 185 } 186 +#endif 187 188 TEST(RE2, FullMatchTypeTests) { 189 // Type tests 190 diff --git a/util/logging.h b/util/logging.h 191 index 4443f7c..d0a2d87 100644 192 --- a/util/logging.h 193 +++ b/util/logging.h 194 @@ -7,8 +7,13 @@ 195 #ifndef RE2_UTIL_LOGGING_H__ 196 #define RE2_UTIL_LOGGING_H__ 197 198 +#ifndef WIN32 199 #include <unistd.h> /* for write */ 200 +#endif 201 #include <sstream> 202 +#ifdef WIN32 203 +#include <io.h> 204 +#endif 205 206 // Debug-only checking. 207 #define DCHECK(condition) assert(condition) 208 diff --git a/util/mutex.h b/util/mutex.h 209 index 9787bfb..e321fae 100644 210 --- a/util/mutex.h 211 +++ b/util/mutex.h 212 @@ -12,8 +12,10 @@ 213 214 namespace re2 { 215 216 +#ifndef WIN32 217 #define HAVE_PTHREAD 1 218 #define HAVE_RWLOCK 1 219 +#endif 220 221 #if defined(NO_THREADS) 222 typedef int MutexType; // to keep a lock-count 223 @@ -32,7 +34,9 @@ namespace re2 { 224 # include <pthread.h> 225 typedef pthread_mutex_t MutexType; 226 #elif defined(WIN32) 227 -# define WIN32_LEAN_AND_MEAN // We only need minimal includes 228 +# ifndef WIN32_LEAN_AND_MEAN 229 +# define WIN32_LEAN_AND_MEAN // We only need minimal includes 230 +# endif 231 # ifdef GMUTEX_TRYLOCK 232 // We need Windows NT or later for TryEnterCriticalSection(). If you 233 // don't need that functionality, you can remove these _WIN32_WINNT 234 diff --git a/util/pcre.cc b/util/pcre.cc 235 index 5e67e1f..1602133 100644 236 --- a/util/pcre.cc 237 +++ b/util/pcre.cc 238 @@ -11,6 +11,11 @@ 239 #include "util/flags.h" 240 #include "util/pcre.h" 241 242 +#ifdef WIN32 243 +#define strtoll _strtoi64 244 +#define strtoull _strtoui64 245 +#endif 246 + 247 #define PCREPORT(level) LOG(level) 248 249 // Default PCRE limits. 250 diff --git a/util/pcre.h b/util/pcre.h 251 index 4dda95d..771ac91 100644 252 --- a/util/pcre.h 253 +++ b/util/pcre.h 254 @@ -180,9 +180,15 @@ struct pcre_extra { int flags, match_limit, match_limit_recursion; }; 255 #define PCRE_ERROR_MATCHLIMIT 2 256 #define PCRE_ERROR_RECURSIONLIMIT 3 257 #define PCRE_INFO_CAPTURECOUNT 0 258 +#ifndef WIN32 259 #define pcre_compile(a,b,c,d,e) ({ (void)(a); (void)(b); *(c)=""; *(d)=0; (void)(e); ((pcre*)0); }) 260 #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; }) 261 #define pcre_fullinfo(a, b, c, d) ({ (void)(a); (void)(b); (void)(c); *(d) = 0; 0; }) 262 +#else 263 +#define pcre_compile(a,b,c,d,e) NULL 264 +#define pcre_exec(a, b, c, d, e, f, g, h) NULL 265 +#define pcre_fullinfo(a, b, c, d) NULL 266 +#endif 267 } // namespace re2 268 #endif 269 270 diff --git a/util/test.cc b/util/test.cc 271 index 0644829..2fe1bfa 100644 272 --- a/util/test.cc 273 +++ b/util/test.cc 274 @@ -3,7 +3,9 @@ 275 // license that can be found in the LICENSE file. 276 277 #include <stdio.h> 278 +#ifndef WIN32 279 #include <sys/resource.h> 280 +#endif 281 #include "util/test.h" 282 283 DEFINE_string(test_tmpdir, "/var/tmp", "temp directory"); 284 @@ -23,9 +25,13 @@ void RegisterTest(void (*fn)(void), const char *name) { 285 286 namespace re2 { 287 int64 VirtualProcessSize() { 288 +#ifndef WIN32 289 struct rusage ru; 290 getrusage(RUSAGE_SELF, &ru); 291 return (int64)ru.ru_maxrss*1024; 292 +#else 293 + return 0; 294 +#endif 295 } 296 } // namespace re2 297 298 diff --git a/util/util.h b/util/util.h 299 index c46ab1b..17ef824 100644 300 --- a/util/util.h 301 +++ b/util/util.h 302 @@ -12,7 +12,9 @@ 303 #include <stddef.h> // For size_t 304 #include <assert.h> 305 #include <stdarg.h> 306 +#ifndef WIN32 307 #include <sys/time.h> 308 +#endif 309 #include <time.h> 310 #include <ctype.h> // For isdigit, isalpha. 311 312 @@ -51,7 +53,11 @@ using std::tr1::unordered_set; 313 #else 314 315 #include <unordered_set> 316 +#ifdef WIN32 317 +using std::tr1::unordered_set; 318 +#else 319 using std::unordered_set; 320 +#endif 321 322 #endif 323 324 diff --git a/util/valgrind.h b/util/valgrind.h 325 index ca10b1a..d097b0c 100644 326 --- a/util/valgrind.h 327 +++ b/util/valgrind.h 328 @@ -4064,6 +4064,7 @@ typedef 329 #endif /* PLAT_ppc64_aix5 */ 330 331 332 +#ifndef WIN32 333 /* ------------------------------------------------------------------ */ 334 /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ 335 /* */ 336 @@ -4170,7 +4171,7 @@ typedef 337 VG_USERREQ__DISCARD_TRANSLATIONS, \ 338 _qzz_addr, _qzz_len, 0, 0, 0); \ 339 } 340 - 341 +#endif 342 343 /* These requests are for getting Valgrind itself to print something. 344 Possibly with a backtrace. This is a really ugly hack. The return value 345