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; } }
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; } }