Mercurial > audlegacy-plugins
diff src/console/Data_Reader.cxx @ 341:986f098da058 trunk
[svn] - merge in blargg's changes
| author | nenolod |
|---|---|
| date | Thu, 07 Dec 2006 15:20:41 -0800 |
| parents | fb513e10174e |
| children |
line wrap: on
line diff
--- a/src/console/Data_Reader.cxx Wed Dec 06 07:57:05 2006 -0800 +++ b/src/console/Data_Reader.cxx Thu Dec 07 15:20:41 2006 -0800 @@ -2,6 +2,7 @@ #include "Data_Reader.h" +#include "blargg_endian.h" #include <assert.h> #include <string.h> #include <stdio.h> @@ -17,11 +18,11 @@ License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "blargg_source.h" + const char Data_Reader::eof_error [] = "Unexpected end of file"; -typedef Data_Reader::error_t error_t; - -error_t Data_Reader::read( void* p, long s ) +blargg_err_t Data_Reader::read( void* p, long s ) { long result = read_avail( p, s ); if ( result != s ) @@ -35,7 +36,7 @@ return 0; } -error_t Data_Reader::skip( long count ) +blargg_err_t Data_Reader::skip( long count ) { char buf [512]; while ( count ) @@ -44,19 +45,19 @@ if ( n > count ) n = count; count -= n; - error_t err = read( buf, n ); - if ( err ) - return err; + RETURN_ERR( read( buf, n ) ); } return 0; } long File_Reader::remain() const { return size() - tell(); } -error_t File_Reader::skip( long n ) +blargg_err_t File_Reader::skip( long n ) { assert( n >= 0 ); - return n ? seek( tell() + n ) : 0; + if ( !n ) + return 0; + return seek( tell() + n ); } // Subset_Reader @@ -97,9 +98,9 @@ { if ( first > count ) first = count; - void const* in = header; + void const* old = header; header += first; - memcpy( out, in, first ); + memcpy( out, old, first ); } return first; } @@ -107,23 +108,23 @@ long Remaining_Reader::read_avail( void* out, long count ) { long first = read_first( out, count ); - long remain = count - first; - if ( remain ) + long second = count - first; + if ( second ) { - remain = in->read_avail( (char*) out + first, remain ); - if ( remain <= 0 ) - return remain; + second = in->read_avail( (char*) out + first, second ); + if ( second <= 0 ) + return second; } - return first + remain; + return first + second; } -error_t Remaining_Reader::read( void* out, long count ) +blargg_err_t Remaining_Reader::read( void* out, long count ) { long first = read_first( out, count ); - long remain = count - first; - if ( !remain ) + long second = count - first; + if ( !second ) return 0; - return in->read( (char*) out + first, remain ); + return in->read( (char*) out + first, second ); } // Mem_File_Reader @@ -149,7 +150,7 @@ long Mem_File_Reader::tell() const { return pos; } -error_t Mem_File_Reader::seek( long n ) +blargg_err_t Mem_File_Reader::seek( long n ) { if ( n > size_ ) return eof_error; @@ -157,63 +158,6 @@ return 0; } -// Std_File_Reader - -Std_File_Reader::Std_File_Reader() : file_( 0 ) { } - -Std_File_Reader::~Std_File_Reader() { close(); } - -error_t Std_File_Reader::open( const char* path ) -{ - file_ = fopen( path, "rb" ); - if ( !file_ ) - return "Couldn't open file"; - return 0; -} - -long Std_File_Reader::size() const -{ - long pos = tell(); - fseek( (FILE*) file_, 0, SEEK_END ); - long result = tell(); - fseek( (FILE*) file_, pos, SEEK_SET ); - return result; -} - -long Std_File_Reader::read_avail( void* p, long s ) -{ - return fread( p, 1, s, (FILE*) file_ ); -} - -error_t Std_File_Reader::read( void* p, long s ) -{ - if ( s == (long) fread( p, 1, s, (FILE*) file_ ) ) - return 0; - if ( feof( (FILE*) file_ ) ) - return eof_error; - return "Couldn't read from file"; -} - -long Std_File_Reader::tell() const { return ftell( (FILE*) file_ ); } - -error_t Std_File_Reader::seek( long n ) -{ - if ( !fseek( (FILE*) file_, n, SEEK_SET ) ) - return 0; - if ( n > size() ) - return eof_error; - return "Error seeking in file"; -} - -void Std_File_Reader::close() -{ - if ( file_ ) - { - fclose( (FILE*) file_ ); - file_ = 0; - } -} - // Callback_Reader Callback_Reader::Callback_Reader( callback_t c, long size, void* d ) : @@ -234,13 +178,70 @@ return count; } -Callback_Reader::error_t Callback_Reader::read( void* out, long count ) +blargg_err_t Callback_Reader::read( void* out, long count ) { if ( count > remain_ ) return eof_error; return callback( data, out, count ); } +// Std_File_Reader + +Std_File_Reader::Std_File_Reader() : file_( 0 ) { } + +Std_File_Reader::~Std_File_Reader() { close(); } + +blargg_err_t Std_File_Reader::open( const char* path ) +{ + file_ = fopen( path, "rb" ); + if ( !file_ ) + return "Couldn't open file"; + return 0; +} + +long Std_File_Reader::size() const +{ + long pos = tell(); + fseek( (FILE*) file_, 0, SEEK_END ); + long result = tell(); + fseek( (FILE*) file_, pos, SEEK_SET ); + return result; +} + +long Std_File_Reader::read_avail( void* p, long s ) +{ + return fread( p, 1, s, (FILE*) file_ ); +} + +blargg_err_t Std_File_Reader::read( void* p, long s ) +{ + if ( s == (long) fread( p, 1, s, (FILE*) file_ ) ) + return 0; + if ( feof( (FILE*) file_ ) ) + return eof_error; + return "Couldn't read from file"; +} + +long Std_File_Reader::tell() const { return ftell( (FILE*) file_ ); } + +blargg_err_t Std_File_Reader::seek( long n ) +{ + if ( !fseek( (FILE*) file_, n, SEEK_SET ) ) + return 0; + if ( n > size() ) + return eof_error; + return "Error seeking in file"; +} + +void Std_File_Reader::close() +{ + if ( file_ ) + { + fclose( (FILE*) file_ ); + file_ = 0; + } +} + // Gzip_File_Reader #ifdef HAVE_ZLIB_H @@ -254,11 +255,11 @@ return "Couldn't open file"; unsigned char buf [4]; - if ( fread( buf, 2, 1, file ) == 1 && buf [0] == 0x1F && buf [1] == 0x8B ) + if ( fread( buf, 2, 1, file ) > 0 && buf [0] == 0x1F && buf [1] == 0x8B ) { fseek( file, -4, SEEK_END ); fread( buf, 4, 1, file ); - *eof = buf [3] * 0x1000000L + buf [2] * 0x10000L + buf [1] * 0x100L + buf [0]; + *eof = get_le32( buf ); } else { @@ -274,13 +275,11 @@ Gzip_File_Reader::~Gzip_File_Reader() { close(); } -error_t Gzip_File_Reader::open( const char* path ) +blargg_err_t Gzip_File_Reader::open( const char* path ) { close(); - error_t err = get_gzip_eof( path, &size_ ); - if ( err ) - return err; + RETURN_ERR( get_gzip_eof( path, &size_ ) ); file_ = gzopen( path, "rb" ); if ( !file_ ) @@ -295,7 +294,7 @@ long Gzip_File_Reader::tell() const { return gztell( file_ ); } -error_t Gzip_File_Reader::seek( long n ) +blargg_err_t Gzip_File_Reader::seek( long n ) { if ( gzseek( file_, n, SEEK_SET ) >= 0 ) return 0;
