/* * ストリームの抽象化の試み * OpenSSL の BIO API の超サブセットというか。 */ #ifndef _MYIO_H_ #define _MYIO_H_ /* * ユーティリティ関数 */ /* * 文字列の長さを返す関数 */ int mystrlen (const char *str); /* 二つの文字列が等しいか検査する関数 * 返り値: * 1:等しい、0:等しくない */ int mystreq (const char*x, const char*y); #define MYIO_CHAR_CR '\r' #define MYIO_CHAR_LF '\n' #define MYIO_BUF_SIZE 1024 typedef struct myio_st MYIO; typedef struct myio_method_st { const char *name; int (*write)(MYIO *, const char *, int); int (*read)(MYIO *, char *, int); int (*puts)(MYIO *, const char *); int (*gets)(MYIO *, char *, int); } MYIO_METHOD; struct myio_st { MYIO_METHOD *method; /* メソッド */ int flag_in; /* 入力ストリーム・フラグ */ int flag_out; /* 出力ストリーム・フラグ */ void *ptr; /* メソッド用コンテクストデータ */ }; /* * 入力ストリームの時1を返す。 */ int MYIO_is_input( MYIO *myio ); /* * 出力ストリームの時1を返す。 */ int MYIO_is_output( MYIO *myio ); /* * ストリームのメソッドが使用するコンテクストデータを返す */ void * MYIO_get_ptr ( MYIO *myio ); /* * ストリームハンドラの生成 */ MYIO *MYIO_make( MYIO *myio /* ストリーム */ , MYIO_METHOD *method /* 使用するメソッド構造体のポインタ */ , int flag_in /* 入力フラグ 入力の時1を指定 */ , int flag_out /* 出力フラグ 出力の時1を指定 */ , void *ptr /* メソッドで使用するコンテクストデータ */ ); /* * size バイト分のデータを読み出す関数。 * 返り値は buf に読み出したバイト数。 * 入力ストリームが空の時も何もしない。0が返る。 * エラー時には -1 が返る。 */ int MYIO_read( MYIO *in /* 入力ストリーム */ , char *buf /* 読み出しデータを保存する領域 */ , int size /* buf のサイズ */ ); /* * buf に格納された size バイト分のデータを書き込む関数。 * 返り値は書き出したバイト数。 * size==0 の時は何もしない。0が返る。 * エラー時には -1 が返る。 */ int MYIO_write( MYIO *out /* 出力ストリーム */ , const char *buf /* 書き込むデータの保存されている領域 */ , int size /* buf の サイズ */ ); /* * 文字列 str (ヌル文字で終端されたデータ)を書き込む関数。 * 返り値は書き出した文字列の長さ。 * strlen(str)==0 の時は何もしない。0が返る。 * エラー時には -1 が返る。 */ int MYIO_puts( MYIO *out /* 出力ストリーム */ , const char *str /* 書き込む文字列 */ ); /* * size-1 バイトまでの文字列をストリームから読み出し、buf に保存する。 * EOF または LF を読み込んだところで停止する。 * LF または CRLF は '\0' に書き換えられる。 * 返り値は最後のヌル文字を含まない読み出した文字列の長さ。 * size==0 の時は何もしない。0が返る。 * エラー時には -1 が返る。 */ int MYIO_gets( MYIO *in /* 入力ストリーム */ , char *buf /* 読み出した文字列を保存する領域 */ , int size /* buf のサイズ */ ); /* * ストリーム間で size バイト分のデータを移す。 * 返り値は実際に移したバイト数。 * size==0 の時は何もしない。0が返る。 * 入力ストリームが空の時も何もしない。0が返る。 * 終了後は出力ストリームの後尾に size バイト分増えている。 */ int MYIO_move ( MYIO *in /* IN: 入力ストリーム */ , int size /* IN: 読み出すバイト数 */ , MYIO *out /* OUT: 出力ストリーム */ ); /* * バッファリングフィルタの生成 * alloc_func はメモリアロケーションの関数 * void * alloc_func(void *alloc_func_ctx, int alloc_size) */ MYIO *MYIO_buf_filter_new ( MYIO *in /* バッファリング対象ストリーム */ , int buf_size /* バッファサイズ */ , void *alloc_func /* メモリアロケーションの関数 */ , void *alloc_func_ctx /* メモリアロケーションの関数のコンテクストデータ */ ); /* * バッファリング対象ストリームの取得 */ MYIO *MYIO_buf_get_MYIO ( MYIO *myio /* 入力ストリーム */ ); /* バッファリングフィルタの解放 * ・フィルタ対象ストリームの解放は行わない。 * ・free_func は領域の解放を行う関数。void free_func(free_func_ctx, data); */ void MYIO_buf_free( MYIO *myio /* 解放対象ストリーム */ , void *free_func /* メモリ解放の関数 */ , void *free_func_ctx /* メモリ解放の関数のコンテクストデータ */ ); #endif /* _MYIO_H_ */