MCOUT.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:
Windows编程
开发平台:
Visual C++
- /*++
- Copyright (c) 1991-1997 Microsoft Corporation
- Module Name:
- mcout.c
- Abstract:
- This file contains the output functions of the Win32 Message Compiler (MC)
- --*/
- #include "mc.h"
- PMESSAGE_BLOCK MessageBlocks = NULL;
- int NumberOfBlocks = 0;
- /*++
- Routine Description:
- Arguments:
- Return Value:
- --*/
- BOOLEAN
- McBlockMessages( void )
- {
- PMESSAGE_BLOCK p, *pp;
- PMESSAGE_INFO MessageInfo;
- pp = &MessageBlocks;
- p = NULL;
- MessageInfo = Messages;
- while (MessageInfo) {
- if (p) {
- if (p->HighId+1 == MessageInfo->Id) {
- p->HighId += 1;
- }
- else {
- pp = &p->Next;
- }
- }
- if (!*pp) {
- NumberOfBlocks += 1;
- p = malloc( sizeof( *p ) );
- p->Next = NULL;
- p->LowId = MessageInfo->Id;
- p->HighId = MessageInfo->Id;
- p->LowInfo = MessageInfo;
- *pp = p;
- }
- MessageInfo = MessageInfo->Next;
- }
- return( TRUE );
- }
- /*++
- Routine Description:
- Arguments:
- Return Value:
- --*/
- BOOLEAN
- McWriteBinaryFiles( void )
- {
- PNAME_INFO LanguageName, *pp;
- PLANGUAGE_INFO LanguageInfo;
- PMESSAGE_INFO MessageInfo;
- PMESSAGE_BLOCK BlockInfo;
- char *FileName;
- ULONG cb;
- ULONG MessageOffset;
- MESSAGE_RESOURCE_ENTRY MessageEntry;
- MESSAGE_RESOURCE_BLOCK MessageBlock;
- MESSAGE_RESOURCE_DATA MessageData;
- ULONG Zeroes = 0;
- ULONG NumberOfMessages;
- FileName = BinaryMessageFileName;
- FileName += strlen( FileName );
- pp = &LanguageNames;
- while (LanguageName = *pp) {
- pp = &LanguageName->Next;
- if (!LanguageName->Used) {
- continue;
- }
- strcpy( FileName, LanguageName->Value );
- strcat( FileName, ".bin" );
- if (!(BinaryMessageFile = fopen( BinaryMessageFileName, "wb" ))) {
- McInputError( "unable to open output file - %s", TRUE, BinaryMessageFileName );
- return( FALSE );
- }
- if (VerboseOutput) {
- fprintf( stderr, "Writing %sn", BinaryMessageFileName );
- }
- fprintf( RcInclFile, "LANGUAGE 0x%x,0x%xrn",
- PRIMARYLANGID( LanguageName->Id ),
- SUBLANGID( LanguageName->Id )
- );
- fprintf( RcInclFile, "1 11 %srn", FileName );
- NumberOfMessages = 0L;
- MessageData.NumberOfBlocks = NumberOfBlocks;
- MessageOffset = fwrite( &MessageData,
- 1,
- (size_t)FIELD_OFFSET( MESSAGE_RESOURCE_DATA,
- Blocks[ 0 ]
- ),
- BinaryMessageFile
- );
- MessageOffset += NumberOfBlocks * sizeof( MessageBlock );
- BlockInfo = MessageBlocks;
- while (BlockInfo) {
- MessageBlock.LowId = BlockInfo->LowId;
- MessageBlock.HighId = BlockInfo->HighId;
- MessageBlock.OffsetToEntries = MessageOffset;
- fwrite( &MessageBlock, 1, sizeof( MessageBlock ), BinaryMessageFile );
- BlockInfo->InfoLength = 0;
- MessageInfo = BlockInfo->LowInfo;
- while (MessageInfo != NULL && MessageInfo->Id <= BlockInfo->HighId) {
- LanguageInfo = MessageInfo->MessageText;
- while (LanguageInfo) {
- if (LanguageInfo->Id == LanguageName->Id) {
- break;
- }
- else {
- LanguageInfo = LanguageInfo->Next;
- }
- }
- if (LanguageInfo != NULL) {
- cb = FIELD_OFFSET( MESSAGE_RESOURCE_ENTRY, Text[ 0 ] ) +
- LanguageInfo->Length + 1;
- cb = (cb + 3) & ~3;
- BlockInfo->InfoLength += cb;
- }
- else {
- fprintf( stderr,
- "MC: No %s language text for %sn",
- LanguageName->Name,
- MessageInfo->SymbolicName
- );
- fclose( BinaryMessageFile );
- return( FALSE );
- }
- MessageInfo = MessageInfo->Next;
- }
- if (VerboseOutput) {
- fprintf( stderr, " [%08lx .. %08lx] - %lu bytesn",
- BlockInfo->LowId,
- BlockInfo->HighId,
- BlockInfo->InfoLength
- );
- }
- MessageOffset += BlockInfo->InfoLength;
- BlockInfo = BlockInfo->Next;
- }
- BlockInfo = MessageBlocks;
- while (BlockInfo) {
- MessageInfo = BlockInfo->LowInfo;
- while (MessageInfo != NULL && MessageInfo->Id <= BlockInfo->HighId) {
- LanguageInfo = MessageInfo->MessageText;
- while (LanguageInfo) {
- if (LanguageInfo->Id == LanguageName->Id) {
- break;
- }
- else {
- LanguageInfo = LanguageInfo->Next;
- }
- }
- if (LanguageInfo != NULL) {
- cb = FIELD_OFFSET( MESSAGE_RESOURCE_ENTRY, Text[ 0 ] ) +
- LanguageInfo->Length + 1;
- cb = (cb + 3) & ~3;
- MessageEntry.Length = (USHORT)cb;
- MessageEntry.Flags = 0;
- cb = fwrite( &MessageEntry,
- 1,
- (size_t)FIELD_OFFSET( MESSAGE_RESOURCE_ENTRY,
- Text[ 0 ]
- ),
- BinaryMessageFile
- );
- cb += fwrite( LanguageInfo->Text,
- 1,
- (size_t)LanguageInfo->Length,
- BinaryMessageFile
- );
- NumberOfMessages++;
- cb = MessageEntry.Length - cb;
- if (cb) {
- fwrite( &Zeroes,
- 1,
- (size_t)cb,
- BinaryMessageFile
- );
- }
- }
- MessageInfo = MessageInfo->Next;
- }
- BlockInfo = BlockInfo->Next;
- }
- if (VerboseOutput) {
- fprintf( stderr, " Total of %lu messages, %lu bytesn",
- NumberOfMessages,
- ftell( BinaryMessageFile )
- );
- }
- fclose( BinaryMessageFile );
- }
- return( TRUE );
- }