diff options
author | Johannes Schickel | 2010-10-13 03:57:44 +0000 |
---|---|---|
committer | Johannes Schickel | 2010-10-13 03:57:44 +0000 |
commit | 75e8452b6e6a2bf4fb2f588aa00b428a60d873b5 (patch) | |
tree | f29541d55309487a94bd1d38e8b53bb3dde9aec6 /engines/sword25/kernel/log.cpp | |
parent | 48ee83b88957dab86bc763e9ef21a70179fa8679 (diff) | |
parent | e9f50882ea5b6beeefa994040be9d3bab6a1f107 (diff) | |
download | scummvm-rg350-75e8452b6e6a2bf4fb2f588aa00b428a60d873b5.tar.gz scummvm-rg350-75e8452b6e6a2bf4fb2f588aa00b428a60d873b5.tar.bz2 scummvm-rg350-75e8452b6e6a2bf4fb2f588aa00b428a60d873b5.zip |
OPENGL: Merged from trunk, from rev 52105 to 53396.
This includes an rather hacky attempt to merge all the recent gp2x backend
changes into the branch. I suppose the gp2x backend and probably all new
backends, i.e. gph, dingux etc., might not compile anymore.
Since I have no way of testing those it would be nice if porters could look
into getting those up to speed in this branch.
svn-id: r53399
Diffstat (limited to 'engines/sword25/kernel/log.cpp')
-rw-r--r-- | engines/sword25/kernel/log.cpp | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/engines/sword25/kernel/log.cpp b/engines/sword25/kernel/log.cpp new file mode 100644 index 0000000000..259c02449f --- /dev/null +++ b/engines/sword25/kernel/log.cpp @@ -0,0 +1,214 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +/* + * This code is based on Broken Sword 2.5 engine + * + * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer + * + * Licensed under GNU GPL v2 + * + */ + +#include "sword25/kernel/log.h" +#include "base/version.h" +#include "common/config-manager.h" +#include "common/fs.h" + +namespace Sword25 { + +// Constants +static const char *BF_LOG_FILENAME = "log.txt"; +static const size_t LOG_BUFFERSIZE = 1024 * 16; + +// Logging will take place only when it's activated +#ifdef BS_ACTIVATE_LOGGING + +Common::WriteStream *BS_Log::_LogFile = NULL; +bool BS_Log::_LineBegin = true; +const char *BS_Log::_Prefix = NULL; +const char *BS_Log::_File = NULL; +int BS_Log::_Line = 0; +bool BS_Log::_AutoNewline = false; +Common::Array<BS_Log::LOG_LISTENER_CALLBACK> BS_Log::_LogListener; + +bool BS_Log::_CreateLog() { + // Open the log file + Common::FSNode dataDir(ConfMan.get("path")); + Common::FSNode file = dataDir.getChild(BF_LOG_FILENAME); + + // Open the file for saving + _LogFile = file.createWriteStream(); + + if (_LogFile) { + // Add a title into the log file + Log("Broken Sword 2.5 Engine - Build: %s - %s - VersionID: %s\n", __DATE__, __TIME__, gScummVMFullVersion); + Log("-----------------------------------------------------------------------------------------------------\n"); + + return true; + } + + // Log file could not be created + return false; +} + +void BS_Log::_CloseLog() { + delete _LogFile; + _LogFile = NULL; +} + +void BS_Log::Log(const char *Format, ...) { + char Message[LOG_BUFFERSIZE]; + + // Create the message + va_list ArgList; + va_start(ArgList, Format); + vsnprintf(Message, sizeof(Message), Format, ArgList); + + // Log the message + _WriteLog(Message); + + _FlushLog(); +} + +void BS_Log::LogPrefix(const char *Prefix, const char *Format, ...) { + char Message[LOG_BUFFERSIZE]; + char ExtFormat[LOG_BUFFERSIZE]; + + // If the issue has ceased at the beginning of a new line, the new issue to begin with the prefix + ExtFormat[0] = 0; + if (_LineBegin) { + snprintf(ExtFormat, sizeof(ExtFormat), "%s%s: ", ExtFormat, Prefix); + _LineBegin = false; + } + // Format String pass line by line and each line with the initial prefix + for (;;) { + const char *NextLine = strstr(Format, "\n"); + if (!NextLine || *(NextLine + strlen("\n")) == 0) { + snprintf(ExtFormat, sizeof(ExtFormat), "%s%s", ExtFormat, Format); + if (NextLine) _LineBegin = true; + break; + } else { + strncat(ExtFormat, Format, (NextLine - Format) + strlen("\n")); + snprintf(ExtFormat, sizeof(ExtFormat), "%s%s: ", ExtFormat, Prefix); + } + + Format = NextLine + strlen("\n"); + } + + // Create message + va_list ArgList; + va_start(ArgList, Format); + vsnprintf(Message, sizeof(Message), ExtFormat, ArgList); + + // Log the message + _WriteLog(Message); + + _FlushLog(); +} + +void BS_Log::LogDecorated(const char *Format, ...) { + // Nachricht erzeugen + char Message[LOG_BUFFERSIZE]; + va_list ArgList; + va_start(ArgList, Format); + vsnprintf(Message, sizeof(Message), Format, ArgList); + + // Zweiten Prefix erzeugen, falls gewünscht + char SecondaryPrefix[1024]; + if (_File && _Line) + snprintf(SecondaryPrefix, sizeof(SecondaryPrefix), "(file: %s, line: %d) - ", _File, _Line); + + // Nachricht zeilenweise ausgeben und an jeden Zeilenanfang das Präfix setzen + char *MessageWalker = Message; + for (;;) { + char *NextLine = strstr(MessageWalker, "\n"); + if (NextLine) { + *NextLine = 0; + if (_LineBegin) { + _WriteLog(_Prefix); + if (_File && _Line) + _WriteLog(SecondaryPrefix); + } + _WriteLog(MessageWalker); + _WriteLog("\n"); + MessageWalker = NextLine + sizeof("\n") - 1; + _LineBegin = true; + } else { + if (_LineBegin) { + _WriteLog(_Prefix); + if (_File && _Line) + _WriteLog(SecondaryPrefix); + } + _WriteLog(MessageWalker); + _LineBegin = false; + break; + } + } + + // Falls gewünscht, wird ans Ende der Nachricht automatisch ein Newline angehängt. + if (_AutoNewline) { + _WriteLog("\n"); + _LineBegin = true; + } + + // Pseudoparameter zurücksetzen + _Prefix = NULL; + _File = 0; + _Line = 0; + _AutoNewline = false; + + _FlushLog(); +} + +int BS_Log::_WriteLog(const char *Message) { + if (!_LogFile) if (!_CreateLog()) return false; + + Common::Array<LOG_LISTENER_CALLBACK>::iterator Iter = _LogListener.begin(); + for (; Iter != _LogListener.end(); ++Iter) + (*Iter)(Message); + + _LogFile->writeString(Message); + + return true; +} + +void BS_Log::_FlushLog() { + _LogFile->flush(); +} + +void (*BS_LogPtr)(const char *, ...) = BS_Log::Log; + +void BS_Log_C(const char *Message) { + BS_LogPtr(Message); +} + +#else + +void BS_Log_C(const char *Message) {}; + +#endif + +} // End of namespace Sword25 |