Offers a simple interface for reading and buffering the content of a file.
FileReader | Offers a simple interface for reading and buffering the content of a file. |
Copyright | This program is free software. |
Files | |
C-kern/ | Header file FileReader. |
C-kern/ | Implementation file FileReader impl. |
Types | |
struct filereader_t | Export filereader_t into global namespace. |
Functions | |
test | |
unittest_io_reader_filereader | Test filereader_t functionality. |
filereader_t | Reads file data into internal memory buffers. |
ioerror | Safes status of last read access to file. |
unreadsize | The size of buffered data for which readnext_filereader is not called. |
nextindex | Index into mmfile. |
nrfreebuffer | Number of released or unread buffers. |
fileoffset | Offset into file where the next read operation begins. |
filesize | The size of the io-stream file refers to. |
file | The file from which is read. |
mmfile | The buffered input of the file. |
static configuration | |
filereader_SYS_BUFFER_SIZE | The sum of the size the two allocated buffers. |
lifetime | |
filereader_FREE | Static initializer. |
initsingle_filereader | Opens file for reading into a single buffer. |
init_filereader | Opens file for reading into a double buffer. |
free_filereader | Closes file and frees allocated buffers. |
query | |
sizebuffer_filereader | Returns the buffer size in bytes. |
ioerror_filereader | Returns the I/0 error (>0) or 0 if no error occurred. |
iseof_filereader | Returns true if end of file is reached. |
isfree_filereader | Returns true in case frd == filereader_FREE. |
isnext_filereader | Returns true if there is a free buffer available. |
setter | |
setioerror_filereader | Sets ioerror of frd. |
read | |
readnext_filereader | Returns buffer containing the next block of input data. |
release_filereader | Releases the oldest read buffer. |
unread_filereader | The last buffer returned by readnext_filereader is marked as unread. |
inline implementation | |
Macros | |
ioerror_filereader | Implements filereader_t.ioerror_filereader. |
iseof_filereader | Implements filereader_t.iseof_filereader. |
isnext_filereader | Implements filereader_t.isnext_filereader. |
setioerror_filereader | Implements filereader_t.setioerror_filereader. |
This program is free software. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program 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 General Public License for more details.
© 2013 Jörg Seebohn
Header file FileReader.
Implementation file FileReader impl.
typedef struct filereader_t filereader_t
Export filereader_t into global namespace.
test | |
unittest_io_reader_filereader | Test filereader_t functionality. |
int unittest_io_reader_filereader( void )
Test filereader_t functionality.
struct filereader_t
Reads file data into internal memory buffers. At least two buffers are supported. If one buffer is in use the other could be filled with new data from the file. The function readnext_filereader returns a buffer containing the next read data. Use release_filereader if you do not longer need it. For every called readnext_filereader you need to call release_filereader. Always the oldest read buffer is released.
ioerror | Safes status of last read access to file. |
unreadsize | The size of buffered data for which readnext_filereader is not called. |
nextindex | Index into mmfile. |
nrfreebuffer | Number of released or unread buffers. |
fileoffset | Offset into file where the next read operation begins. |
filesize | The size of the io-stream file refers to. |
file | The file from which is read. |
mmfile | The buffered input of the file. |
static configuration | |
filereader_SYS_BUFFER_SIZE | The sum of the size the two allocated buffers. |
lifetime | |
filereader_FREE | Static initializer. |
initsingle_filereader | Opens file for reading into a single buffer. |
init_filereader | Opens file for reading into a double buffer. |
free_filereader | Closes file and frees allocated buffers. |
query | |
sizebuffer_filereader | Returns the buffer size in bytes. |
ioerror_filereader | Returns the I/0 error (>0) or 0 if no error occurred. |
iseof_filereader | Returns true if end of file is reached. |
isfree_filereader | Returns true in case frd == filereader_FREE. |
isnext_filereader | Returns true if there is a free buffer available. |
setter | |
setioerror_filereader | Sets ioerror of frd. |
read | |
readnext_filereader | Returns buffer containing the next block of input data. |
release_filereader | Releases the oldest read buffer. |
unread_filereader | The last buffer returned by readnext_filereader is marked as unread. |
size_t unreadsize
The size of buffered data for which readnext_filereader is not called.
uint8_t nextindex
Index into mmfile. It is the index of the buffer which must be returned during the next call to readnext_filereader.
off_t fileoffset
Offset into file where the next read operation begins.
off_t filesize
The size of the io-stream file refers to.
size_t sizebuffer_filereader( void )
Returns the buffer size in bytes. See also filereader_t.filereader_SYS_BUFFER_SIZE. The size is aligned to value (2 * pagesize_vm()). Therefore the two buffers of the double buffer configuration are aligned to pagesize_vm().
int ioerror_filereader( const filereader_t * frd )
Returns the I/0 error (>0) or 0 if no error occurred. If an error occurred every call to readnext_filereader returns this error code (EIO, ENOMEM, ...).
bool iseof_filereader( const filereader_t * frd )
Returns true if end of file is reached. If there is no more data to read readnext_filereader will also return ENODATA.
bool isfree_filereader( const filereader_t * frd )
Returns true in case frd == filereader_FREE.
bool isnext_filereader( const filereader_t * frd )
Returns true if there is a free buffer available. Therefore readnext_filereader will not return ENOBUFS or ENODATA.
void setioerror_filereader( filereader_t * frd, int ioerr )
Sets ioerror of frd. After an error occurred (or is simulated by another component) the function readnext_filereader returns this error. Call free and init on frd again to clear the error or call this function with ioerr set to 0.
int readnext_filereader( filereader_t * frd, /*out*/struct stringstream_t * buffer )
Returns buffer containing the next block of input data. If you do not longer need it use release_filereader to release the oldest buffer. The current implementation supports only two unreleased buffers.
0 | Read new buffer. |
ENODATA | All data read. |
ENOBUFS | No more buffer available. Call release_filereader first before calling this function. |
EIO | Input/Output error (ENOMEM or other error codes are also possible). |
void unread_filereader( filereader_t * frd )
The last buffer returned by readnext_filereader is marked as unread. The next call to readnext_filereader returns the same buffer. If no buffer was read this function does nothing.
#define ioerror_filereader( frd ) ((frd)->ioerror)
Implements filereader_t.ioerror_filereader.
#define iseof_filereader( frd ) ( __extension__ ({ const filereader_t * _f ; _f = (frd) ; (_f->unreadsize == 0 && _f->fileoffset == _f->filesize) ; }))
Implements filereader_t.iseof_filereader.
#define isnext_filereader( frd ) ( __extension__ ({ const filereader_t * _f ; _f = (frd) ; (_f->unreadsize != 0) ; }))
Implements filereader_t.isnext_filereader.
#define setioerror_filereader( frd, ioerr ) ((void)((frd)->ioerror = (ioerr)))
Implements filereader_t.setioerror_filereader.
Export filereader_t into global namespace.
typedef struct filereader_t filereader_t
Reads file data into internal memory buffers.
struct filereader_t
Test filereader_t functionality.
int unittest_io_reader_filereader( void )
Safes status of last read access to file.
int ioerror
The file from which is read.
sys_iochannel_t file
The size of buffered data for which readnext_filereader is not called.
size_t unreadsize
Returns buffer containing the next block of input data.
int readnext_filereader( filereader_t * frd, /*out*/struct stringstream_t * buffer )
Index into mmfile.
uint8_t nextindex
The buffered input of the file.
struct { uint8_t* addr ; size_t size ; } mmfile[2]
Number of released or unread buffers.
uint8_t nrfreebuffer
Offset into file where the next read operation begins.
off_t fileoffset
The size of the io-stream file refers to.
off_t filesize
The sum of the size the two allocated buffers.
#define filereader_SYS_BUFFER_SIZE ( 4*4096 )
Static initializer.
#define filereader_FREE { 0, 0, 0, 0, 0, 0, sys_iochannel_FREE, { {0, 0}, {0, 0} } }
Opens file for reading into a single buffer.
int initsingle_filereader( /*out*/filereader_t * frd, const char * filepath, const struct directory_t * relative_to/*0 = > current working dir*/ )
Opens file for reading into a double buffer.
int init_filereader( /*out*/filereader_t * frd, const char * filepath, const struct directory_t * relative_to/*0 = > current working dir*/ )
Closes file and frees allocated buffers.
int free_filereader( filereader_t * frd )
Returns the buffer size in bytes.
size_t sizebuffer_filereader( void )
Returns the I/0 error (>0) or 0 if no error occurred.
int ioerror_filereader( const filereader_t * frd )
Returns true if end of file is reached.
bool iseof_filereader( const filereader_t * frd )
Returns true in case frd == filereader_FREE.
bool isfree_filereader( const filereader_t * frd )
Returns true if there is a free buffer available.
bool isnext_filereader( const filereader_t * frd )
Sets ioerror of frd.
void setioerror_filereader( filereader_t * frd, int ioerr )
Releases the oldest read buffer.
void release_filereader( filereader_t * frd )
The last buffer returned by readnext_filereader is marked as unread.
void unread_filereader( filereader_t * frd )
Implements filereader_t.ioerror_filereader.
#define ioerror_filereader( frd ) ((frd)->ioerror)
Implements filereader_t.iseof_filereader.
#define iseof_filereader( frd ) ( __extension__ ({ const filereader_t * _f ; _f = (frd) ; (_f->unreadsize == 0 && _f->fileoffset == _f->filesize) ; }))
Implements filereader_t.isnext_filereader.
#define isnext_filereader( frd ) ( __extension__ ({ const filereader_t * _f ; _f = (frd) ; (_f->unreadsize != 0) ; }))
Implements filereader_t.setioerror_filereader.
#define setioerror_filereader( frd, ioerr ) ((void)((frd)->ioerror = (ioerr)))