MC.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1991-1997 Microsoft Corporation
  3. Module Name:
  4.     mc.c
  5. Abstract:
  6.     This is the main source file for the Win32 Message Compiler (MC)
  7. --*/
  8. #include "mc.h"
  9. #include "windows.h"
  10. void
  11. ConvertAppToOem( unsigned argc, char* argv[] )
  12. /*++
  13. Routine Description:
  14.     Converts the command line from ANSI to OEM, and force the app
  15.     to use OEM APIs
  16. Arguments:
  17.     argc - Standard C argument count.
  18.     argv - Standard C argument strings.
  19. Return Value:
  20.     None.
  21. --*/
  22. {
  23.     unsigned i;
  24.     for( i=0; i<argc; i++ ) {
  25.        CharToOem( argv[i], argv[i] );
  26.     }
  27.     SetFileApisToOEM();
  28. }
  29. void
  30. McPrintUsage( void )
  31. {
  32.     fprintf( stderr, "usage: MC [-?vws] [-h dirspec] [-r dirspec] filename.mcn" );
  33.     fprintf( stderr, "       -? - displays this messagen" );
  34.     fprintf( stderr, "       -v - gives verbose output.n" );
  35.     fprintf( stderr, "       -c - sets the Customer bit in all the message Ids.n" );
  36.     fprintf( stderr, "       -d - numeric values in header file in decimal.n" );
  37.     fprintf( stderr, "       -w - warns if message text contains non-OS/2 compatible inserts.n" );
  38.     fprintf( stderr, "       -s - insert symbolic name as first line of each message.n" );
  39.     fprintf( stderr, "       -h pathspec - gives the path of where to create the C include filen" );
  40.     fprintf( stderr, "                     Default is .\n" );
  41.     fprintf( stderr, "       -r pathspec - gives the path of where to create the RC include filen" );
  42.     fprintf( stderr, "                     and the binary message resource files it includes.n" );
  43.     fprintf( stderr, "                     Default is .\n" );
  44.     fprintf( stderr, "       filename.mc - gives the names of a message text filen" );
  45.     fprintf( stderr, "                     to compile.n" );
  46. }
  47. int
  48. _CRTAPI1 main(
  49.     int argc,
  50.     char *argv[]
  51.     )
  52. {
  53.     char c, *s, *s1;
  54.     int ShowUsage;
  55.     ConvertAppToOem( argc, argv );
  56.     FacilityNames = NULL;
  57.     SeverityNames = NULL;
  58.     LanguageNames = NULL;
  59.     MessageIdTypeName = NULL;
  60.     CurrentFacilityName =
  61.     McAddName( &FacilityNames, "Application",  0x0, NULL );
  62.     CurrentSeverityName =
  63.     McAddName( &SeverityNames, "Success",       0x0, NULL );
  64.     McAddName( &SeverityNames, "Informational", 0x1, NULL );
  65.     McAddName( &SeverityNames, "Warning",       0x2, NULL );
  66.     McAddName( &SeverityNames, "Error",         0x3, NULL );
  67.     McAddName( &LanguageNames,
  68.                "English",
  69.                MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  70.                "MSG00001"
  71.              );
  72.     strcpy( HeaderFileName, ".\" );
  73.     strcpy( RcInclFileName, ".\" );
  74.     strcpy( BinaryMessageFileName, ".\" );
  75.     MessageFileName[ 0 ] = '';
  76.     McInitLexer();
  77.     VerboseOutput = FALSE;
  78.     WarnOs2Compatible = FALSE;
  79.     GenerateDecimalValues = FALSE;
  80.     ShowUsage = FALSE;
  81.     while (--argc) {
  82.         s = *++argv;
  83.         if (*s == '-' || *s == '/') {
  84.             while (c = *++s) {
  85.                 switch( c ) {
  86.                 case '?':
  87.                     McPrintUsage();
  88.                     exit( 0 );
  89.                     break;
  90.                 case 'c':
  91.                     CustomerMsgIdBit = 0x1 << 29;
  92.                     break;
  93.                 case 'v':
  94.                     VerboseOutput = TRUE;
  95.                     break;
  96.                 case 'd':
  97.                     GenerateDecimalValues = TRUE;
  98.                     break;
  99.                 case 'w':
  100.                     WarnOs2Compatible = TRUE;
  101.                     break;
  102.                 case 's':
  103.                     InsertSymbolicName = TRUE;
  104.                     break;
  105.                 case 'h':
  106.                     if (--argc) {
  107.                         strcpy( s1 = HeaderFileName, *++argv );
  108. s1 += strlen( s1 );
  109.                         s1 = CharPrev( HeaderFileName, s1 );
  110.                         if (*s1 != '\' && *s1 != '/') {
  111.                             s1 = CharNext( s1 );
  112.                             *s1 = '\';
  113.                             *++s1 = '';
  114.     }
  115. }
  116.                     else {
  117.                         argc++;
  118.                         fprintf( stderr, "MC: missing argument for -%c switchn", (USHORT)c );
  119.                         ShowUsage = TRUE;
  120.                         }
  121.                     break;
  122.                 case 'r':
  123.                     if (--argc) {
  124. strcpy( s1 = RcInclFileName, *++argv );
  125.                         s1 += strlen( s1 );
  126.                         s1 = CharPrev( HeaderFileName, s1 );
  127.                         if (*s1 != '\' && *s1 != '/') {
  128.                             s1 = CharNext( s1 );
  129.                             *s1 = '\';
  130.                             *++s1 = '';
  131.                         }
  132. strcpy( BinaryMessageFileName, RcInclFileName );
  133.                         }
  134.                     else {
  135.                         argc++;
  136.                         fprintf( stderr, "MC: missing argument for -%c switchn", (USHORT)c );
  137.                         ShowUsage = TRUE;
  138.                         }
  139.                     break;
  140.                 default:
  141.                     fprintf( stderr, "MC: Invalid switch: %cn", (USHORT)c );
  142.                     ShowUsage = TRUE;
  143.                     break;
  144.                     }
  145.                 }
  146.             }
  147.         else
  148.         if (strlen( MessageFileName )) {
  149.             fprintf( stderr, "MC: may only specify one message file to compile.n" );
  150.             ShowUsage = TRUE;
  151.             }
  152.         else {
  153.             strcpy( MessageFileName, s );
  154.             }
  155.         }
  156.     if (ShowUsage) {
  157.         McPrintUsage();
  158.         exit( 1 );
  159.         }
  160.     ResultCode = 1;
  161.     if (McParseFile() && McBlockMessages() && McWriteBinaryFiles()) {
  162.         ResultCode = 0;
  163.         }
  164.     else {
  165.         McCloseInputFile();
  166.         McCloseOutputFiles();
  167.         }
  168.     return( ResultCode );
  169. }