コード例 #1
0
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 */
コード例 #2
0
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 */
コード例 #3
0
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 );
}
コード例 #4
0
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,
                             &lt, &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 );
}
コード例 #5
0
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 */
コード例 #6
0
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 );
}