blob: ce5d05aada2e76ecbdd2c0311a587c9c08e3124f [file] [log] [blame]
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/mswin/stdint.h b/mswin/stdint.h
new file mode 100644
index 0000000..d02608a
--- /dev/null
+++ b/mswin/stdint.h
@@ -0,0 +1,247 @@
+// ISO C9x compliant stdint.h for Microsoft Visual Studio
+// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
+//
+// Copyright (c) 2006-2008 Alexander Chemeris
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// 3. The name of the author may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MSC_VER // [
+#error "Use this header only with Microsoft Visual C++ compilers!"
+#endif // _MSC_VER ]
+
+#ifndef _MSC_STDINT_H_ // [
+#define _MSC_STDINT_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include <limits.h>
+
+// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
+// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
+// or compiler give many errors like this:
+// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
+#ifdef __cplusplus
+extern "C" {
+#endif
+# include <wchar.h>
+#ifdef __cplusplus
+}
+#endif
+
+// Define _W64 macros to mark types changing their size, like intptr_t.
+#ifndef _W64
+# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+# define _W64 __w64
+# else
+# define _W64
+# endif
+#endif
+
+
+// 7.18.1 Integer types
+
+// 7.18.1.1 Exact-width integer types
+
+// Visual Studio 6 and Embedded Visual C++ 4 doesn't
+// realize that, e.g. char has the same size as __int8
+// so we give up on __intX for them.
+#if (_MSC_VER < 1300)
+ typedef signed char int8_t;
+ typedef signed short int16_t;
+ typedef signed int int32_t;
+ typedef unsigned char uint8_t;
+ typedef unsigned short uint16_t;
+ typedef unsigned int uint32_t;
+#else
+ typedef signed __int8 int8_t;
+ typedef signed __int16 int16_t;
+ typedef signed __int32 int32_t;
+ typedef unsigned __int8 uint8_t;
+ typedef unsigned __int16 uint16_t;
+ typedef unsigned __int32 uint32_t;
+#endif
+typedef signed __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+
+
+// 7.18.1.2 Minimum-width integer types
+typedef int8_t int_least8_t;
+typedef int16_t int_least16_t;
+typedef int32_t int_least32_t;
+typedef int64_t int_least64_t;
+typedef uint8_t uint_least8_t;
+typedef uint16_t uint_least16_t;
+typedef uint32_t uint_least32_t;
+typedef uint64_t uint_least64_t;
+
+// 7.18.1.3 Fastest minimum-width integer types
+typedef int8_t int_fast8_t;
+typedef int16_t int_fast16_t;
+typedef int32_t int_fast32_t;
+typedef int64_t int_fast64_t;
+typedef uint8_t uint_fast8_t;
+typedef uint16_t uint_fast16_t;
+typedef uint32_t uint_fast32_t;
+typedef uint64_t uint_fast64_t;
+
+// 7.18.1.4 Integer types capable of holding object pointers
+#ifdef _WIN64 // [
+ typedef signed __int64 intptr_t;
+ typedef unsigned __int64 uintptr_t;
+#else // _WIN64 ][
+ typedef _W64 signed int intptr_t;
+ typedef _W64 unsigned int uintptr_t;
+#endif // _WIN64 ]
+
+// 7.18.1.5 Greatest-width integer types
+typedef int64_t intmax_t;
+typedef uint64_t uintmax_t;
+
+
+// 7.18.2 Limits of specified-width integer types
+
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
+
+// 7.18.2.1 Limits of exact-width integer types
+#define INT8_MIN ((int8_t)_I8_MIN)
+#define INT8_MAX _I8_MAX
+#define INT16_MIN ((int16_t)_I16_MIN)
+#define INT16_MAX _I16_MAX
+#define INT32_MIN ((int32_t)_I32_MIN)
+#define INT32_MAX _I32_MAX
+#define INT64_MIN ((int64_t)_I64_MIN)
+#define INT64_MAX _I64_MAX
+#define UINT8_MAX _UI8_MAX
+#define UINT16_MAX _UI16_MAX
+#define UINT32_MAX _UI32_MAX
+#define UINT64_MAX _UI64_MAX
+
+// 7.18.2.2 Limits of minimum-width integer types
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define INT_LEAST64_MIN INT64_MIN
+#define INT_LEAST64_MAX INT64_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
+
+// 7.18.2.3 Limits of fastest minimum-width integer types
+#define INT_FAST8_MIN INT8_MIN
+#define INT_FAST8_MAX INT8_MAX
+#define INT_FAST16_MIN INT16_MIN
+#define INT_FAST16_MAX INT16_MAX
+#define INT_FAST32_MIN INT32_MIN
+#define INT_FAST32_MAX INT32_MAX
+#define INT_FAST64_MIN INT64_MIN
+#define INT_FAST64_MAX INT64_MAX
+#define UINT_FAST8_MAX UINT8_MAX
+#define UINT_FAST16_MAX UINT16_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+#define UINT_FAST64_MAX UINT64_MAX
+
+// 7.18.2.4 Limits of integer types capable of holding object pointers
+#ifdef _WIN64 // [
+# define INTPTR_MIN INT64_MIN
+# define INTPTR_MAX INT64_MAX
+# define UINTPTR_MAX UINT64_MAX
+#else // _WIN64 ][
+# define INTPTR_MIN INT32_MIN
+# define INTPTR_MAX INT32_MAX
+# define UINTPTR_MAX UINT32_MAX
+#endif // _WIN64 ]
+
+// 7.18.2.5 Limits of greatest-width integer types
+#define INTMAX_MIN INT64_MIN
+#define INTMAX_MAX INT64_MAX
+#define UINTMAX_MAX UINT64_MAX
+
+// 7.18.3 Limits of other integer types
+
+#ifdef _WIN64 // [
+# define PTRDIFF_MIN _I64_MIN
+# define PTRDIFF_MAX _I64_MAX
+#else // _WIN64 ][
+# define PTRDIFF_MIN _I32_MIN
+# define PTRDIFF_MAX _I32_MAX
+#endif // _WIN64 ]
+
+#define SIG_ATOMIC_MIN INT_MIN
+#define SIG_ATOMIC_MAX INT_MAX
+
+#ifndef SIZE_MAX // [
+# ifdef _WIN64 // [
+# define SIZE_MAX _UI64_MAX
+# else // _WIN64 ][
+# define SIZE_MAX _UI32_MAX
+# endif // _WIN64 ]
+#endif // SIZE_MAX ]
+
+// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
+#ifndef WCHAR_MIN // [
+# define WCHAR_MIN 0
+#endif // WCHAR_MIN ]
+#ifndef WCHAR_MAX // [
+# define WCHAR_MAX _UI16_MAX
+#endif // WCHAR_MAX ]
+
+#define WINT_MIN 0
+#define WINT_MAX _UI16_MAX
+
+#endif // __STDC_LIMIT_MACROS ]
+
+
+// 7.18.4 Limits of other integer types
+
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
+
+// 7.18.4.1 Macros for minimum-width integer constants
+
+#define INT8_C(val) val##i8
+#define INT16_C(val) val##i16
+#define INT32_C(val) val##i32
+#define INT64_C(val) val##i64
+
+#define UINT8_C(val) val##ui8
+#define UINT16_C(val) val##ui16
+#define UINT32_C(val) val##ui32
+#define UINT64_C(val) val##ui64
+
+// 7.18.4.2 Macros for greatest-width integer constants
+#define INTMAX_C INT64_C
+#define UINTMAX_C UINT64_C
+
+#endif // __STDC_CONSTANT_MACROS ]
+
+
+#endif // _MSC_STDINT_H_ ]
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/stringprintf.cc b/util/stringprintf.cc
index c908181..d4691d1 100644
--- a/util/stringprintf.cc
+++ b/util/stringprintf.cc
@@ -4,6 +4,10 @@
#include "util/util.h"
+#ifndef va_copy
+#define va_copy(d,s) ((d) = (s)) //KLUGE: for MS compilers
+#endif
+
namespace re2 {
static void StringAppendV(string* dst, const char* format, va_list ap) {
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