docs/Writerside/topics/buffer.h.md

Thu, 11 Dec 2025 23:47:46 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 11 Dec 2025 23:47:46 +0100
changeset 1575
dde0c67a449b
parent 1571
25ead2ffb9b5
permissions
-rw-r--r--

improves cxBufferTerminate()

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Buffer
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
1262
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff 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: 1143
diff changeset
4
151c057faf7c add marker to every incomplete page
Mike Becker <universe@uap-core.de>
parents: 1143
diff 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: 1298
diff changeset
6 or from a file or network stream to the buffer and vice versa.
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7
1262
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
8 More features for convenient use of the buffer can be enabled, like automatic memory management,
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
9 or automatic resizing of the buffer space.
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10
1262
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff 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: 1261
diff 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: 1298
diff 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: 1261
diff 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: 1141
diff changeset
15
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
16 ## Example
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
17
1276
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
18 In the following example we use a `CxBuffer`, the `bprintf()` macro from the [UCX printf header](printf.h.md),
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
19 and a [UCX map](map.h.md) to create a simple HTTP GET request.
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
20
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
21 ```C
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
22 #include <cx/buffer.h>
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
23 #include <cx/printf.h>
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
24 #include <cx/map.h>
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
25
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
26 void send_get_request(
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
27 void *net_target,
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
28 cx_write_func net_write,
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
29 const char *host,
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
30 const char *path,
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
31 CxMap *header
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
32 ) {
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
33 // initialize buffer and use stack memory for small requests
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
34 char stackmem[128];
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
35 CxBuffer buf;
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
36 cxBufferInit(
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
37 &buf, stackmem, sizeof(stackmem),
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
38 cxDefaultAllocator,
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
39 CX_BUFFER_COPY_ON_EXTEND // move to heap when request is larger
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
40 );
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
41
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
42 // basic request data
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
43 cx_bprintf(&buf, "GET %s HTTP/1.1\r\n", path);
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
44 cx_bprintf(&buf, "Host: %s\r\n", host);
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
45
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
46 // add headers
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
47 CxMapIterator iter = cxMapIterator(header);
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
48 cx_foreach(CxMapEntry*, entry, iter) {
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
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: 1291
diff 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: 1291
diff changeset
51 CX_SFMT(name), entry->value
1276
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
52 );
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
53 }
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
54
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
55 // blank line terminates
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
56 cxBufferWrite("\r\n", 1, 2, &buf);
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
57
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
58 // write request to the network stream and destroy the buffer
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
59 net_write(buf.space, 1, buf.size, net_target);
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
60 cxBufferDestroy(&buf);
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
61 }
91a64ba395f7 add buffer example
Mike Becker <universe@uap-core.de>
parents: 1270
diff changeset
62 ```
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
63
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
64 ## Create
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
65
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
66 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
67 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
68
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff 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: 1190
diff changeset
70 const CxAllocator *allocator, int flags);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
71
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
72 CxBuffer *cxBufferCreate(void *space,size_t capacity,
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
73 const CxAllocator *allocator, int flags);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
74
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
75 // available flags:
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
76 #define CX_BUFFER_DEFAULT
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
77 #define CX_BUFFER_FREE_CONTENTS
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
78 #define CX_BUFFER_AUTO_EXTEND
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
79 #define CX_BUFFER_COPY_ON_WRITE
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
80 #define CX_BUFFER_COPY_ON_EXTEND
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
81 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
82
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1298
diff 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: 1263
diff changeset
84
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff 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: 1263
diff 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: 1263
diff 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: 1263
diff changeset
88
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff 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: 1263
diff changeset
90
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff 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: 1263
diff changeset
92
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff 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: 1190
diff changeset
94
1263
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff changeset
95 | Flag | Description |
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff changeset
96 |--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff 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: 1262
diff 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: 1262
diff 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: 1262
diff 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: 1262
diff 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: 1262
diff changeset
102
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff changeset
103
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
104 ## Destroy
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
105
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
106 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
107 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
108
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
109 void cxBufferDestroy(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
110
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
111 void cxBufferFree(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
112 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
113
1259
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff 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: 1256
diff changeset
115
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff 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: 1256
diff 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: 1256
diff 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: 1190
diff changeset
119
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
120 ## Capacity Management
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
121
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
122 ```C
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
123 #include <cx/buffer.h>
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
124
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
125 int cxBufferMaximumCapacity(CxBuffer *buffer, size_t capacity);
1515
f024313c08f1 add cxBufferReserve()
Mike Becker <universe@uap-core.de>
parents: 1514
diff changeset
126
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
127 int cxBufferMinimumCapacity(CxBuffer *buffer, size_t capacity);
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
128
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
129 int cxBufferReserve(CxBuffer *buffer, size_t capacity);
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
130
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
131 void cxBufferShrink(CxBuffer *buffer, size_t reserve);
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
132 ```
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
133
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
134 The function `cxBufferMaximumCapacity()` specifies an upper limit for auto-growing the buffer's capacity.
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
135 If the new threshold is smaller than the current capacity, this function fails and returns non-zero.
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
136
1542
197450c2b0b3 change cxBufferReserve() to allow reducing the capacity
Mike Becker <universe@uap-core.de>
parents: 1515
diff changeset
137 The function `cxBufferMinimumCapacity()` guarantees a buffer capacity of _at least_ `capacity`.
197450c2b0b3 change cxBufferReserve() to allow reducing the capacity
Mike Becker <universe@uap-core.de>
parents: 1515
diff changeset
138 It will grow the capacity in powers of two until the system's page size is reached.
1291
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
139 Then, the new capacity will be a multiple of the page size.
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
140 The function returns non-zero if increasing the capacity was attempted unsuccessfully;
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
141 that includes attempts to specify a minimum capacity that exceeds the maximum capacity.
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
142
1542
197450c2b0b3 change cxBufferReserve() to allow reducing the capacity
Mike Becker <universe@uap-core.de>
parents: 1515
diff changeset
143 The function `cxBufferReserve()`, on the other hand, will reallocate the buffer's space to match exactly the requested `capacity`
197450c2b0b3 change cxBufferReserve() to allow reducing the capacity
Mike Becker <universe@uap-core.de>
parents: 1515
diff changeset
144 and the contents are truncated if required.
197450c2b0b3 change cxBufferReserve() to allow reducing the capacity
Mike Becker <universe@uap-core.de>
parents: 1515
diff changeset
145
1515
f024313c08f1 add cxBufferReserve()
Mike Becker <universe@uap-core.de>
parents: 1514
diff changeset
146 You should use `cxBufferReserve()` when you know precisely the required capacity beforehand
f024313c08f1 add cxBufferReserve()
Mike Becker <universe@uap-core.de>
parents: 1514
diff changeset
147 and `cxBufferMinimumCapacity()` when it is likely that the buffer needs to regrow soon.
f024313c08f1 add cxBufferReserve()
Mike Becker <universe@uap-core.de>
parents: 1514
diff changeset
148
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
149 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: 1288
diff changeset
150 plus a number of `reserve` bytes.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
151 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: 1288
diff changeset
152
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
153 > 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: 1288
diff changeset
154 > before reallocating the space.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
155 > The function `cxBufferShrink()` on the other hand does _nothing_ when the buffer is in a copy-on-write state,
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
156 > because it makes little sense to copy the memory just to have it in a smaller memory region.
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
157
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
158 ## Write
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
159
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
160 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
161 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
162
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
163 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: 1190
diff changeset
164 CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
165
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
166 int cxBufferPut(CxBuffer *buffer, int c);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
167
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
168 size_t cxBufferPutString(CxBuffer *buffer, const char *str);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
169
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
170 int cxBufferTerminate(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
171
1270
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
172 size_t cxBufferAppend(const void *ptr, size_t size, size_t nitems,
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
173 CxBuffer *buffer);
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
174 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
175
1270
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
176 The primary function for writing to a buffer is `cxBufferWrite()`
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
177 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: 1269
diff changeset
178
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
179 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: 1269
diff changeset
180 items that do not fit into the buffer are discarded.
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
181 The function then returns the actual number of items successfully written.
1270
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
182 This equals the number of bytes if and only if `size=1`.
1571
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
183 If `CX_BUFFER_AUTO_EXTEND` is set, the buffer is grown to it's maximum capacity
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
184 (see `cxBufferMaximumCapacity()` in [](#capacity-management)).
25ead2ffb9b5 removes buffer flush and adds maximum capacity instead - resolves #185
Mike Becker <universe@uap-core.de>
parents: 1542
diff changeset
185 In case the allocation for auto-extension fails, the function immediately returns zero and does not write any data.
1270
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
186
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
187 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: 1269
diff changeset
188 converted to an `unsigned char` to the buffer.
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
189 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: 1269
diff changeset
190 but it does _not_ set `errno` on failure.
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
191
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
192 The function `cxBufferPutString()` is a convenience function,
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
193 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: 1269
diff changeset
194
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1298
diff changeset
195 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: 1269
diff changeset
196 and cause the _size_ of the buffer to grow, if necessary, to contain all written bytes.
1575
dde0c67a449b improves cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1571
diff changeset
197 On the other hand, `cxBufferTerminate()` writes a zero-byte at the current position and shrinks the buffer,
1270
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
198 effectively creating a zero-terminated string whose size equals the buffer size.
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
199
1575
dde0c67a449b improves cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1571
diff changeset
200 > If you use cxBufferTerminate() on a buffer with the `CX_BUFFER_COPY_ON_EXTEND` flag set, the shrink operation is skipped.
dde0c67a449b improves cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1571
diff changeset
201 > Using `cxBufferTerminate()` on a buffer with the `CX_BUFFER_COPY_ON_WRITE` flag set, will copy the entire memory just to add the zero-terminator.
dde0c67a449b improves cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1571
diff changeset
202
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1298
diff changeset
203 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: 1269
diff changeset
204 and it also does _not_ advance the position.
503f0ad94c6c document buffer write functions
Mike Becker <universe@uap-core.de>
parents: 1269
diff changeset
205
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
206 ## Read
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
207
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
208 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
209 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
210
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
211 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: 1190
diff changeset
212 CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
213
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
214 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: 1256
diff changeset
215
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
216 bool cxBufferEof(const CxBuffer *buffer);
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
217 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
218
1262
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
219 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: 1298
diff changeset
220 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: 1298
diff changeset
221 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: 1261
diff changeset
222
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
223 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: 1261
diff changeset
224 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: 1261
diff changeset
225
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
226 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: 1261
diff changeset
227
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
228 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: 1261
diff changeset
229
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
230 > 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: 1261
diff changeset
231 > 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: 1190
diff changeset
232
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
233 ## Reset and Clear
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
234
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
235 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
236 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
237
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
238 void cxBufferReset(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
239
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
240 void cxBufferClear(CxBuffer *buffer);
1514
ee5d668a71e4 add cxBufferPop()
Mike Becker <universe@uap-core.de>
parents: 1430
diff changeset
241
ee5d668a71e4 add cxBufferPop()
Mike Becker <universe@uap-core.de>
parents: 1430
diff changeset
242 size_t cxBufferPop(CxBuffer *buffer,
ee5d668a71e4 add cxBufferPop()
Mike Becker <universe@uap-core.de>
parents: 1430
diff changeset
243 size_t size, size_t nitems);
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
244 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
245
1261
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
246 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: 1260
diff changeset
247 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: 1260
diff changeset
248
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1298
diff changeset
249 > 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: 1298
diff changeset
250 > 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: 1260
diff changeset
251
1514
ee5d668a71e4 add cxBufferPop()
Mike Becker <universe@uap-core.de>
parents: 1430
diff changeset
252 The function `cxBufferPop()` erases the last `nitems` with the given `size` and returns the number of items that could be erased.
ee5d668a71e4 add cxBufferPop()
Mike Becker <universe@uap-core.de>
parents: 1430
diff changeset
253 When the buffer contains fewer bytes than requested and the number of bytes is not divisible by the item `size`,
ee5d668a71e4 add cxBufferPop()
Mike Becker <universe@uap-core.de>
parents: 1430
diff changeset
254 the remainder will stay in the buffer.
ee5d668a71e4 add cxBufferPop()
Mike Becker <universe@uap-core.de>
parents: 1430
diff changeset
255
1261
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
256 > 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: 1260
diff changeset
257 > because writing to the contents is disallowed.
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
258 >{style="note"}
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
259
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
260 ## Random Access
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
261
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
262 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
263 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
264
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
265 int cxBufferSeek(CxBuffer *buffer, off_t offset, int whence);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
266 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
267
1259
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
268 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: 1256
diff changeset
269 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: 1256
diff changeset
270 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: 1256
diff changeset
271
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
272 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: 1276
diff changeset
273 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: 1256
diff changeset
274
1288
b41ad5d9bcbf fixes errno value after failing cxBufferSeek() to be consistently EINVAL
Mike Becker <universe@uap-core.de>
parents: 1276
diff changeset
275 > 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: 1190
diff changeset
276
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
277 ## Shift Contents
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
278
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
279 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
280 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
281
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
282 int cxBufferShift(CxBuffer *buffer, off_t shift);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
283
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
284 int cxBufferShiftRight(CxBuffer *buffer, size_t shift);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
285
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
286 int cxBufferShiftLeft(CxBuffer *buffer, size_t shift);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
287 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
288
1260
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
289 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: 1259
diff changeset
290 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: 1298
diff changeset
291 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: 1259
diff changeset
292
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1298
diff changeset
293 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: 1424
diff changeset
294 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: 1259
diff changeset
295
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
296 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: 1259
diff changeset
297 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: 1259
diff changeset
298 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: 1259
diff changeset
299 (which means, `cxBufferEof()` returns `true` after the operation).
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
300
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
301 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: 1298
diff changeset
302 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: 1298
diff changeset
303 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: 1190
diff changeset
304
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
305 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
306 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
307 <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: 1146
diff changeset
308 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
309 </seealso>

mercurial