Andrew Nguyen : dxdiag: Introduce the file output infrastructure.

Alexandre Julliard julliard at winehq.org
Tue Jun 14 11:57:48 CDT 2011


Module: wine
Branch: master
Commit: 9678907d34ceec9c0eab2b9a4b798b7b5e8b5883
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9678907d34ceec9c0eab2b9a4b798b7b5e8b5883

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Tue Jun 14 08:01:37 2011 -0500

dxdiag: Introduce the file output infrastructure.

---

 programs/dxdiag/Makefile.in      |    3 +-
 programs/dxdiag/dxdiag_private.h |   45 +++++++++++++++++++++++++++++++
 programs/dxdiag/main.c           |   39 ++++++++++++++++++++++++---
 programs/dxdiag/output.c         |   55 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 137 insertions(+), 5 deletions(-)

diff --git a/programs/dxdiag/Makefile.in b/programs/dxdiag/Makefile.in
index 941d2c7..608790a 100644
--- a/programs/dxdiag/Makefile.in
+++ b/programs/dxdiag/Makefile.in
@@ -3,6 +3,7 @@ MODULE    = dxdiag.exe
 APPMODE   = -mwindows -municode
 
 C_SRCS = \
-	main.c
+	main.c \
+	output.c
 
 @MAKE_PROG_RULES@
diff --git a/programs/dxdiag/dxdiag_private.h b/programs/dxdiag/dxdiag_private.h
new file mode 100644
index 0000000..48b4c4d
--- /dev/null
+++ b/programs/dxdiag/dxdiag_private.h
@@ -0,0 +1,45 @@
+/*
+ * Private definitions for the DirectX Diagnostic Tool
+ *
+ * Copyright 2011 Andrew Nguyen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* Output backend definitions. */
+enum output_type
+{
+    OUTPUT_NONE,
+    OUTPUT_TEXT,
+    OUTPUT_XML,
+};
+
+static inline const char *debugstr_output_type(enum output_type type)
+{
+    switch (type)
+    {
+    case OUTPUT_NONE:
+        return "(none)";
+    case OUTPUT_TEXT:
+        return "Plain-text output";
+    case OUTPUT_XML:
+        return "XML output";
+    default:
+        return "(unknown)";
+    }
+}
+
+const WCHAR *get_output_extension(enum output_type type);
+BOOL output_dxdiag_information(const WCHAR *filename, enum output_type type);
diff --git a/programs/dxdiag/main.c b/programs/dxdiag/main.c
index 3b89b19..6e4042c 100644
--- a/programs/dxdiag/main.c
+++ b/programs/dxdiag/main.c
@@ -23,11 +23,14 @@
 #include "wine/debug.h"
 #include "wine/unicode.h"
 
+#include "dxdiag_private.h"
+
 WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
 
 struct command_line_info
 {
     WCHAR outfile[MAX_PATH];
+    enum output_type output_type;
     BOOL whql_check;
 };
 
@@ -37,7 +40,7 @@ static void usage(void)
     ExitProcess(0);
 }
 
-static BOOL process_file_name(const WCHAR *cmdline, WCHAR *filename, size_t filename_len)
+static BOOL process_file_name(const WCHAR *cmdline, enum output_type output_type, WCHAR *filename, size_t filename_len)
 {
     const WCHAR *endptr;
     size_t len;
@@ -65,6 +68,17 @@ static BOOL process_file_name(const WCHAR *cmdline, WCHAR *filename, size_t file
     memcpy(filename, cmdline, len * sizeof(WCHAR));
     filename[len] = '\0';
 
+    /* Append an extension appropriate for the output type if the filename does not have one. */
+    if (!(endptr = strrchrW(filename, '.')))
+    {
+        const WCHAR *filename_ext = get_output_extension(output_type);
+
+        if (len + strlenW(filename_ext) >= filename_len)
+            return FALSE;
+
+        strcatW(filename, filename_ext);
+    }
+
     return TRUE;
 }
 
@@ -87,6 +101,7 @@ static BOOL process_command_line(const WCHAR *cmdline, struct command_line_info
     static const WCHAR onW[] = {'o','n',0};
 
     info->whql_check = FALSE;
+    info->output_type = OUTPUT_NONE;
 
     while (*cmdline)
     {
@@ -96,7 +111,11 @@ static BOOL process_command_line(const WCHAR *cmdline, struct command_line_info
 
         /* If no option is specified, treat the command line as a filename. */
         if (*cmdline != '-' && *cmdline != '/')
-            return process_file_name(cmdline, info->outfile, sizeof(info->outfile)/sizeof(WCHAR));
+        {
+            info->output_type = OUTPUT_TEXT;
+            return process_file_name(cmdline, OUTPUT_TEXT, info->outfile,
+                                     sizeof(info->outfile)/sizeof(WCHAR));
+        }
 
         cmdline++;
 
@@ -104,10 +123,14 @@ static BOOL process_command_line(const WCHAR *cmdline, struct command_line_info
         {
         case 'T':
         case 't':
-            return process_file_name(cmdline + 1, info->outfile, sizeof(info->outfile)/sizeof(WCHAR));
+            info->output_type = OUTPUT_TEXT;
+            return process_file_name(cmdline + 1, OUTPUT_TEXT, info->outfile,
+                                     sizeof(info->outfile)/sizeof(WCHAR));
         case 'X':
         case 'x':
-            return process_file_name(cmdline + 1, info->outfile, sizeof(info->outfile)/sizeof(WCHAR));
+            info->output_type = OUTPUT_XML;
+            return process_file_name(cmdline + 1, OUTPUT_XML, info->outfile,
+                                     sizeof(info->outfile)/sizeof(WCHAR));
         case 'W':
         case 'w':
             if (strncmpiW(cmdline, whql_colonW, 5))
@@ -147,6 +170,14 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cm
         usage();
 
     WINE_TRACE("WHQL check: %s\n", info.whql_check ? "TRUE" : "FALSE");
+    WINE_TRACE("Output type: %d\n", info.output_type);
+    if (info.output_type != OUTPUT_NONE)
+        WINE_TRACE("Output filename: %s\n", debugstr_output_type(info.output_type));
+
+    if (info.output_type != OUTPUT_NONE)
+        output_dxdiag_information(info.outfile, info.output_type);
+    else
+        WINE_FIXME("Information dialog is not implemented\n");
 
     return 0;
 }
diff --git a/programs/dxdiag/output.c b/programs/dxdiag/output.c
new file mode 100644
index 0000000..c7b3060
--- /dev/null
+++ b/programs/dxdiag/output.c
@@ -0,0 +1,55 @@
+/*
+ * DxDiag file information output
+ *
+ * Copyright 2011 Andrew Nguyen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <assert.h>
+
+#include "wine/debug.h"
+
+#include "dxdiag_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
+
+static struct output_backend
+{
+    const WCHAR filename_ext[5];
+} output_backends[] =
+{
+    /* OUTPUT_TEXT */
+    {
+        {'.','t','x','t',0},
+    },
+    /* OUTPUT_XML */
+    {
+        {'.','x','m','l',0},
+    },
+};
+
+const WCHAR *get_output_extension(enum output_type type)
+{
+    assert(type > OUTPUT_NONE && type <= sizeof(output_backends)/sizeof(output_backends[0]));
+
+    return output_backends[type - 1].filename_ext;
+}
+
+BOOL output_dxdiag_information(const WCHAR *filename, enum output_type type)
+{
+    WINE_FIXME("File information output is not implemented\n");
+    return FALSE;
+}




More information about the wine-cvs mailing list