Thu, 30 Oct 2025 19:26:47 +0100
add tests for cxListDifference() - resolves #751
| 1143 
0559812df10c
assign proper names to the documentation topics
 Mike Becker <universe@uap-core.de> parents: 
1142diff
changeset | 1 | # Buffer | 
| 1141 | 2 | |
| 1262 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 3 | This buffer implementation can be used to read from or write to memory like you would do with a stream. | 
| 1146 
151c057faf7c
add marker to every incomplete page
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 4 | |
| 
151c057faf7c
add marker to every incomplete page
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 5 | This allows the use of `cx_stream_copy()` (see [](streams.h.md)) to copy contents from one buffer to another, | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 6 | or from a file or network stream to the buffer and vice versa. | 
| 1141 | 7 | |
| 1262 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 8 | More features for convenient use of the buffer can be enabled, like automatic memory management, | 
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 9 | automatic resizing of the buffer space, or automatic flushing of contents. | 
| 1141 | 10 | |
| 1262 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 11 | The functions `cxBufferRead()` and `cxBufferWrite()` are `cx_read_func` and `cx_write_func` compatible, | 
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 12 | which in turn have a compatible signature to `fread()` and `fwrite()`. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 13 | However, due to the different pointer type the function pointers do not type check out of the box. | 
| 1262 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 14 | For convenience, the macros `cxBufferReadFunc` and `cxBufferWriteFunc` are defined, which perform the necessary cast. | 
| 1142 
9437530176bc
add symbols that need documentation as TODOs
 Mike Becker <universe@uap-core.de> parents: 
1141diff
changeset | 15 | |
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 16 | ## Example | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 17 | |
| 1276 | 18 | In the following example we use a `CxBuffer`, the `bprintf()` macro from the [UCX printf header](printf.h.md), | 
| 19 | and a [UCX map](map.h.md) to create a simple HTTP GET request. | |
| 20 | ||
| 21 | ```C | |
| 22 | #include <cx/buffer.h> | |
| 23 | #include <cx/printf.h> | |
| 24 | #include <cx/map.h> | |
| 25 | ||
| 26 | void send_get_request( | |
| 27 | void *net_target, | |
| 28 | cx_write_func net_write, | |
| 29 | const char *host, | |
| 30 | const char *path, | |
| 31 | CxMap *header | |
| 32 | ) { | |
| 33 | // initialize buffer and use stack memory for small requests | |
| 34 | char stackmem[128]; | |
| 35 | CxBuffer buf; | |
| 36 | cxBufferInit( | |
| 37 | &buf, stackmem, sizeof(stackmem), | |
| 38 | cxDefaultAllocator, | |
| 39 | CX_BUFFER_COPY_ON_EXTEND // move to heap when request is larger | |
| 40 | ); | |
| 41 | ||
| 42 | // basic request data | |
| 43 | cx_bprintf(&buf, "GET %s HTTP/1.1\r\n", path); | |
| 44 | cx_bprintf(&buf, "Host: %s\r\n", host); | |
| 45 | ||
| 46 | // add headers | |
| 47 | CxMapIterator iter = cxMapIterator(header); | |
| 48 | cx_foreach(CxMapEntry*, entry, iter) { | |
| 49 | cxstring name = cx_strn(entry->key->data, entry->key->len); | |
| 1298 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1291diff
changeset | 50 | cx_bprintf(&buf, "%" CX_PRIstr ": %s\r\n", | 
| 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1291diff
changeset | 51 | CX_SFMT(name), entry->value | 
| 1276 | 52 | ); | 
| 53 | } | |
| 54 | ||
| 55 | // blank line terminates | |
| 56 | cxBufferWrite("\r\n", 1, 2, &buf); | |
| 57 | ||
| 58 | // write request to the network stream and destroy the buffer | |
| 59 | net_write(buf.space, 1, buf.size, net_target); | |
| 60 | cxBufferDestroy(&buf); | |
| 61 | } | |
| 62 | ``` | |
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 63 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 64 | ## Create | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 65 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 66 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 67 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 68 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 69 | int cxBufferInit(CxBuffer *buffer, void *space, size_t capacity, | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 70 | const CxAllocator *allocator, int flags); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 71 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 72 | CxBuffer *cxBufferCreate(void *space,size_t capacity, | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 73 | const CxAllocator *allocator, int flags); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 74 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 75 | // available flags: | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 76 | #define CX_BUFFER_DEFAULT | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 77 | #define CX_BUFFER_FREE_CONTENTS | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 78 | #define CX_BUFFER_AUTO_EXTEND | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 79 | #define CX_BUFFER_COPY_ON_WRITE | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 80 | #define CX_BUFFER_COPY_ON_EXTEND | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 81 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 82 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 83 | For creating a UCX buffer, you have two options: initialize a pre-allocated structure, or allocate and initialize a new structure in one call. | 
| 1264 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 84 | |
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 85 | For the first option, you can call `cxBufferInit()` with the `buffer` argument pointing to an uninitialized `CxBuffer` structure. | 
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 86 | You can pass a pre-allocated `space`, the desired `capacity`, and an `allocator`. | 
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 87 | If `space` is `NULL`, the `allocator` is used to allocate enough space to match the desired `capacity`. | 
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 88 | |
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 89 | The `flags` argument is a bit-wise-or combination of the constants listed below. | 
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 90 | |
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 91 | The function `cxBufferCreate()` is equivalent, except that it uses the `allocator` to allocate a new `CxBuffer` structure, instead of initializing an existing one. | 
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 92 | |
| 
8ff604356af7
document buffer create/init
 Mike Becker <universe@uap-core.de> parents: 
1263diff
changeset | 93 | If any allocation fails, `cxBufferInit()` returns non-zero, or `cxBufferCreate()` returns `NULL`, respectively. | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 94 | |
| 1263 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 95 | | Flag | Description | | 
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 96 | |--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 97 | | CX_BUFFER_DEFAULT | Alias for zero, meaning no flags are set. | | 
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 98 | | CX_BUFFER_FREE_CONTENTS | When the buffer structure is [destroyed](#destroy), the memory for the contents is also automatically deallocated. | | 
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 99 | | CX_BUFFER_AUTO_EXTEND | When a write operation would exceed the buffers capacity, the buffer is grown automatically with a call to `cxBufferMinimumCapacity()`. | | 
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 100 | | CX_BUFFER_COPY_ON_WRITE | Any write operation will result in allocating a copy of the data, first. This is particularly useful, when a buffer is initialized with read-only memory. | | 
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 101 | | CX_BUFFER_COPY_ON_EXTEND | Only when a write operation would exceed the buffers capacity, the copy-on-write operation is performed. This is useful, when a buffer is initialized with read-write memory which is allocated on the stack. | | 
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 102 | |
| 
f993745c60f0
document the buffer flags
 Mike Becker <universe@uap-core.de> parents: 
1262diff
changeset | 103 | |
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 104 | ## Destroy | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 105 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 106 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 107 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 108 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 109 | void cxBufferDestroy(CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 110 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 111 | void cxBufferFree(CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 112 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 113 | |
| 1259 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 114 | The above functions destroy the buffer and deallocate the buffer's memory when the `CX_BUFFER_FREE_CONTENTS` flag is set. | 
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 115 | |
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 116 | The function `cxBufferDestroy()` is to be used when the buffer was initialized with `cxBufferInit()`, | 
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 117 | and the function `cxBufferFree()` is to be used when the buffer was created with `cxBufferCreate()`. | 
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 118 | The only difference is, that `cxBufferFree()` additionally deallocates the memory of the `CxBuffer` structure. | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 119 | |
| 1290 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 120 | ## Capacity Management | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 121 | |
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 122 | ```C | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 123 | #include <cx/buffer.h> | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 124 | |
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 125 | int cxBufferMinimumCapacity(CxBuffer *buffer, size_t capacity); | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 126 | |
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 127 | void cxBufferShrink(CxBuffer *buffer, size_t reserve); | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 128 | ``` | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 129 | |
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 130 | The function `cxBufferMinimumCapacity()` guarantees a buffer capacity of _at least_ `capacity`. | 
| 1291 
5942859fd76c
new auto-extend strategy for CxBuffer - resolves #641
 Mike Becker <universe@uap-core.de> parents: 
1290diff
changeset | 131 | The actual capacity will be a power of two until the system's page size is reached. | 
| 
5942859fd76c
new auto-extend strategy for CxBuffer - resolves #641
 Mike Becker <universe@uap-core.de> parents: 
1290diff
changeset | 132 | Then, the new capacity will be a multiple of the page size. | 
| 1290 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 133 | The function returns non-zero if increasing the capacity was attempted unsuccessfully. | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 134 | |
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 135 | The function `cxBufferShrink()` can be used to shrink the capacity of the buffer to its current size | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 136 | plus a number of `reserve` bytes. | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 137 | If the current capacity is not larger than the size plus the reserve bytes, the function will do nothing. | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 138 | |
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 139 | > If the buffer is in a copy-on-write state, `cxBufferMinimumCapacity()` will perform the copy-on-write action | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 140 | > before reallocating the space. | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 141 | > The function `cxBufferShrink()` on the other hand does _nothing_ when the buffer is in a copy-on-write state, | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 142 | > because it does not make much sense to copy the memory just to have it in a smaller memory region. | 
| 
4ac889e14211
adds cxBufferShrink() - resolves #626
 Mike Becker <universe@uap-core.de> parents: 
1288diff
changeset | 143 | |
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 144 | ## Write | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 145 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 146 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 147 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 148 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 149 | size_t cxBufferWrite(const void *ptr, size_t size, size_t nitems, | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 150 | CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 151 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 152 | int cxBufferPut(CxBuffer *buffer, int c); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 153 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 154 | size_t cxBufferPutString(CxBuffer *buffer, const char *str); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 155 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 156 | int cxBufferTerminate(CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 157 | |
| 1270 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 158 | size_t cxBufferAppend(const void *ptr, size_t size, size_t nitems, | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 159 | CxBuffer *buffer); | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 160 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 161 | |
| 1270 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 162 | The primary function for writing to a buffer is `cxBufferWrite()` | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 163 | which writes up to `nitems` with `size` bytes each from the memory pointed to by `ptr` to the buffer. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 164 | |
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 165 | When the capacity of the buffer is not sufficient and the `CX_BUFFER_AUTO_EXTEND` is not set in the buffer, | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 166 | items that do not fit into the buffer are discarded. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 167 | The function always returns the actual number of items successfully written. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 168 | This equals the number of bytes if and only if `size=1`. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 169 | |
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 170 | The function `cxBufferPut()` is a `putc()`-like wrapper for `cxBufferWrite()` which writes the character `c`, | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 171 | converted to an `unsigned char` to the buffer. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 172 | Just like `putc()` this function returns the written character on success, and `EOF` on failure, | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 173 | but it does _not_ set `errno` on failure. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 174 | |
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 175 | The function `cxBufferPutString()` is a convenience function, | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 176 | that uses stdlib `strlen()` to compute the length of `str` and then invokes `cxBufferWrite()`. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 177 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 178 | All the above functions advance the buffer position by the number of bytes written | 
| 1270 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 179 | and cause the _size_ of the buffer to grow, if necessary, to contain all written bytes. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 180 | On the other hand, `cxBufferTerminate()` writes a zero-byte at the current position, | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 181 | effectively creating a zero-terminated string whose size equals the buffer size. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 182 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 183 | The function `cxBufferAppend()` writes the data to the end of the buffer (given by its size) regardless of the current position, | 
| 1270 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 184 | and it also does _not_ advance the position. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 185 | If the write operation triggered a [flush](#flushing), however, the position will be shifted left alongside the shifted buffer contents. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 186 | In case the data at which the current position points gets flushed, the new position will be zero. | 
| 
503f0ad94c6c
document buffer write functions
 Mike Becker <universe@uap-core.de> parents: 
1269diff
changeset | 187 | |
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 188 | ## Read | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 189 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 190 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 191 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 192 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 193 | size_t cxBufferRead(void *ptr, size_t size, size_t nitems, | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 194 | CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 195 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 196 | int cxBufferGet(CxBuffer *buffer); | 
| 1259 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 197 | |
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 198 | bool cxBufferEof(const CxBuffer *buffer); | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 199 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 200 | |
| 1262 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 201 | The function `cxBufferRead()` reads `nitems` number of items of `size` bytes each from the `buffer` | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 202 | and stores them into the memory pointed to by `ptr`, which must be large enough to hold the contents. | 
| 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 203 | The function returns the actual bytes read, which might be lower if the desired number of items is not available. | 
| 1262 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 204 | |
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 205 | The function `cxBufferGet()` is a `fgetc()`-like function which returns the next byte in the buffer converted to an `int`. | 
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 206 | Similar to `fgetc()` it returns `EOF` when there are no more bytes in the buffer. | 
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 207 | |
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 208 | When all bytes from the buffer have been read, the function `cxBufferEof()` returns true. | 
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 209 | |
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 210 | All read functions advance the position in the buffer by the number of read bytes. | 
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 211 | |
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 212 | > When you want to read from a buffer that you previously used for writing, do not forget to set the position | 
| 
7cc81244b28a
document buffer read operations
 Mike Becker <universe@uap-core.de> parents: 
1261diff
changeset | 213 | > in the buffer to zero, e.g. by calling `cxBufferSeek()`. | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 214 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 215 | ## Reset and Clear | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 216 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 217 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 218 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 219 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 220 | void cxBufferReset(CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 221 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 222 | void cxBufferClear(CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 223 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 224 | |
| 1261 
6bbc308b7a20
add documentation for reset and clear
 Mike Becker <universe@uap-core.de> parents: 
1260diff
changeset | 225 | The function `cxBufferReset()` sets both size and position of the buffer to zero, | 
| 
6bbc308b7a20
add documentation for reset and clear
 Mike Becker <universe@uap-core.de> parents: 
1260diff
changeset | 226 | and `cxBufferClear()` additionally uses `memset()` to set every byte in the buffer to zero. | 
| 
6bbc308b7a20
add documentation for reset and clear
 Mike Becker <universe@uap-core.de> parents: 
1260diff
changeset | 227 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 228 | > When clearing the buffer, only the "live" data, i.e., bytes with indices `[0..size)`, are cleared. | 
| 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 229 | > If you want to clear the entire buffer's memory, you would need to set the size to the capacity, first. | 
| 1261 
6bbc308b7a20
add documentation for reset and clear
 Mike Becker <universe@uap-core.de> parents: 
1260diff
changeset | 230 | |
| 
6bbc308b7a20
add documentation for reset and clear
 Mike Becker <universe@uap-core.de> parents: 
1260diff
changeset | 231 | > If the `CX_BUFFER_COPY_ON_WRITE` flag is set, `cxBufferClear()` behaves exactly like `cxBufferReset()`, | 
| 
6bbc308b7a20
add documentation for reset and clear
 Mike Becker <universe@uap-core.de> parents: 
1260diff
changeset | 232 | > because writing to the contents is disallowed. | 
| 
6bbc308b7a20
add documentation for reset and clear
 Mike Becker <universe@uap-core.de> parents: 
1260diff
changeset | 233 | >{style="note"} | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 234 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 235 | ## Random Access | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 236 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 237 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 238 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 239 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 240 | int cxBufferSeek(CxBuffer *buffer, off_t offset, int whence); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 241 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 242 | |
| 1259 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 243 | The function `cxBufferSeek()` is a `fseek()`-like function that sets the current position in the buffer | 
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 244 | relative to the start (when `whence` is `SEEK_SET`), the current position (when `whence` is `SEEK_CUR`), | 
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 245 | or end (when `whence` is `SEEK_END`) of the buffer. | 
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 246 | |
| 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 247 | If the resulting position is negative, or larger than the size (i.e. the first unused byte), | 
| 1288 
b41ad5d9bcbf
 fixes errno value after failing cxBufferSeek() to be consistently EINVAL
 Mike Becker <universe@uap-core.de> parents: 
1276diff
changeset | 248 | this function returns non-zero and sets `errno` to `EINVAL`. | 
| 1259 
7bc999fe285d
more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
 Mike Becker <universe@uap-core.de> parents: 
1256diff
changeset | 249 | |
| 1288 
b41ad5d9bcbf
 fixes errno value after failing cxBufferSeek() to be consistently EINVAL
 Mike Becker <universe@uap-core.de> parents: 
1276diff
changeset | 250 | > Note that the behavior of `cxBufferSeek()` when seeking beyond the end of the buffer is not exactly the same as for POSIX `fseek()`. | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 251 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 252 | ## Shift Contents | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 253 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 254 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 255 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 256 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 257 | int cxBufferShift(CxBuffer *buffer, off_t shift); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 258 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 259 | int cxBufferShiftRight(CxBuffer *buffer, size_t shift); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 260 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 261 | int cxBufferShiftLeft(CxBuffer *buffer, size_t shift); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 262 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 263 | |
| 1260 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 264 | The function `cxBufferShift()` moves the contents within the buffer by the specified `shift` offset, | 
| 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 265 | where a negative offset means a shift to the left, and a positive offset means a shift to the right. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 266 | It also adjusts the current position within the buffer, and in the case of a right shift also the size, by the same offset. | 
| 1260 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 267 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 268 | Data shifted to the left is always discarded when the new position of a byte would be smaller than zero. | 
| 1430 
5917ed4e5a79
minor wording improvements in buffer documentation
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 269 | When bytes are discarded, the new position of the buffer is set to zero. | 
| 1260 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 270 | |
| 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 271 | When data is shift to the right, the behavior depends on the `CX_BUFFER_AUTO_EXTEND` flag. | 
| 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 272 | If set, the function extends the buffer's capacity before moving the data. | 
| 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 273 | Otherwise, the function discards all data that would exceed the buffer's capacity, and both the size and the position are equal to the capacity | 
| 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 274 | (which means, `cxBufferEof()` returns `true` after the operation). | 
| 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 275 | |
| 
56a019cdb055
add documentation for the shift functions
 Mike Becker <universe@uap-core.de> parents: 
1259diff
changeset | 276 | The functions `cxBufferShiftRight()` and `cxBufferShiftLeft()` accept a larger (but in both cases positive) shift offset, | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 277 | which usually makes little sense on a 64-bit platform where `off_t` is already large enough to represent any reasonable offset. | 
| 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 278 | You may, however, still use those functions to express more explicitly in your code in which direction you want the contents to be shifted. | 
| 1256 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 279 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 280 | ## Flushing | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 281 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 282 | ```C | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 283 | #include <cx/buffer.h> | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 284 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 285 | typedef struct cx_buffer_flush_config_s { | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 286 | size_t threshold; | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 287 | size_t blksize; | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 288 | size_t blkmax; | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 289 | void *target; | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 290 | cx_write_func wfunc; | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 291 | } CxBufferFlushConfig; | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 292 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 293 | int cxBufferEnableFlushing(CxBuffer *buffer, | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 294 | CxBufferFlushConfig config); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 295 | |
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 296 | size_t cxBufferFlush(CxBuffer *buffer); | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 297 | ``` | 
| 
b9a940779877
define structure for buffer.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 298 | |
| 1269 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 299 | With the function `cxBufferEnableFlushing()` you can configure a flushing strategy for the contents of the buffer. | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 300 | |
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 301 | Flushing, once enabled, may happen in the following cases: | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 302 | 1. when data is written to the buffer, the capacity is insufficient, and `CX_BUFFER_AUTO_EXTEND` is _not_ enabled | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 303 | 2. when data is written to the buffer, and the required capacity exceeds the `threshold` configuration | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 304 | 3. when `cxBufferFlush()` is called explicitly | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 305 | |
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 306 | > By combining the `CX_BUFFER_AUTO_EXTEND` flag and the `threshold` setting, | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 307 | > you can create a buffer that initially starts with a small capacity, grows up to a certain threshold, | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 308 | > and starts flushing only when that threshold is exceeded. | 
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 309 | |
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 310 | Flushing happens by invoking the `wfunc` up to `blkmax` times, writing up to `blksize` bytes from the buffer to the `target` with each call. | 
| 1430 
5917ed4e5a79
minor wording improvements in buffer documentation
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 311 | The target might not accept all bytes (i.e., the `wfunc` return value indicates that fewer items have been written than requested), | 
| 1269 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 312 | in which case the remaining data remains in the buffer. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 313 | That means the buffer is effectively [shifted](#shift-contents) left by the number of successfully flushed bytes. | 
| 1269 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 314 | |
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 315 | > When you write large amounts of data to a buffer, multiple flush cycles might happen. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 316 | > After the first flush operations are completed, the reclaimed space in the buffer is filled first, but if that | 
| 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 317 | > is not enough, another flush may be triggered within the same invocation of the write operation. | 
| 1269 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 318 | > | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 319 | > That means as much data is written to the buffer and/or flushed as possible, until neither the flush target nor the buffer accept more data. | 
| 1430 
5917ed4e5a79
minor wording improvements in buffer documentation
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 320 | > {style="note"} | 
| 1269 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 321 | |
| 
e15ca477d448
document the flushing feature for the buffer
 Mike Becker <universe@uap-core.de> parents: 
1264diff
changeset | 322 | > The function `cxBufferFlush()` simply returns zero when flushing was not enabled via `cxBufferEnableFlushing()`. | 
| 1190 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 323 | |
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 324 | <seealso> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 325 | <category ref="apidoc"> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 326 | <a href="https://ucx.sourceforge.io/api/buffer_8h.html">buffer.h</a> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 327 | </category> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 328 | </seealso> |