|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1991 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: mcout.c ! 8: ! 9: Abstract: ! 10: ! 11: This file contains the output functions of the Win32 Message Compiler (MC) ! 12: ! 13: --*/ ! 14: ! 15: #include "mc.h" ! 16: ! 17: PMESSAGE_BLOCK MessageBlocks = NULL; ! 18: int NumberOfBlocks = 0; ! 19: ! 20: /*++ ! 21: ! 22: Routine Description: ! 23: ! 24: Arguments: ! 25: ! 26: ! 27: Return Value: ! 28: ! 29: ! 30: --*/ ! 31: ! 32: ! 33: BOOLEAN ! 34: McBlockMessages( void ) ! 35: { ! 36: PMESSAGE_BLOCK p, *pp; ! 37: PMESSAGE_INFO MessageInfo; ! 38: ! 39: pp = &MessageBlocks; ! 40: p = NULL; ! 41: ! 42: MessageInfo = Messages; ! 43: while (MessageInfo) { ! 44: if (p) { ! 45: if (p->HighId+1 == MessageInfo->Id) { ! 46: p->HighId += 1; ! 47: } ! 48: else { ! 49: pp = &p->Next; ! 50: } ! 51: } ! 52: ! 53: if (!*pp) { ! 54: NumberOfBlocks += 1; ! 55: p = malloc( sizeof( *p ) ); ! 56: p->Next = NULL; ! 57: p->LowId = MessageInfo->Id; ! 58: p->HighId = MessageInfo->Id; ! 59: p->LowInfo = MessageInfo; ! 60: *pp = p; ! 61: } ! 62: ! 63: MessageInfo = MessageInfo->Next; ! 64: } ! 65: ! 66: return( TRUE ); ! 67: } ! 68: ! 69: /*++ ! 70: ! 71: Routine Description: ! 72: ! 73: Arguments: ! 74: ! 75: ! 76: Return Value: ! 77: ! 78: ! 79: --*/ ! 80: ! 81: ! 82: BOOLEAN ! 83: McWriteBinaryFiles( void ) ! 84: { ! 85: PNAME_INFO LanguageName, *pp; ! 86: PLANGUAGE_INFO LanguageInfo; ! 87: PMESSAGE_INFO MessageInfo; ! 88: PMESSAGE_BLOCK BlockInfo; ! 89: char *FileName; ! 90: ULONG cb; ! 91: ULONG MessageOffset; ! 92: MESSAGE_RESOURCE_ENTRY MessageEntry; ! 93: MESSAGE_RESOURCE_BLOCK MessageBlock; ! 94: MESSAGE_RESOURCE_DATA MessageData; ! 95: ULONG Zeroes = 0; ! 96: ULONG NumberOfMessages; ! 97: ! 98: FileName = BinaryMessageFileName; ! 99: FileName += strlen( FileName ); ! 100: ! 101: pp = &LanguageNames; ! 102: while (LanguageName = *pp) { ! 103: pp = &LanguageName->Next; ! 104: if (!LanguageName->Used) { ! 105: continue; ! 106: } ! 107: ! 108: strcpy( FileName, LanguageName->Value ); ! 109: strcat( FileName, ".bin" ); ! 110: if (!(BinaryMessageFile = fopen( BinaryMessageFileName, "wb" ))) { ! 111: McInputError( "unable to open output file - %s", TRUE, BinaryMessageFileName ); ! 112: return( FALSE ); ! 113: } ! 114: ! 115: if (VerboseOutput) { ! 116: fprintf( stderr, "Writing %s\n", BinaryMessageFileName ); ! 117: } ! 118: ! 119: fprintf( RcInclFile, "LANGUAGE 0x%x,0x%x\r\n", ! 120: PRIMARYLANGID( LanguageName->Id ), ! 121: SUBLANGID( LanguageName->Id ) ! 122: ); ! 123: ! 124: fprintf( RcInclFile, "1 11 %s\r\n", FileName ); ! 125: ! 126: NumberOfMessages = 0L; ! 127: ! 128: MessageData.NumberOfBlocks = NumberOfBlocks; ! 129: MessageOffset = fwrite( &MessageData, ! 130: 1, ! 131: (size_t)FIELD_OFFSET( MESSAGE_RESOURCE_DATA, ! 132: Blocks[ 0 ] ! 133: ), ! 134: BinaryMessageFile ! 135: ); ! 136: MessageOffset += NumberOfBlocks * sizeof( MessageBlock ); ! 137: ! 138: BlockInfo = MessageBlocks; ! 139: while (BlockInfo) { ! 140: MessageBlock.LowId = BlockInfo->LowId; ! 141: MessageBlock.HighId = BlockInfo->HighId; ! 142: MessageBlock.OffsetToEntries = MessageOffset; ! 143: fwrite( &MessageBlock, 1, sizeof( MessageBlock ), BinaryMessageFile ); ! 144: ! 145: BlockInfo->InfoLength = 0; ! 146: MessageInfo = BlockInfo->LowInfo; ! 147: while (MessageInfo != NULL && MessageInfo->Id <= BlockInfo->HighId) { ! 148: LanguageInfo = MessageInfo->MessageText; ! 149: while (LanguageInfo) { ! 150: if (LanguageInfo->Id == LanguageName->Id) { ! 151: break; ! 152: } ! 153: else { ! 154: LanguageInfo = LanguageInfo->Next; ! 155: } ! 156: } ! 157: ! 158: if (LanguageInfo != NULL) { ! 159: cb = FIELD_OFFSET( MESSAGE_RESOURCE_ENTRY, Text[ 0 ] ) + ! 160: LanguageInfo->Length + 1; ! 161: ! 162: cb = (cb + 3) & ~3; ! 163: BlockInfo->InfoLength += cb; ! 164: } ! 165: else { ! 166: fprintf( stderr, ! 167: "MC: No %s language text for %s\n", ! 168: LanguageName->Name, ! 169: MessageInfo->SymbolicName ! 170: ); ! 171: fclose( BinaryMessageFile ); ! 172: return( FALSE ); ! 173: } ! 174: ! 175: MessageInfo = MessageInfo->Next; ! 176: } ! 177: ! 178: if (VerboseOutput) { ! 179: fprintf( stderr, " [%08lx .. %08lx] - %lu bytes\n", ! 180: BlockInfo->LowId, ! 181: BlockInfo->HighId, ! 182: BlockInfo->InfoLength ! 183: ); ! 184: } ! 185: ! 186: MessageOffset += BlockInfo->InfoLength; ! 187: BlockInfo = BlockInfo->Next; ! 188: } ! 189: ! 190: BlockInfo = MessageBlocks; ! 191: while (BlockInfo) { ! 192: MessageInfo = BlockInfo->LowInfo; ! 193: while (MessageInfo != NULL && MessageInfo->Id <= BlockInfo->HighId) { ! 194: LanguageInfo = MessageInfo->MessageText; ! 195: while (LanguageInfo) { ! 196: if (LanguageInfo->Id == LanguageName->Id) { ! 197: break; ! 198: } ! 199: else { ! 200: LanguageInfo = LanguageInfo->Next; ! 201: } ! 202: } ! 203: ! 204: if (LanguageInfo != NULL) { ! 205: cb = FIELD_OFFSET( MESSAGE_RESOURCE_ENTRY, Text[ 0 ] ) + ! 206: LanguageInfo->Length + 1; ! 207: ! 208: cb = (cb + 3) & ~3; ! 209: ! 210: MessageEntry.Length = (USHORT)cb; ! 211: MessageEntry.Flags = 0; ! 212: ! 213: cb = fwrite( &MessageEntry, ! 214: 1, ! 215: (size_t)FIELD_OFFSET( MESSAGE_RESOURCE_ENTRY, ! 216: Text[ 0 ] ! 217: ), ! 218: BinaryMessageFile ! 219: ); ! 220: cb += fwrite( LanguageInfo->Text, ! 221: 1, ! 222: (size_t)LanguageInfo->Length, ! 223: BinaryMessageFile ! 224: ); ! 225: ! 226: NumberOfMessages++; ! 227: ! 228: cb = MessageEntry.Length - cb; ! 229: if (cb) { ! 230: fwrite( &Zeroes, ! 231: 1, ! 232: (size_t)cb, ! 233: BinaryMessageFile ! 234: ); ! 235: } ! 236: } ! 237: ! 238: MessageInfo = MessageInfo->Next; ! 239: } ! 240: ! 241: BlockInfo = BlockInfo->Next; ! 242: } ! 243: ! 244: if (VerboseOutput) { ! 245: fprintf( stderr, " Total of %lu messages, %lu bytes\n", ! 246: NumberOfMessages, ! 247: ftell( BinaryMessageFile ) ! 248: ); ! 249: } ! 250: ! 251: fclose( BinaryMessageFile ); ! 252: } ! 253: ! 254: return( TRUE ); ! 255: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.