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