116 lines
2.3 KiB
C++
116 lines
2.3 KiB
C++
// File_Extractor 1.0.0. http://www.slack.net/~ant/
|
|
|
|
#include "Data_Reader.h"
|
|
|
|
#include "blargg_endian.h"
|
|
#include <errno.h>
|
|
|
|
/* Copyright (C) 2005-2009 Shay Green. This module is free software; you
|
|
can redistribute it and/or modify it under the terms of the GNU Lesser
|
|
General Public License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version. This
|
|
module is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
|
details. You should have received a copy of the GNU Lesser General Public
|
|
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"
|
|
|
|
// Data_Reader
|
|
|
|
const char * Data_Reader::read( void* p, int n )
|
|
{
|
|
if ( n < 0 )
|
|
return "Internal usage bug";
|
|
|
|
if ( n <= 0 )
|
|
return 0;
|
|
|
|
if ( n > remain() )
|
|
return "Truncated file";
|
|
|
|
const char * err = read_v( p, n );
|
|
if ( !err )
|
|
remain_ -= n;
|
|
|
|
return err;
|
|
}
|
|
|
|
const char * Data_Reader::read_avail( void* p, int* n_ )
|
|
{
|
|
int n = min( (uint64_t)(*n_), remain() );
|
|
*n_ = 0;
|
|
|
|
if ( n < 0 )
|
|
return "Internal usage bug";
|
|
|
|
if ( n <= 0 )
|
|
return 0;
|
|
|
|
const char * err = read_v( p, n );
|
|
if ( !err )
|
|
{
|
|
remain_ -= n;
|
|
*n_ = n;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
const char * Data_Reader::read_avail( void* p, long* n )
|
|
{
|
|
int i = STATIC_CAST(int, *n);
|
|
const char * err = read_avail( p, &i );
|
|
*n = i;
|
|
return err;
|
|
}
|
|
|
|
const char * Data_Reader::skip_v( int count )
|
|
{
|
|
char buf [512];
|
|
while ( count )
|
|
{
|
|
int n = min( count, (int) sizeof buf );
|
|
count -= n;
|
|
RETURN_ERR( read_v( buf, n ) );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
const char * Data_Reader::skip( int n )
|
|
{
|
|
if ( n < 0 )
|
|
return "Internal usage bug";
|
|
|
|
if ( n <= 0 )
|
|
return 0;
|
|
|
|
if ( n > remain() )
|
|
return "Truncated file";
|
|
|
|
const char * err = skip_v( n );
|
|
if ( !err )
|
|
remain_ -= n;
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
// File_Reader
|
|
|
|
// Mem_File_Reader
|
|
|
|
Mem_File_Reader::Mem_File_Reader( const void* p, long s ) :
|
|
begin( STATIC_CAST(const char*, p) )
|
|
{
|
|
set_size( s );
|
|
}
|
|
|
|
const char * Mem_File_Reader::read_v( void* p, int s )
|
|
{
|
|
memcpy( p, begin + tell(), s );
|
|
return 0;
|
|
}
|