1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "debug.h"
6 
7 #include <stdlib.h>
8 #include <iostream>
9 #include <string>
10 
11 namespace relocation_packer {
12 
13 // Construct a new message logger.  Prints if level is less than or equal to
14 // the level set with SetVerbose() and predicate is true.
Logger(Severity severity,int level,bool predicate)15 Logger::Logger(Severity severity, int level, bool predicate) {
16   severity_ = severity;
17   level_ = level;
18   predicate_ = predicate;
19 }
20 
21 // On destruction, flush and print the strings accumulated.  Abort if FATAL.
~Logger()22 Logger::~Logger() {
23   if (predicate_) {
24     if (level_ <= max_level_) {
25       std::ostream* log = severity_ == INFO ? info_stream_ : error_stream_;
26       std::string tag;
27       switch (severity_) {
28         case INFO: tag = "INFO"; break;
29         case WARNING: tag = "WARNING"; break;
30         case ERROR: tag = "ERROR"; break;
31         case FATAL: tag = "FATAL"; break;
32       }
33       stream_.flush();
34       *log << tag << ": " << stream_.str() << std::endl;
35     }
36     if (severity_ == FATAL)
37       abort();
38   }
39 }
40 
41 // Reset to initial state.
Reset()42 void Logger::Reset() {
43   max_level_ = -1;
44   info_stream_ = &std::cout;
45   error_stream_ = &std::cerr;
46 }
47 
48 // Verbosity.  Not thread-safe.
49 int Logger::max_level_ = -1;
50 
51 // Logging streams.  Not thread-safe.
52 std::ostream* Logger::info_stream_ = &std::cout;
53 std::ostream* Logger::error_stream_ = &std::cerr;
54 
55 }  // namespace relocation_packer
56