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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Mon Sep 14 15:13:20 CEST 2009


Revision: 44082
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44082&view=rev
Author:   fingolfin
Date:     2009-09-14 13:13:20 +0000 (Mon, 14 Sep 2009)

Log Message:
-----------
SCI: kernelDeref*() functions are now seSegmentManager methods

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kernel.h
    scummvm/trunk/engines/sci/engine/kfile.cpp
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/engine/kmenu.cpp
    scummvm/trunk/engines/sci/engine/kmisc.cpp
    scummvm/trunk/engines/sci/engine/kpathing.cpp
    scummvm/trunk/engines/sci/engine/kstring.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.h
    scummvm/trunk/engines/sci/engine/stringfrag.cpp
    scummvm/trunk/engines/sci/gfx/menubar.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -721,38 +721,6 @@
 		return (*sig == 0 || (*sig & KSIG_ELLIPSIS));
 }
 
-static void *_kernel_dereference_pointer(SegManager *segMan, reg_t pointer, int entries, int align) {
-	int maxsize;
-	void *retval = segMan->dereference(pointer, &maxsize);
-
-	if (!retval)
-		return NULL;
-
-	if (pointer.offset & (align - 1)) {
-		warning("Unaligned pointer read: %04x:%04x expected with %d alignment", PRINT_REG(pointer), align);
-		return NULL;
-	}
-
-	if (entries > maxsize) {
-		warning("Trying to dereference pointer %04x:%04x beyond end of segment", PRINT_REG(pointer));
-		return NULL;
-	}
-	return retval;
-
-}
-
-byte *kernelDerefBulkPtr(SegManager *segMan, reg_t pointer, int entries) {
-	return (byte *)_kernel_dereference_pointer(segMan, pointer, entries, 1);
-}
-
-reg_t *kernelDerefRegPtr(SegManager *segMan, reg_t pointer, int entries) {
-	return (reg_t *)_kernel_dereference_pointer(segMan, pointer, entries, sizeof(reg_t));
-}
-
-char *kernelDerefString(SegManager *segMan, reg_t pointer, int entries) {
-	return (char *)_kernel_dereference_pointer(segMan, pointer, entries, 1);
-}
-
 void Kernel::setDefaultKernelNames() {
 	_kernelNames = Common::StringList(sci_default_knames, SCI_KNAMES_DEFAULT_ENTRIES_NR);
 

Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kernel.h	2009-09-14 13:13:20 UTC (rev 44082)
@@ -224,22 +224,6 @@
  */
 char *kernel_lookup_text(EngineState *s, reg_t address, int index);
 
-/******************** Kernel function parameter macros ********************/
-
-/* Returns the parameter value or (alt) if not enough parameters were supplied */
-/**
- * Dereferences a heap pointer
- * @param s The state to operate on
- * @param pointer The pointer to dereference
- * @parm entries The number of values expected (for checking; use 0 for strings)
- * @return A physical reference to the address pointed to, or NULL on error or
- * if not enugh entries were available.
- * reg_t dereferenciation also assures alignedness of data.
- */
-reg_t *kernelDerefRegPtr(SegManager *segMan, reg_t pointer, int entries);
-byte *kernelDerefBulkPtr(SegManager *segMan, reg_t pointer, int entries);
-char *kernelDerefString(SegManager *segMan, reg_t pointer, int entries = 0);
-
 /******************** Priority macros/functions ********************/
 /**
  * Finds the position of the priority band specified

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -197,7 +197,7 @@
 }
 
 reg_t kFOpen(EngineState *s, int, int argc, reg_t *argv) {
-	char *name = kernelDerefString(s->segMan, argv[0]);
+	char *name = s->segMan->kernelDerefString(argv[0]);
 	int mode = argv[1].toUint16();
 
 	debug(3, "kFOpen(%s,0x%x)", name, mode);
@@ -250,7 +250,7 @@
 
 reg_t kFPuts(EngineState *s, int, int argc, reg_t *argv) {
 	int handle = argv[0].toUint16();
-	char *data = kernelDerefString(s->segMan, argv[1]);
+	char *data = s->segMan->kernelDerefString(argv[1]);
 
 	fwrite_wrapper(s, handle, data, strlen(data));
 	return s->r_acc;
@@ -307,7 +307,7 @@
 }
 
 reg_t kFGets(EngineState *s, int, int argc, reg_t *argv) {
-	char *dest = kernelDerefString(s->segMan, argv[0]);
+	char *dest = s->segMan->kernelDerefString(argv[0]);
 	int maxsize = argv[1].toUint16();
 	int handle = argv[2].toUint16();
 
@@ -320,7 +320,7 @@
  * Writes the cwd to the supplied address and returns the address in acc.
  */
 reg_t kGetCWD(EngineState *s, int, int argc, reg_t *argv) {
-	char *targetaddr = kernelDerefString(s->segMan, argv[0]);
+	char *targetaddr = s->segMan->kernelDerefString(argv[0]);
 
 	// We do not let the scripts see the file system, instead pretending
 	// we are always in the same directory.
@@ -356,8 +356,8 @@
 
 	switch (mode) {
 	case K_DEVICE_INFO_GET_DEVICE:
-		input_s = kernelDerefString(s->segMan, argv[1]);
-		output_s = kernelDerefString(s->segMan, argv[2]);
+		input_s = s->segMan->kernelDerefString(argv[1]);
+		output_s = s->segMan->kernelDerefString(argv[2]);
 		assert(input_s != output_s);
 
 		strcpy(output_s, "/");
@@ -365,15 +365,15 @@
 		break;
 
 	case K_DEVICE_INFO_GET_CURRENT_DEVICE:
-		output_s = kernelDerefString(s->segMan, argv[1]);
+		output_s = s->segMan->kernelDerefString(argv[1]);
 
 		strcpy(output_s, "/");
 		debug(3, "K_DEVICE_INFO_GET_CURRENT_DEVICE() -> %s", output_s);
 		break;
 
 	case K_DEVICE_INFO_PATHS_EQUAL: {
-		char *path1_s = kernelDerefString(s->segMan, argv[1]);
-		char *path2_s = kernelDerefString(s->segMan, argv[2]);
+		char *path1_s = s->segMan->kernelDerefString(argv[1]);
+		char *path2_s = s->segMan->kernelDerefString(argv[2]);
 		debug(3, "K_DEVICE_INFO_PATHS_EQUAL(%s,%s)", path1_s, path2_s);
 
 		return make_reg(0, Common::matchString(path2_s, path1_s, true));
@@ -381,7 +381,7 @@
 		break;
 
 	case K_DEVICE_INFO_IS_FLOPPY:
-		input_s = kernelDerefString(s->segMan, argv[1]);
+		input_s = s->segMan->kernelDerefString(argv[1]);
 		debug(3, "K_DEVICE_INFO_IS_FLOPPY(%s)", input_s);
 		return NULL_REG; /* Never */
 
@@ -390,8 +390,8 @@
 	** for more information on our workaround for this.
 	*/
 	case K_DEVICE_INFO_GET_SAVECAT_NAME: {
-		output_s = kernelDerefString(s->segMan, argv[1]);
-		game_prefix = kernelDerefString(s->segMan, argv[2]);
+		output_s = s->segMan->kernelDerefString(argv[1]);
+		game_prefix = s->segMan->kernelDerefString(argv[2]);
 
 		sprintf(output_s, "__throwaway");
 		debug(3, "K_DEVICE_INFO_GET_SAVECAT_NAME(%s) -> %s", game_prefix, output_s);
@@ -399,8 +399,8 @@
 
 	break;
 	case K_DEVICE_INFO_GET_SAVEFILE_NAME: {
-		output_s = kernelDerefString(s->segMan, argv[1]);
-		game_prefix = kernelDerefString(s->segMan, argv[2]);
+		output_s = s->segMan->kernelDerefString(argv[1]);
+		game_prefix = s->segMan->kernelDerefString(argv[2]);
 		int savegame_id = argv[3].toUint16();
 		sprintf(output_s, "__throwaway");
 		debug(3, "K_DEVICE_INFO_GET_SAVEFILE_NAME(%s,%d) -> %s", game_prefix, savegame_id, output_s);
@@ -428,7 +428,7 @@
 }
 
 reg_t kCheckFreeSpace(EngineState *s, int, int argc, reg_t *argv) {
-	char *path = kernelDerefString(s->segMan, argv[0]);
+	char *path = s->segMan->kernelDerefString(argv[0]);
 
 	debug(3, "kCheckFreeSpace(%s)", path);
 	// We simply always pretend that there is enough space.
@@ -486,7 +486,7 @@
 }
 
 reg_t kCheckSaveGame(EngineState *s, int, int argc, reg_t *argv) {
-	char *game_id = kernelDerefString(s->segMan, argv[0]);
+	char *game_id = s->segMan->kernelDerefString(argv[0]);
 	int savedir_nr = argv[1].toUint16();
 
 	debug(3, "kCheckSaveGame(%s, %d)", game_id, savedir_nr);
@@ -522,10 +522,10 @@
 }
 
 reg_t kGetSaveFiles(EngineState *s, int, int argc, reg_t *argv) {
-	char *game_id = kernelDerefString(s->segMan, argv[0]);
-	char *nametarget = kernelDerefString(s->segMan, argv[1]);
+	char *game_id = s->segMan->kernelDerefString(argv[0]);
+	char *nametarget = s->segMan->kernelDerefString(argv[1]);
 	reg_t nametarget_base = argv[1];
-	reg_t *nameoffsets = kernelDerefRegPtr(s->segMan, argv[2], 0);
+	reg_t *nameoffsets = s->segMan->kernelDerefRegPtr(argv[2], 0);
 
 	debug(3, "kGetSaveFiles(%s,%s)", game_id, nametarget);
 
@@ -572,11 +572,11 @@
 }
 
 reg_t kSaveGame(EngineState *s, int, int argc, reg_t *argv) {
-	char *game_id = kernelDerefString(s->segMan, argv[0]);
+	char *game_id = s->segMan->kernelDerefString(argv[0]);
 	int savedir_nr = argv[1].toUint16();
 	int savedir_id; // Savegame ID, derived from savedir_nr and the savegame ID list
-	char *game_description = kernelDerefString(s->segMan, argv[2]);
-	char *version = argc > 3 ? strdup(kernelDerefString(s->segMan, argv[3])) : NULL;
+	char *game_description = s->segMan->kernelDerefString(argv[2]);
+	char *version = argc > 3 ? strdup(s->segMan->kernelDerefString(argv[3])) : NULL;
 
 	debug(3, "kSaveGame(%s,%d,%s,%s)", game_id, savedir_nr, game_description, version);
 	s->game_version = version;
@@ -645,7 +645,7 @@
 }
 
 reg_t kRestoreGame(EngineState *s, int, int argc, reg_t *argv) {
-	char *game_id = kernelDerefString(s->segMan, argv[0]);
+	char *game_id = s->segMan->kernelDerefString(argv[0]);
 	int savedir_nr = argv[1].toUint16();
 
 	debug(3, "kRestoreGame(%s,%d)", game_id, savedir_nr);
@@ -684,7 +684,7 @@
 }
 
 reg_t kValidPath(EngineState *s, int, int argc, reg_t *argv) {
-	const char *path = kernelDerefString(s->segMan, argv[0]);
+	const char *path = s->segMan->kernelDerefString(argv[0]);
 
 	// FIXME: For now, we only accept the (fake) root dir "/" as a valid path.
 	s->r_acc = make_reg(0, 0 == strcmp(path, "/"));
@@ -735,7 +735,7 @@
 		return;
 	}
 
-	char *mem = kernelDerefString(_vm->segMan, _outbuffer);
+	char *mem = _vm->segMan->kernelDerefString(_outbuffer);
 	memset(mem, 0, 13);
 
 	// TODO: Transform the string back into a format usable by the SCI scripts.
@@ -756,7 +756,7 @@
 
 	switch (func_nr) {
 	case K_FILEIO_OPEN : {
-		char *name = kernelDerefString(s->segMan, argv[1]);
+		char *name = s->segMan->kernelDerefString(argv[1]);
 		int mode = argv[2].toUint16();
 
 		file_open(s, name, mode);
@@ -772,7 +772,7 @@
 	}
 	case K_FILEIO_READ_RAW : {
 		int handle = argv[1].toUint16();
-		char *dest = kernelDerefString(s->segMan, argv[2]);
+		char *dest = s->segMan->kernelDerefString(argv[2]);
 		int size = argv[3].toUint16();
 		debug(3, "K_FILEIO_READ_RAW(%d,%d)", handle, size);
 
@@ -781,7 +781,7 @@
 	}
 	case K_FILEIO_WRITE_RAW : {
 		int handle = argv[1].toUint16();
-		char *buf = kernelDerefString(s->segMan, argv[2]);
+		char *buf = s->segMan->kernelDerefString(argv[2]);
 		int size = argv[3].toUint16();
 		debug(3, "K_FILEIO_WRITE_RAW(%d,%d)", handle, size);
 
@@ -789,7 +789,7 @@
 		break;
 	}
 	case K_FILEIO_UNLINK : {
-		char *name = kernelDerefString(s->segMan, argv[1]);
+		char *name = s->segMan->kernelDerefString(argv[1]);
 		debug(3, "K_FILEIO_UNLINK(%s)", name);
 
 		Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
@@ -800,7 +800,7 @@
 		break;
 	}
 	case K_FILEIO_READ_STRING : {
-		char *dest = kernelDerefString(s->segMan, argv[1]);
+		char *dest = s->segMan->kernelDerefString(argv[1]);
 		int size = argv[2].toUint16();
 		int handle = argv[3].toUint16();
 		debug(3, "K_FILEIO_READ_STRING(%d,%d)", handle, size);
@@ -811,7 +811,7 @@
 	case K_FILEIO_WRITE_STRING : {
 		int handle = argv[1].toUint16();
 		int size = argv[3].toUint16();
-		char *buf = kernelDerefString(s->segMan, argv[2], size);
+		char *buf = s->segMan->kernelDerefString(argv[2], size);
 		debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size);
 
 		// FIXME: What is the difference between K_FILEIO_WRITE_STRING and
@@ -832,7 +832,7 @@
 		break;
 	}
 	case K_FILEIO_FIND_FIRST : {
-		char *mask = kernelDerefString(s->segMan, argv[1]);
+		char *mask = s->segMan->kernelDerefString(argv[1]);
 		reg_t buf = argv[2];
 		int attr = argv[3].toUint16(); // We won't use this, Win32 might, though...
 		debug(3, "K_FILEIO_FIND_FIRST(%s,0x%x)", mask, attr);
@@ -851,7 +851,7 @@
 		break;
 	}
 	case K_FILEIO_FILE_EXISTS : {
-		char *name = kernelDerefString(s->segMan, argv[1]);
+		char *name = s->segMan->kernelDerefString(argv[1]);
 
 		// Check for regular file
 		bool exists = Common::File::exists(name);

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -602,14 +602,14 @@
 
 reg_t kTextSize(EngineState *s, int, int argc, reg_t *argv) {
 	int width, height;
-	char *text = argv[1].segment ? kernelDerefString(s->segMan, argv[1]) : NULL;
+	char *text = argv[1].segment ? s->segMan->kernelDerefString(argv[1]) : NULL;
 	const char *sep = NULL; 
-	reg_t *dest = kernelDerefRegPtr(s->segMan, argv[0], 4);
+	reg_t *dest = s->segMan->kernelDerefRegPtr(argv[0], 4);
 	int maxwidth = (argc > 3) ? argv[3].toUint16() : 0;
 	int font_nr = argv[2].toUint16();
 
 	if ((argc > 4) && (argv[4].segment))
-		sep = kernelDerefString(s->segMan, argv[4]);
+		sep = s->segMan->kernelDerefString(argv[4]);
 
 	if (maxwidth < 0)
 		maxwidth = 0;
@@ -1298,7 +1298,7 @@
 
 static void disableCertainButtons(SegManager *segMan, Common::String gameName, reg_t obj) {
 	reg_t text_pos = GET_SEL32(obj, text);
-	char *text = text_pos.isNull() ? NULL : (char *)segMan->dereference(text_pos, NULL);
+	char *text = text_pos.isNull() ? NULL : segMan->kernelDerefString(text_pos);
 	int type = GET_SEL32V(obj, type);
 	int state = GET_SEL32V(obj, state);
 
@@ -1396,7 +1396,7 @@
 				reg_t text_pos = GET_SEL32(obj, text);
 				int display_offset = 0;
 
-				char *text = (char *)s->segMan->dereference(text_pos, NULL);
+				char *text = s->segMan->kernelDerefString(text_pos);
 				int textlen;
 
 				if (!text) {
@@ -1559,7 +1559,7 @@
 
 	int font_nr = GET_SEL32V(obj, font);
 	reg_t text_pos = GET_SEL32(obj, text);
-	const char *text = text_pos.isNull() ? NULL : (char *)s->segMan->dereference(text_pos, NULL);
+	const char *text = text_pos.isNull() ? NULL : s->segMan->kernelDerefString(text_pos);
 	int view = GET_SEL32V(obj, view);
 	int cel = sign_extend_byte(GET_SEL32V(obj, cel));
 	int loop = sign_extend_byte(GET_SEL32V(obj, loop));
@@ -2506,7 +2506,7 @@
 	lWhite.alpha = 0;
 	lWhite.priority = -1;
 	lWhite.control = -1;
-	const char *title = argv[4 + argextra].segment ? kernelDerefString(s->segMan, argv[4 + argextra]) : NULL;
+	const char *title = argv[4 + argextra].segment ? s->segMan->kernelDerefString(argv[4 + argextra]) : NULL;
 
 	window = sciw_new_window(s, gfx_rect(x, y, xl, yl), s->titlebar_port->_font, fgcolor, bgcolor,
 							s->titlebar_port->_font, lWhite, black, title ? s->strSplit(title, NULL).c_str() : NULL, flags);
@@ -3135,7 +3135,7 @@
 
 	if (textp.segment) {
 		argpt = 1;
-		text = kernelDerefString(s->segMan, textp);
+		text = s->segMan->kernelDerefString(textp);
 	} else {
 		argpt = 2;
 		text = kernel_lookup_text(s, textp, index);
@@ -3303,7 +3303,7 @@
 }
 
 static reg_t kShowMovie_Windows(EngineState *s, int argc, reg_t *argv) {
-	const char *filename = kernelDerefString(s->segMan, argv[1]);
+	const char *filename = s->segMan->kernelDerefString(argv[1]);
 	
 	Graphics::AVIPlayer *player = new Graphics::AVIPlayer(g_system);
 	
@@ -3382,7 +3382,7 @@
 }
 
 static reg_t kShowMovie_DOS(EngineState *s, int argc, reg_t *argv) {
-	const char *filename = kernelDerefString(s->segMan, argv[0]);
+	const char *filename = s->segMan->kernelDerefString(argv[0]);
 	int delay = argv[1].toUint16(); // Time between frames in ticks
 	int frameNr = 0;
 	SeqDecoder seq;

Modified: scummvm/trunk/engines/sci/engine/kmenu.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmenu.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kmenu.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -34,8 +34,8 @@
 namespace Sci {
 
 reg_t kAddMenu(EngineState *s, int, int argc, reg_t *argv) {
-	char *name = kernelDerefString(s->segMan, argv[0]);
-	char *contents = kernelDerefString(s->segMan, argv[1]);
+	char *name = s->segMan->kernelDerefString(argv[0]);
+	char *contents = s->segMan->kernelDerefString(argv[1]);
 
 	s->_menubar->addMenu(s->gfx_state, name,
 	                 contents, s->titlebar_port->_font, argv[1]);
@@ -78,7 +78,7 @@
 	s->status_bar_background = bgcolor;
 
 	if (text.segment) {
-		const char *tmp = strdup(kernelDerefString(s->segMan, text));
+		const char *tmp = strdup(s->segMan->kernelDerefString(text));
 		s->_statusBarText = tmp ? tmp : "";
 	}
 

Modified: scummvm/trunk/engines/sci/engine/kmisc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmisc.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kmisc.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -187,8 +187,8 @@
 		break;
 	case K_MEMORY_MEMCPY : {
 		int size = argv[3].toUint16();
-		byte *dest = kernelDerefBulkPtr(s->segMan, argv[1], size);
-		byte *src = kernelDerefBulkPtr(s->segMan, argv[2], size);
+		byte *dest = s->segMan->kernelDerefBulkPtr(argv[1], size);
+		byte *src = s->segMan->kernelDerefBulkPtr(argv[2], size);
 
 		if (dest && src)
 			memcpy(dest, src, size);
@@ -204,7 +204,7 @@
 		break;
 	}
 	case K_MEMORY_PEEK : {
-		byte *ref = kernelDerefBulkPtr(s->segMan, argv[1], 2);
+		byte *ref = s->segMan->kernelDerefBulkPtr(argv[1], 2);
 
 		if (!ref) {
 			// This occurs in KQ5CD when interacting with certain objects
@@ -218,7 +218,7 @@
 		break;
 	}
 	case K_MEMORY_POKE : {
-		byte *ref = kernelDerefBulkPtr(s->segMan, argv[1], 2);
+		byte *ref = s->segMan->kernelDerefBulkPtr(argv[1], 2);
 
 		if (!ref) {
 			warning("Attempt to poke invalid memory at %04x:%04x", PRINT_REG(argv[1]));

Modified: scummvm/trunk/engines/sci/engine/kpathing.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kpathing.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kpathing.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -295,8 +295,8 @@
 	if (size != GET_SEL32(p2, size).toUint16())
 		return false;
 
-	const byte *p1_points = kernelDerefBulkPtr(segMan, GET_SEL32(p1, points), size * POLY_POINT_SIZE);
-	const byte *p2_points = kernelDerefBulkPtr(segMan, GET_SEL32(p2, points), size * POLY_POINT_SIZE);
+	const byte *p1_points = segMan->kernelDerefBulkPtr(GET_SEL32(p1, points), size * POLY_POINT_SIZE);
+	const byte *p2_points = segMan->kernelDerefBulkPtr(GET_SEL32(p2, points), size * POLY_POINT_SIZE);
 	bool p1_is_reg_t = polygon_is_reg_t(p1_points, size);
 	bool p2_is_reg_t = polygon_is_reg_t(p2_points, size);
 
@@ -359,7 +359,7 @@
 	int size = GET_SEL32(polygon, size).toUint16();
 	int type = GET_SEL32(polygon, type).toUint16();
 	Common::Point first, prev;
-	const byte *list = kernelDerefBulkPtr(s->segMan, points, size * POLY_POINT_SIZE);
+	const byte *list = s->segMan->kernelDerefBulkPtr(points, size * POLY_POINT_SIZE);
 	int is_reg_t = polygon_is_reg_t(list, size);
 	int i;
 
@@ -406,7 +406,7 @@
 	int size = GET_SEL32(polygon, size).toUint16();
 	int type = GET_SEL32(polygon, type).toUint16();
 	int i;
-	const byte *point_array = kernelDerefBulkPtr(segMan, points, size * POLY_POINT_SIZE);
+	const byte *point_array = segMan->kernelDerefBulkPtr(points, size * POLY_POINT_SIZE);
 	int is_reg_t = polygon_is_reg_t(point_array, size);
 	Common::Point point;
 
@@ -1230,7 +1230,7 @@
 	int i;
 	reg_t points = GET_SEL32(polygon, points);
 	int size = GET_SEL32(polygon, size).toUint16();
-	const byte *list = kernelDerefBulkPtr(s->segMan, points, size * POLY_POINT_SIZE);
+	const byte *list = s->segMan->kernelDerefBulkPtr(points, size * POLY_POINT_SIZE);
 	Polygon *poly = new Polygon(GET_SEL32(polygon, type).toUint16());
 	int is_reg_t = polygon_is_reg_t(list, size);
 

Modified: scummvm/trunk/engines/sci/engine/kstring.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kstring.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/kstring.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -44,7 +44,7 @@
 	Resource *textres;
 
 	if (address.segment)
-		return kernelDerefString(s->segMan, address);
+		return s->segMan->kernelDerefString(address);
 	else {
 		int textlen;
 		int _index = index;
@@ -87,7 +87,7 @@
 	if (!heap_said_block.segment)
 		return NULL_REG;
 
-	said_block = (byte *)kernelDerefBulkPtr(s->segMan, heap_said_block, 0);
+	said_block = (byte *)s->segMan->kernelDerefBulkPtr(heap_said_block, 0);
 
 	if (!said_block) {
 		warning("Said on non-string, pointer %04x:%04x", PRINT_REG(heap_said_block));
@@ -189,7 +189,7 @@
 reg_t kParse(EngineState *s, int, int argc, reg_t *argv) {
 	SegManager *segMan = s->segMan;
 	reg_t stringpos = argv[0];
-	char *string = kernelDerefString(s->segMan, stringpos);
+	char *string = s->segMan->kernelDerefString(stringpos);
 	char *error;
 	ResultWordList words;
 	reg_t event = argv[1];
@@ -242,7 +242,7 @@
 		s->r_acc = make_reg(0, 0);
 		PUT_SEL32V(event, claimed, 1);
 		if (error) {
-			char *pbase_str = kernelDerefString(s->segMan, s->parser_base);
+			char *pbase_str = s->segMan->kernelDerefString(s->parser_base);
 			strcpy(pbase_str, error);
 			debugC(2, kDebugLevelParser, "Word unknown: %s\n", error);
 			/* Issue warning: */
@@ -259,7 +259,7 @@
 
 reg_t kStrEnd(EngineState *s, int, int argc, reg_t *argv) {
 	reg_t address = argv[0];
-	char *seeker = kernelDerefString(s->segMan, address);
+	char *seeker = s->segMan->kernelDerefString(address);
 
 	while (*seeker++)
 		++address.offset;
@@ -268,16 +268,16 @@
 }
 
 reg_t kStrCat(EngineState *s, int, int argc, reg_t *argv) {
-	char *s1 = kernelDerefString(s->segMan, argv[0]);
-	char *s2 = kernelDerefString(s->segMan, argv[1]);
+	char *s1 = s->segMan->kernelDerefString(argv[0]);
+	char *s2 = s->segMan->kernelDerefString(argv[1]);
 
 	strcat(s1, s2);
 	return argv[0];
 }
 
 reg_t kStrCmp(EngineState *s, int, int argc, reg_t *argv) {
-	char *s1 = kernelDerefString(s->segMan, argv[0]);
-	char *s2 = kernelDerefString(s->segMan, argv[1]);
+	char *s1 = s->segMan->kernelDerefString(argv[0]);
+	char *s2 = s->segMan->kernelDerefString(argv[1]);
 
 	if (argc > 2)
 		return make_reg(0, strncmp(s1, s2, argv[2].toUint16()));
@@ -287,8 +287,8 @@
 
 
 reg_t kStrCpy(EngineState *s, int, int argc, reg_t *argv) {
-	char *dest = kernelDerefString(s->segMan, argv[0]);
-	char *src = kernelDerefString(s->segMan, argv[1]);
+	char *dest = s->segMan->kernelDerefString(argv[0]);
+	char *src = s->segMan->kernelDerefString(argv[1]);
 
 	if (!dest) {
 		warning("Attempt to strcpy TO invalid pointer %04x:%04x",
@@ -352,7 +352,7 @@
 
 
 reg_t kStrAt(EngineState *s, int, int argc, reg_t *argv) {
-	char *dest = kernelDerefString(s->segMan, argv[0]);
+	char *dest = s->segMan->kernelDerefString(argv[0]);
 	reg_t *dest2;
 
 	if (!dest) {
@@ -394,7 +394,7 @@
 
 
 reg_t kReadNumber(EngineState *s, int, int argc, reg_t *argv) {
-	char *source = kernelDerefString(s->segMan, argv[0]);
+	char *source = s->segMan->kernelDerefString(argv[0]);
 
 	while (isspace(*source))
 		source++; /* Skip whitespace */
@@ -420,7 +420,7 @@
 reg_t kFormat(EngineState *s, int, int argc, reg_t *argv) {
 	int *arguments;
 	reg_t dest = argv[0];
-	char *target = kernelDerefString(s->segMan, dest);
+	char *target = s->segMan->kernelDerefString(dest);
 	reg_t position = argv[1]; /* source */
 	int index = argv[2].toUint16();
 	char *source;
@@ -633,7 +633,7 @@
 
 
 reg_t kStrLen(EngineState *s, int, int argc, reg_t *argv) {
-	char *str = kernelDerefString(s->segMan, argv[0]);
+	char *str = s->segMan->kernelDerefString(argv[0]);
 
 	if (!str) {
 		warning("StrLen: invalid pointer %04x:%04x", PRINT_REG(argv[0]));
@@ -665,7 +665,7 @@
 	** resource.
 	*/
 
-	strcpy(kernelDerefString(s->segMan, argv[2]), seeker); /* Copy the string and get return value */
+	strcpy(s->segMan->kernelDerefString(argv[2]), seeker); /* Copy the string and get return value */
 	return argv[2];
 }
 
@@ -740,7 +740,7 @@
 
 		if (!bufferReg.isNull()) {
 			int len = str.size() + 1;
-			buffer = kernelDerefString(s->segMan, bufferReg, len);
+			buffer = s->segMan->kernelDerefString(bufferReg, len);
 
 			if (buffer) {
 				strcpy(buffer, str.c_str());
@@ -748,7 +748,7 @@
 				warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(bufferReg), len, str.c_str());
 
 				// Set buffer to empty string if possible
-				buffer = kernelDerefString(s->segMan, bufferReg, 1);
+				buffer = s->segMan->kernelDerefString(bufferReg, 1);
 				if (buffer)
 					*buffer = 0;
 			}
@@ -788,7 +788,7 @@
 	case K_MESSAGE_LASTMESSAGE: {
 		MessageTuple msg = s->_msgState.getLastTuple();
 		int module = s->_msgState.getLastModule();
-		byte *buffer = kernelDerefBulkPtr(s->segMan, argv[1], 10);
+		byte *buffer = s->segMan->kernelDerefBulkPtr(argv[1], 10);
 
 		if (buffer) {
 			WRITE_LE_UINT16(buffer, module);
@@ -810,18 +810,18 @@
 }
 
 reg_t kSetQuitStr(EngineState *s, int, int argc, reg_t *argv) {
-        char *quitStr = kernelDerefString(s->segMan, argv[0]);
+        char *quitStr = s->segMan->kernelDerefString(argv[0]);
         debug("Setting quit string to '%s'", quitStr);
         return s->r_acc;
 }
 
 reg_t kStrSplit(EngineState *s, int, int argc, reg_t *argv) {
-	const char *format = kernelDerefString(s->segMan, argv[1]);
-	const char *sep = !argv[2].isNull() ? kernelDerefString(s->segMan, argv[2]) : NULL;
+	const char *format = s->segMan->kernelDerefString(argv[1]);
+	const char *sep = !argv[2].isNull() ? s->segMan->kernelDerefString(argv[2]) : NULL;
 	Common::String str = s->strSplit(format, sep);
 
 	// Make sure target buffer is large enough
-	char *buf = kernelDerefString(s->segMan, argv[0], str.size() + 1);
+	char *buf = s->segMan->kernelDerefString(argv[0], str.size() + 1);
 
 	if (buf) {
 		strcpy(buf, str.c_str());

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -930,6 +930,39 @@
 	return mobj->dereference(pointer, size);
 }
 
+static void *_kernel_dereference_pointer(SegManager *segMan, reg_t pointer, int entries, int align) {
+	int maxsize;
+	void *retval = segMan->dereference(pointer, &maxsize);
+
+	if (!retval)
+		return NULL;
+
+	if (pointer.offset & (align - 1)) {
+		warning("Unaligned pointer read: %04x:%04x expected with %d alignment", PRINT_REG(pointer), align);
+		return NULL;
+	}
+
+	if (entries > maxsize) {
+		warning("Trying to dereference pointer %04x:%04x beyond end of segment", PRINT_REG(pointer));
+		return NULL;
+	}
+	return retval;
+
+}
+
+byte *SegManager::kernelDerefBulkPtr(reg_t pointer, int entries) {
+	return (byte *)_kernel_dereference_pointer(this, pointer, entries, 1);
+}
+
+reg_t *SegManager::kernelDerefRegPtr(reg_t pointer, int entries) {
+	return (reg_t *)_kernel_dereference_pointer(this, pointer, entries, sizeof(reg_t));
+}
+
+char *SegManager::kernelDerefString(reg_t pointer, int entries) {
+	return (char *)_kernel_dereference_pointer(this, pointer, entries, 1);
+}
+
+
 byte *SegManager::allocDynmem(int size, const char *descr, reg_t *addr) {
 	SegmentId seg;
 	MemObject *mobj = allocSegment(MEM_OBJ_DYNMEM, &seg);

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-14 13:13:20 UTC (rev 44082)
@@ -333,6 +333,34 @@
 	byte *dereference(reg_t reg, int *size);
 
 	/**
+	 * Dereferences a heap pointer pointing to raw memory.
+	 * @param pointer The pointer to dereference
+	 * @parm entries The number of values expected (for checkingO
+	 * @return A physical reference to the address pointed to, or NULL on error or
+	 * if not enough entries were available.
+	 */
+	byte *kernelDerefBulkPtr(reg_t pointer, int entries);
+
+	/**
+	 * Dereferences a heap pointer pointing to a (list of) register(s).
+	 * Ensures alignedness of data.
+	 * @param pointer The pointer to dereference
+	 * @parm entries The number of values expected (for checking)
+	 * @return A physical reference to the address pointed to, or NULL on error or
+	 * if not enough entries were available.
+	 */
+	reg_t *kernelDerefRegPtr(reg_t pointer, int entries);
+
+	/**
+	 * Dereferences a heap pointer pointing to raw memory.
+	 * @param pointer The pointer to dereference
+	 * @parm entries The number of values expected (for checking)
+	 * @return A physical reference to the address pointed to, or NULL on error or
+	 * if not enough entries were available.
+	 */
+	char *kernelDerefString(reg_t pointer, int entries = 0);
+
+	/**
 	 * Finds a unique segment by type
 	 * @param type	The type of the segment to find
 	 * @return		The segment number, or -1 if the segment wasn't found

Modified: scummvm/trunk/engines/sci/engine/stringfrag.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/stringfrag.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/engine/stringfrag.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -103,7 +103,7 @@
 }
 
 int is_valid_stringfrag(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernelDerefRegPtr(s->segMan, pos, 1);
+	reg_t *buffer = s->segMan->kernelDerefRegPtr(pos, 1);
 
 	return internal_is_valid_stringfrag(s, buffer);
 }
@@ -138,7 +138,7 @@
 }
 
 int stringfrag_length(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernelDerefRegPtr(s->segMan, pos, 1);
+	reg_t *buffer = s->segMan->kernelDerefRegPtr(pos, 1);
 
 	return internal_stringfrag_length(s, buffer);
 }
@@ -169,7 +169,7 @@
 }
 
 void stringfrag_to_ascii(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernelDerefRegPtr(s->segMan, pos, 1);
+	reg_t *buffer = s->segMan->kernelDerefRegPtr(pos, 1);
 
 	internal_stringfrag_to_ascii(s, buffer);
 }
@@ -191,7 +191,7 @@
 }
 
 void ascii_to_stringfrag(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernelDerefRegPtr(s->segMan, pos, 1);
+	reg_t *buffer = s->segMan->kernelDerefRegPtr(pos, 1);
 
 	internal_ascii_to_stringfrag(s, buffer);
 }
@@ -214,7 +214,7 @@
 }
 
 void stringfrag_append_char(EngineState *s, reg_t pos, unsigned char c) {
-	reg_t *buffer = kernelDerefRegPtr(s->segMan, pos, 1);
+	reg_t *buffer = s->segMan->kernelDerefRegPtr(pos, 1);
 
 	internal_stringfrag_append_char(s, buffer, c);
 }
@@ -311,7 +311,7 @@
 }
 
 void stringfrag_insert_char(EngineState *s, reg_t pos, int p, unsigned char c) {
-	reg_t *buffer = kernelDerefRegPtr(s->segMan, pos, 1);
+	reg_t *buffer = s->segMan->kernelDerefRegPtr(pos, 1);
 
 	internal_stringfrag_insert_char(s, buffer, p, c);
 }
@@ -343,7 +343,7 @@
 }
 
 void stringfrag_delete_char(EngineState *s, reg_t pos, int p) {
-	reg_t *buffer = kernelDerefRegPtr(s->segMan, pos, 1);
+	reg_t *buffer = s->segMan->kernelDerefRegPtr(pos, 1);
 
 	internal_stringfrag_delete_char(s, buffer, p);
 }
@@ -360,8 +360,8 @@
 }
 
 void stringfrag_strcpy(EngineState *s, reg_t dest, reg_t src) {
-	reg_t *destbuf = kernelDerefRegPtr(s->segMan, dest, 1);
-	reg_t *srcbuf = kernelDerefRegPtr(s->segMan, src, 1);
+	reg_t *destbuf = s->segMan->kernelDerefRegPtr(dest, 1);
+	reg_t *srcbuf = s->segMan->kernelDerefRegPtr(src, 1);
 
 	internal_stringfrag_strcpy(s, destbuf, srcbuf);
 }
@@ -388,8 +388,8 @@
 }
 
 void stringfrag_strncpy(EngineState *s, reg_t dest, reg_t src, int len) {
-	reg_t *destbuf = kernelDerefRegPtr(s->segMan, dest, 1);
-	reg_t *srcbuf = kernelDerefRegPtr(s->segMan, src, 1);
+	reg_t *destbuf = s->segMan->kernelDerefRegPtr(dest, 1);
+	reg_t *srcbuf = s->segMan->kernelDerefRegPtr(src, 1);
 
 	internal_stringfrag_strncpy(s, destbuf, srcbuf, len);
 }
@@ -416,8 +416,8 @@
 }
 
 void stringfrag_strcmp(EngineState *s, reg_t s1, reg_t s2) {
-	reg_t *s1buf = kernelDerefRegPtr(s->segMan, s1, 1);
-	reg_t *s2buf = kernelDerefRegPtr(s->segMan, s2, 1);
+	reg_t *s1buf = s->segMan->kernelDerefRegPtr(s1, 1);
+	reg_t *s2buf = s->segMan->kernelDerefRegPtr(s2, 1);
 
 	internal_stringfrag_strcmp(s, s1buf, s2buf);
 }
@@ -449,8 +449,8 @@
 }
 
 void stringfrag_strncmp(EngineState *s, reg_t s1, reg_t s2, int len) {
-	reg_t *s1buf = kernelDerefRegPtr(s->segMan, s1, 1);
-	reg_t *s2buf = kernelDerefRegPtr(s->segMan, s2, 1);
+	reg_t *s1buf = s->segMan->kernelDerefRegPtr(s1, 1);
+	reg_t *s2buf = s->segMan->kernelDerefRegPtr(s2, 1);
 
 	internal_stringfrag_strncmp(s, s1buf, s2buf, len);
 }

Modified: scummvm/trunk/engines/sci/gfx/menubar.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/menubar.cpp	2009-09-14 12:59:42 UTC (rev 44081)
+++ scummvm/trunk/engines/sci/gfx/menubar.cpp	2009-09-14 13:13:20 UTC (rev 44082)
@@ -294,7 +294,7 @@
 	case MENU_ATTRIBUTE_SAID:
 		if (value.segment) {
 			item->_saidPos = value;
-			memcpy(item->_said, kernelDerefBulkPtr(s->segMan, value, 0), MENU_SAID_SPEC_SIZE); // Copy Said spec
+			memcpy(item->_said, s->segMan->kernelDerefBulkPtr(value, 0), MENU_SAID_SPEC_SIZE); // Copy Said spec
 			item->_flags |= MENU_ATTRIBUTE_FLAGS_SAID;
 
 		} else
@@ -304,7 +304,7 @@
 
 	case MENU_ATTRIBUTE_TEXT:
 		assert(value.segment);
-		item->_text = kernelDerefString(s->segMan, value);
+		item->_text = s->segMan->kernelDerefString(value);
 		item->_textPos = value;
 		break;
 


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