[Scummvm-cvs-logs] SF.net SVN: scummvm:[46130] scummvm/trunk

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Tue Nov 24 23:11:07 CET 2009


Revision: 46130
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46130&view=rev
Author:   fingolfin
Date:     2009-11-24 22:11:07 +0000 (Tue, 24 Nov 2009)

Log Message:
-----------
COMMON: Remove dependency on engines code (by using the inversion principle).

Modified Paths:
--------------
    scummvm/trunk/common/debug.cpp
    scummvm/trunk/common/debug.h
    scummvm/trunk/common/module.mk
    scummvm/trunk/common/util.cpp
    scummvm/trunk/common/util.h
    scummvm/trunk/engines/engine.cpp

Added Paths:
-----------
    scummvm/trunk/common/console.cpp
    scummvm/trunk/common/console.h

Added: scummvm/trunk/common/console.cpp
===================================================================
--- scummvm/trunk/common/console.cpp	                        (rev 0)
+++ scummvm/trunk/common/console.cpp	2009-11-24 22:11:07 UTC (rev 46130)
@@ -0,0 +1,144 @@
+/* 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$
+ */
+
+#include "common/console.h"
+#include "common/system.h"
+
+namespace Common {
+
+static OutputFormatter s_errorOutputFormatter = 0;
+
+void setErrorOutputFormatter(OutputFormatter f) {
+	s_errorOutputFormatter = f;
+}
+
+static ErrorHandler s_errorHandler = 0;
+
+void setErrorHandler(ErrorHandler handler) {
+	s_errorHandler = handler;
+}
+
+
+}	// End of namespace Common
+
+
+#ifndef DISABLE_TEXT_CONSOLE
+
+void warning(const char *s, ...) {
+	char buf[STRINGBUFLEN];
+	va_list va;
+
+	va_start(va, s);
+	vsnprintf(buf, STRINGBUFLEN, s, va);
+	va_end(va);
+
+#if !defined (__SYMBIAN32__)
+	fputs("WARNING: ", stderr);
+	fputs(buf, stderr);
+	fputs("!\n", stderr);
+#endif
+
+#if defined( USE_WINDBG )
+	strcat(buf, "\n");
+#if defined( _WIN32_WCE )
+	TCHAR buf_unicode[1024];
+	MultiByteToWideChar(CP_ACP, 0, buf, strlen(buf) + 1, buf_unicode, sizeof(buf_unicode));
+	OutputDebugString(buf_unicode);
+#else
+	OutputDebugString(buf);
+#endif
+#endif
+}
+
+#endif
+
+void NORETURN error(const char *s, ...) {
+	char buf_input[STRINGBUFLEN];
+	char buf_output[STRINGBUFLEN];
+	va_list va;
+
+	// Generate the full error message
+	va_start(va, s);
+	vsnprintf(buf_input, STRINGBUFLEN, s, va);
+	va_end(va);
+
+
+	// Next, give the active engine (if any) a chance to augment the message
+	if (Common::s_errorOutputFormatter) {
+		(*Common::s_errorOutputFormatter)(buf_output, buf_input, STRINGBUFLEN);
+	} else {
+		strncpy(buf_output, buf_input, STRINGBUFLEN);
+	}
+
+	buf_output[STRINGBUFLEN-3] = '\0';
+	buf_output[STRINGBUFLEN-2] = '\0';
+	buf_output[STRINGBUFLEN-1] = '\0';
+	strcat(buf_output, "!\n");
+
+
+	// Print the error message to stderr
+	fputs(buf_output, stderr);
+
+	// If there is an error handler, invoke it now
+	if (Common::s_errorHandler)
+		(*Common::s_errorHandler)(buf_output);
+
+	// TODO: Add a OSystem::fatalError() method and invoke it here.
+	// The default implementation would just call OSystem::quit().
+
+#if defined( USE_WINDBG )
+#if defined( _WIN32_WCE )
+	TCHAR buf_output_unicode[1024];
+	MultiByteToWideChar(CP_ACP, 0, buf_output, strlen(buf_output) + 1, buf_output_unicode, sizeof(buf_output_unicode));
+	OutputDebugString(buf_output_unicode);
+#ifndef DEBUG
+	drawError(buf_output);
+#else
+	int cmon_break_into_the_debugger_if_you_please = *(int *)(buf_output + 1);	// bus error
+	printf("%d", cmon_break_into_the_debugger_if_you_please);			// don't optimize the int out
+#endif
+#else
+	OutputDebugString(buf_output);
+#endif
+#endif
+
+#ifdef PALMOS_MODE
+	extern void PalmFatalError(const char *err);
+	PalmFatalError(buf_output);
+#endif
+
+#ifdef __SYMBIAN32__
+	Symbian::FatalError(buf_output);
+#endif
+	// Finally exit. quit() will terminate the program if g_system is present
+	if (g_system)
+		g_system->quit();
+
+#if defined(SAMSUNGTV)
+	// FIXME
+	for (;;) {}
+#else
+	exit(1);
+#endif
+}


Property changes on: scummvm/trunk/common/console.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Added: scummvm/trunk/common/console.h
===================================================================
--- scummvm/trunk/common/console.h	                        (rev 0)
+++ scummvm/trunk/common/console.h	2009-11-24 22:11:07 UTC (rev 46130)
@@ -0,0 +1,89 @@
+/* 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$
+ */
+
+#ifndef COMMON_CONSOLE_H
+#define COMMON_CONSOLE_H
+
+#include "common/scummsys.h"
+
+namespace Common {
+
+/**
+ * An output formatter takes a source string and 'decorates' it with
+ * extra information, storing the result in a destination buffer.
+ * A typical use is to (optionally) enhance the output given by
+ * the error() and debug() functions with extra information on
+ * the state of the active engine.
+ */
+typedef void (*OutputFormatter)(char *dst, const char *src, size_t dstSize);
+
+/**
+ * Set the output formatter used by error().
+ */
+void setErrorOutputFormatter(OutputFormatter f);
+
+
+/**
+ * A callback which is invoked by error() just before aborting.
+ * A typical example would be a function which shows a debug
+ * console and displays the given message in it.
+ */
+typedef void (*ErrorHandler)(const char *msg);
+
+/**
+ * Set a callback that is invoked by error() after the error
+ * message has been printed, but before the application is
+ * terminated.
+ * This can be used to e.g. show a debugger console.
+ */
+void setErrorHandler(ErrorHandler handler);
+
+}	// End of namespace Common
+
+
+#if defined(__GNUC__)
+void error(const char *s, ...) GCC_PRINTF(1, 2) NORETURN;
+#else
+void NORETURN error(const char *s, ...);
+#endif
+
+#ifdef DISABLE_TEXT_CONSOLE
+
+inline int printf(const char *s, ...) { return 0; }
+
+inline void warning(const char *s, ...) {}
+
+#else
+
+/**
+ * Print a warning message to the text console (stderr).
+ * Automatically prepends the text "WARNING: " and appends
+ * an exclamation mark and a newline.
+ */
+void warning(const char *s, ...) GCC_PRINTF(1, 2);
+
+#endif
+
+
+#endif


Property changes on: scummvm/trunk/common/console.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Modified: scummvm/trunk/common/debug.cpp
===================================================================
--- scummvm/trunk/common/debug.cpp	2009-11-24 22:10:34 UTC (rev 46129)
+++ scummvm/trunk/common/debug.cpp	2009-11-24 22:11:07 UTC (rev 46130)
@@ -25,9 +25,8 @@
 #include "common/debug.h"
 #include "common/util.h"
 #include "common/hashmap.h"
+#include "common/hash-str.h"
 
-#include "engines/engine.h"
-
 #include <stdarg.h>	// For va_list etc.
 
 
@@ -47,6 +46,12 @@
 #endif
 
 
+
+// TODO: Move gDebugLevel into namespace Common.
+int gDebugLevel = -1;
+
+
+
 namespace Common {
 
 namespace {
@@ -135,11 +140,16 @@
 }
 
 
+
+static OutputFormatter s_debugOutputFormatter = 0;
+
+void setDebugOutputFormatter(OutputFormatter f) {
+	s_debugOutputFormatter = f;
+}
+
 }	// End of namespace Common
 
 
-int gDebugLevel = -1;
-
 #ifndef DISABLE_TEXT_CONSOLE
 
 static void debugHelper(const char *s, va_list va, bool caret = true) {
@@ -149,8 +159,8 @@
 
 	// Next, give the active engine (if any) a chance to augment the message,
 	// but only if not used from debugN.
-	if (g_engine && caret) {
-		g_engine->errorString(in_buf, buf, STRINGBUFLEN);
+	if (Common::s_debugOutputFormatter) {
+		(*Common::s_debugOutputFormatter)(buf, in_buf, STRINGBUFLEN);
 	} else {
 		strncpy(buf, in_buf, STRINGBUFLEN);
 	}

Modified: scummvm/trunk/common/debug.h
===================================================================
--- scummvm/trunk/common/debug.h	2009-11-24 22:10:34 UTC (rev 46129)
+++ scummvm/trunk/common/debug.h	2009-11-24 22:11:07 UTC (rev 46130)
@@ -26,6 +26,7 @@
 #define COMMON_DEBUG_H
 
 #include "common/scummsys.h"
+#include "common/console.h"
 #include "common/list.h"
 #include "common/str.h"
 
@@ -96,6 +97,12 @@
 bool isDebugChannelEnabled(const String &name);
 
 
+/**
+ * Set the output formatter used by debug() and related functions.
+ */
+void setDebugOutputFormatter(OutputFormatter f);
+
+
 }	// End of namespace Common
 
 

Modified: scummvm/trunk/common/module.mk
===================================================================
--- scummvm/trunk/common/module.mk	2009-11-24 22:10:34 UTC (rev 46129)
+++ scummvm/trunk/common/module.mk	2009-11-24 22:11:07 UTC (rev 46130)
@@ -4,6 +4,7 @@
 	archive.o \
 	config-file.o \
 	config-manager.o \
+	console.o \
 	debug.o \
 	EventDispatcher.o \
 	EventRecorder.o \

Modified: scummvm/trunk/common/util.cpp
===================================================================
--- scummvm/trunk/common/util.cpp	2009-11-24 22:10:34 UTC (rev 46129)
+++ scummvm/trunk/common/util.cpp	2009-11-24 22:11:07 UTC (rev 46130)
@@ -25,8 +25,6 @@
 #include "common/util.h"
 #include "common/system.h"
 #include "common/config-manager.h"
-#include "gui/debugger.h"
-#include "engines/engine.h"
 
 #include <stdarg.h>	// For va_list etc.
 
@@ -421,113 +419,3 @@
 }
 
 }	// End of namespace Common
-
-
-
-#ifndef DISABLE_TEXT_CONSOLE
-
-void warning(const char *s, ...) {
-	char buf[STRINGBUFLEN];
-	va_list va;
-
-	va_start(va, s);
-	vsnprintf(buf, STRINGBUFLEN, s, va);
-	va_end(va);
-
-#if !defined (__SYMBIAN32__)
-	fputs("WARNING: ", stderr);
-	fputs(buf, stderr);
-	fputs("!\n", stderr);
-#endif
-
-#if defined( USE_WINDBG )
-	strcat(buf, "\n");
-#if defined( _WIN32_WCE )
-	TCHAR buf_unicode[1024];
-	MultiByteToWideChar(CP_ACP, 0, buf, strlen(buf) + 1, buf_unicode, sizeof(buf_unicode));
-	OutputDebugString(buf_unicode);
-#else
-	OutputDebugString(buf);
-#endif
-#endif
-}
-
-#endif
-
-void NORETURN error(const char *s, ...) {
-	char buf_input[STRINGBUFLEN];
-	char buf_output[STRINGBUFLEN];
-	va_list va;
-
-	// Generate the full error message
-	va_start(va, s);
-	vsnprintf(buf_input, STRINGBUFLEN, s, va);
-	va_end(va);
-
-
-	// Next, give the active engine (if any) a chance to augment the message
-	if (g_engine) {
-		g_engine->errorString(buf_input, buf_output, STRINGBUFLEN);
-	} else {
-		strncpy(buf_output, buf_input, STRINGBUFLEN);
-	}
-
-	buf_output[STRINGBUFLEN-3] = '\0';
-	buf_output[STRINGBUFLEN-2] = '\0';
-	buf_output[STRINGBUFLEN-1] = '\0';
-	strcat(buf_output, "!\n");
-
-
-	// Print the error message to stderr
-	fputs(buf_output, stderr);
-
-	// Unless this error -originated- within the debugger itself, we
-	// now invoke the debugger, if available / supported.
-	if (g_engine) {
-		GUI::Debugger *debugger = g_engine->getDebugger();
-#ifdef _WIN32_WCE
-		if (isSmartphone())
-			debugger = 0;
-#endif
-		if (debugger && !debugger->isAttached()) {
-			debugger->attach(buf_output);
-			debugger->onFrame();
-		}
-	}
-
-
-#if defined( USE_WINDBG )
-#if defined( _WIN32_WCE )
-	TCHAR buf_output_unicode[1024];
-	MultiByteToWideChar(CP_ACP, 0, buf_output, strlen(buf_output) + 1, buf_output_unicode, sizeof(buf_output_unicode));
-	OutputDebugString(buf_output_unicode);
-#ifndef DEBUG
-	drawError(buf_output);
-#else
-	int cmon_break_into_the_debugger_if_you_please = *(int *)(buf_output + 1);	// bus error
-	printf("%d", cmon_break_into_the_debugger_if_you_please);			// don't optimize the int out
-#endif
-#else
-	OutputDebugString(buf_output);
-#endif
-#endif
-
-#ifdef PALMOS_MODE
-	extern void PalmFatalError(const char *err);
-	PalmFatalError(buf_output);
-#endif
-
-#ifdef __SYMBIAN32__
-	Symbian::FatalError(buf_output);
-#endif
-	// Finally exit. quit() will terminate the program if g_system is present
-	if (g_system)
-		g_system->quit();
-
-#if defined(SAMSUNGTV)
-	// FIXME
-	for (;;) {}
-#else
-	exit(1);
-#endif
-}

Modified: scummvm/trunk/common/util.h
===================================================================
--- scummvm/trunk/common/util.h	2009-11-24 22:10:34 UTC (rev 46129)
+++ scummvm/trunk/common/util.h	2009-11-24 22:11:07 UTC (rev 46130)
@@ -26,6 +26,7 @@
 #define COMMON_UTIL_H
 
 #include "common/scummsys.h"
+#include "common/console.h"
 #include "common/str.h"
 
 
@@ -293,28 +294,4 @@
 
 }	// End of namespace Common
 
-
-#if defined(__GNUC__)
-void error(const char *s, ...) GCC_PRINTF(1, 2) NORETURN;
-#else
-void NORETURN error(const char *s, ...);
 #endif
-
-#ifdef DISABLE_TEXT_CONSOLE
-
-inline int printf(const char *s, ...) { return 0; }
-
-inline void warning(const char *s, ...) {}
-
-#else
-
-/**
- * Print a warning message to the text console (stderr).
- * Automatically prepends the text "WARNING: " and appends
- * an exclamation mark and a newline.
- */
-void warning(const char *s, ...) GCC_PRINTF(1, 2);
-
-#endif
-
-#endif

Modified: scummvm/trunk/engines/engine.cpp
===================================================================
--- scummvm/trunk/engines/engine.cpp	2009-11-24 22:10:34 UTC (rev 46129)
+++ scummvm/trunk/engines/engine.cpp	2009-11-24 22:11:07 UTC (rev 46130)
@@ -31,11 +31,13 @@
 
 #include "engines/engine.h"
 #include "common/config-manager.h"
+#include "common/debug.h"
 #include "common/events.h"
 #include "common/file.h"
 #include "common/timer.h"
 #include "common/savefile.h"
 #include "common/system.h"
+#include "gui/debugger.h"
 #include "gui/message.h"
 #include "gui/GuiManager.h"
 #include "sound/mixer.h"
@@ -49,7 +51,33 @@
 // FIXME: HACK for MidiEmu & error()
 Engine *g_engine = 0;
 
+// Output formatter for debug() and error() which invokes
+// the errorString method of the active engine, if any.
+static void defaultOutputFormatter(char *dst, const char *src, size_t dstSize) {
+	if (g_engine) {
+		g_engine->errorString(src, dst, dstSize);
+	} else {
+		strncpy(dst, src, dstSize);
+	}
+}
 
+static void defaultErrorHandler(const char *msg) {
+	// Unless this error -originated- within the debugger itself, we
+	// now invoke the debugger, if available / supported.
+	if (g_engine) {
+		GUI::Debugger *debugger = g_engine->getDebugger();
+#ifdef _WIN32_WCE
+		if (isSmartphone())
+			debugger = 0;
+#endif
+		if (debugger && !debugger->isAttached()) {
+			debugger->attach(msg);
+			debugger->onFrame();
+		}
+	}
+}
+
+
 Engine::Engine(OSystem *syst)
 	: _system(syst),
 		_mixer(_system->getMixer()),
@@ -62,6 +90,9 @@
 		_mainMenuDialog(NULL) {
 
 	g_engine = this;
+	Common::setDebugOutputFormatter(defaultOutputFormatter);
+	Common::setErrorOutputFormatter(defaultOutputFormatter);
+	Common::setErrorHandler(defaultErrorHandler);
 
 	// FIXME: Get rid of the following again. It is only here temporarily.
 	// We really should never run with a non-working Mixer, so ought to handle


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list