aboutsummaryrefslogtreecommitdiff
path: root/src/script/common/c_internal.cpp
Commit message (Expand)AuthorAge
* Fix configuration caching in log_deprecated (#9697)HybridDog2020-04-22
* Fix 'the the' typos in comments (#9554)LNJ2020-04-04
* Refactor Script API's log_deprecatedsfan52020-02-23
* Clean up stack after script_get_backtrace (#7854)Michael Muller2018-11-28
* Add a MSVC / Windows compatible snprintf function (#7353)nOOb31672018-07-22
* Fix segfault in player migration and crash in log_deprecatedSmallJoker2018-05-14
* Hint at problematic code when logging deprecated callssfan52017-11-27
* Create a filesystem abstraction layer for CSM and only allow accessing files ...red-0012017-06-30
* Fix crash regression when invsize formspec gets usedest312015-10-17
* Use warningstream for deprecated field messages and refactor log_deprecatedShadowNinja2015-10-15
* Push error handler afresh each time lua_pcall is usedKahrl2015-08-27
* SAPI: Track last executed mod and include in error messageskwolekr2015-08-12
* Display Lua memory usage at the time of Out-of-Memory errorkwolekr2015-08-10
* Improve Script CPP API diagnosticskwolekr2015-08-05
* Add mod securityShadowNinja2015-05-16
* Move globals from main.cpp to more sane locationsCraig Robbins2015-04-01
* For usages of assert() that are meant to persist in Release builds (when NDEB...Craig Robbins2015-03-07
* Fix LuaJIT exception wrapperKahrl2014-08-23
* Use "core" namespace internallyShadowNinja2014-05-08
* Add proper lua api deprecated handlingsapier2014-04-29
* Remove lua_State parameter from LuaError::LuaErrorShadowNinja2014-03-15
* Revert "Make sure we get a stacktrace for as many lua errors as possible"ShadowNinja2014-03-15
* Make sure we get a stacktrace for as many lua errors as possibleSfan52014-03-15
* Handle LuaErrors in Lua -> C++ calls on LuaJITShadowNinja2013-12-18
* Move script_run_callbacks to LuaShadowNinja2013-12-07
* Fix possible implicit conversion of NULL to std::stringkwolekr2013-11-21
* Pass a errfunc to lua_pcall to get a tracebackShadowNinja2013-11-15
* Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenuKahrl2013-08-14
* Move scriptapi to separate folder (by sapier)sapier2013-05-25
">, // Special level that is always printed LL_ERROR, LL_WARNING, LL_ACTION, // In-game actions LL_INFO, LL_VERBOSE, LL_MAX, }; enum LogColor { LOG_COLOR_NEVER, LOG_COLOR_ALWAYS, LOG_COLOR_AUTO, }; typedef u8 LogLevelMask; #define LOGLEVEL_TO_MASKLEVEL(x) (1 << x) class Logger { public: void addOutput(ILogOutput *out); void addOutput(ILogOutput *out, LogLevel lev); void addOutputMasked(ILogOutput *out, LogLevelMask mask); void addOutputMaxLevel(ILogOutput *out, LogLevel lev); LogLevelMask removeOutput(ILogOutput *out); void setLevelSilenced(LogLevel lev, bool silenced); void registerThread(const std::string &name); void deregisterThread(); void log(LogLevel lev, const std::string &text); // Logs without a prefix void logRaw(LogLevel lev, const std::string &text); void setTraceEnabled(bool enable) { m_trace_enabled = enable; } bool getTraceEnabled() { return m_trace_enabled; } static LogLevel stringToLevel(const std::string &name); static const std::string getLevelLabel(LogLevel lev); static LogColor color_mode; private: void logToOutputsRaw(LogLevel, const std::string &line); void logToOutputs(LogLevel, const std::string &combined, const std::string &time, const std::string &thread_name, const std::string &payload_text); const std::string getThreadName(); std::vector<ILogOutput *> m_outputs[LL_MAX]; // Should implement atomic loads and stores (even though it's only // written to when one thread has access currently). // Works on all known architectures (x86, ARM, MIPS). volatile bool m_silenced_levels[LL_MAX]; std::map<std::thread::id, std::string> m_thread_names; mutable std::mutex m_mutex; bool m_trace_enabled; }; class ILogOutput { public: virtual void logRaw(LogLevel, const std::string &line) = 0; virtual void log(LogLevel, const std::string &combined, const std::string &time, const std::string &thread_name, const std::string &payload_text) = 0; }; class ICombinedLogOutput : public ILogOutput { public: void log(LogLevel lev, const std::string &combined, const std::string &time, const std::string &thread_name, const std::string &payload_text) { logRaw(lev, combined); } }; class StreamLogOutput : public ICombinedLogOutput { public: StreamLogOutput(std::ostream &stream) : m_stream(stream) { #if !defined(_WIN32) is_tty = isatty(fileno(stdout)); #else is_tty = false; #endif } void logRaw(LogLevel lev, const std::string &line); private: std::ostream &m_stream; bool is_tty; }; class FileLogOutput : public ICombinedLogOutput { public: void setFile(const std::string &filename, s64 file_size_max); void logRaw(LogLevel lev, const std::string &line) { m_stream << line << std::endl; } private: std::ofstream m_stream; }; class LogOutputBuffer : public ICombinedLogOutput { public: LogOutputBuffer(Logger &logger) : m_logger(logger) { updateLogLevel(); }; virtual ~LogOutputBuffer() { m_logger.removeOutput(this); } void updateLogLevel(); void logRaw(LogLevel lev, const std::string &line); void clear() { m_buffer = std::queue<std::string>(); } bool empty() const { return m_buffer.empty(); } std::string get() { if (empty()) return ""; std::string s = m_buffer.front(); m_buffer.pop(); return s; } private: std::queue<std::string> m_buffer; Logger &m_logger; }; extern StreamLogOutput stdout_output; extern StreamLogOutput stderr_output; extern std::ostream null_stream; extern std::ostream *dout_con_ptr; extern std::ostream *derr_con_ptr; extern std::ostream *dout_server_ptr; extern std::ostream *derr_server_ptr; #ifndef SERVER extern std::ostream *dout_client_ptr; extern std::ostream *derr_client_ptr; #endif extern Logger g_logger; // Writes directly to all LL_NONE log outputs for g_logger with no prefix. extern std::ostream rawstream; extern std::ostream errorstream; extern std::ostream warningstream; extern std::ostream actionstream; extern std::ostream infostream; extern std::ostream verbosestream; extern std::ostream dstream; #define TRACEDO(x) do { \ if (g_logger.getTraceEnabled()) { \ x; \ } \ } while (0) #define TRACESTREAM(x) TRACEDO(verbosestream x) #define dout_con (*dout_con_ptr) #define derr_con (*derr_con_ptr) #define dout_server (*dout_server_ptr) #ifndef SERVER #define dout_client (*dout_client_ptr) #endif