CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
bufchain.h
Go to the documentation of this file.
1#pragma once
2
3#include <cx/cx.h>
4#include "cx/buffer/buffer.h"
5#include "cx/utils/compare.h"
6
7CX_C_BEGIN
8
11
55
56typedef struct BufChainNode BufChainNode;
57typedef struct BufChainNode {
58 BufChainNode* next;
59 Buffer buf;
60} BufChainNode;
61
62typedef struct BufChain {
63 BufChainNode* head;
64 BufChainNode* tail;
65 uintptr cursor;
66 size_t total;
67 size_t segsz;
68} BufChain;
69
84typedef bool (*bufchainZCCB)(_Inout_ Buffer buf, size_t off, _Pre_opt_valid_ void* ctx);
85
94void bufchainInit(_Out_ BufChain* chain, size_t segsz);
95
106size_t bufchainRead(_Inout_ BufChain* chain, _Out_writes_bytes_(bytes) uint8* buf, size_t bytes);
107
118_meta_inline size_t bufchainReadBuf(_Inout_ BufChain* chain, _Inout_ Buffer buf, size_t maxbytes)
119{
120 buf->len = bufchainRead(chain, buf->data, min(buf->sz, maxbytes));
121 return buf->len;
122}
123
135size_t bufchainPeek(_Inout_ BufChain* chain, _Out_writes_bytes_(bytes) uint8* buf, size_t off,
136 size_t bytes);
137
150_meta_inline size_t bufchainPeekBuf(_Inout_ BufChain* chain, _Inout_ Buffer buf, size_t off,
151 size_t maxbytes)
152{
153 buf->len = bufchainPeek(chain, buf->data, off, min(buf->sz, maxbytes));
154 return buf->len;
155}
156
166size_t bufchainSkip(_Inout_ BufChain* chain, size_t bytes);
167
186size_t bufchainReadZC(_Inout_ BufChain* chain, size_t maxbytes, bufchainZCCB cb,
187 _Inout_opt_ void* ctx);
188
219size_t bufchainGatherIov(_In_ BufChain* chain, _Out_writes_to_(maxiov, *count) BufIov* iov,
220 size_t maxiov, _Out_opt_ size_t* count);
221
231void bufchainWrite(_Inout_ BufChain* chain, _In_reads_bytes_(bytes) const uint8* buf, size_t bytes);
232
241_meta_inline void bufchainWriteBuf(_Inout_ BufChain* chain, _In_ Buffer buf)
242{
243 bufchainWrite(chain, buf->data, buf->len);
244}
245
260_At_(*buf, _Pre_notnull_ _Post_null_) void bufchainWriteZC(BufChain* chain, _Inout_ Buffer* buf);
261
269void bufchainDestroy(_Pre_notnull_ _Post_invalid_ BufChain* chain);
270
272
273CX_C_END
Simple buffer management.
Comparison and clamping macros.
void bufchainInit(BufChain *chain, size_t segsz)
void bufchainWrite(BufChain *chain, const uint8 *buf, size_t bytes)
size_t bufchainReadZC(BufChain *chain, size_t maxbytes, bufchainZCCB cb, void *ctx)
void bufchainWriteBuf(BufChain *chain, Buffer buf)
Definition bufchain.h:241
size_t bufchainPeekBuf(BufChain *chain, Buffer buf, size_t off, size_t maxbytes)
Definition bufchain.h:150
void bufchainWriteZC(BufChain *chain, Buffer *buf)
size_t bufchainSkip(BufChain *chain, size_t bytes)
size_t bufchainGatherIov(BufChain *chain, _Out_writes_to_(maxiov, *count) BufIov *iov, size_t maxiov, size_t *count)
size_t bufchainReadBuf(BufChain *chain, Buffer buf, size_t maxbytes)
Definition bufchain.h:118
void bufchainDestroy(BufChain *chain)
size_t bufchainPeek(BufChain *chain, uint8 *buf, size_t off, size_t bytes)
size_t bufchainRead(BufChain *chain, uint8 *buf, size_t bytes)
bool(* bufchainZCCB)(Buffer buf, size_t off, void *ctx)
Definition bufchain.h:84