changeset 17354:35ec1d5ef9d7 draft

(svn r22096) -Codechange: Move openttd getopt implementation to its own file.
author alberth <alberth@openttd.org>
date Fri, 18 Feb 2011 20:14:30 +0000 (2011-02-18)
parents 311c1caf7591
children 12b8c43f633b
files projects/openttd_vs100.vcxproj projects/openttd_vs100.vcxproj.filters projects/openttd_vs80.vcproj projects/openttd_vs90.vcproj source.list src/openttd.cpp
diffstat 6 files changed, 29 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/projects/openttd_vs100.vcxproj
+++ b/projects/openttd_vs100.vcxproj
@@ -1022,6 +1022,8 @@
     <ClCompile Include="..\src\misc\dbg_helpers.cpp" />
     <ClInclude Include="..\src\misc\dbg_helpers.h" />
     <ClInclude Include="..\src\misc\fixedsizearray.hpp" />
+    <ClCompile Include="..\src\misc\getoptdata.cpp" />
+    <ClInclude Include="..\src\misc\getoptdata.h" />
     <ClInclude Include="..\src\misc\hashtable.hpp" />
     <ClInclude Include="..\src\misc\str.hpp" />
     <ClCompile Include="..\src\network\core\address.cpp" />
--- a/projects/openttd_vs100.vcxproj.filters
+++ b/projects/openttd_vs100.vcxproj.filters
@@ -2286,6 +2286,12 @@
     <ClInclude Include="..\src\misc\fixedsizearray.hpp">
       <Filter>Misc</Filter>
     </ClInclude>
+    <ClCompile Include="..\src\misc\getoptdata.cpp">
+      <Filter>Misc</Filter>
+    </ClCompile>
+    <ClInclude Include="..\src\misc\getoptdata.h">
+      <Filter>Misc</Filter>
+    </ClInclude>
     <ClInclude Include="..\src\misc\hashtable.hpp">
       <Filter>Misc</Filter>
     </ClInclude>
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -3439,6 +3439,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\misc\getoptdata.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\getoptdata.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\misc\hashtable.hpp"
 				>
 			</File>
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -3436,6 +3436,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\misc\getoptdata.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\getoptdata.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\misc\hashtable.hpp"
 				>
 			</File>
--- a/source.list
+++ b/source.list
@@ -815,6 +815,8 @@
 misc/dbg_helpers.cpp
 misc/dbg_helpers.h
 misc/fixedsizearray.hpp
+misc/getoptdata.cpp
+misc/getoptdata.h
 misc/hashtable.hpp
 misc/str.hpp
 
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -59,6 +59,7 @@
 #include "core/backup_type.hpp"
 #include "hotkeys.h"
 #include "newgrf.h"
+#include "misc/getoptdata.h"
 
 
 #include "town.h"
@@ -215,73 +216,6 @@
 }
 
 
-struct MyGetOptData {
-	char *opt;
-	int numleft;
-	char **argv;
-	const char *options;
-	char *cont;
-
-	MyGetOptData(int argc, char **argv, const char *options)
-	{
-		opt = NULL;
-		numleft = argc;
-		this->argv = argv;
-		this->options = options;
-		cont = NULL;
-	}
-};
-
-static int MyGetOpt(MyGetOptData *md)
-{
-	char *s = md->cont;
-	if (s != NULL) {
-		goto md_continue_here;
-	}
-
-	for (;;) {
-		if (--md->numleft < 0) return -1;
-
-		s = *md->argv++;
-		if (*s == '-') {
-md_continue_here:;
-			s++;
-			if (*s != 0) {
-				const char *r;
-				/* Found argument, try to locate it in options. */
-				if (*s == ':' || (r = strchr(md->options, *s)) == NULL) {
-					/* ERROR! */
-					return -2;
-				}
-				if (r[1] == ':') {
-					char *t;
-					/* Item wants an argument. Check if the argument follows, or if it comes as a separate arg. */
-					if (!*(t = s + 1)) {
-						/* It comes as a separate arg. Check if out of args? */
-						if (--md->numleft < 0 || *(t = *md->argv) == '-') {
-							/* Check if item is optional? */
-							if (r[2] != ':') return -2;
-							md->numleft++;
-							t = NULL;
-						} else {
-							md->argv++;
-						}
-					}
-					md->opt = t;
-					md->cont = NULL;
-					return *s;
-				}
-				md->opt = NULL;
-				md->cont = s;
-				return *s;
-			}
-		} else {
-			/* This is currently not supported. */
-			return -2;
-		}
-	}
-}
-
 /**
  * Extract the resolution from the given string and store
  * it in the 'res' parameter.
@@ -452,9 +386,9 @@
 #endif
 	;
 
-	MyGetOptData mgo(argc - 1, argv + 1, optformat);
+	GetOptData mgo(argc - 1, argv + 1, optformat);
 
-	while ((i = MyGetOpt(&mgo)) != -1) {
+	while ((i = mgo.GetOpt()) != -1) {
 		switch (i) {
 		case 'I': free(graphics_set); graphics_set = strdup(mgo.opt); break;
 		case 'S': free(sounds_set); sounds_set = strdup(mgo.opt); break;