1 /* 2 * PROJECT: ReactOS Build Tools [Keyboard Layout Compiler] 3 * LICENSE: BSD - See COPYING.BSD in the top level directory 4 * FILE: tools/kbdtool/main.c 5 * PURPOSE: Main Logic Loop 6 * PROGRAMMERS: ReactOS Foundation 7 */ 8 9 /* INCLUDES *******************************************************************/ 10 11 #include "kbdtool.h" 12 13 /* GLOBALS ********************************************************************/ 14 15 /* Internal tool data */ 16 ULONG gVersion = 3; 17 ULONG gSubVersion = 40; 18 19 /* Input file */ 20 PCHAR gpszFileName; 21 FILE* gfpInput; 22 23 /* Command-line parameters */ 24 BOOLEAN UnicodeFile, Verbose, NoLogo, FallbackDriver, SanityCheck, SourceOnly; 25 ULONG BuildType; 26 27 /* FUNCTIONS ******************************************************************/ 28 29 VOID 30 PrintUsage(VOID) 31 { 32 /* This is who we are */ 33 printf("\nKbdTool v%d.%02d - convert keyboard text file to C file or a keyboard layout DLL\n\n", 34 gVersion, gSubVersion); 35 36 /* This is what we do */ 37 printf("Usage: KbdTool [-v] [-n] [-w] [-k] [-n] [-u|a] [-i|x|m|o|s] FILE\n\n"); 38 printf("\t[-?] display this message\n"); 39 printf("\t[-n] no logo or normal build information displayed\n\n"); 40 printf("\t[-a] Uses non-Unicode source files (default)\n"); 41 printf("\t[-u] Uses Unicode source files\n\n"); 42 printf("\t[-v] Verbose diagnostics (and warnings, with -w)\n"); 43 printf("\t[-w] display extended Warnings\n\n"); 44 printf("\t[-x] Builds for x86 (default)\n"); 45 printf("\t[-i] Builds for IA64\n"); 46 printf("\t[-m] Builds for AMD64\n"); 47 printf("\t[-o] Builds for WOW64\n"); 48 printf("\t[-s] Generate Source files (no build)\n\n"); 49 printf("\tFILE The source keyboard file (required)\n\n"); 50 51 /* Extra hints */ 52 printf("\t-u/-a are mutually exclusive; kbdutool will use the last one if you specify more than one.\n"); 53 printf("\t-i/-x/-m/-o-s will exhibit the same behavior when than one of them is specified.\n\n"); 54 55 /* Quit */ 56 exit(1); 57 printf("should not be here"); 58 } 59 60 INT 61 main(INT argc, 62 PCHAR* argv) 63 { 64 int i; 65 ULONG ErrorCode, FailureCode; 66 CHAR Option; 67 PCHAR OpenFlags; 68 CHAR BuildOptions[16] = {0}; 69 70 /* Loop for parameter */ 71 for (i = 1; i < argc; ++i) 72 { 73 if (argv[i][0] != '/' && argv[i][0] != '-') 74 break; 75 76 if (argv[i][1] && !argv[i][2]) 77 Option = argv[i][1]; 78 else 79 Option = 0; 80 81 /* Check supported options */ 82 switch (Option) 83 { 84 /* ASCII File */ 85 case 'A': 86 case 'a': 87 UnicodeFile = 0; 88 break; 89 90 /* UNICODE File */ 91 case 'U': 92 case 'u': 93 UnicodeFile = 1; 94 break; 95 96 /* Verbose */ 97 case 'V': 98 case 'v': 99 Verbose = 1; 100 break; 101 102 /* No logo */ 103 case 'N': 104 case 'n': 105 NoLogo = 1; 106 break; 107 108 /* Fallback driver */ 109 case 'K': 110 case 'k': 111 FallbackDriver = 1; 112 break; 113 114 /* Sanity Check */ 115 case 'W': 116 case 'w': 117 SanityCheck = 1; 118 break; 119 120 /* Itanium */ 121 case 'I': 122 case 'i': 123 BuildType = 1; 124 break; 125 126 /* X86 */ 127 case 'X': 128 case 'x': 129 BuildType = 0; 130 break; 131 132 /* AMD64 */ 133 case 'M': 134 case 'm': 135 BuildType = 2; 136 break; 137 138 /* WOW64 */ 139 case 'O': 140 case 'o': 141 BuildType = 3; 142 break; 143 144 /* Source only */ 145 case 'S': 146 case 's': 147 SourceOnly = 1; 148 break; 149 150 default: 151 /* If you got here, the options are invalid or missing */ 152 PrintUsage(); 153 break; 154 } 155 } 156 157 /* Do we have no options? */ 158 if (i == argc) PrintUsage(); 159 160 /* Should we announce ourselves? */ 161 if (!NoLogo) 162 { 163 /* This is who we are */ 164 printf("\nKbdTool v%d.%02d - convert keyboard text file to C file or a keyboard layout DLL\n\n", 165 gVersion, gSubVersion); 166 } 167 168 /* Save the file name */ 169 gpszFileName = argv[i]; 170 171 /* Open either as binary or text */ 172 OpenFlags = "rb"; 173 if (!UnicodeFile) OpenFlags = "rt"; 174 175 /* Open a handle to the file */ 176 gfpInput = fopen(gpszFileName, OpenFlags); 177 if (!gfpInput) 178 { 179 /* Couldn't open it */ 180 printf("Unable to open '%s' for read.\n", gpszFileName); 181 exit(1); 182 } 183 184 /* Should we print out what we're doing? */ 185 if (!NoLogo) 186 { 187 /* Are we only building the source files? */ 188 if (SourceOnly) 189 { 190 /* Then there's no target architecture */ 191 strcpy(BuildOptions, "source files"); 192 } 193 else 194 { 195 /* Take a look at the target architecture*/ 196 switch (BuildType) 197 { 198 /* Print the appropriate message depending on what was chosen */ 199 case 0: 200 strcpy(BuildOptions, "i386/x86"); 201 break; 202 case 1: 203 strcpy(BuildOptions, "ia64"); 204 break; 205 case 2: 206 strcpy(BuildOptions, "amd64/x64"); 207 break; 208 case 3: 209 strcpy(BuildOptions, "wow64"); 210 break; 211 default: 212 strcpy(BuildOptions, "unknown purpose"); 213 break; 214 } 215 } 216 217 /* Now inform the user */ 218 printf("Compiling layout information from '%s' for %s.\n", gpszFileName, BuildOptions); 219 } 220 221 /* Now parse the keywords */ 222 FailureCode = DoParsing(); 223 224 /* Should we build? */ 225 if (!(SourceOnly) && !(FallbackDriver)) ErrorCode = 0;//DoBuild(); 226 227 /* Did everything work? */ 228 if (FailureCode == 0) 229 { 230 /* Tell the user, if he cares */ 231 if (!NoLogo) printf("All tasks completed successfully.\n"); 232 } 233 else 234 { 235 /* Print the failure code */ 236 printf("\n %13d\n", FailureCode); 237 } 238 239 /* Return the error code */ 240 return ErrorCode; 241 } 242 243 /* EOF */ 244