reactos/sdk/tools/kbdtool/main.c

243 lines
6.3 KiB
C

/*
* 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)
{
int i;
ULONG 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 */