dxdiag: add basic command line parsing
Austin English
austinenglish at gmail.com
Tue Aug 25 23:51:04 CDT 2009
Based on Dan Kegel's patch he wrote for Louis Lenders old implementation.
--
-Austin
-------------- next part --------------
diff --git a/programs/dxdiag/main.c b/programs/dxdiag/main.c
index d24945c..f0fe136 100644
--- a/programs/dxdiag/main.c
+++ b/programs/dxdiag/main.c
@@ -20,8 +20,77 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
+
+/*
+ Process options [/WHQL:ON|OFF][/X outfile][/T outfile]
+ Returns TRUE if options were present, FALSE otherwise
+ FIXME: Native behavior seems to be:
+ Only one of /X and /T is allowed, /WHQL must come before /X and /T,
+ quotes are optional around the filename, even if it contains spaces.
+*/
+
+static BOOL ProcessCommandLine(LPSTR cmdline)
+{
+ const char *s = cmdline;
+ char outfile[MAX_PATH+1];
+ int opt_t = FALSE;
+ int opt_x = FALSE;
+ int opt_help = FALSE;
+ int opt_given = FALSE;
+ int want_arg = FALSE;
+
+ outfile[0] = 0;
+ while (*s) {
+ /* Skip whitespace before arg */
+ while (*s == ' ')
+ s++;
+ /* Check for option */
+ if (*s != '-' && *s != '/')
+ return FALSE;
+ s++;
+ switch (*s++) {
+ case 'T':
+ case 't': opt_t = TRUE; want_arg = TRUE; opt_given = TRUE; break;
+ case 'X':
+ case 'x': opt_x = TRUE; want_arg = TRUE; opt_given = TRUE; break;
+ case 'W':
+ case 'w':
+ opt_given = TRUE;
+ while (isalpha(*s) || *s == ':')
+ s++;
+ break;
+ default: opt_help = TRUE; opt_given = TRUE; break;
+ }
+ /* Skip any spaces before next option or filename */
+ while (*s == ' ')
+ s++;
+ if (want_arg) {
+ int i;
+ if (*s == '"')
+ s++;
+ for (i=0; i < MAX_PATH && *s && *s != '"'; i++, s++)
+ outfile[i] = *s;
+ outfile[i] = 0;
+ break;
+ }
+ }
+ if (opt_help)
+ WINE_FIXME("help unimplemented\n");
+ if (opt_t)
+ WINE_FIXME("/t unimplemented\n");
+ if (opt_x)
+ WINE_FIXME("/x unimplemented\n");
+ return opt_given;
+}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow)
{
+
+ if (ProcessCommandLine(cmdline))
+ return 0;
+
return 0;
}
More information about the wine-patches
mailing list