[Scummvm-cvs-logs] CVS: scummvm gameDetector.cpp,1.48,1.49

Lionel Ulmer bbrox at users.sourceforge.net
Thu May 2 12:00:43 CEST 2002


Update of /cvsroot/scummvm/scummvm
In directory usw-pr-cvs1:/tmp/cvs-serv25518

Modified Files:
	gameDetector.cpp 
Log Message:
Fixed the command line parsing for the parameters with optionnal
values.

This may well break the config file changes. I am waiting for Pixel to
get back to ask him to explain his wonderful API :-)



Index: gameDetector.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gameDetector.cpp,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -d -r1.48 -r1.49
--- gameDetector.cpp	1 May 2002 22:20:59 -0000	1.48
+++ gameDetector.cpp	2 May 2002 18:59:31 -0000	1.49
@@ -28,9 +28,15 @@
 #include "gameDetector.h"
 
 
-#define GET_VALUE()		\
-	((*s == '\0' && i+1 < argc && argv[i+1] && argv[i+1][0] != '-' && argv[i+1][0] != '\0') ? argv[++i] : s)
-
+#define CHECK_OPTION() if ((current_option != NULL) || (*s != '\0')) goto ShowHelpAndExit
+#define HANDLE_OPTION() if ((*s == '\0') && (current_option == NULL)) goto ShowHelpAndExit;  \
+                        if ((*s != '\0') && (current_option != NULL)) goto ShowHelpAndExit; \
+                        option = (*s == '\0' ? current_option : s);                         \
+                        current_option = NULL
+#define HANDLE_OPT_OPTION() if ((*s != '\0') && (current_option != NULL)) goto ShowHelpAndExit; \
+                            if ((*s == '\0') && (current_option == NULL)) option = NULL;         \
+                            else option = (*s == '\0' ? current_option : s);                    \
+                            current_option = NULL
 
 static const char USAGE_STRING[] = 
 	"ScummVM - Scumm Interpreter\n"
@@ -100,21 +106,21 @@
 			_noSubtitles = false;
 
 	if ((val = scummcfg->get("music_driver")))
-			if (!parseMusicDriver(val)) {
-		printf("Error in the config file: invalid music_driver.\n");
-					printf(USAGE_STRING);
-					exit(-1);
-			}
+		if (!parseMusicDriver(val)) {
+			printf("Error in the config file: invalid music_driver.\n");
+			printf(USAGE_STRING);
+			exit(-1);
+		}
 
 	if ((val = scummcfg->get("gfx_mode")))
-			if ((_gfx_mode = parseGraphicsMode(val)) == -1) {
-		printf("Error in the config file: invalid gfx_mode.\n");
-				printf(USAGE_STRING);
-				exit(-1);
-			}
+		if ((_gfx_mode = parseGraphicsMode(val)) == -1) {
+			printf("Error in the config file: invalid gfx_mode.\n");
+			printf(USAGE_STRING);
+			exit(-1);
+		}
 
 	if ((val = scummcfg->get("cdrom")))
-			_cdrom = atoi(val);
+		_cdrom = atoi(val);
 }
 
 void GameDetector::parseCommandLine(int argc, char **argv)
@@ -122,6 +128,8 @@
 #if !defined(__APPLE__CW)
 	int i;
 	char *s;
+	char *current_option = NULL;
+	char *option = NULL;
 
 	// check for arguments
 	if (argc < 2) {
@@ -131,134 +139,133 @@
 
 	scummcfg->set_domain("game-specific");
 	/* Parse the arguments */
-	for (i = 1; i < argc; i++) {
+	for (i = argc - 1; i >= 1; i--) {
 		s = argv[i];
 
-		if (s && s[0] == '-') {
+		if (s[0] == '-') {
 			s++;
-			while (*s) {
-				switch (tolower(*s++)) {
-				case 'a':
-					_amiga = true;
-					scummcfg->set("amiga", "true");
-					break;
-				case 'b':
-					s = GET_VALUE();
-					if (*s == '\0')
-						goto ShowHelpAndExit;
-					_bootParam = atoi(s);
-					goto NextArg;
-				case 'c':
-					s = GET_VALUE();
-					if (*s == '\0')
-						goto ShowHelpAndExit;
-					_cdrom = atoi(s);
-					scummcfg->set("cdrom", _cdrom);
-					goto NextArg;
-				case 'd':
-					_debugMode = true;
-					s = GET_VALUE();
-					if (*s != '\0')
-						_debugLevel = atoi(s);
-					debug(1,"Debugmode (level %d) on", _debugLevel);
-					goto NextArg;
-				case 'e':
-					s = GET_VALUE();
-					if (!parseMusicDriver(s))
-						goto ShowHelpAndExit;
-					scummcfg->set("music_driver", s);
-					goto NextArg;
-				case 'f':
-					_fullScreen = true;
-					scummcfg->set("fullscreen", "true", "scummvm");
-					break;
-				case 'g':
-					s = GET_VALUE();
-					_gfx_mode = parseGraphicsMode(s);
-					if (_gfx_mode == -1)
-						goto ShowHelpAndExit;
-					scummcfg->set("gfx_mode", s, "scummvm");
-					goto NextArg;
-				case 'l':
-				    s = GET_VALUE();
-				    if (*s != '\0') {
-					    Config * newconfig = new Config(s, "scummvm");
-					    scummcfg->merge_config(newconfig);
-					    delete newconfig;
-					    updateconfig();
-					    goto NextArg;
-				    } else
-					    goto ShowHelpAndExit;
-				case 'm':
-					s = GET_VALUE();
-					if (*s == '\0')
-						goto ShowHelpAndExit;
-					_music_volume = atoi(s);
-					scummcfg->set("music_volume", _music_volume, "scummvm");
-					goto NextArg;
-				case 'n':
-					_noSubtitles = true;
-					scummcfg->set("nosubtitles", "true");
-					break;
-				case 'p':
-					s = GET_VALUE();
-					if (*s == '\0')
-						goto ShowHelpAndExit;
-					_gameDataPath = s;
-					scummcfg->set("path", _gameDataPath);
-					goto NextArg;
-				case 'r':
-					_mt32emulate = true;
-					scummcfg->set("mt32emulate", "true");
+			switch (tolower(*s++)) {
+			case 'a':
+				CHECK_OPTION();
+				_amiga = true;
+				scummcfg->set("amiga", "true");
+				break;
+			case 'b':
+				HANDLE_OPTION();
+				_bootParam = atoi(option);
+				break;
+			case 'c':
+				HANDLE_OPTION();
+				_cdrom = atoi(option);
+				scummcfg->set("cdrom", _cdrom);
+				break;
+			case 'd':
+				_debugMode = true;
+				HANDLE_OPT_OPTION();
+				if (option != NULL)
+					_debugLevel = atoi(option);
+				debug(1,"Debugmode (level %d) on", _debugLevel);
+				break;
+			case 'e':
+				HANDLE_OPTION();
+				if (!parseMusicDriver(option))
+					goto ShowHelpAndExit;
+				scummcfg->set("music_driver", option);
+				break;
+			case 'f':
+				CHECK_OPTION();
+				_fullScreen = true;
+				scummcfg->set("fullscreen", "true", "scummvm");
+				break;
+			case 'g':
+				HANDLE_OPTION();
+				_gfx_mode = parseGraphicsMode(option);
+				if (_gfx_mode == -1)
+					goto ShowHelpAndExit;
+				scummcfg->set("gfx_mode", option, "scummvm");
+				break;
+			case 'l':
+				HANDLE_OPTION();
+				{
+					Config * newconfig = new Config(option, "scummvm");
+					scummcfg->merge_config(newconfig);
+					delete newconfig;
+					updateconfig();
 					break;
-				case 's':
-					s = GET_VALUE();
-					if (*s == '\0')
-						goto ShowHelpAndExit;
-					_sfx_volume = atoi(s);
-					scummcfg->set("sfx_volume", _sfx_volume, "scummvm");
-					goto NextArg;
-				case 't':
-					s = GET_VALUE();
-					if (*s == '\0')
-						goto ShowHelpAndExit;
-					_gameTempo = strtol(s, 0, 0);
-					scummcfg->set("tempo", s);
-					goto NextArg;
-				case 'v':
-					printf("ScummVM " SCUMMVM_VERSION "\nBuilt on " __DATE__ " "
-								 __TIME__ "\n");
+				}
+				break;
+			case 'm':
+				HANDLE_OPTION();
+				_music_volume = atoi(option);
+				scummcfg->set("music_volume", _music_volume, "scummvm");
+				break;
+			case 'n':
+				CHECK_OPTION();
+				_noSubtitles = true;
+				scummcfg->set("nosubtitles", "true");
+				break;
+			case 'p':
+				HANDLE_OPTION();
+				_gameDataPath = option;
+				scummcfg->set("path", _gameDataPath);
+				break;
+			case 'r':
+				CHECK_OPTION();
+				_mt32emulate = true;
+				scummcfg->set("mt32emulate", "true");
+				break;
+			case 's':
+				HANDLE_OPTION();
+				_sfx_volume = atoi(option);
+				scummcfg->set("sfx_volume", _sfx_volume, "scummvm");
+				break;
+			case 't':
+				HANDLE_OPTION();
+				_gameTempo = strtol(option, 0, 0);
+				scummcfg->set("tempo", option);
+				break;
+			case 'v':
+				CHECK_OPTION();
+				printf("ScummVM " SCUMMVM_VERSION "\nBuilt on " __DATE__ " "
+							 __TIME__ "\n");
 #ifdef SCUMMVM_PLATFORM_VERSION
-					printf("    " SCUMMVM_PLATFORM_VERSION "\n");
+				printf("    " SCUMMVM_PLATFORM_VERSION "\n");
 #endif
-					exit(1);
-
-				case 'w':
-					_saveconfig = true;
-					s = GET_VALUE();
-					if (*s != '\0')
-						scummcfg->change_filename(s);
-					goto NextArg;
-				default:
-				ShowHelpAndExit:;
-					printf(USAGE_STRING);
-					exit(1);
-				}
+				exit(1);
+			case 'w':
+				_saveconfig = true;
+				HANDLE_OPT_OPTION();
+				if (option != NULL)
+					scummcfg->change_filename(option);
+				break;
+			default:
+				goto ShowHelpAndExit;
 			}
-		NextArg:;
 		} else {
-			if (_exe_name)
-				goto ShowHelpAndExit;
-			_exe_name = s;
-			scummcfg->set_domain(s);
-			scummcfg->rename_domain("game-specific");
-			scummcfg->rename_domain(s);
-			updateconfig();
+			if (i == (argc - 1)) {
+				_exe_name = s;
+				scummcfg->set_domain(s);
+				scummcfg->rename_domain("game-specific");
+				scummcfg->rename_domain(s);
+				updateconfig();
+			} else {
+				if (current_option == NULL)
+					current_option = s;
+				else
+					goto ShowHelpAndExit;
+			}
 		}
 	}
 	
 	if (_saveconfig)
 		scummcfg->flush();
+
+	return;
+
+ ShowHelpAndExit:
+	printf(USAGE_STRING);
+	exit(1);
+
 #else
 	_midi_driver = MD_QTMUSIC;
 	_exe_name = *argv;





More information about the Scummvm-git-logs mailing list