15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2009 The RE2 Authors. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// license that can be found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simplified version of Google's logging. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef RE2_UTIL_LOGGING_H__ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RE2_UTIL_LOGGING_H__ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WIN32 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> /* for write */ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WIN32 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <io.h> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Debug-only checking. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCHECK(condition) assert(condition) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCHECK_EQ(val1, val2) assert((val1) == (val2)) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCHECK_NE(val1, val2) assert((val1) != (val2)) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCHECK_LE(val1, val2) assert((val1) <= (val2)) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCHECK_LT(val1, val2) assert((val1) < (val2)) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCHECK_GE(val1, val2) assert((val1) >= (val2)) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCHECK_GT(val1, val2) assert((val1) > (val2)) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Always-on checking 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK(x) if(x){}else LogMessageFatal(__FILE__, __LINE__).stream() << "Check failed: " #x 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK_LT(x, y) CHECK((x) < (y)) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK_GT(x, y) CHECK((x) > (y)) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK_LE(x, y) CHECK((x) <= (y)) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK_GE(x, y) CHECK((x) >= (y)) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK_EQ(x, y) CHECK((x) == (y)) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK_NE(x, y) CHECK((x) != (y)) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_INFO LogMessage(__FILE__, __LINE__) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_ERROR LOG_INFO 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_WARNING LOG_INFO 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_FATAL LogMessageFatal(__FILE__, __LINE__) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_QFATAL LOG_FATAL 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VLOG(x) if((x)>0){}else LOG_INFO.stream() 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NDEBUG 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_MODE 0 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_DFATAL LOG_ERROR 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_MODE 1 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_DFATAL LOG_FATAL 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG(severity) LOG_ ## severity.stream() 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LogMessage { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogMessage(const char* file, int line) : flushed_(false) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream() << file << ":" << line << ": "; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Flush() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream() << "\n"; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string s = str_.str(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int n = (int)s.size(); // shut up msvc 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if(write(2, s.data(), n) < 0) {} // shut up gcc 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flushed_ = true; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~LogMessage() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!flushed_) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Flush(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ostream& stream() { return str_; } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flushed_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::ostringstream str_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_EVIL_CONSTRUCTORS(LogMessage); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LogMessageFatal : public LogMessage { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogMessageFatal(const char* file, int line) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LogMessage(file, line) { } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~LogMessageFatal() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Flush(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_EVIL_CONSTRUCTORS(LogMessageFatal); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // RE2_UTIL_LOGGING_H__ 92