static int CompareOneResource( WResFileID fid1, WResDirWindow wind1, WResFileID fid2, WResDirWindow wind2 ) /********************************************************************/ { int retcode; int oldretcode; WResResInfo *res1; WResResInfo *res2; WResLangInfo *lang1; WResLangInfo *lang2; char * resname1; oldretcode = 0; res1 = WResGetResInfo( wind1 ); res2 = WResGetResInfo( wind2 ); lang1 = WResGetLangInfo( wind1 ); lang2 = WResGetLangInfo( wind2 ); if (lang1->MemoryFlags != lang2->MemoryFlags) { if (!CmdLineParms.Quiet) { resname1 = WResIDToStr( &(res1->ResName) ); printf( "Error: memory flags for resource %s are not the same\n", resname1 ); RESFREE( resname1 ); } oldretcode = 1; } if (lang1->Length != lang2->Length) { if (!CmdLineParms.Quiet) { resname1 = WResIDToStr( &(res1->ResName) ); printf( "Error: resource %s does not have the same length\n", resname1 ); RESFREE( resname1 ); } oldretcode = 1; } else { retcode = BinaryCompare( fid1, lang1->Offset, fid2, lang2->Offset, lang1->Length ); switch (retcode) { case 1: if (!CmdLineParms.Quiet) { resname1 = WResIDToStr( &(res1->ResName) ); printf( "Error: contents of resource %s are different.\n", resname1 ); RESFREE( resname1 ); } oldretcode = retcode; break; case -1: oldretcode = retcode; break; } } return( oldretcode ); }
static WResDirWindow LookUpResource( WResDirWindow wind1, WResDir dir2 ) /**********************************************************************/ { WResDirWindow wind2; WResTypeInfo *type1; WResResInfo *res1; WResLangInfo *lang1; char *resname1; type1 = WResGetTypeInfo( wind1 ); res1 = WResGetResInfo( wind1 ); lang1 = WResGetLangInfo( wind1 ); wind2 = WResFindResource( &(type1->TypeName), &(res1->ResName), dir2, &(lang1->lang) ); if (WResIsEmptyWindow( wind2 ) && !CmdLineParms.Quiet) { resname1 = WResIDToStr( &(res1->ResName) ); printf( "Error: Resource %s (lang 0x%X SubLang 0x%X) not in file %s\n", resname1, (int)lang1->lang.lang, (int)lang1->lang.sublang, CmdLineParms.FileName2 ); RESFREE( resname1 ); } return( wind2 ); }
/* Build OS/2 NE style resource table. Each resource gets one entry, and * resources > 64K will get an additional entry for each 64K chunk. */ static void buildOS2ResTable( OS2ResTable *res_tbl, WResDir dir ) /***************************************************************/ { WResDirWindow wind; WResLangInfo *lang; OS2ResEntry *entry; WResTypeInfo *res_type; WResResInfo *resinfo; uint_16 type; uint_16 id; int_32 length; entry = res_tbl->resources; /* Walk through the WRes directory */ for( wind = WResFirstResource( dir ); !WResIsEmptyWindow( wind ); wind = WResNextResource( wind, dir ) ) { lang = WResGetLangInfo( wind ); res_type = WResGetTypeInfo( wind ); resinfo = WResGetResInfo( wind ); // RT_DEFAULTICON is not written into the executable, ignore if( res_type->TypeName.ID.Num == OS2_RT_DEFAULTICON ) { wind = WResNextResource( wind, dir ); continue; } if( res_type->TypeName.IsName ) type = 0; else type = res_type->TypeName.ID.Num; if( resinfo->ResName.IsName ) id = 0; else id = resinfo->ResName.ID.Num; /* Fill in resource entries */ entry->res_type = type; entry->res_id = id; entry->wind = wind; entry->mem_flags = lang->MemoryFlags; entry->seg_length = 0; /* Zero means 64K */ entry->first_part = true; for( length = lang->Length; length > 0x10000; length -= 0x10000 ) { entry++; entry->res_type = type; entry->res_id = id; entry->wind = wind; entry->mem_flags = lang->MemoryFlags; entry->seg_length = 0; entry->first_part = false; } entry->seg_length = lang->Length % 0x10000; entry++; } }
static bool copyAResource( WResFileID fid, WResDirWindow *wind, char *buffer, const char *filename ) /****************************************************************/ { ResLocation loc; WResLangInfo *langinfo; WResTypeInfo *typeinfo; WResResInfo *resinfo; // RcStatus rc; int err_code; langinfo = WResGetLangInfo( *wind ); resinfo = WResGetResInfo( *wind ); typeinfo = WResGetTypeInfo( *wind ); loc.start = SemStartResource(); /* rc = */ CopyData( langinfo->Offset, langinfo->Length, fid, buffer, BUFFER_SIZE, &err_code ); loc.len = SemEndResource( loc.start ); SemAddResource2( &resinfo->ResName, &typeinfo->TypeName, langinfo->MemoryFlags, loc, filename ); return( false ); }
static bool DumpResource( WResDirWindow wind, WResFileID handle, uint_16 os ) /***************************************************************************/ { bool error; char resname[15]; char typename[20]; WResTypeInfo *type; WResResInfo *res; WResLangInfo *lang; type = WResGetTypeInfo( wind ); res = WResGetResInfo( wind ); lang = WResGetLangInfo( wind ); if( CmdLineParms.Type != NULL ) { if( !WResIDCmp( CmdLineParms.Type, &(type->TypeName) ) ) { return( false ); } } if( CmdLineParms.Name != NULL ) { if( !WResIDCmp( CmdLineParms.Name, &(res->ResName) ) ) { return( false ); } } ConvertIDToStr( &(res->ResName), resname, 15 ); ConvertTypeIDToStr( &(type->TypeName), typename, 20 ); fprintf( stdout, "%-20.20s %-15.15s 0x%04X 0x%02X ", typename, resname, (int)lang->lang.lang, (int)lang->lang.sublang ); PrintUint16Flags( lang->MemoryFlags, MemFlagsOnList, MemFlagsOffList, 53 ); if( CmdLineParms.DumpContents ) { error = DumpContents( type, res, lang, handle, os ); if( error ) { return( true ); } } return( false ); }