This is an automated email from the git hooks/post-receive script. thansen pushed a commit to branch master in repository aseprite.
commit 516ee5c611f61f398563dd85670e1e64d71d977d Author: David Capello <[email protected]> Date: Fri Feb 26 16:13:54 2016 -0300 New LOG() function with different logging levels and std::ostream support --- src/app/app.cpp | 22 +++++++---- src/app/app_options.cpp | 11 ++++-- src/app/app_options.h | 13 +++++-- src/app/log.cpp | 22 ++++------- src/app/log.h | 9 +---- src/base/log.cpp | 100 ++++++++++++++++++++++++++++++++++++------------ src/base/log.h | 37 ++++++++++++++---- 7 files changed, 148 insertions(+), 66 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index b729889..90ef485 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -109,10 +109,7 @@ public: // This is a raw pointer because we want to delete this explicitly. app::crash::DataRecovery* m_recovery; - Modules(bool verbose) - : m_loggerModule(verbose) - , m_recovery(nullptr) { - } + Modules() : m_recovery(nullptr) { } app::crash::DataRecovery* recovery() { return m_recovery; @@ -164,10 +161,21 @@ void App::initialize(const AppOptions& options) if (m_isGui) m_uiSystem.reset(new ui::UISystem); - // Initializes the application loading the modules, setting the - // graphics mode, loading the configuration and resources, etc. m_coreModules = new CoreModules; - m_modules = new Modules(options.verbose()); + + switch (options.verboseLevel()) { + case AppOptions::kNoVerbose: + base::set_log_level(ERROR); + break; + case AppOptions::kVerbose: + base::set_log_level(INFO); + break; + case AppOptions::kHighlyVerbose: + base::set_log_level(VERBOSE); + break; + } + + m_modules = new Modules; m_legacy = new LegacyModules(isGui() ? REQUIRE_INTERFACE: 0); m_brushes.reset(new AppBrushes); diff --git a/src/app/app_options.cpp b/src/app/app_options.cpp index b9abab6..72fd919 100644 --- a/src/app/app_options.cpp +++ b/src/app/app_options.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2001-2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -24,7 +24,7 @@ AppOptions::AppOptions(int argc, const char* argv[]) : m_exeName(base::get_file_name(argv[0])) , m_startUI(true) , m_startShell(false) - , m_verboseEnabled(false) + , m_verboseLevel(kNoVerbose) , m_palette(m_po.add("palette").requiresValue("<filename>").description("Use a specific palette by default")) , m_shell(m_po.add("shell").description("Start an interactive console to execute scripts")) , m_batch(m_po.add("batch").mnemonic('b').description("Do not start the UI")) @@ -52,13 +52,18 @@ AppOptions::AppOptions(int argc, const char* argv[]) , m_listLayers(m_po.add("list-layers").description("List layers of the next given sprite\nor include layers in JSON data")) , m_listTags(m_po.add("list-tags").description("List tags of the next given sprite sprite\nor include frame tags in JSON data")) , m_verbose(m_po.add("verbose").mnemonic('v').description("Explain what is being done")) + , m_debug(m_po.add("debug").description("Extreme verbose mode and\ncopy log to desktop")) , m_help(m_po.add("help").mnemonic('?').description("Display this help and exits")) , m_version(m_po.add("version").description("Output version information and exit")) { try { m_po.parse(argc, argv); - m_verboseEnabled = m_po.enabled(m_verbose); + if (m_po.enabled(m_debug)) + m_verboseLevel = kHighlyVerbose; + else if (m_po.enabled(m_verbose)) + m_verboseLevel = kVerbose; + m_paletteFileName = m_po.value_of(m_palette); m_startShell = m_po.enabled(m_shell); diff --git a/src/app/app_options.h b/src/app/app_options.h index dc3df68..921ccbf 100644 --- a/src/app/app_options.h +++ b/src/app/app_options.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2001-2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -19,6 +19,12 @@ namespace app { class AppOptions { public: + enum VerboseLevel { + kNoVerbose, + kVerbose, + kHighlyVerbose, + }; + typedef base::ProgramOptions PO; typedef PO::Option Option; typedef PO::ValueList ValueList; @@ -27,7 +33,7 @@ public: bool startUI() const { return m_startUI; } bool startShell() const { return m_startShell; } - bool verbose() const { return m_verboseEnabled; } + VerboseLevel verboseLevel() const { return m_verboseLevel; } const std::string& paletteFileName() const { return m_paletteFileName; } @@ -70,7 +76,7 @@ private: base::ProgramOptions m_po; bool m_startUI; bool m_startShell; - bool m_verboseEnabled; + VerboseLevel m_verboseLevel; std::string m_paletteFileName; Option& m_palette; @@ -101,6 +107,7 @@ private: Option& m_listTags; Option& m_verbose; + Option& m_debug; Option& m_help; Option& m_version; diff --git a/src/app/log.cpp b/src/app/log.cpp index e7e41fb..56e59d4 100644 --- a/src/app/log.cpp +++ b/src/app/log.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2001-2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -17,19 +17,12 @@ namespace app { -static LoggerModule* logger_instance = NULL; - -LoggerModule::LoggerModule(bool verbose) - : m_verbose(verbose) +LoggerModule::LoggerModule() { - logger_instance = this; - - if (verbose) { - app::ResourceFinder rf(false); - rf.includeUserDir("aseprite.log"); - auto filename = rf.defaultFilename(); - base_set_log_filename(filename.c_str()); - } + app::ResourceFinder rf(false); + rf.includeUserDir("aseprite.log"); + auto filename = rf.defaultFilename(); + base::set_log_filename(filename.c_str()); } LoggerModule::~LoggerModule() @@ -37,8 +30,7 @@ LoggerModule::~LoggerModule() LOG("Logger module: shutting down (this is the last line)\n"); // Close log file - base_set_log_filename(""); - logger_instance = nullptr; + base::set_log_filename(""); } } // namespace app diff --git a/src/app/log.h b/src/app/log.h index 7860e15..cb0b668 100644 --- a/src/app/log.h +++ b/src/app/log.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2001-2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -13,13 +13,8 @@ namespace app { class LoggerModule { public: - LoggerModule(bool verbose); + LoggerModule(); ~LoggerModule(); - - bool isVerbose() const { return m_verbose; } - - private: - bool m_verbose; }; } // namespace app diff --git a/src/base/log.cpp b/src/base/log.cpp index 74ebab0..c89ad94 100644 --- a/src/base/log.cpp +++ b/src/base/log.cpp @@ -1,5 +1,5 @@ // Aseprite Base Library -// Copyright (c) 2001-2015 David Capello +// Copyright (c) 2001-2016 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -10,47 +10,99 @@ #include "base/log.h" -#include "base/file_handle.h" +#include "base/fstream_path.h" #include <cstdarg> #include <cstdio> #include <cstring> +#include <fstream> +#include <iostream> #include <string> -static FILE* log_fileptr = nullptr; -static std::string log_filename; +namespace { -void base_set_log_filename(const char* filename) +class nullbuf : public std::streambuf { +protected: + int_type overflow(int_type ch) override { + return traits_type::not_eof(ch); + } +}; + +class nullstream : public std::ostream { +public: + nullstream() + : std::basic_ios<char_type, traits_type>(&m_buf) + , std::ostream(&m_buf) { } +private: + nullbuf m_buf; +}; + +LogLevel log_level = LogLevel::NONE; +nullstream null_stream; +std::ofstream log_stream; +std::string log_filename; + +bool open_log_stream() { - if (log_fileptr) { - fclose(log_fileptr); - log_fileptr = nullptr; + if (!log_stream) { + if (log_filename.empty()) + return false; + + log_stream.open(FSTREAM_PATH(log_filename)); } + return (bool)log_stream; +} + +void log_text(const char* text) +{ + if (!open_log_stream()) + return; + + log_stream.write(text, strlen(text)); + log_stream.flush(); +} + +} // anonymous namespace + +void base::set_log_filename(const char* filename) +{ + if (log_stream) + log_stream.close(); + log_filename = filename; } -void base_log(const char* format, ...) +void base::set_log_level(LogLevel level) { - if (!log_fileptr) { - if (log_filename.empty()) - return; + log_level = level; +} - log_fileptr = base::open_file_raw(log_filename, "w"); - } +std::ostream& base::get_log_stream(LogLevel level) +{ + ASSERT(level != NONE); - if (log_fileptr) { - va_list ap; - va_start(ap, format); + if ((log_level < level) || + (!log_stream && !open_log_stream())) + return null_stream; + else + return log_stream; +} - vfprintf(log_fileptr, format, ap); - fflush(log_fileptr); +void LOG(const char* format, ...) +{ + if (log_level < INFO) + return; + + char buf[2048]; + va_list ap; + va_start(ap, format); + std::vsnprintf(buf, sizeof(buf)-1, format, ap); + log_text(buf); #ifdef _DEBUG - va_start(ap, format); - vfprintf(stderr, format, ap); - fflush(stderr); + fputs(buf, stderr); + fflush(stderr); #endif - va_end(ap); - } + va_end(ap); } diff --git a/src/base/log.h b/src/base/log.h index 0eff401..ba9039a 100644 --- a/src/base/log.h +++ b/src/base/log.h @@ -1,5 +1,5 @@ // Aseprite Base Library -// Copyright (c) 2001-2015 David Capello +// Copyright (c) 2001-2016 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -8,12 +8,35 @@ #define BASE_LOG_H_INCLUDED #pragma once -// Define BASE_DONT_DEFINE_LOG_MACRO in case that you don't need LOG -#ifndef BASE_DONT_DEFINE_LOG_MACRO - #define LOG base_log -#endif +enum LogLevel { + NONE = 0, // Default log level: do not log + FATAL = 1, // Something failed and we CANNOT continue the execution + ERROR = 2, // Something failed, the UI should show this, and we can continue + WARNING = 3, // Something failed, the UI don't need to show this, and we can continue + INFO = 4, // Information about some important event + VERBOSE = 5, // Information step by step +}; + +// E.g. LOG("text in information log level\n"); +void LOG(const char* format, ...); + +#ifdef __cplusplus +#include <iosfwd> + +namespace base { + + void set_log_filename(const char* filename); + void set_log_level(LogLevel level); -void base_set_log_filename(const char* filename); -void base_log(const char* format, ...); + std::ostream& get_log_stream(LogLevel level); + +} // namespace base + +// E.g. LOG(INFO) << "some information\n"; +inline std::ostream& LOG(LogLevel level) { + return base::get_log_stream(level); +} + +#endif #endif -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

