Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / sdk / tools / kbdtool / main.c
diff --git a/sdk/tools/kbdtool/main.c b/sdk/tools/kbdtool/main.c
new file mode 100644 (file)
index 0000000..9a5517a
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * PROJECT:         ReactOS Build Tools [Keyboard Layout Compiler]
+ * LICENSE:         BSD - See COPYING.BSD in the top level directory
+ * FILE:            tools/kbdtool/main.c
+ * PURPOSE:         Main Logic Loop
+ * PROGRAMMERS:     ReactOS Foundation
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "kbdtool.h"
+
+/* GLOBALS ********************************************************************/
+
+/* Internal tool data */
+ULONG gVersion = 3;
+ULONG gSubVersion = 40;
+
+/* Input file */
+PCHAR gpszFileName;
+FILE* gfpInput;
+
+/* Command-line parameters */
+BOOLEAN UnicodeFile, Verbose, NoLogo, FallbackDriver, SanityCheck, SourceOnly;
+ULONG BuildType;
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+PrintUsage(VOID)
+{
+    /* This is who we are */
+    printf("\nKbdTool v%d.%02d - convert keyboard text file to C file or a keyboard layout DLL\n\n",
+           gVersion, gSubVersion);
+
+    /* This is what we do */
+    printf("Usage: KbdTool [-v] [-n] [-w] [-k] [-n] [-u|a] [-i|x|m|o|s] FILE\n\n");
+    printf("\t[-?] display this message\n");
+    printf("\t[-n] no logo or normal build information displayed\n\n");
+    printf("\t[-a] Uses non-Unicode source files (default)\n");
+    printf("\t[-u] Uses Unicode source files\n\n");
+    printf("\t[-v] Verbose diagnostics (and warnings, with -w)\n");
+    printf("\t[-w] display extended Warnings\n\n");
+    printf("\t[-x] Builds for x86 (default)\n");
+    printf("\t[-i] Builds for IA64\n");
+    printf("\t[-m] Builds for AMD64\n");
+    printf("\t[-o] Builds for WOW64\n");
+    printf("\t[-s] Generate Source files (no build)\n\n");
+    printf("\tFILE The source keyboard file (required)\n\n");
+
+    /* Extra hints */
+    printf("\t-u/-a are mutually exclusive; kbdutool will use the last one if you specify more than one.\n");
+    printf("\t-i/-x/-m/-o-s will exhibit the same behavior when than one of them is specified.\n\n");
+
+    /* Quit */
+    exit(1);
+    printf("should not be here");
+}
+
+INT
+main(INT argc,
+     PCHAR* argv)
+{
+    ULONG i, ErrorCode, FailureCode;
+    CHAR Option;
+    PCHAR OpenFlags;
+    CHAR BuildOptions[16] = {0};
+
+    /* Loop for parameter */
+    for (i = 1; i < argc; ++i)
+    {
+        if (argv[i][0] != '/' && argv[i][0] != '-')
+            break;
+
+        if (argv[i][1] && !argv[i][2])
+            Option = argv[i][1];
+        else
+            Option = 0;
+
+        /* Check supported options */
+        switch (Option)
+        {
+            /* ASCII File */
+            case 'A':
+            case 'a':
+                UnicodeFile = 0;
+                break;
+
+            /* UNICODE File */
+            case 'U':
+            case 'u':
+                UnicodeFile = 1;
+                break;
+
+            /* Verbose */
+            case 'V':
+            case 'v':
+                Verbose = 1;
+                break;
+
+            /* No logo */
+            case 'N':
+            case 'n':
+                NoLogo = 1;
+                break;
+
+            /* Fallback driver */
+            case 'K':
+            case 'k':
+                FallbackDriver = 1;
+                break;
+
+            /* Sanity Check */
+            case 'W':
+            case 'w':
+                SanityCheck = 1;
+                break;
+
+            /* Itanium */
+            case 'I':
+            case 'i':
+                BuildType = 1;
+                break;
+
+            /* X86 */
+            case 'X':
+            case 'x':
+                BuildType = 0;
+                break;
+
+            /* AMD64 */
+            case 'M':
+            case 'm':
+                BuildType = 2;
+                break;
+
+            /* WOW64 */
+            case 'O':
+            case 'o':
+                BuildType = 3;
+                break;
+
+            /* Source only */
+            case 'S':
+            case 's':
+                SourceOnly = 1;
+                break;
+
+            default:
+                /* If you got here, the options are invalid or missing */
+                PrintUsage();
+                break;
+        }
+    }
+
+    /* Do we have no options? */
+    if (i == argc) PrintUsage();
+
+    /* Should we announce ourselves? */
+    if (!NoLogo)
+    {
+        /* This is who we are */
+        printf("\nKbdTool v%d.%02d - convert keyboard text file to C file or a keyboard layout DLL\n\n",
+               gVersion, gSubVersion);
+    }
+
+    /* Save the file name */
+    gpszFileName = argv[i];
+
+    /* Open either as binary or text */
+    OpenFlags = "rb";
+    if (!UnicodeFile) OpenFlags = "rt";
+
+    /* Open a handle to the file */
+    gfpInput = fopen(gpszFileName, OpenFlags);
+    if (!gfpInput)
+    {
+        /* Couldn't open it */
+        printf("Unable to open '%s' for read.\n", gpszFileName);
+        exit(1);
+    }
+
+    /* Should we print out what we're doing? */
+    if (!NoLogo)
+    {
+        /* Are we only building the source files? */
+        if (SourceOnly)
+        {
+            /* Then there's no target architecture */
+            strcpy(BuildOptions, "source files");
+        }
+        else
+        {
+            /* Take a look at the target architecture*/
+            switch (BuildType)
+            {
+                /* Print the appropriate message depending on what was chosen */
+                case 0:
+                    strcpy(BuildOptions, "i386/x86");
+                    break;
+                case 1:
+                    strcpy(BuildOptions, "ia64");
+                    break;
+                case 2:
+                    strcpy(BuildOptions, "amd64/x64");
+                    break;
+                case 3:
+                    strcpy(BuildOptions, "wow64");
+                    break;
+                default:
+                    strcpy(BuildOptions, "unknown purpose");
+                    break;
+            }
+        }
+
+        /* Now inform the user */
+        printf("Compiling layout information from '%s' for %s.\n", gpszFileName, BuildOptions);
+    }
+
+    /* Now parse the keywords */
+    FailureCode = DoParsing();
+
+    /* Should we build? */
+    if (!(SourceOnly) && !(FallbackDriver)) ErrorCode = 0;//DoBuild();
+
+    /* Did everything work? */
+    if (FailureCode == 0)
+    {
+        /* Tell the user, if he cares */
+        if (!NoLogo) printf("All tasks completed successfully.\n");
+    }
+    else
+    {
+        /* Print the failure code */
+        printf("\n     %13d\n", FailureCode);
+    }
+
+    /* Return the error code */
+    return ErrorCode;
+}
+
+/* EOF */