static RcStatus copyFont( FontInfo *info, FILE *fp, WResID *name, ResMemFlags flags, int *err_code ) /*********************************************************************/ { RcStatus ret; char * buffer; ResLocation loc; long pos; buffer = RESALLOC( FONT_BUFFER_SIZE ); loc.start = SemStartResource(); if( ResWriteFontInfo( info, CurrResFile.fp ) ) { ret = RS_WRITE_ERROR; *err_code = LastWresErr(); } else { pos = RESTELL( fp ); if( pos == -1L ) { ret = RS_READ_ERROR; *err_code = errno; } else { ret = SemCopyDataUntilEOF( pos, fp, buffer, FONT_BUFFER_SIZE, err_code ); } } loc.len = SemEndResource( loc.start ); /* add the font to the RES file directory */ SemAddResourceFree( name, WResIDFromNum( RESOURCE2INT( RT_FONT ) ), flags, loc ); RESFREE( buffer ); return( ret ); } /* copyFont */
static RcStatus copyBitmap( BitmapFileHeader *head, WResFileID fid, WResID *name, ResMemFlags flags, int *err_code ) /**************************************************************************/ { RcStatus ret; char * buffer; ResLocation loc; WResFileOffset pos; buffer = RESALLOC( BITMAP_BUFFER_SIZE ); loc.start = SemStartResource(); pos = RESTELL( fid ); if( pos == -1 ) { ret = RS_READ_ERROR; *err_code = errno; } else { ret = CopyData( pos, head->Size - sizeof(BitmapFileHeader), fid, buffer, BITMAP_BUFFER_SIZE, err_code ); } loc.len = SemEndResource( loc.start ); /* add the bitmap to the RES file directory */ SemAddResourceFree( name, WResIDFromNum( RESOURCE2INT( RT_BITMAP ) ), flags, loc ); RESFREE( buffer ); return( ret ); } /* copyBitmap */
ResLocation SemCopyRawFile( const char *filename ) /************************************************/ { WResFileID fid; RcStatus ret; char *buffer; char full_filename[_MAX_PATH]; ResLocation loc; int err_code; WResFileOffset pos; buffer = RESALLOC( BUFFER_SIZE ); if( RcFindResource( filename, full_filename ) == -1 ) { RcError( ERR_CANT_FIND_FILE, filename ); goto HANDLE_ERROR; } if( AddDependency( full_filename ) ) goto HANDLE_ERROR; fid = RcIoOpenInput( full_filename, false ); if( fid == WRES_NIL_HANDLE ) { RcError( ERR_CANT_OPEN_FILE, filename, strerror( errno ) ); goto HANDLE_ERROR; } loc.start = SemStartResource(); pos = RESTELL( fid ); if( pos == -1 ) { RcError( ERR_READING_DATA, full_filename, strerror( errno ) ); RESCLOSE( fid ); goto HANDLE_ERROR; } else { ret = SemCopyDataUntilEOF( pos, fid, buffer, BUFFER_SIZE, &err_code ); if( ret != RS_OK ) { ReportCopyError( ret, ERR_READING_DATA, full_filename, err_code ); RESCLOSE( fid ); goto HANDLE_ERROR; } } loc.len = SemEndResource( loc.start ); RESCLOSE( fid ); RESFREE( buffer ); return( loc ); HANDLE_ERROR: ErrorHasOccured = true; loc.start = 0; loc.len = 0; RESFREE( buffer ); return( loc ); }
static bool WRWriteResourceToWRES( WResTypeNode *tnode, WResResNode *rnode, WResDir new_dir, WResFileID src_fid, WResFileID dst_fid, bool is32bit ) { WResLangType lt; WResLangNode *lnode; uint_32 offset; bool dup; if( is32bit ) { if( ResWritePadDWord( dst_fid ) ) { return( false ); } } offset = RESTELL( dst_fid ); lnode = rnode->Head; while( lnode != NULL ) { lt = lnode->Info.lang; if( WResAddResource( &tnode->Info.TypeName, &rnode->Info.ResName, lnode->Info.MemoryFlags, offset, lnode->Info.Length, new_dir, <, &dup ) || dup ) { if( dup ) { displayDupMsg( &tnode->Info.TypeName, &rnode->Info.ResName ); } return( false ); } if( lnode->data != NULL ) { if( !WRCopyResFromDataToFile( lnode->data, lnode->Info.Length, dst_fid ) ) { return( false ); } } else { if( !WRCopyResFromFileToFile( src_fid, lnode->Info.Offset, lnode->Info.Length, dst_fid ) ) { return( false ); } } if( lnode == rnode->Tail ) { break; } lnode = lnode->Next; offset += lnode->Info.Length; } return( true ); }
static bool ConvertMResources( FILE *in_fp, FILE *out_fp, WResDir outdir ) /************************************************************************/ { MResResourceHeader * mheader; WResID * name; WResID * type; bool error; bool lastheader; /* true if lastheader has been read */ uint_32 offset; bool duplicate; mheader = MResReadResourceHeader( in_fp ); /* assume that any error reading here means end of file */ lastheader = ( mheader == NULL ); error = false; while( !lastheader && !error ) { name = ConvertNameOrOrdToID( mheader->Name ); type = ConvertNameOrOrdToID( mheader->Type ); offset = RESTELL( out_fp ); /* copy the resource if it isn't a name table or if the user */ /* requested that name tables be copied */ if( type->IsName || type->ID.Num != RESOURCE2INT( RT_NAMETABLE ) || CmdLineParms.KeepNameTable ) { error = WResAddResource( type, name, mheader->MemoryFlags, offset, mheader->Size, outdir, NULL, &duplicate ); if( duplicate ) { /* print message and continue */ puts( "Error: duplicate entry" ); error = false; } else { error = BinaryCopy( in_fp, out_fp, mheader->Size ); } } else { RESSEEK( in_fp, mheader->Size, SEEK_CUR ); } WResIDFree( name ); WResIDFree( type ); MResFreeResourceHeader( mheader ); mheader = MResReadResourceHeader( in_fp ); /* assume that any error reading here means end of file */ lastheader = ( mheader == NULL ); } return( error ); } /* ConvertMResources */
static RcStatus copyOneCursor( const CurFileDirEntry *entry, WResFileID fid, void *buffer, unsigned buffer_size, BitmapInfoHeader *dibhead, int *err_code ) /*****************************************************************************/ /* NOTE: this routine fills in dibhead as it copies the data */ { RcStatus ret; WResFileOffset curpos; ret = RS_OK; if( RESSEEK( fid, entry->Offset, SEEK_SET ) == -1 ) { ret = RS_READ_ERROR; *err_code = errno; } if( ret == RS_OK ) { ret = ReadBitmapInfoHeader( dibhead, fid ); *err_code = errno; } if( ret == RS_OK ) { if( ResWriteBitmapInfoHeader( dibhead, CurrResFile.fid ) ) { ret = RS_WRITE_ERROR; *err_code = LastWresErr(); } } if( ret == RS_OK ) { curpos = RESTELL( fid ); if( curpos == -1 ) { ret = RS_READ_ERROR; *err_code = errno; } else { ret = CopyData( curpos, entry->Length - sizeof(BitmapInfoHeader), fid, buffer, buffer_size, err_code ); } } return( ret ); }