// Separate file to avoid linking to f* functions unless user calls unrar_open_file() #include "unrar.h" #include "rar.hpp" #include extern "C" { static unrar_err_t unrar_read_file( void* user_data, void* out, int* count, unrar_pos_t pos ) { FILE* file = (FILE*) user_data; // most of the time, seeking won't be necessary if ( pos != ftell( file ) && fseek( file, pos, SEEK_SET ) != 0 ) return unrar_err_corrupt; *count = (int) fread( out, 1, *count, file ); if ( ferror( file ) != 0 ) return unrar_err_io; return unrar_ok; } } static void unrar_close_file( void* user_data ) { fclose( (FILE*) user_data ); } unrar_err_t unrar_open( unrar_t** arc_out, const char path [] ) { *arc_out = NULL; FILE* file = fopen( path, "rb" ); if ( file == NULL ) return unrar_err_open; unrar_err_t err = unrar_open_custom( arc_out, &unrar_read_file, file ); if ( err != unrar_ok ) fclose( file ); else (*arc_out)->close_file = &unrar_close_file; return err; }