2013-01-11 01:48:46 +08:00
|
|
|
#ifndef FOUG_C_STREAM_H
|
|
|
|
#define FOUG_C_STREAM_H
|
|
|
|
|
2013-01-16 00:56:24 +08:00
|
|
|
#include "global.h"
|
2013-01-11 01:48:46 +08:00
|
|
|
#include "memory.h"
|
2013-03-03 04:51:08 +08:00
|
|
|
#include <stdio.h>
|
2013-01-11 01:48:46 +08:00
|
|
|
|
2014-01-21 17:51:23 +08:00
|
|
|
/*! \brief Stream that can get input from an arbitrary data source or can write output to an
|
|
|
|
* arbitrary data sink
|
|
|
|
*
|
|
|
|
* This is pretty much the same as
|
|
|
|
* <a href="http://www.gnu.org/software/libc/manual/html_mono/libc.html#Custom-Streams">
|
|
|
|
* custom streams</a> in the GNU C Library
|
|
|
|
*
|
|
|
|
* It uses a cookie being basically an opaque pointer on a hidden data type. The custom stream is
|
|
|
|
* implemented by defining hook functions that know how to read/write the data.
|
|
|
|
*
|
|
|
|
*/
|
2014-01-27 22:03:50 +08:00
|
|
|
typedef struct
|
2013-01-11 01:48:46 +08:00
|
|
|
{
|
2013-03-03 04:51:08 +08:00
|
|
|
void* cookie;
|
2014-01-21 17:51:23 +08:00
|
|
|
|
2014-01-27 22:03:50 +08:00
|
|
|
foug_bool_t (*at_end_func)(void*);
|
2014-01-29 18:31:44 +08:00
|
|
|
int (*error_func)(void*);
|
2014-01-27 22:03:50 +08:00
|
|
|
size_t (*read_func)(void*, void*, size_t, size_t);
|
|
|
|
size_t (*write_func)(void*, const void*, size_t, size_t);
|
|
|
|
} foug_stream_t;
|
2013-01-11 01:48:46 +08:00
|
|
|
|
2013-03-27 20:00:48 +08:00
|
|
|
/* Initialization */
|
|
|
|
|
2013-03-03 04:51:08 +08:00
|
|
|
FOUG_LIB_EXPORT void foug_stream_set_null(foug_stream_t* stream);
|
|
|
|
FOUG_LIB_EXPORT void foug_stream_set_stdio(foug_stream_t* stream, FILE* file);
|
2013-01-11 01:48:46 +08:00
|
|
|
|
|
|
|
/* Services */
|
2013-02-21 21:51:29 +08:00
|
|
|
|
2013-01-15 23:45:01 +08:00
|
|
|
FOUG_LIB_EXPORT foug_bool_t foug_stream_at_end(foug_stream_t* stream);
|
2013-02-21 21:51:29 +08:00
|
|
|
|
2013-01-15 23:45:01 +08:00
|
|
|
FOUG_LIB_EXPORT int foug_stream_error(foug_stream_t* stream);
|
2013-02-21 21:51:29 +08:00
|
|
|
|
2013-01-15 23:45:01 +08:00
|
|
|
FOUG_LIB_EXPORT size_t foug_stream_read(foug_stream_t* stream,
|
2013-02-21 21:51:29 +08:00
|
|
|
void* ptr,
|
|
|
|
size_t item_size,
|
|
|
|
size_t item_count);
|
|
|
|
|
2013-01-15 23:45:01 +08:00
|
|
|
FOUG_LIB_EXPORT size_t foug_stream_write(foug_stream_t* stream,
|
2013-02-21 21:51:29 +08:00
|
|
|
const void* ptr,
|
|
|
|
size_t item_size,
|
|
|
|
size_t item_count);
|
|
|
|
|
2013-01-11 01:48:46 +08:00
|
|
|
#endif /* FOUG_C_STREAM_H */
|