myio.h

最終更新:2009/11/8

myio.h

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_ */
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)