static size_t MResFindHeaderSize( MResResourceHeader *header, bool use_unicode ) /******************************************************************************/ { size_t headersize; size_t namesize; size_t typesize; size_t padding; headersize = 2 * sizeof( uint_16 ) + 5 * sizeof( uint_32 ); namesize = MResFindNameOrOrdSize( header->Name, use_unicode ); typesize = MResFindNameOrOrdSize( header->Type, use_unicode ); headersize += ( namesize + typesize ); padding = RES_PADDING( typesize + namesize, sizeof( uint_32 ) ); return( headersize + padding ); }
static int MResFindHeaderSize( MResResourceHeader *header, char use_unicode ) /***************************************************************************/ { int headersize; long namesize; long typesize; long padding; headersize = sizeof( MResResourceHeader ) - 2 * sizeof( ResNameOrOrdinal * ) + sizeof( uint_32 ); namesize = MResFindNameOrOrdSize( header->Name, use_unicode ); typesize = MResFindNameOrOrdSize( header->Type, use_unicode ); headersize += ( namesize + typesize ); padding = RES_PADDING( typesize + namesize, sizeof(uint_32) ); return( headersize + padding ); }
static uint_16 CalcBlockSize( FullVerBlock * block ) /**************************************************/ { uint_16 val_size; uint_16 padding; uint_16 head_size; uint_16 nest_size; uint_8 os; if( CmdLineParms.TargetOS == RC_TARGET_OS_WIN32 ) { os = WRES_OS_WIN32; } else { os = WRES_OS_WIN16; } head_size = ResSizeVerBlockHeader( &block->Head, block->UseUnicode, os ); if( block->Value == NULL ) { val_size = 0; padding = 0; } else { val_size = CalcValListSize( block->Value, block->UseUnicode ); padding = RES_PADDING( val_size, sizeof(uint_32) ); } if( block->Nest == NULL ) { nest_size = 0; } else { nest_size = CalcNestSize( block->Nest ); } block->Head.ValSize = val_size; if( !stricmp( block->Head.Key, "Translation" ) ) { block->Head.Type = 0; } else { if( block->UseUnicode ) block->Head.ValSize /= 2; block->Head.Type = 1; } block->Head.Size = head_size + val_size + padding + nest_size; return( block->Head.Size ); }
extern int ResPadDWord( WResFileID handle ) /*****************************************/ /* advances in the file to the next DWORD boundry */ { long curr_pos; long padding; int error; error = FALSE; curr_pos = WRESTELL( handle ); if( curr_pos == -1 ) { WRES_ERROR( WRS_TELL_FAILED ); error = TRUE; } else { padding = RES_PADDING( curr_pos, sizeof(uint_32) ); curr_pos = WRESSEEK( handle, padding, SEEK_CUR ); if( curr_pos == -1L ) { WRES_ERROR( WRS_SEEK_FAILED ); error = TRUE; } } return( error ); }
bool ResWritePadDWord( WResFileID handle ) /****************************************/ { WResFileOffset curr_pos; WResFileSize padding; bool error; uint_32 zero = 0; error = false; curr_pos = WRESTELL( handle ); if( curr_pos == -1 ) { WRES_ERROR( WRS_TELL_FAILED ); return( true ); } padding = RES_PADDING( curr_pos, sizeof( uint_32 ) ); if( padding != 0 ) { if( (WResFileSize)WRESWRITE( handle, &zero, padding ) != padding ) { WRES_ERROR( WRS_WRITE_FAILED ); return( true ); } } return( false ); }
void SemWINWriteVerInfo( WResID * name, ResMemFlags flags, VerFixedInfo * info, FullVerBlockNest * nest ) /********************************************************************/ { WResLangType lang; VerBlockHeader root; ResLocation loc; int padding; bool error; bool use_unicode; uint_8 os; int err_code; if( CmdLineParms.TargetOS == RC_TARGET_OS_WIN32 ) { use_unicode = true; os = WRES_OS_WIN32; } else { use_unicode = false; os = WRES_OS_WIN16; } root.Key = "VS_VERSION_INFO"; root.ValSize = sizeof(VerFixedInfo); root.Type = 0; padding = RES_PADDING( root.ValSize, sizeof(uint_32) ); root.Size = ResSizeVerBlockHeader( &root, use_unicode, os ) + root.ValSize + padding + CalcNestSize( nest ); /* pad the start of the resource so that padding within the resource */ /* is easier */ error = ResPadDWord( CurrResFile.handle ); if( error ) { err_code = LastWresErr(); goto OutputWriteError; } if( !ErrorHasOccured ) { loc.start = SemStartResource(); error = ResWriteVerBlockHeader( &root, use_unicode, os, CurrResFile.handle); if( error ) { err_code = LastWresErr(); goto OutputWriteError; } error = ResWriteVerFixedInfo( info, CurrResFile.handle ); if( error ) { err_code = LastWresErr(); goto OutputWriteError; } if( ResSeek( CurrResFile.handle, padding, SEEK_CUR ) == -1 ) { err_code = LastWresErr(); goto OutputWriteError; } error = SemWriteVerBlockNest( nest, CurrResFile.handle, &err_code ); if( error) goto OutputWriteError; loc.len = SemEndResource( loc.start ); /* version info resources must be language neutral */ lang.lang = DEF_LANG; lang.sublang = DEF_SUBLANG; SemWINSetResourceLanguage( &lang, false ); SemAddResourceFree( name, WResIDFromNum( RT_VERSIONINFO ), flags, loc ); } else { RCFREE( name ); } RCFREE( info ); FreeVerBlockNest( nest ); return; OutputWriteError: RcError( ERR_WRITTING_RES_FILE, CurrResFile.filename, strerror( err_code ) ); ErrorHasOccured = true; RCFREE( info ); FreeVerBlockNest( nest ); return; }