/*++ Copyright (c) 1991 Microsoft Corporation Module Name: mc.c Abstract: This is the main source file for the Win32 Message Compiler (MC) Author: Steve Wood (stevewo) 21-Aug-1991 Revision History: --*/ #include "mc.h" #include "version.h" #include #include NAME_INFO DefaultLanguageName; int UnicodeOutput=TRUE; BOOL fUniqueBinName = FALSE; void ConvertAppToOem( unsigned argc, char* argv[] ) /*++ Routine Description: Converts the command line from ANSI to OEM, and force the app to use OEM APIs Arguments: argc - Standard C argument count. argv - Standard C argument strings. Return Value: None. --*/ { unsigned i; for (i = 0; i < argc; i++ ) { CharToOem( argv[i], argv[i] ); } SetFileApisToOEM(); } void InitializeMCNls( void ); void McPrintUsage( void ) { fprintf(stderr, "Microsoft (R) Message Compiler Version 1.12.%04d\n" VER_LEGALCOPYRIGHT_STR "\n\n", VER_PRODUCTBUILD); fputs("usage: MC [-?aAcdnosuUvw] [-m maxmsglen] [-h dirspec] [-e extension] [-r dirspec] [-x dbgFileSpec] filename.mc\n" " -? - displays this message\n" " -a - input file is ANSI (default).\n" " -A - messages in .BIN file should be ANSI.\n" " -b - .BIN filename should have .mc filename_ included for uniqueness.\n" " -c - sets the Customer bit in all the message Ids.\n" " -d - FACILTY and SEVERITY values in header file in decimal.\n" " Sets message values in header to decimal initially.\n" " -e extension - Specify the extension for the header file.\n" " From 1 - 3 chars.\n" " -h pathspec - gives the path of where to create the C include file\n" " Default is .\\\n" " -m maxmsglen - generate a warning if the size of any message exceeds\n" " maxmsglen characters.\n" " -n - terminates all strings with null's in the message tables.\n" " -o - generate OLE2 header file (use HRESULT definition instead of\n" " status code definition)\n" " -r pathspec - gives the path of where to create the RC include file\n" " and the binary message resource files it includes.\n" " Default is .\\\n" " -s - insert symbolic name as first line of each message.\n" " -u - input file is Unicode.\n" " -U - messages in .BIN file should be Unicode (default).\n" " -v - gives verbose output.\n" " -w - warns if message text contains non-OS/2 compatible inserts.\n" " -x pathspec - gives the path of where to create the .dbg C include\n" " file that maps message Ids to their symbolic name.\n" " filename.mc - gives the names of a message text file\n" " to compile.\n" " Generated files have the Archive bit cleared.\n", stderr); } int __cdecl main( int argc, char *argv[] ) { char c, *s, *s1; int i; int ShowUsage; setlocale(LC_ALL, ""); if (argc == 1) { McPrintUsage(); exit(1); } ConvertAppToOem( argc, argv ); // Initialize CurrentLanguageName DefaultLanguageName.CodePage = GetOEMCP(); CurrentLanguageName = &DefaultLanguageName; CurrentFacilityName = McAddName( &FacilityNames, L"Application", 0x0, NULL ); CurrentSeverityName = McAddName( &SeverityNames, L"Success", 0x0, NULL ); McAddName( &SeverityNames, L"Informational", 0x1, NULL ); McAddName( &SeverityNames, L"Warning", 0x2, NULL ); McAddName( &SeverityNames, L"Error", 0x3, NULL ); McAddName( &LanguageNames, L"English", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), L"MSG00001" ); strcpy( DebugFileName, ".\\" ); strcpy( HeaderFileName, ".\\" ); strcpy( HeaderFileExt, "h" ); strcpy( RcInclFileName, ".\\" ); strcpy( BinaryMessageFileName, ".\\" ); MessageFileName[ 0 ] = '\0'; McInitLexer(); NULLTerminate = FALSE; VerboseOutput = FALSE; WarnOs2Compatible = FALSE; GenerateDecimalSevAndFacValues = FALSE; GenerateDecimalMessageValues = FALSE; GenerateDebugFile = FALSE; MaxMessageLength = 0; // No limit ShowUsage = FALSE; while (--argc) { s = *++argv; if (*s == '-' || *s == '/') { while (c = *++s) { switch( tolower( c ) ) { case '?': McPrintUsage(); exit( 0 ); break; case 'a': if (c == 'a') { UnicodeInput = FALSE; } else { UnicodeOutput = FALSE; } break; case 'b': fUniqueBinName = TRUE; break; case 'c': CustomerMsgIdBit = 0x1 << 29; break; case 'd': GenerateDecimalSevAndFacValues = TRUE; GenerateDecimalMessageValues = TRUE; break; case 'e': if (--argc) { strcpy( HeaderFileExt, *++argv ); i = strlen( HeaderFileExt ); if ((i < 1) || (i > 3) || (*HeaderFileExt == '.')) { fprintf( stderr, "MC: invalid argument for -%c switch\n", (USHORT)c ); ShowUsage = TRUE; } } else { argc++; fprintf( stderr, "MC: missing argument for -%c switch\n", (USHORT)c ); ShowUsage = TRUE; } break; case 'h': if (--argc) { strcpy( s1 = HeaderFileName, *++argv ); // s1 += strlen( s1 ) - 1; s1 += strlen(s1); s1 = CharPrev( HeaderFileName, s1 ); if (*s1 != '\\' && *s1 != '/') { // *++s1 = '\\'; s1 = CharNext( s1 ); *s1 = '\\'; *++s1 = '\0'; } } else { argc++; fprintf( stderr, "MC: missing argument for -%c switch\n", (USHORT)c ); ShowUsage = TRUE; } break; case 'm': if (--argc) { MaxMessageLength = atoi(*++argv); if (MaxMessageLength <= 0) { fprintf( stderr, "MC: invalid argument (%s) for -%c switch\n", *argv, (USHORT)c ); ShowUsage = TRUE; } } else { argc++; fprintf( stderr, "MC: missing argument for -%c switch\n", (USHORT)c ); ShowUsage = TRUE; } break; case 'n': NULLTerminate = TRUE; break; case 'o': OleOutput = TRUE; break; case 'r': if (--argc) { strcpy( s1 = RcInclFileName, *++argv ); // s1 += strlen( s1 ) - 1; s1 += strlen( s1 ); s1 = CharPrev( HeaderFileName, s1 ); if (*s1 != '\\' && *s1 != '/') { // *++s1 = '\\'; s1 = CharNext( s1 ); *s1 = '\\'; *++s1 = '\0'; } strcpy( BinaryMessageFileName, RcInclFileName ); } else { argc++; fprintf( stderr, "MC: missing argument for -%c switch\n", (USHORT)c ); ShowUsage = TRUE; } break; case 's': InsertSymbolicName = TRUE; break; case 'u': if (c == 'u') { UnicodeInput = TRUE; } else { UnicodeOutput = TRUE; } break; case 'v': VerboseOutput = TRUE; break; case 'w': WarnOs2Compatible = TRUE; break; case 'x': if (--argc) { strcpy( s1 = DebugFileName, *++argv ); // s1 += strlen( s1 ) - 1; s1 += strlen( s1 ); s1 = CharPrev( HeaderFileName, s1 ); if (*s1 != '\\' && *s1 != '/') { // *++s1 = '\\'; s1 = CharNext( s1 ); *s1 = '\\'; *++s1 = '\0'; } GenerateDebugFile = TRUE; } else { argc++; fprintf( stderr, "MC: missing argument for -%c switch\n", (USHORT)c ); ShowUsage = TRUE; } break; default: fprintf( stderr, "MC: Invalid switch: %c\n", (USHORT)c ); ShowUsage = TRUE; break; } } } else if (strlen( MessageFileName )) { fprintf( stderr, "MC: may only specify one message file to compile.\n" ); ShowUsage = TRUE; } else { strcpy( MessageFileName, s ); } } if (ShowUsage) { McPrintUsage(); exit( 1 ); } if (fUniqueBinName) { _splitpath(MessageFileName, NULL, NULL, FNameMsgFileName, NULL); strcat(BinaryMessageFileName, FNameMsgFileName); strcat(BinaryMessageFileName, "_"); } if (UnicodeInput) { if (!IsFileUnicode( MessageFileName )) { fprintf( stderr, "MC: -u switch cannot be used with non-Unicode message file!\n" ); exit( 1 ); } } else { if (IsFileUnicode( MessageFileName )) { fprintf( stderr, "MC: -u switch must be used with Unicode message file!\n" ); exit( 1 ); } } InputErrorCount = 0; ResultCode = 1; if (McParseFile() && McBlockMessages() && (UnicodeOutput ? McWriteBinaryFilesW() : McWriteBinaryFilesA())) { if (InputErrorCount == 0) { ResultCode = 0; } } McCloseInputFile(); McCloseOutputFiles((BOOL)(ResultCode == 0)); return( ResultCode ); }