[Scummvm-cvs-logs] scummvm master -> b81207a04ecb5057b2b6efa0f3a6288b6e969aef

fingolfin max at quendi.de
Sat Jun 18 01:39:55 CEST 2011


This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
e792adb1b8 COMMON: Add vformat() function (Common::String analog to vsprintf)
71ea5acd29 AGI: Replace vsprintf by Common::String::vformat
5455fc5ff4 AGOS: Replace vsprintf by Common::String::vformat
fcc5580d9f HUGO: Replace vsprintf by Common::String::vformat
d74e2d3224 KYRA: Replace vsprintf by Common::String::vformat
b81207a04e COMMON: Replace some vsnprintf/STRINGBUFLEN uses by vformat


Commit: e792adb1b889580fa198d56e16f9098fd4227bb0
    https://github.com/scummvm/scummvm/commit/e792adb1b889580fa198d56e16f9098fd4227bb0
Author: Max Horn (max at quendi.de)
Date: 2011-06-17T16:36:15-07:00

Commit Message:
COMMON: Add vformat() function (Common::String analog to vsprintf)

Changed paths:
    common/scummsys.h
    common/str.cpp
    common/str.h



diff --git a/common/scummsys.h b/common/scummsys.h
index a425bef..9d4b6a9 100644
--- a/common/scummsys.h
+++ b/common/scummsys.h
@@ -302,6 +302,19 @@
 #define MAXPATHLEN 256
 #endif
 
+#ifndef scumm_va_copy
+	#if defined(va_copy)
+		#define scumm_va_copy va_copy
+	#elif defined(__va_copy)
+		#define scumm_va_copy __va_copy
+	#elif defined(_MSC_VER)
+		#define scumm_va_copy(dst, src)       ((dst) = (src))
+	#else
+		#error scumm_va_copy undefined for this port
+	#endif
+#endif
+
+
 
 //
 // Typedef our system types unless they have already been defined by config.h,
diff --git a/common/str.cpp b/common/str.cpp
index 223188b..a2cd4a01 100644
--- a/common/str.cpp
+++ b/common/str.cpp
@@ -25,8 +25,6 @@
 #include "common/str.h"
 #include "common/util.h"
 
-#include <stdarg.h>
-
 namespace Common {
 
 MemoryPool *g_refCountPool = 0; // FIXME: This is never freed right now
@@ -429,10 +427,22 @@ uint String::hash() const {
 // static
 String String::format(const char *fmt, ...) {
 	String output;
-	assert(output.isStorageIntern());
 
 	va_list va;
 	va_start(va, fmt);
+	output = String::vformat(fmt, va);
+	va_end(va);
+
+	return output;
+}
+
+// static
+String String::vformat(const char *fmt, va_list args) {
+	String output;
+	assert(output.isStorageIntern());
+
+	va_list va;
+	scumm_va_copy(va, args);
 	int len = vsnprintf(output._str, _builtinCapacity, fmt, va);
 	va_end(va);
 
@@ -457,7 +467,7 @@ String String::format(const char *fmt, ...) {
 			assert(!output.isStorageIntern());
 			size = output._extern._capacity;
 
-			va_start(va, fmt);
+			scumm_va_copy(va, args);
 			len = vsnprintf(output._str, size, fmt, va);
 			va_end(va);
 		} while (len == -1 || len >= size - 1);
@@ -468,7 +478,7 @@ String String::format(const char *fmt, ...) {
 	} else {
 		// vsnprintf didn't have enough space, so grow buffer
 		output.ensureCapacity(len, false);
-		va_start(va, fmt);
+		scumm_va_copy(va, args);
 		int len2 = vsnprintf(output._str, len+1, fmt, va);
 		va_end(va);
 		assert(len == len2);
diff --git a/common/str.h b/common/str.h
index 7b97dfe..8e07b62 100644
--- a/common/str.h
+++ b/common/str.h
@@ -24,6 +24,8 @@
 
 #include "common/scummsys.h"
 
+#include <stdarg.h>
+
 namespace Common {
 
 /**
@@ -213,10 +215,19 @@ public:
 	uint hash() const;
 
 	/**
-	 * Printf-like function. Returns a formatted String.
+	 * Print formatted data into a String object. Similar to sprintf,
+	 * except that it stores the result in (variably sized) String
+	 * instead of a fixed size buffer.
 	 */
 	static Common::String format(const char *fmt, ...) GCC_PRINTF(1,2);
 
+	/**
+	 * Print formatted data into a String object. Similar to vsprintf,
+	 * except that it stores the result in (variably sized) String
+	 * instead of a fixed size buffer.
+	 */
+	static Common::String vformat(const char *fmt, va_list args);
+
 public:
 	typedef char *        iterator;
 	typedef const char *  const_iterator;


Commit: 71ea5acd29e97a123d095d88638778bf3dbe4d0d
    https://github.com/scummvm/scummvm/commit/71ea5acd29e97a123d095d88638778bf3dbe4d0d
Author: Max Horn (max at quendi.de)
Date: 2011-06-17T16:36:15-07:00

Commit Message:
AGI: Replace vsprintf by Common::String::vformat

Changed paths:
    engines/agi/text.cpp



diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp
index fedfd29..82a2340 100644
--- a/engines/agi/text.cpp
+++ b/engines/agi/text.cpp
@@ -504,17 +504,16 @@ int AgiEngine::print(const char *p, int lin, int col, int len) {
  *
  */
 void AgiEngine::printStatus(const char *message, ...) {
-	char x[42];
 	va_list args;
 
 	va_start(args, message);
 
-	vsprintf(x, message, args);
+	Common::String x = Common::String::vformat(message, args);
 
 	va_end(args);
 
 	debugC(4, kDebugLevelText, "fg=%d, bg=%d", STATUS_FG, STATUS_BG);
-	printText(x, 0, 0, _game.lineStatus, 40, STATUS_FG, STATUS_BG);
+	printText(x.c_str(), 0, 0, _game.lineStatus, 40, STATUS_FG, STATUS_BG);
 }
 
 static void safeStrcat(Common::String &p, const char *t) {


Commit: 5455fc5ff48c6b005ac514c55f975491c2202bac
    https://github.com/scummvm/scummvm/commit/5455fc5ff48c6b005ac514c55f975491c2202bac
Author: Max Horn (max at quendi.de)
Date: 2011-06-17T16:36:15-07:00

Commit Message:
AGOS: Replace vsprintf by Common::String::vformat

Changed paths:
    engines/agos/string.cpp



diff --git a/engines/agos/string.cpp b/engines/agos/string.cpp
index 1cdd7f6..fa85d57 100644
--- a/engines/agos/string.cpp
+++ b/engines/agos/string.cpp
@@ -840,13 +840,12 @@ void AGOSEngine_Feeble::printInteractText(uint16 num, const char *string) {
 
 void AGOSEngine_Feeble::sendInteractText(uint16 num, const char *fmt, ...) {
 	va_list arglist;
-	char string[256];
 
 	va_start(arglist, fmt);
-	vsprintf(string, fmt, arglist);
+	Common::String string = Common::String::vformat(fmt, arglist);
 	va_end(arglist);
 
-	printInteractText(num, string);
+	printInteractText(num, string.c_str());
 }
 #endif
 


Commit: fcc5580d9f917abf17363a124b07fe8d199bf530
    https://github.com/scummvm/scummvm/commit/fcc5580d9f917abf17363a124b07fe8d199bf530
Author: Max Horn (max at quendi.de)
Date: 2011-06-17T16:36:15-07:00

Commit Message:
HUGO: Replace vsprintf by Common::String::vformat

Changed paths:
    engines/hugo/parser.cpp



diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp
index 4a53d67..a79ec2c 100644
--- a/engines/hugo/parser.cpp
+++ b/engines/hugo/parser.cpp
@@ -391,6 +391,8 @@ void Parser::command(const char *format, ...) {
 
 	va_list marker;
 	va_start(marker, format);
+//	TODO:
+//	_vm->_line = Common::String::vformat(format, marker);
 	vsprintf(_vm->_line, format, marker);
 	va_end(marker);
 


Commit: d74e2d3224f7f43daf7bc90018b1b3f40a8c4596
    https://github.com/scummvm/scummvm/commit/d74e2d3224f7f43daf7bc90018b1b3f40a8c4596
Author: Max Horn (max at quendi.de)
Date: 2011-06-17T16:36:16-07:00

Commit Message:
KYRA: Replace vsprintf by Common::String::vformat

Changed paths:
    engines/kyra/gui.cpp



diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp
index b9477c9..f58ca01 100644
--- a/engines/kyra/gui.cpp
+++ b/engines/kyra/gui.cpp
@@ -643,32 +643,31 @@ void MainMenu::printString(const char *format, int x, int y, int col1, int col2,
 	if (!format)
 		return;
 
-	char string[512];
 	va_list vaList;
 	va_start(vaList, flags);
-	vsprintf(string, format, vaList);
+	Common::String string = Common::String::vformat(format, vaList);
 	va_end(vaList);
 
 	if (flags & 1)
-		x -= _screen->getTextWidth(string) >> 1;
+		x -= _screen->getTextWidth(string.c_str()) >> 1;
 
 	if (flags & 2)
-		x -= _screen->getTextWidth(string);
+		x -= _screen->getTextWidth(string.c_str());
 
 	if (_vm->gameFlags().use16ColorMode)
 		flags &= 3;
 
 	if (flags & 4) {
-		_screen->printText(string, x - 1, y, _static.altColor, col2);
-		_screen->printText(string, x, y + 1, _static.altColor, col2);
+		_screen->printText(string.c_str(), x - 1, y, _static.altColor, col2);
+		_screen->printText(string.c_str(), x, y + 1, _static.altColor, col2);
 	}
 
 	if (flags & 8) {
-		_screen->printText(string, x - 1, y, 227, col2);
-		_screen->printText(string, x, y + 1, 227, col2);
+		_screen->printText(string.c_str(), x - 1, y, 227, col2);
+		_screen->printText(string.c_str(), x, y + 1, 227, col2);
 	}
 
-	_screen->printText(string, x, y, col1, col2);
+	_screen->printText(string.c_str(), x, y, col1, col2);
 }
 
 } // End of namespace Kyra


Commit: b81207a04ecb5057b2b6efa0f3a6288b6e969aef
    https://github.com/scummvm/scummvm/commit/b81207a04ecb5057b2b6efa0f3a6288b6e969aef
Author: Max Horn (max at quendi.de)
Date: 2011-06-17T16:36:16-07:00

Commit Message:
COMMON: Replace some vsnprintf/STRINGBUFLEN uses by vformat

Changed paths:
    common/debug.cpp
    common/textconsole.cpp



diff --git a/common/debug.cpp b/common/debug.cpp
index dbbb204..0dae344 100644
--- a/common/debug.cpp
+++ b/common/debug.cpp
@@ -107,18 +107,13 @@ bool DebugManager::isDebugChannelEnabled(uint32 channel) {
 #ifndef DISABLE_TEXT_CONSOLE
 
 static void debugHelper(const char *s, va_list va, bool caret = true) {
-	char buf[STRINGBUFLEN];
+	Common::String buf = Common::String::vformat(s, va);
 
-	vsnprintf(buf, STRINGBUFLEN, s, va);
-	buf[STRINGBUFLEN-1] = '\0';
-
-	if (caret) {
-		buf[STRINGBUFLEN-2] = '\0';
-		strcat(buf, "\n");
-	}
+	if (caret)
+		buf += '\n';
 
 	if (g_system)
-		g_system->logMessage(LogMessageType::kDebug, buf);
+		g_system->logMessage(LogMessageType::kDebug, buf.c_str());
 	// TODO: Think of a good fallback in case we do not have
 	// any OSystem yet.
 }
diff --git a/common/textconsole.cpp b/common/textconsole.cpp
index f2325ac..ffa42e6 100644
--- a/common/textconsole.cpp
+++ b/common/textconsole.cpp
@@ -46,14 +46,14 @@ void setErrorHandler(ErrorHandler handler) {
 #ifndef DISABLE_TEXT_CONSOLE
 
 void warning(const char *s, ...) {
-	char buf[STRINGBUFLEN];
+	Common::String output;
 	va_list va;
 
 	va_start(va, s);
-	vsnprintf(buf, STRINGBUFLEN, s, va);
+	output = Common::String::vformat(s, va);
 	va_end(va);
 
-	Common::String output = Common::String::format("WARNING: %s!\n", buf);
+	output = "WARNING: " + output + "!\n";
 
 	if (g_system)
 		g_system->logMessage(LogMessageType::kWarning, output.c_str());
@@ -64,6 +64,9 @@ void warning(const char *s, ...) {
 #endif
 
 void NORETURN_PRE error(const char *s, ...) {
+	// We don't use String::vformat here, as that require
+	// using the heap, and that might be impossible at this
+	// point, e.g. if the error was an "out-of-memory" error.
 	char buf_input[STRINGBUFLEN];
 	char buf_output[STRINGBUFLEN];
 	va_list va;






More information about the Scummvm-git-logs mailing list