[Scummvm-cvs-logs] SF.net SVN: scummvm:[47697] scummvm/trunk/engines/sci/engine

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Sat Jan 30 03:40:16 CET 2010


Revision: 47697
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47697&view=rev
Author:   mthreepwood
Date:     2010-01-30 02:40:15 +0000 (Sat, 30 Jan 2010)

Log Message:
-----------
Implement kString(Printf) and resizing of SCI32 strings in kFormat().

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel32.cpp
    scummvm/trunk/engines/sci/engine/kstring.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel32.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel32.cpp	2010-01-30 02:03:59 UTC (rev 47696)
+++ scummvm/trunk/engines/sci/engine/kernel32.cpp	2010-01-30 02:40:15 UTC (rev 47697)
@@ -612,10 +612,18 @@
 		return GET_SEL32(s->_segMan, argv[1], data);
 	case 10: // Stringlen
 		return make_reg(0, s->_segMan->strlen(argv[1]));
-	case 11: // Printf
-		// TODO: Return a new formatting string
-		warning("kString(Printf)");
-		break;
+	case 11: { // Printf
+		reg_t stringHandle;
+		s->_segMan->allocateString(&stringHandle);
+
+		reg_t *adjustedArgs = new reg_t[argc];
+		adjustedArgs[0] = stringHandle;
+		memcpy(&adjustedArgs[1], argv + 1, argc - 1);
+		
+		kFormat(s, argc, adjustedArgs);
+		delete[] adjustedArgs;
+		return stringHandle;
+		}
 	case 12: // Printf Buf
 		return kFormat(s, argc - 1, argv + 1);
 	case 13: { // atoi

Modified: scummvm/trunk/engines/sci/engine/kstring.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kstring.cpp	2010-01-30 02:03:59 UTC (rev 47696)
+++ scummvm/trunk/engines/sci/engine/kstring.cpp	2010-01-30 02:40:15 UTC (rev 47697)
@@ -271,11 +271,13 @@
 			switch (xfer) {
 			case 's': { /* Copy string */
 				reg_t reg = argv[startarg + paramindex];
-				if (s->_segMan->isObject(reg)) {
-					Selector slc = s->_kernel->findSelector("data");	// TODO: place in selector table
-					reg = read_selector(s->_segMan, reg, slc);
-				}
 
+#ifdef ENABLE_SCI32
+				// If the string is a string object, get to the actual string in the data selector
+				if (s->_segMan->isObject(reg)) 
+					reg = GET_SEL32(s->_segMan, reg, data);
+#endif
+
 				Common::String tempsource = (reg == NULL_REG) ? "" : kernel_lookup_text(s, reg,
 				                                  arguments[paramindex + 1]);
 				int slen = strlen(tempsource.c_str());
@@ -398,6 +400,14 @@
 	free(arguments);
 
 	*target = 0; /* Terminate string */
+	
+#ifdef ENABLE_SCI32
+	// Resize SCI32 strings if necessary
+	if (getSciVersion() >= SCI_VERSION_2) {
+		SciString *string = s->_segMan->lookupString(dest);
+		string->setSize(strlen(targetbuf) + 1);
+	}
+#endif
 
 	s->_segMan->strcpy(dest, targetbuf);
 


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