myio.h
最終更新:2009/11/8
001: /* 002: * ストリームの抽象化の試み 003: * OpenSSL の BIO API の超サブセットというか。 004: */ 005: 006: #ifndef _MYIO_H_ 007: #define _MYIO_H_ 008: 009: /* 010: * ユーティリティ関数 011: */ 012: 013: /* 014: * 文字列の長さを返す関数 015: */ 016: 017: int mystrlen (const char *str); 018: 019: /* 二つの文字列が等しいか検査する関数 020: * 返り値: 021: * 1:等しい、0:等しくない 022: */ 023: 024: int mystreq (const char*x, const char*y); 025: 026: #define MYIO_CHAR_CR '\r' 027: #define MYIO_CHAR_LF '\n' 028: #define MYIO_BUF_SIZE 1024 029: 030: typedef struct myio_st MYIO; 031: 032: typedef struct myio_method_st { 033: const char *name; 034: int (*write)(MYIO *, const char *, int); 035: int (*read)(MYIO *, char *, int); 036: int (*puts)(MYIO *, const char *); 037: int (*gets)(MYIO *, char *, int); 038: } MYIO_METHOD; 039: 040: struct myio_st { 041: MYIO_METHOD *method; /* メソッド */ 042: int flag_in; /* 入力ストリーム・フラグ */ 043: int flag_out; /* 出力ストリーム・フラグ */ 044: void *ptr; /* メソッド用コンテクストデータ */ 045: }; 046: 047: /* 048: * 入力ストリームの時1を返す。 049: */ 050: 051: int MYIO_is_input( 052: MYIO *myio 053: ); 054: 055: /* 056: * 出力ストリームの時1を返す。 057: */ 058: 059: int MYIO_is_output( 060: MYIO *myio 061: ); 062: 063: /* 064: * ストリームのメソッドが使用するコンテクストデータを返す 065: */ 066: void * MYIO_get_ptr ( 067: MYIO *myio 068: ); 069: 070: /* 071: * ストリームハンドラの生成 072: */ 073: 074: MYIO *MYIO_make( 075: MYIO *myio /* ストリーム */ 076: , MYIO_METHOD *method /* 使用するメソッド構造体のポインタ */ 077: , int flag_in /* 入力フラグ 入力の時1を指定 */ 078: , int flag_out /* 出力フラグ 出力の時1を指定 */ 079: , void *ptr /* メソッドで使用するコンテクストデータ */ 080: ); 081: 082: /* 083: * size バイト分のデータを読み出す関数。 084: * 返り値は buf に読み出したバイト数。 085: * 入力ストリームが空の時も何もしない。0が返る。 086: * エラー時には -1 が返る。 087: */ 088: 089: int MYIO_read( 090: MYIO *in /* 入力ストリーム */ 091: , char *buf /* 読み出しデータを保存する領域 */ 092: , int size /* buf のサイズ */ 093: ); 094: 095: /* 096: * buf に格納された size バイト分のデータを書き込む関数。 097: * 返り値は書き出したバイト数。 098: * size==0 の時は何もしない。0が返る。 099: * エラー時には -1 が返る。 100: */ 101: 102: int MYIO_write( 103: MYIO *out /* 出力ストリーム */ 104: , const char *buf /* 書き込むデータの保存されている領域 */ 105: , int size /* buf の サイズ */ 106: ); 107: 108: /* 109: * 文字列 str (ヌル文字で終端されたデータ)を書き込む関数。 110: * 返り値は書き出した文字列の長さ。 111: * strlen(str)==0 の時は何もしない。0が返る。 112: * エラー時には -1 が返る。 113: */ 114: 115: int MYIO_puts( 116: MYIO *out /* 出力ストリーム */ 117: , const char *str /* 書き込む文字列 */ 118: ); 119: 120: /* 121: * size-1 バイトまでの文字列をストリームから読み出し、buf に保存する。 122: * EOF または LF を読み込んだところで停止する。 123: * LF または CRLF は '\0' に書き換えられる。 124: * 返り値は最後のヌル文字を含まない読み出した文字列の長さ。 125: * size==0 の時は何もしない。0が返る。 126: * エラー時には -1 が返る。 127: */ 128: int MYIO_gets( 129: MYIO *in /* 入力ストリーム */ 130: , char *buf /* 読み出した文字列を保存する領域 */ 131: , int size /* buf のサイズ */ 132: ); 133: 134: /* 135: * ストリーム間で size バイト分のデータを移す。 136: * 返り値は実際に移したバイト数。 137: * size==0 の時は何もしない。0が返る。 138: * 入力ストリームが空の時も何もしない。0が返る。 139: * 終了後は出力ストリームの後尾に size バイト分増えている。 140: */ 141: 142: int MYIO_move ( 143: MYIO *in /* IN: 入力ストリーム */ 144: , int size /* IN: 読み出すバイト数 */ 145: , MYIO *out /* OUT: 出力ストリーム */ 146: ); 147: 148: /* 149: * バッファリングフィルタの生成 150: * alloc_func はメモリアロケーションの関数 151: * void * alloc_func(void *alloc_func_ctx, int alloc_size) 152: */ 153: 154: MYIO *MYIO_buf_filter_new ( 155: MYIO *in /* バッファリング対象ストリーム */ 156: , int buf_size /* バッファサイズ */ 157: , void *alloc_func /* メモリアロケーションの関数 */ 158: , void *alloc_func_ctx /* メモリアロケーションの関数のコンテクストデータ */ 159: ); 160: 161: /* 162: * バッファリング対象ストリームの取得 163: */ 164: MYIO *MYIO_buf_get_MYIO ( 165: MYIO *myio /* 入力ストリーム */ 166: ); 167: 168: /* バッファリングフィルタの解放 169: * ・フィルタ対象ストリームの解放は行わない。 170: * ・free_func は領域の解放を行う関数。void free_func(free_func_ctx, data); 171: */ 172: 173: void MYIO_buf_free( 174: MYIO *myio /* 解放対象ストリーム */ 175: , void *free_func /* メモリ解放の関数 */ 176: , void *free_func_ctx /* メモリ解放の関数のコンテクストデータ */ 177: ); 178: 179: #endif /* _MYIO_H_ */
KAKU PROJECT (2009) |