#ifndef _XH_READER_H_
#define _XH_READER_H_
#include "xh_config.h"
#include "xh_core.h"
typedef enum {
XH_READER_STRING_TYPE,
XH_READER_FILE_TYPE,
XH_READER_MMAPED_FILE_TYPE
} xh_reader_type_t;
typedef struct _xh_reader_t xh_reader_t;
struct _xh_reader_t {
xh_reader_type_t type;
SV *input;
xh_char_t *str;
size_t len;
xh_char_t *file;
int fd;
PerlIO *perl_io;
SV *perl_obj;
#ifdef WIN32
HANDLE fm, fh;
#endif
#ifdef XH_HAVE_ENCODER
xh_encoder_t *encoder;
xh_buffer_t enc_buf;
#endif
xh_buffer_t main_buf;
xh_perl_buffer_t perl_buf;
xh_char_t *fake_read_pos;
size_t fake_read_len;
size_t buf_size;
void (*init) (xh_reader_t *reader, SV *input, xh_char_t *encoding, size_t buf_size);
size_t (*read) (xh_reader_t *reader, xh_char_t **buf, xh_char_t *preserve, size_t *off);
void (*switch_encoding) (xh_reader_t *reader, xh_char_t *encoding, xh_char_t **buf, size_t *len);
void (*destroy) (xh_reader_t *reader);
};
void xh_reader_destroy(xh_reader_t *reader);
void xh_reader_init(xh_reader_t *reader, SV *input, xh_char_t *encoding, size_t buf_size);
#endif /* _XH_READER_H_ */