Esempio n. 1
0
static size_t read_stdio(STDIOSTREAMFILE *streamfile,uint8_t * dest, off_t offset, size_t length) {

    if (!streamfile || !dest || length<=0)
        return 0;

    /* request outside file: ignore to avoid seek/read in read_the_rest() */
    if (offset > streamfile->filesize) {
        streamfile->offset = streamfile->filesize;
        VGM_LOG_ONCE("ERROR: offset over filesize 0x%x @ 0x%lx + 0x%x (buggy meta?)\n", streamfile->filesize, offset, length);

#if STREAMFILE_IGNORE_EOF
        memset(dest,0,length);
        return length; /* 0-set buffer */
#else
        return 0; /* nothing to read */
#endif
    }

    /* just copy if entire request is within the buffer */
    if (offset >= streamfile->offset && offset + length <= streamfile->offset + streamfile->validsize) {
        off_t offset_into_buffer = offset - streamfile->offset;
        memcpy(dest,streamfile->buffer + offset_into_buffer,length);
        return length;
    }

    /* request outside buffer: new fread */
    {
        size_t length_read = read_the_rest(dest,offset,length,streamfile);
#ifdef PROFILE_STREAMFILE
        if (length_read < length) 
            streamfile->error_count++;
#endif
        return length_read;
    }
}
Esempio n. 2
0
static size_t read_stdio(STDIOSTREAMFILE *streamfile,uint8_t * dest, off_t offset, size_t length)
{
    // read
    if (!streamfile || !dest || length<=0) return 0;

    /* if entire request is within the buffer */
    if (offset >= streamfile->offset && offset+length <= streamfile->offset+streamfile->validsize) {
        memcpy(dest,streamfile->buffer+(offset-streamfile->offset),length);
        return length;
    }

    {
        size_t length_read = read_the_rest(dest,offset,length,streamfile);
#if PROFILE_STREAMFILE
        if (length_read < length) 
            streamfile->error_count++;
#endif
        return length_read;
    }
}