CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
bufring.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
51
52typedef struct BufRingNode BufRingNode;
53typedef struct BufRingNode {
54 BufRingNode* next;
55 Buffer buf;
56 size_t head;
57 size_t tail;
58 bool full;
59} BufRingNode;
60
61typedef struct BufRing {
62 BufRingNode* head;
63 BufRingNode* tail;
64 size_t total;
65 size_t segsz;
66 size_t reserved;
67} BufRing;
68
79typedef bool (*bufringZCCB)(_In_reads_bytes_(bytes) const uint8* buf, size_t bytes,
80 _Pre_opt_valid_ void* ctx);
81
96typedef size_t (*bufringFeedCB)(_Out_writes_bytes_(maxbytes) uint8* buf, size_t maxbytes,
97 _Pre_opt_valid_ void* ctx);
98
107void bufringInit(_Out_ BufRing* ring, size_t segsz);
108
119size_t bufringRead(_Inout_ BufRing* ring, _Out_writes_bytes_(bytes) uint8* buf, size_t bytes);
120
131_meta_inline size_t bufringReadBuf(_Inout_ BufRing* ring, _Inout_ Buffer buf, size_t maxbytes)
132{
133 buf->len = bufringRead(ring, buf->data, min(buf->sz, maxbytes));
134 return buf->len;
135}
136
148size_t bufringPeek(_Inout_ BufRing* ring, _Out_writes_bytes_(bytes) uint8* buf, size_t off,
149 size_t bytes);
150
163_meta_inline size_t bufringPeekBuf(_Inout_ BufRing* ring, _Inout_ Buffer buf, size_t off,
164 size_t maxbytes)
165{
166 buf->len = bufringPeek(ring, buf->data, off, min(buf->sz, maxbytes));
167 return buf->len;
168}
169
179size_t bufringSkip(_Inout_ BufRing* ring, size_t bytes);
180
199size_t bufringReadZC(_Inout_ BufRing* ring, size_t bytes, bufringZCCB cb, _Inout_opt_ void* ctx);
200
210void bufringWrite(_Inout_ BufRing* ring, _In_reads_bytes_(bytes) const uint8* buf, size_t bytes);
211
220_meta_inline void bufringWriteBuf(_Inout_ BufRing* ring, _In_ Buffer buf)
221{
222 bufringWrite(ring, buf->data, buf->len);
223}
224
240_At_(*buf, _Pre_notnull_ _Post_null_) void bufringWriteZC(_Inout_ BufRing* ring, _Inout_ Buffer* buf);
241
250size_t bufringWriteSpace(_In_ BufRing* ring);
251
270size_t bufringFeed(_Inout_ BufRing* ring, bufringFeedCB feed, size_t bytes, _Inout_opt_ void* ctx);
271
280size_t bufringWriteSpace(_In_ BufRing* ring);
281
300size_t bufringFeed(_Inout_ BufRing* ring, bufringFeedCB feed, size_t bytes, _Inout_opt_ void* ctx);
301
340void bufringReserve(_Inout_ BufRing* ring, size_t minbytes,
341 _Outptr_result_buffer_(*len) uint8** ptr, _Out_ size_t* len);
342
353void bufringCommit(_Inout_ BufRing* ring, size_t bytes);
354
362void bufringDestroy(_Pre_notnull_ _Post_invalid_ BufRing* ring);
363
365
366CX_C_END
Simple buffer management.
Comparison and clamping macros.
size_t bufringReadBuf(BufRing *ring, Buffer buf, size_t maxbytes)
Definition bufring.h:131
void bufringWrite(BufRing *ring, const uint8 *buf, size_t bytes)
size_t bufringPeekBuf(BufRing *ring, Buffer buf, size_t off, size_t maxbytes)
Definition bufring.h:163
size_t bufringSkip(BufRing *ring, size_t bytes)
bool(* bufringZCCB)(const uint8 *buf, size_t bytes, void *ctx)
Definition bufring.h:79
void bufringInit(BufRing *ring, size_t segsz)
size_t bufringReadZC(BufRing *ring, size_t bytes, bufringZCCB cb, void *ctx)
void bufringWriteBuf(BufRing *ring, Buffer buf)
Definition bufring.h:220
size_t(* bufringFeedCB)(uint8 *buf, size_t maxbytes, void *ctx)
Definition bufring.h:96
size_t bufringPeek(BufRing *ring, uint8 *buf, size_t off, size_t bytes)
size_t bufringRead(BufRing *ring, uint8 *buf, size_t bytes)
void bufringReserve(BufRing *ring, size_t minbytes, _Outptr_result_buffer_(*len) uint8 **ptr, size_t *len)
void bufringCommit(BufRing *ring, size_t bytes)
void bufringDestroy(BufRing *ring)
void bufringWriteZC(BufRing *ring, Buffer *buf)
size_t bufringFeed(BufRing *ring, bufringFeedCB feed, size_t bytes, void *ctx)
size_t bufringWriteSpace(BufRing *ring)