52typedef struct StreamBuffer StreamBuffer;
66typedef size_t (*sbufPullCB)(_Pre_valid_ StreamBuffer* sb, _Out_writes_bytes_(sz) uint8* buf,
67 size_t sz, _Pre_opt_valid_
void* ctx);
73typedef void (*sbufPushCB)(_Pre_valid_ StreamBuffer* sb, _In_reads_bytes_(sz)
const uint8* buf,
74 size_t sz, _Pre_opt_valid_
void* ctx);
84typedef bool (*sbufSendCB)(_Pre_valid_ StreamBuffer* sb, _In_reads_bytes_(sz)
const uint8* buf,
85 size_t off,
size_t sz, _Pre_opt_valid_
void* ctx);
91typedef void (*sbufNotifyCB)(_Pre_valid_ StreamBuffer* sb,
size_t sz, _Pre_opt_valid_
void* ctx);
96typedef void (*sbufCleanupCB)(_Pre_opt_valid_
void* ctx);
114enum STREAM_BUFFER_FLAGS_ENUM {
117 SBUF_Direct = 0x0010,
119 SBUF_Producer_Registered = 0x1000,
120 SBUF_Consumer_Registered = 0x2000,
121 SBUF_Producer_Done = 0x4000,
122 SBUF_Consumer_Done = 0x8000,
126typedef struct StreamBuffer {
130 sbufPullCB producerPull;
131 sbufCleanupCB producerCleanup;
134 sbufNotifyCB consumerNotify;
135 sbufPushCB consumerPush;
136 sbufCleanupCB consumerCleanup;
170_At_(*sb, _Pre_maybenull_ _Post_null_)
void sbufRelease(_Inout_ StreamBuffer** sb);
190 return sb->flags & SBUF_Pull;
201 return sb->flags & SBUF_Push;
212 return sb->flags & SBUF_Error;
223 return (sb->flags & SBUF_Producer_Done) ||
sbufIsError(sb);
236 return (sb->flags & SBUF_Consumer_Done) ||
sbufIsError(sb);
260 _In_opt_ sbufCleanupCB pcleanup, _Inout_opt_
void* ctx);
274 _Inout_opt_
void* ctx);
295bool sbufPWrite(_Inout_ StreamBuffer* sb, _In_reads_bytes_(sz)
const uint8* buf,
size_t sz);
356 _Inout_opt_
void* ctx);
372 _In_opt_ sbufCleanupCB ccleanup, _Inout_opt_
void* ctx);
388 _In_opt_ sbufCleanupCB ccleanup, _Inout_opt_
void* ctx);
412_Success_(
return)
bool
413sbufCRead(_Inout_ StreamBuffer* sb, _Out_writes_bytes_to_(sz, *bytesread) uint8* buf,
size_t sz,
414 _Out_ _Deref_out_range_(0, sz)
size_t* bytesread);
431_Success_(
return > 0) bool
432sbufCPeek(_Inout_ StreamBuffer* sb, _Out_writes_bytes_(sz) uint8* buf,
size_t off,
size_t sz);
462bool sbufCSend(_Inout_ StreamBuffer* sb, _In_ sbufSendCB func,
size_t sz);
Ring buffer implementation for efficient streaming I/O.
bool sbufCRegisterPushDirect(StreamBuffer *sb, sbufPushCB cpush, sbufCleanupCB ccleanup, void *ctx)
bool sbufCSend(StreamBuffer *sb, sbufSendCB func, size_t sz)
bool sbufCFeed(StreamBuffer *sb, size_t minsz)
bool sbufCPeek(StreamBuffer *sb, uint8 *buf, size_t off, size_t sz)
size_t sbufCAvail(StreamBuffer *sb)
void sbufCFinish(StreamBuffer *sb)
bool sbufCSkip(StreamBuffer *sb, size_t bytes)
bool sbufCRegisterPush(StreamBuffer *sb, sbufNotifyCB cnotify, sbufCleanupCB ccleanup, void *ctx)
bool sbufCRegisterPull(StreamBuffer *sb, sbufCleanupCB ccleanup, void *ctx)
bool sbufCRead(StreamBuffer *sb, uint8 *buf, size_t sz, size_t *bytesread)
void sbufError(StreamBuffer *sb)
bool sbufIsPFinished(StreamBuffer *sb)
bool sbufIsPush(StreamBuffer *sb)
StreamBuffer * sbufCreate(size_t targetsz)
bool sbufIsCFinished(StreamBuffer *sb)
void sbufRelease(StreamBuffer **sb)
bool sbufIsPull(StreamBuffer *sb)
bool sbufIsError(StreamBuffer *sb)
bool sbufPRegisterPull(StreamBuffer *sb, sbufPullCB ppull, sbufCleanupCB pcleanup, void *ctx)
size_t sbufPAvail(StreamBuffer *sb)
bool sbufPWriteEOL(StreamBuffer *sb)
bool sbufPWriteStr(StreamBuffer *sb, strref str)
void sbufPFinish(StreamBuffer *sb)
bool sbufPWriteLine(StreamBuffer *sb, strref str)
bool sbufPRegisterPush(StreamBuffer *sb, sbufCleanupCB pcleanup, void *ctx)
bool sbufPWrite(StreamBuffer *sb, const uint8 *buf, size_t sz)
Runtime type system and type descriptor infrastructure.