12ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Copyright 2009 The RE2 Authors.  All Rights Reserved.
22ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Use of this source code is governed by a BSD-style
32ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// license that can be found in the LICENSE file.
42ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
52ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#ifndef RE2_UTIL_UTIL_H__
62ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define RE2_UTIL_UTIL_H__
72ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
82ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// C
92ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stdio.h>
102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <string.h>
112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stdint.h>
122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stddef.h>         // For size_t
132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <assert.h>
142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stdarg.h>
152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <sys/time.h>
162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <time.h>
170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include <ctype.h>	// For isdigit, isalpha.
182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// C++
202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <vector>
212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <string>
222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <algorithm>
232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <iosfwd>
242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <map>
252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stack>
260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include <ostream>
272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <utility>
282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <set>
292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Use std names.
312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::set;
322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::pair;
332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::vector;
342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::string;
352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::min;
362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::max;
372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::ostream;
382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::map;
392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::stack;
402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::sort;
412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::swap;
422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::make_pair;
432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#if defined(ANDROID)
452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
46c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#if defined(_STLPORT_VERSION)
47c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#include <unordered_set>      // using stlport
48c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#else
49c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#include <tr1/unordered_set>  // using gnustl
50c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#endif
512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::tr1::unordered_set;
520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin
532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#elif defined(__GNUC__) && !defined(USE_CXX0X)
542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <tr1/unordered_set>
562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::tr1::unordered_set;
572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#else
592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <unordered_set>
612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::unordered_set;
622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
632ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif
642ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
652ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonnamespace re2 {
662ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
672ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int8_t int8;
682ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint8_t uint8;
692ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int16_t int16;
702ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint16_t uint16;
712ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int32_t int32;
722ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint32_t uint32;
732ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int64_t int64;
742ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint64_t uint64;
752ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
762ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned long ulong;
772ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned int uint;
782ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned short ushort;
792ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
802ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// COMPILE_ASSERT causes a compile error about msg if expr is not true.
812ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontemplate<bool> struct CompileAssert {};
822ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define COMPILE_ASSERT(expr, msg) \
832ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
842ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
852ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// DISALLOW_EVIL_CONSTRUCTORS disallows the copy and operator= functions.
862ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// It goes in the private: declarations in a class.
872ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
882ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  TypeName(const TypeName&);                 \
892ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  void operator=(const TypeName&)
902ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
912ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define arraysize(array) (sizeof(array)/sizeof((array)[0]))
922ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
932ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Fake lock annotations.  For real ones, see
942ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// http://code.google.com/p/data-race-test/
950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifndef ANNOTATE_PUBLISH_MEMORY_RANGE
962ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_PUBLISH_MEMORY_RANGE(a, b)
972ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_IGNORE_WRITES_BEGIN()
982ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_IGNORE_WRITES_END()
992ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_BENIGN_RACE(a, b)
1002ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define NO_THREAD_SAFETY_ANALYSIS
1012ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_HAPPENS_BEFORE(x)
1022ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_HAPPENS_AFTER(x)
1030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define ANNOTATE_UNPROTECTED_READ(x) (x)
1040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif
1052ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1062ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonclass StringPiece;
1072ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1082ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstring CEscape(const StringPiece& src);
1092ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint CEscapeString(const char* src, int src_len, char* dest, int dest_len);
1102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern string StringPrintf(const char* format, ...);
1122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern void SStringPrintf(string* dst, const char* format, ...);
1132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern void StringAppendF(string* dst, const char* format, ...);
1142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern string PrefixSuccessor(const StringPiece& prefix);
1152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonuint32 hashword(const uint32*, size_t, uint32);
1172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid hashword2(const uint32*, size_t, uint32*, uint32*);
1182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstatic inline uint32 Hash32StringWithSeed(const char* s, int len, uint32 seed) {
1202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  return hashword((uint32*)s, len/4, seed);
1212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstatic inline uint64 Hash64StringWithSeed(const char* s, int len, uint32 seed) {
1242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  uint32 x, y;
1252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  x = seed;
1262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  y = 0;
1272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  hashword2((uint32*)s, len/4, &x, &y);
1282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  return ((uint64)x << 32) | y;
1292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint RunningOnValgrind();
1322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}  // namespace re2
1342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/arena.h"
1362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/logging.h"
1372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/mutex.h"
1382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/utf.h"
1392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif // RE2_UTIL_UTIL_H__
141