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) |