Ejemplo n.º 1
0
file_offset LibRead( libfile lio, void *buff, file_offset len )
{
    size_t      ret;
    file_offset b_read;

    if( len > READ_FILE_BUFFER_SIZE ) {
        b_read = lio->buf_size - lio->buf_pos;
        if( b_read ) {
            memcpy( buff, lio->buffer + lio->buf_pos, b_read );
        }
        ret = fread( (char *)buff + b_read, 1, len - b_read, lio->io );
        if( ferror( lio->io ) ) {
            LibReadError( lio );
        }
        b_read += ret;
        lio->buf_size = 0;
        lio->buf_pos = 0;
        return( b_read );
    }
    b_read = lio->buf_size - lio->buf_pos;
    if( b_read > len )
        b_read = len;
    if( b_read ) {
        memcpy( buff, lio->buffer + lio->buf_pos, b_read );
        lio->buf_pos += b_read;
    }
    if( lio->buf_pos == lio->buf_size ) {
        ret = fread( lio->buffer, 1, READ_FILE_BUFFER_SIZE, lio->io );
        if( ferror( lio->io ) ) {
            LibReadError( lio );
        }
        lio->buf_size = ret;
        lio->buf_pos = 0;
        if( ret == 0 ) {
            return( b_read );
        }
        if( b_read < len ) {
            if( ret > len - b_read )
                ret = len - b_read;
            memcpy( (char *)buff + b_read, lio->buffer, ret );
            b_read += ret;
            lio->buf_pos += ret;
        }
    }
    return( b_read );
}
Ejemplo n.º 2
0
Archivo: libio.c Proyecto: JWasm/JWlink
file_offset LibRead( libfile lio, void *buff, file_offset len )
{
    signed_32 ret;
    file_offset b_read;

    if( len > READ_FILE_BUFFER_SIZE ) {
        b_read = lio->buf_size - lio->buf_pos;
        if( b_read ) {
            memcpy( buff, lio->buffer + lio->buf_pos, b_read );
        }
        ret = read( lio->io, (char *)buff + b_read, len - b_read );
        if( ret < 0 ) {
            LibReadError( lio );
        }
        b_read += ret;
        lio->buf_size = 0;
        lio->buf_pos = 0;
        return( b_read );
    }
    b_read = min( len, lio->buf_size - lio->buf_pos );
    if( b_read ) {
        memcpy( buff, lio->buffer + lio->buf_pos, b_read );
        lio->buf_pos += b_read;
    }
    if( lio->buf_pos == lio->buf_size ) {
        ret = read( lio->io, lio->buffer, READ_FILE_BUFFER_SIZE );
        if( ret < 0 ) {
            LibReadError( lio );
        }
        lio->buf_size = ret;
        lio->buf_pos = 0;
        if( ret == 0 ) {
            return( b_read );
        }
        if( b_read < len ) {
            ret = min( ret, len - b_read );
            memcpy( (char *)buff + b_read, lio->buffer, ret );
            b_read += ret;
            lio->buf_pos += ret;
        }
    }
    return( b_read );
}