1*a3a45f30SXin Li // Copyright 2017 The Chromium OS Authors. All rights reserved. 2*a3a45f30SXin Li // Use of this source code is governed by a BSD-style license that can be 3*a3a45f30SXin Li // found in the LICENSE file. 4*a3a45f30SXin Li 5*a3a45f30SXin Li #ifndef _BSDIFF_LOGGING_H_ 6*a3a45f30SXin Li #define _BSDIFF_LOGGING_H_ 7*a3a45f30SXin Li 8*a3a45f30SXin Li #include <string.h> 9*a3a45f30SXin Li 10*a3a45f30SXin Li #include <iostream> 11*a3a45f30SXin Li #include <sstream> 12*a3a45f30SXin Li 13*a3a45f30SXin Li // Simple error logging macro to avoid dependencies in other base libraries. 14*a3a45f30SXin Li #define LOG(severity) LogMessage(__FILE__, __LINE__, #severity).stream() 15*a3a45f30SXin Li 16*a3a45f30SXin Li // A variant of LOG that also logs the current errno value. 17*a3a45f30SXin Li #define PLOG(severity) LogMessage(__FILE__, __LINE__, #severity, errno).stream() 18*a3a45f30SXin Li 19*a3a45f30SXin Li // A temporarily scoped object used by LOG & PLOG. 20*a3a45f30SXin Li class LogMessage { 21*a3a45f30SXin Li public: 22*a3a45f30SXin Li LogMessage(const char* file, unsigned int line, const char* severity); 23*a3a45f30SXin Li 24*a3a45f30SXin Li LogMessage(const char* file, 25*a3a45f30SXin Li unsigned int line, 26*a3a45f30SXin Li const char* severity, 27*a3a45f30SXin Li int error); 28*a3a45f30SXin Li 29*a3a45f30SXin Li ~LogMessage(); 30*a3a45f30SXin Li 31*a3a45f30SXin Li // Returns the stream associated with the message, the LogMessage performs 32*a3a45f30SXin Li // output when it goes out of scope. stream()33*a3a45f30SXin Li std::ostream& stream() { return stream_; } 34*a3a45f30SXin Li 35*a3a45f30SXin Li private: 36*a3a45f30SXin Li std::ostringstream stream_; 37*a3a45f30SXin Li int error_; // The saved errno value. 38*a3a45f30SXin Li }; 39*a3a45f30SXin Li 40*a3a45f30SXin Li #endif // _BSDIFF_LOGGING_H_ 41