picox  0.1
xstream.h
[詳解]
1 
14 /*
15  * License: MIT license
16  * Copyright (c) <2016> <MaskedW [maskedw00@gmail.com]>
17  *
18  * Permission is hereby granted, free of charge, to any person
19  * obtaining a copy of this software and associated documentation
20  * files (the "Software"), to deal in the Software without
21  * restriction, including without limitation the rights to use, copy,
22  * modify, merge, publish, distribute, sublicense, and/or sell copies
23  * of the Software, and to permit persons to whom the Software is
24  * furnished to do so, subject to the following conditions:
25  *
26  * The above copyright notice and this permission notice shall be
27  * included in all copies or substantial portions of the Software.
28  *
29  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
33  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
34  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
35  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
36  * SOFTWARE.
37  */
38 
39 #ifndef picox_core_detail_xstream_h_
40 #define picox_core_detail_xstream_h_
41 
42 
75 #ifdef __cplusplus
76 extern "C" {
77 #endif /* __cplusplus */
78 
79 
94 typedef int (*XStreamReadFunc)(void* driver, void* dst, size_t size, size_t* nread);
95 
96 
102 typedef int (*XStreamWriteFunc)(void* driver, const void* src, size_t size, size_t* nwritten);
103 
104 
109 typedef int (*XStreamSeekFunc)(void* driver, XOffset offset, XSeekMode mode);
110 
111 
114 typedef int (*XStreamTellFunc)(void* driver, XSize* pos);
115 
116 
119 typedef int (*XStreamSizeFunc)(void* driver, XSize* size);
120 
121 
124 typedef int (*XStreamFlushFunc)(void* driver);
125 
126 
129 typedef int (*XStreamCloseFunc)(void* driver);
130 
131 
134 typedef const char* (*XStreamErrorStringFunc)(int errcode);
135 
136 
153 typedef struct XStream
154 {
161  XTag tag;
162 
164  void* driver;
165 
167  int error;
168  XStreamReadFunc read_func;
169  XStreamWriteFunc write_func;
170  XStreamCloseFunc close_func;
171  XStreamFlushFunc flush_func;
172  XStreamSeekFunc seek_func;
173  XStreamTellFunc tell_func;
174  XStreamErrorStringFunc error_string_func;
175 } XStream;
176 
177 
180 #define X_STREAM_TAG (X_MAKE_TAG('X', 'S', 'T', 'R'))
181 
182 
185 typedef struct XMemStream
186 {
187  XStream stream;
188  uint8_t* mem;
189  XSize pos;
190  XSize size;
191  XSize capacity;
192 } XMemStream;
193 
194 
197 #define X_MEMSTREAM_TAG (X_MAKE_TAG('X', 'M', 'M', 'S'))
198 
199 
202 void xstream_init(XStream* self);
203 
204 
212 int xstream_read(XStream* self, void* dst, size_t size, size_t* nread);
213 
214 
222 int xstream_write(XStream* self, const void* src, size_t size, size_t* nwritten);
223 
224 
230 int xstream_close(XStream* self);
231 
232 
238 int xstream_flush(XStream* self);
239 
240 
246 int xstream_seek(XStream* self, XOffset offset, XSeekMode mode);
247 
248 
254 int xstream_tell(XStream* self, XSize* pos);
255 
256 
259 int xstream_error(const XStream* self);
260 
261 
264 const char* xstream_error_string(const XStream* self, int errcode);
265 
266 
272 int xstream_putc(XStream* self, int c);
273 
274 
279 int xstream_getc(XStream* self);
280 
281 
322 int xstream_gets(XStream* self, char* dst, size_t size, char** result, bool* overflow);
323 
324 
330 int xstream_printf(XStream* self, const char* fmt, ...);
331 
332 
338 int xstream_vprintf(XStream* self, const char* fmt, va_list args);
339 
340 
352 void xmemstream_init(XMemStream* self, void* mem, size_t size, size_t capacity);
353 
354 
357 static inline XMemStream* x_memstream_cast(XStream* stream)
358 {
359  X_ASSERT(stream);
360  return (stream->tag == X_MEMSTREAM_TAG) ? (XMemStream*)stream : NULL;
361 }
362 
363 
364 #ifdef __cplusplus
365 }
366 #endif /* __cplusplus */
367 
368 
374 #endif /* picox_core_detail_xstream_h_ */
int xstream_read(XStream *self, void *dst, size_t size, size_t *nread)
ストリームからdstにsizeバイトの読み出しを試みます
Definition: xstream.c:72
int(* XStreamSeekFunc)(void *driver, XOffset offset, XSeekMode mode)
ストリームの現在位置を移動する関数ポインタ型です
Definition: xstream.h:109
int(* XStreamCloseFunc)(void *driver)
ストリームのフラッシュと、リソースの開放を行う関数ポインタ型です
Definition: xstream.h:129
int xstream_putc(XStream *self, int c)
cをunsigned charにキャストしてストリームに書き込みます
Definition: xstream.c:146
int xstream_seek(XStream *self, XOffset offset, XSeekMode mode)
ストリームの現在位置を移動します
Definition: xstream.c:112
int xstream_vprintf(XStream *self, const char *fmt, va_list args)
ストリームにvprintf形式の出力を行います
Definition: xstream.c:216
int(* XStreamWriteFunc)(void *driver, const void *src, size_t size, size_t *nwritten)
ストリームへの書き込み関数ポインタ型です
Definition: xstream.h:102
int xstream_tell(XStream *self, XSize *pos)
ストリームの現在位置をposに格納します
Definition: xstream.c:122
XTag tag
ストリームの識別ID
Definition: xstream.h:160
uint32_t XSize
何らかの大きさを表すのに十分なサイズを備えた符号なし整数型です
Definition: xstddef.h:251
int(* XStreamReadFunc)(void *driver, void *dst, size_t size, size_t *nread)
ストリームからの読み出し関数ポインタ型です
Definition: xstream.h:94
int xstream_write(XStream *self, const void *src, size_t size, size_t *nwritten)
ストリームにsrcからsizeバイトの書き込みを試みます
Definition: xstream.c:83
static XMemStream * x_memstream_cast(XStream *stream)
tagがXMemStreamと一致していなければNULLを返します
Definition: xstream.h:356
int xstream_error(const XStream *self)
最後のエラー値を返します
Definition: xstream.c:132
int(* XStreamSizeFunc)(void *driver, XSize *size)
ストリームのバイト数を取得する関数ポインタ型です
Definition: xstream.h:119
const char *(* XStreamErrorStringFunc)(int errcode)
ストリームが返したエラーステータスに対応する文字列を返す関数ポインタ型です
Definition: xstream.h:134
uint32_t XTag
何らかのIDを格納するための符号なし整数が型です
Definition: xstddef.h:269
const char * xstream_error_string(const XStream *self, int errcode)
エラー値の文字列表現を返します
Definition: xstream.c:139
int(* XStreamFlushFunc)(void *driver)
ストリームのバッファリングをフラッシュする関数ポインタ型です
Definition: xstream.h:124
int xstream_gets(XStream *self, char *dst, size_t size, char **result, bool *overflow)
ストリームから1行を取り出します
Definition: xstream.c:179
void * driver
Definition: xstream.h:163
int32_t XOffset
何らかのオフセットを表すのに十分な大きさをもった符号あり整数型です
Definition: xstddef.h:261
ストリームを表す抽象型です
Definition: xstream.h:152
int error
Definition: xstream.h:166
void xmemstream_init(XMemStream *self, void *mem, size_t size, size_t capacity)
メモリストリームを初期化します
Definition: xstream.c:223
int xstream_printf(XStream *self, const char *fmt,...)
ストリームにvprintf形式の出力を行います
Definition: xstream.c:206
int xstream_close(XStream *self)
ストリームの終了処理を行います
Definition: xstream.c:94
XSeekMode
シークの起点を指定する列挙型です
Definition: xstddef.h:340
int xstream_getc(XStream *self)
ストリームから1バイトを読みだし、intにキャストして返します
Definition: xstream.c:163
メモリに対して入出力を行うストリーム型です
Definition: xstream.h:184
int xstream_flush(XStream *self)
ストリームの終了処理を行います
Definition: xstream.c:103
int(* XStreamTellFunc)(void *driver, XSize *pos)
ストリームの現在位置を取得する関数ポインタ型です
Definition: xstream.h:114
#define X_MEMSTREAM_TAG
XMemStreamのタグです
Definition: xstream.h:196
void xstream_init(XStream *self)
ストリームの初期化を行います
Definition: xstream.c:56