| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmCPackLog.h" |
| |
| #include <cmConfigure.h> |
| #include <iostream> |
| |
| #include "cmGeneratedFileStream.h" |
| #include "cmSystemTools.h" |
| |
| cmCPackLog::cmCPackLog() |
| { |
| this->Verbose = false; |
| this->Debug = false; |
| this->Quiet = false; |
| this->NewLine = true; |
| |
| this->LastTag = cmCPackLog::NOTAG; |
| this->DefaultOutput = &std::cout; |
| this->DefaultError = &std::cerr; |
| |
| this->LogOutput = CM_NULLPTR; |
| this->LogOutputCleanup = false; |
| } |
| |
| cmCPackLog::~cmCPackLog() |
| { |
| this->SetLogOutputStream(CM_NULLPTR); |
| } |
| |
| void cmCPackLog::SetLogOutputStream(std::ostream* os) |
| { |
| if (this->LogOutputCleanup && this->LogOutput) { |
| delete this->LogOutput; |
| } |
| this->LogOutputCleanup = false; |
| this->LogOutput = os; |
| } |
| |
| bool cmCPackLog::SetLogOutputFile(const char* fname) |
| { |
| cmGeneratedFileStream* cg = CM_NULLPTR; |
| if (fname) { |
| cg = new cmGeneratedFileStream(fname); |
| } |
| if (cg && !*cg) { |
| delete cg; |
| cg = CM_NULLPTR; |
| } |
| this->SetLogOutputStream(cg); |
| if (!cg) { |
| return false; |
| } |
| this->LogOutputCleanup = true; |
| return true; |
| } |
| |
| void cmCPackLog::Log(int tag, const char* file, int line, const char* msg, |
| size_t length) |
| { |
| // By default no logging |
| bool display = false; |
| |
| // Display file and line number if debug |
| bool useFileAndLine = this->Debug; |
| |
| bool output = false; |
| bool debug = false; |
| bool warning = false; |
| bool error = false; |
| bool verbose = false; |
| |
| // When writing in file, add list of tags whenever tag changes. |
| std::string tagString; |
| bool needTagString = false; |
| if (this->LogOutput && this->LastTag != tag) { |
| needTagString = true; |
| } |
| |
| if (tag & LOG_OUTPUT) { |
| output = true; |
| display = true; |
| if (needTagString) { |
| if (!tagString.empty()) { |
| tagString += ","; |
| } |
| tagString = "VERBOSE"; |
| } |
| } |
| if (tag & LOG_WARNING) { |
| warning = true; |
| display = true; |
| if (needTagString) { |
| if (!tagString.empty()) { |
| tagString += ","; |
| } |
| tagString = "WARNING"; |
| } |
| } |
| if (tag & LOG_ERROR) { |
| error = true; |
| display = true; |
| if (needTagString) { |
| if (!tagString.empty()) { |
| tagString += ","; |
| } |
| tagString = "ERROR"; |
| } |
| } |
| if (tag & LOG_DEBUG && this->Debug) { |
| debug = true; |
| display = true; |
| if (needTagString) { |
| if (!tagString.empty()) { |
| tagString += ","; |
| } |
| tagString = "DEBUG"; |
| } |
| useFileAndLine = true; |
| } |
| if (tag & LOG_VERBOSE && this->Verbose) { |
| verbose = true; |
| display = true; |
| if (needTagString) { |
| if (!tagString.empty()) { |
| tagString += ","; |
| } |
| tagString = "VERBOSE"; |
| } |
| } |
| if (this->Quiet) { |
| display = false; |
| } |
| if (this->LogOutput) { |
| if (needTagString) { |
| *this->LogOutput << "[" << file << ":" << line << " " << tagString |
| << "] "; |
| } |
| this->LogOutput->write(msg, length); |
| } |
| this->LastTag = tag; |
| if (!display) { |
| return; |
| } |
| if (this->NewLine) { |
| if (error && !this->ErrorPrefix.empty()) { |
| *this->DefaultError << this->ErrorPrefix; |
| } else if (warning && !this->WarningPrefix.empty()) { |
| *this->DefaultError << this->WarningPrefix; |
| } else if (output && !this->OutputPrefix.empty()) { |
| *this->DefaultOutput << this->OutputPrefix; |
| } else if (verbose && !this->VerbosePrefix.empty()) { |
| *this->DefaultOutput << this->VerbosePrefix; |
| } else if (debug && !this->DebugPrefix.empty()) { |
| *this->DefaultOutput << this->DebugPrefix; |
| } else if (!this->Prefix.empty()) { |
| *this->DefaultOutput << this->Prefix; |
| } |
| if (useFileAndLine) { |
| if (error || warning) { |
| *this->DefaultError << file << ":" << line << " "; |
| } else { |
| *this->DefaultOutput << file << ":" << line << " "; |
| } |
| } |
| } |
| if (error || warning) { |
| this->DefaultError->write(msg, length); |
| this->DefaultError->flush(); |
| } else { |
| this->DefaultOutput->write(msg, length); |
| this->DefaultOutput->flush(); |
| } |
| if (msg[length - 1] == '\n' || length > 2) { |
| this->NewLine = true; |
| } |
| |
| if (error) { |
| cmSystemTools::SetErrorOccured(); |
| } |
| } |