/* vim: ts=4 sw=4 sts=4 ff=unix fenc=utf-8 :
 * =====================================================================
 *  sc_stream.h
 *  Copyright (c)  2003 - 2011  sys0tem
 *  LICENSE :
 *	LGPL (GNU Lesser General Public License - Version 3,29 June 2007)
 *	http://www.gnu.org/copyleft/lesser.html
 *	or
 *	EPL (Eclipse Public License - v1.0)
 *	http://www.eclipse.org/legal/epl-v10.html
 * =====================================================================
 */
#ifndef __SC_STREAM_H__
#define __SC_STREAM_H__

#include <stddef.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
	char* buff;
	int   buffSize;
	int   off;
	int   size;
} SC_Stream_BufferData;


/**
 * ストリーム。
 */
typedef struct SC_Stream_ {
	int  (*readc      )(struct SC_Stream_*, char*);
	int  (*read       )(struct SC_Stream_*, void*, size_t);
	int  (*readExact  )(struct SC_Stream_*, void*, size_t);
	int  (*readLine   )(struct SC_Stream_*, char*, size_t);
	int  (*limitedRead)(struct SC_Stream_*, char*, size_t, char*, size_t);
	int  (*writec     )(struct SC_Stream_*, char);
	int  (*write      )(struct SC_Stream_*, const void*, size_t);
	int  (*writeExact )(struct SC_Stream_*, const void*, size_t);
	bool (*close      )(struct SC_Stream_*);
	int  (*_readCore  )(struct SC_Stream_*, void*, size_t);
	int  (*_writeCore )(struct SC_Stream_*, const void*, size_t);
	SC_Stream_BufferData _data;
	void* _strmInfo;
} SC_Stream;

/* ストリーム破棄	*/
void SC_Stream_delete(SC_Stream* strm);

/* 各ストリームの実装にて使用する	*/
int SC_Stream_readc_      (SC_Stream*, char*);
int SC_Stream_read_       (SC_Stream*, void*, size_t);
int SC_Stream_readExact_  (SC_Stream*, void*, size_t);
int SC_Stream_readLine_   (SC_Stream*, char*, size_t);
int SC_Stream_limitedRead_(SC_Stream*, char*, size_t, char*, size_t);
int SC_Stream_writec_     (SC_Stream*, char);
int SC_Stream_write_      (SC_Stream*, const void*, size_t);
int SC_Stream_writeExact_ (SC_Stream*, const void*, size_t);

#ifdef __cplusplus
}
#endif

#endif	/* __SC_STREAM_H__ */

